commit f00343dc6fee51a36d2b952718aa93c196226ca9 Author: spatialfree Date: Fri Jun 5 11:54:36 2020 -0700 Initial commit diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1060b04 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,56 @@ +{ + "files.exclude": + { + "**/.DS_Store":true, + "**/.git":true, + "**/.gitignore":true, + "**/.gitmodules":true, + "**/*.booproj":true, + "**/*.pidb":true, + "**/*.suo":true, + "**/*.user":true, + "**/*.userprefs":true, + "**/*.unityproj":true, + "**/*.dll":true, + "**/*.exe":true, + "**/*.pdf":true, + "**/*.mid":true, + "**/*.midi":true, + "**/*.wav":true, + "**/*.gif":true, + "**/*.ico":true, + "**/*.jpg":true, + "**/*.jpeg":true, + "**/*.png":true, + "**/*.psd":true, + "**/*.tga":true, + "**/*.tif":true, + "**/*.tiff":true, + "**/*.3ds":true, + "**/*.3DS":true, + "**/*.fbx":true, + "**/*.FBX":true, + "**/*.lxo":true, + "**/*.LXO":true, + "**/*.ma":true, + "**/*.MA":true, + "**/*.obj":true, + "**/*.OBJ":true, + "**/*.asset":true, + "**/*.cubemap":true, + "**/*.flare":true, + "**/*.mat":true, + "**/*.meta":true, + "**/*.prefab":true, + "**/*.unity":true, + "build/":true, + "Build/":true, + "Library/":true, + "library/":true, + "obj/":true, + "Obj/":true, + "ProjectSettings/":true, + "temp/":true, + "Temp/":true + } +} \ No newline at end of file diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj new file mode 100644 index 0000000..d9a577f --- /dev/null +++ b/Assembly-CSharp.csproj @@ -0,0 +1,716 @@ + + + + latest + + + Debug + AnyCPU + 10.0.20506 + 2.0 + + {DAC2F904-1585-AB65-9EE9-B3FA09E3D939} + Library + Properties + Assembly-CSharp + v4.7.1 + 512 + . + + + true + full + false + Temp\bin\Debug\ + DEBUG;TRACE;UNITY_2019_3_0;UNITY_2019_3;UNITY_2019;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;ENABLE_AR;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_EVENT_QUEUE;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;PLATFORM_STANDALONE;PLATFORM_STANDALONE_WIN;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_4_6;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;UNITY_PRO_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER + prompt + 4 + 0169 + False + + + pdbonly + true + Temp\bin\Release\ + prompt + 4 + 0169 + False + + + true + true + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C:/dofdev/Pixelgon/Library/ScriptAssemblies/Unity.Timeline.Editor.dll + + + C:/dofdev/Pixelgon/Library/ScriptAssemblies/Unity.VSCode.Editor.dll + + + C:/dofdev/Pixelgon/Library/ScriptAssemblies/Unity.TextMeshPro.Editor.dll + + + C:/dofdev/Pixelgon/Library/ScriptAssemblies/UnityEngine.UI.dll + + + C:/dofdev/Pixelgon/Library/ScriptAssemblies/Unity.Timeline.dll + + + C:/dofdev/Pixelgon/Library/ScriptAssemblies/Unity.CollabProxy.Editor.dll + + + C:/dofdev/Pixelgon/Library/ScriptAssemblies/Unity.Rider.Editor.dll + + + C:/dofdev/Pixelgon/Library/ScriptAssemblies/Unity.TextMeshPro.dll + + + C:/dofdev/Pixelgon/Library/ScriptAssemblies/UnityEditor.UI.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.AIModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.ARModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.AndroidJNIModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.AnimationModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.AssetBundleModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.AudioModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.ClothModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterInputModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.CoreModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.CrashReportingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.DSPGraphModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.DirectorModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.GameCenterModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.GridModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.HotReloadModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.IMGUIModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.ImageConversionModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.InputModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.InputLegacyModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.LocalizationModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.PhysicsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.Physics2DModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.ProfilerModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.StreamingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.SubstanceModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.SubsystemsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.TLSModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.TextCoreModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.TextRenderingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.TilemapModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UIModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UIElementsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UNETModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UmbraModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UnityConnectModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UnityTestProtocolModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.VFXModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.VRModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.VehiclesModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.VideoModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.WindModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEngine/UnityEngine.XRModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/Managed/UnityEditor.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/mscorlib.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Core.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Runtime.Serialization.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.Linq.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.Vectors.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Net.Http.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Microsoft.CSharp.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Data.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/Microsoft.Win32.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/netstandard.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.AppContext.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Concurrent.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.NonGeneric.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Specialized.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Annotations.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.EventBasedAsync.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.TypeConverter.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Console.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Data.Common.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Contracts.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Debug.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.FileVersionInfo.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Process.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.StackTrace.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TextWriterTraceListener.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Tools.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TraceSource.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Drawing.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Dynamic.Runtime.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Calendars.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Extensions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Compression.ZipFile.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.DriveInfo.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Watcher.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.IsolatedStorage.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.MemoryMappedFiles.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Pipes.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.UnmanagedMemoryStream.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Expressions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Parallel.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Queryable.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Http.Rtc.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NameResolution.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NetworkInformation.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Ping.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Requests.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Security.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Sockets.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebHeaderCollection.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.Client.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ObjectModel.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.ILGeneration.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.Lightweight.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Extensions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Reader.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.ResourceManager.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Writer.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.CompilerServices.VisualC.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Extensions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Handles.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.RuntimeInformation.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.WindowsRuntime.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Numerics.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Formatters.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Json.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Xml.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Claims.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Algorithms.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Csp.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Encoding.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.X509Certificates.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Principal.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.SecureString.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Duplex.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Http.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.NetTcp.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Security.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.Extensions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.RegularExpressions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Overlapped.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.Parallel.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Thread.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.ThreadPool.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Timer.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ValueTuple.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.ReaderWriter.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XDocument.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlDocument.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlSerializer.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.XDocument.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.Lang.dll + + + C:/Program Files/Unity/Hub/Editor/2019.3.0f3/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/Boo.Lang.dll + + + + + {B9899DDD-5BC8-D33F-E803-31A07AE1A44B} + NaughtyAttributes.Editor + + + {F120D8B3-6592-C6B9-B1A7-26FCB060968F} + NaughtyAttributes.Core + + + {8C904A79-47C2-CF29-FF00-DE23938D6676} + NaughtyAttributes.Test + + + {5DD0B09F-5542-19A2-6948-C6CFE9D1997F} + Oculus.VR.Editor + + + {0E0965FD-AE5E-A13A-C9E4-2991A5417D0E} + Oculus.VR.Scripts.Editor + + + {6DC81A06-AAB8-4D5C-1092-DB32ED7AAA94} + Oculus.VR + + + + + diff --git a/Assets/AssetSpace.meta b/Assets/AssetSpace.meta new file mode 100644 index 0000000..baa6859 --- /dev/null +++ b/Assets/AssetSpace.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a44ff2ff652bd0d49876f932590802d8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AssetSpace/draft.pixelgon b/Assets/AssetSpace/draft.pixelgon new file mode 100644 index 0000000..a279cea Binary files /dev/null and b/Assets/AssetSpace/draft.pixelgon differ diff --git a/Assets/AssetSpace/draft.pixelgon.meta b/Assets/AssetSpace/draft.pixelgon.meta new file mode 100644 index 0000000..4862663 --- /dev/null +++ b/Assets/AssetSpace/draft.pixelgon.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4b2183ce9a640ce46990e3029a03496a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AssetSpace/missile.pixelgon b/Assets/AssetSpace/missile.pixelgon new file mode 100644 index 0000000..dc21bec Binary files /dev/null and b/Assets/AssetSpace/missile.pixelgon differ diff --git a/Assets/AssetSpace/missile.pixelgon.meta b/Assets/AssetSpace/missile.pixelgon.meta new file mode 100644 index 0000000..1cd8d0b --- /dev/null +++ b/Assets/AssetSpace/missile.pixelgon.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3fd529051a22f6343857011fec566d37 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AssetSpaceBackup.meta b/Assets/AssetSpaceBackup.meta new file mode 100644 index 0000000..0b7658c --- /dev/null +++ b/Assets/AssetSpaceBackup.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7cbe39e06d6f6514ea7fca6faf72ee52 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AssetSpaceBackup/draft.pixelgon b/Assets/AssetSpaceBackup/draft.pixelgon new file mode 100644 index 0000000..f5f139b Binary files /dev/null and b/Assets/AssetSpaceBackup/draft.pixelgon differ diff --git a/Assets/AssetSpaceBackup/draft.pixelgon.meta b/Assets/AssetSpaceBackup/draft.pixelgon.meta new file mode 100644 index 0000000..7a89e1a --- /dev/null +++ b/Assets/AssetSpaceBackup/draft.pixelgon.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ab1238b11f0d2a34ab4a3ffc0ea97389 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials.meta b/Assets/Materials.meta new file mode 100644 index 0000000..f0f12d5 --- /dev/null +++ b/Assets/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8d8cf524bb676304884e4c89caf18872 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/ColorCube.asset b/Assets/Materials/ColorCube.asset new file mode 100644 index 0000000..3046847 --- /dev/null +++ b/Assets/Materials/ColorCube.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!117 &11700000 +Texture3D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ColorCube + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + serializedVersion: 3 + m_ColorSpace: 0 + m_Format: 8 + m_Width: 32 + m_Height: 32 + m_Depth: 32 + m_MipCount: 1 + m_DataSize: 131072 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 1 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_IsReadable: 1 + image data: 131072 + _typelessdata: 000000ff080000ff100000ff190000ff210000ff290000ff310000ff3a0000ff420000ff4a0000ff520000ff5a0000ff630000ff6b0000ff730000ff7b0000ff840000ff8c0000ff940000ff9c0000ffa50000ffad0000ffb50000ffbd0000ffc50000ffce0000ffd60000ffde0000ffe60000ffef0000fff70000ffff0000ff000800ff080800ff100800ff190800ff210800ff290800ff310800ff3a0800ff420800ff4a0800ff520800ff5a0800ff630800ff6b0800ff730800ff7b0800ff840800ff8c0800ff940800ff9c0800ffa50800ffad0800ffb50800ffbd0800ffc50800ffce0800ffd60800ffde0800ffe60800ffef0800fff70800ffff0800ff001000ff081000ff101000ff191000ff211000ff291000ff311000ff3a1000ff421000ff4a1000ff521000ff5a1000ff631000ff6b1000ff731000ff7b1000ff841000ff8c1000ff941000ff9c1000ffa51000ffad1000ffb51000ffbd1000ffc51000ffce1000ffd61000ffde1000ffe61000ffef1000fff71000ffff1000ff001900ff081900ff101900ff191900ff211900ff291900ff311900ff3a1900ff421900ff4a1900ff521900ff5a1900ff631900ff6b1900ff731900ff7b1900ff841900ff8c1900ff941900ff9c1900ffa51900ffad1900ffb51900ffbd1900ffc51900ffce1900ffd61900ffde1900ffe61900ffef1900fff71900ffff1900ff002100ff082100ff102100ff192100ff212100ff292100ff312100ff3a2100ff422100ff4a2100ff522100ff5a2100ff632100ff6b2100ff732100ff7b2100ff842100ff8c2100ff942100ff9c2100ffa52100ffad2100ffb52100ffbd2100ffc52100ffce2100ffd62100ffde2100ffe62100ffef2100fff72100ffff2100ff002900ff082900ff102900ff192900ff212900ff292900ff312900ff3a2900ff422900ff4a2900ff522900ff5a2900ff632900ff6b2900ff732900ff7b2900ff842900ff8c2900ff942900ff9c2900ffa52900ffad2900ffb52900ffbd2900ffc52900ffce2900ffd62900ffde2900ffe62900ffef2900fff72900ffff2900ff003100ff083100ff103100ff193100ff213100ff293100ff313100ff3a3100ff423100ff4a3100ff523100ff5a3100ff633100ff6b3100ff733100ff7b3100ff843100ff8c3100ff943100ff9c3100ffa53100ffad3100ffb53100ffbd3100ffc53100ffce3100ffd63100ffde3100ffe63100ffef3100fff73100ffff3100ff003a00ff083a00ff103a00ff193a00ff213a00ff293a00ff313a00ff3a3a00ff423a00ff4a3a00ff523a00ff5a3a00ff633a00ff6b3a00ff733a00ff7b3a00ff843a00ff8c3a00ff943a00ff9c3a00ffa53a00ffad3a00ffb53a00ffbd3a00ffc53a00ffce3a00ffd63a00ffde3a00ffe63a00ffef3a00fff73a00ffff3a00ff004200ff084200ff104200ff194200ff214200ff294200ff314200ff3a4200ff424200ff4a4200ff524200ff5a4200ff634200ff6b4200ff734200ff7b4200ff844200ff8c4200ff944200ff9c4200ffa54200ffad4200ffb54200ffbd4200ffc54200ffce4200ffd64200ffde4200ffe64200ffef4200fff74200ffff4200ff004a00ff084a00ff104a00ff194a00ff214a00ff294a00ff314a00ff3a4a00ff424a00ff4a4a00ff524a00ff5a4a00ff634a00ff6b4a00ff734a00ff7b4a00ff844a00ff8c4a00ff944a00ff9c4a00ffa54a00ffad4a00ffb54a00ffbd4a00ffc54a00ffce4a00ffd64a00ffde4a00ffe64a00ffef4a00fff74a00ffff4a00ff005200ff085200ff105200ff195200ff215200ff295200ff315200ff3a5200ff425200ff4a5200ff525200ff5a5200ff635200ff6b5200ff735200ff7b5200ff845200ff8c5200ff945200ff9c5200ffa55200ffad5200ffb55200ffbd5200ffc55200ffce5200ffd65200ffde5200ffe65200ffef5200fff75200ffff5200ff005a00ff085a00ff105a00ff195a00ff215a00ff295a00ff315a00ff3a5a00ff425a00ff4a5a00ff525a00ff5a5a00ff635a00ff6b5a00ff735a00ff7b5a00ff845a00ff8c5a00ff945a00ff9c5a00ffa55a00ffad5a00ffb55a00ffbd5a00ffc55a00ffce5a00ffd65a00ffde5a00ffe65a00ffef5a00fff75a00ffff5a00ff006300ff086300ff106300ff196300ff216300ff296300ff316300ff3a6300ff426300ff4a6300ff526300ff5a6300ff636300ff6b6300ff736300ff7b6300ff846300ff8c6300ff946300ff9c6300ffa56300ffad6300ffb56300ffbd6300ffc56300ffce6300ffd66300ffde6300ffe66300ffef6300fff76300ffff6300ff006b00ff086b00ff106b00ff196b00ff216b00ff296b00ff316b00ff3a6b00ff426b00ff4a6b00ff526b00ff5a6b00ff636b00ff6b6b00ff736b00ff7b6b00ff846b00ff8c6b00ff946b00ff9c6b00ffa56b00ffad6b00ffb56b00ffbd6b00ffc56b00ffce6b00ffd66b00ffde6b00ffe66b00ffef6b00fff76b00ffff6b00ff007300ff087300ff107300ff197300ff217300ff297300ff317300ff3a7300ff427300ff4a7300ff527300ff5a7300ff637300ff6b7300ff737300ff7b7300ff847300ff8c7300ff947300ff9c7300ffa57300ffad7300ffb57300ffbd7300ffc57300ffce7300ffd67300ffde7300ffe67300ffef7300fff77300ffff7300ff007b00ff087b00ff107b00ff197b00ff217b00ff297b00ff317b00ff3a7b00ff427b00ff4a7b00ff527b00ff5a7b00ff637b00ff6b7b00ff737b00ff7b7b00ff847b00ff8c7b00ff947b00ff9c7b00ffa57b00ffad7b00ffb57b00ffbd7b00ffc57b00ffce7b00ffd67b00ffde7b00ffe67b00ffef7b00fff77b00ffff7b00ff008400ff088400ff108400ff198400ff218400ff298400ff318400ff3a8400ff428400ff4a8400ff528400ff5a8400ff638400ff6b8400ff738400ff7b8400ff848400ff8c8400ff948400ff9c8400ffa58400ffad8400ffb58400ffbd8400ffc58400ffce8400ffd68400ffde8400ffe68400ffef8400fff78400ffff8400ff008c00ff088c00ff108c00ff198c00ff218c00ff298c00ff318c00ff3a8c00ff428c00ff4a8c00ff528c00ff5a8c00ff638c00ff6b8c00ff738c00ff7b8c00ff848c00ff8c8c00ff948c00ff9c8c00ffa58c00ffad8c00ffb58c00ffbd8c00ffc58c00ffce8c00ffd68c00ffde8c00ffe68c00ffef8c00fff78c00ffff8c00ff009400ff089400ff109400ff199400ff219400ff299400ff319400ff3a9400ff429400ff4a9400ff529400ff5a9400ff639400ff6b9400ff739400ff7b9400ff849400ff8c9400ff949400ff9c9400ffa59400ffad9400ffb59400ffbd9400ffc59400ffce9400ffd69400ffde9400ffe69400ffef9400fff79400ffff9400ff009c00ff089c00ff109c00ff199c00ff219c00ff299c00ff319c00ff3a9c00ff429c00ff4a9c00ff529c00ff5a9c00ff639c00ff6b9c00ff739c00ff7b9c00ff849c00ff8c9c00ff949c00ff9c9c00ffa59c00ffad9c00ffb59c00ffbd9c00ffc59c00ffce9c00ffd69c00ffde9c00ffe69c00ffef9c00fff79c00ffff9c00ff00a500ff08a500ff10a500ff19a500ff21a500ff29a500ff31a500ff3aa500ff42a500ff4aa500ff52a500ff5aa500ff63a500ff6ba500ff73a500ff7ba500ff84a500ff8ca500ff94a500ff9ca500ffa5a500ffada500ffb5a500ffbda500ffc5a500ffcea500ffd6a500ffdea500ffe6a500ffefa500fff7a500ffffa500ff00ad00ff08ad00ff10ad00ff19ad00ff21ad00ff29ad00ff31ad00ff3aad00ff42ad00ff4aad00ff52ad00ff5aad00ff63ad00ff6bad00ff73ad00ff7bad00ff84ad00ff8cad00ff94ad00ff9cad00ffa5ad00ffadad00ffb5ad00ffbdad00ffc5ad00ffcead00ffd6ad00ffdead00ffe6ad00ffefad00fff7ad00ffffad00ff00b500ff08b500ff10b500ff19b500ff21b500ff29b500ff31b500ff3ab500ff42b500ff4ab500ff52b500ff5ab500ff63b500ff6bb500ff73b500ff7bb500ff84b500ff8cb500ff94b500ff9cb500ffa5b500ffadb500ffb5b500ffbdb500ffc5b500ffceb500ffd6b500ffdeb500ffe6b500ffefb500fff7b500ffffb500ff00bd00ff08bd00ff10bd00ff19bd00ff21bd00ff29bd00ff31bd00ff3abd00ff42bd00ff4abd00ff52bd00ff5abd00ff63bd00ff6bbd00ff73bd00ff7bbd00ff84bd00ff8cbd00ff94bd00ff9cbd00ffa5bd00ffadbd00ffb5bd00ffbdbd00ffc5bd00ffcebd00ffd6bd00ffdebd00ffe6bd00ffefbd00fff7bd00ffffbd00ff00c500ff08c500ff10c500ff19c500ff21c500ff29c500ff31c500ff3ac500ff42c500ff4ac500ff52c500ff5ac500ff63c500ff6bc500ff73c500ff7bc500ff84c500ff8cc500ff94c500ff9cc500ffa5c500ffadc500ffb5c500ffbdc500ffc5c500ffcec500ffd6c500ffdec500ffe6c500ffefc500fff7c500ffffc500ff00ce00ff08ce00ff10ce00ff19ce00ff21ce00ff29ce00ff31ce00ff3ace00ff42ce00ff4ace00ff52ce00ff5ace00ff63ce00ff6bce00ff73ce00ff7bce00ff84ce00ff8cce00ff94ce00ff9cce00ffa5ce00ffadce00ffb5ce00ffbdce00ffc5ce00ffcece00ffd6ce00ffdece00ffe6ce00ffefce00fff7ce00ffffce00ff00d600ff08d600ff10d600ff19d600ff21d600ff29d600ff31d600ff3ad600ff42d600ff4ad600ff52d600ff5ad600ff63d600ff6bd600ff73d600ff7bd600ff84d600ff8cd600ff94d600ff9cd600ffa5d600ffadd600ffb5d600ffbdd600ffc5d600ffced600ffd6d600ffded600ffe6d600ffefd600fff7d600ffffd600ff00de00ff08de00ff10de00ff19de00ff21de00ff29de00ff31de00ff3ade00ff42de00ff4ade00ff52de00ff5ade00ff63de00ff6bde00ff73de00ff7bde00ff84de00ff8cde00ff94de00ff9cde00ffa5de00ffadde00ffb5de00ffbdde00ffc5de00ffcede00ffd6de00ffdede00ffe6de00ffefde00fff7de00ffffde00ff00e600ff08e600ff10e600ff19e600ff21e600ff29e600ff31e600ff3ae600ff42e600ff4ae600ff52e600ff5ae600ff63e600ff6be600ff73e600ff7be600ff84e600ff8ce600ff94e600ff9ce600ffa5e600ffade600ffb5e600ffbde600ffc5e600ffcee600ffd6e600ffdee600ffe6e600ffefe600fff7e600ffffe600ff00ef00ff08ef00ff10ef00ff19ef00ff21ef00ff29ef00ff31ef00ff3aef00ff42ef00ff4aef00ff52ef00ff5aef00ff63ef00ff6bef00ff73ef00ff7bef00ff84ef00ff8cef00ff94ef00ff9cef00ffa5ef00ffadef00ffb5ef00ffbdef00ffc5ef00ffceef00ffd6ef00ffdeef00ffe6ef00ffefef00fff7ef00ffffef00ff00f700ff08f700ff10f700ff19f700ff21f700ff29f700ff31f700ff3af700ff42f700ff4af700ff52f700ff5af700ff63f700ff6bf700ff73f700ff7bf700ff84f700ff8cf700ff94f700ff9cf700ffa5f700ffadf700ffb5f700ffbdf700ffc5f700ffcef700ffd6f700ffdef700ffe6f700ffeff700fff7f700fffff700ff00ff00ff08ff00ff10ff00ff19ff00ff21ff00ff29ff00ff31ff00ff3aff00ff42ff00ff4aff00ff52ff00ff5aff00ff63ff00ff6bff00ff73ff00ff7bff00ff84ff00ff8cff00ff94ff00ff9cff00ffa5ff00ffadff00ffb5ff00ffbdff00ffc5ff00ffceff00ffd6ff00ffdeff00ffe6ff00ffefff00fff7ff00ffffff00ff000008ff080008ff100008ff190008ff210008ff290008ff310008ff3a0008ff420008ff4a0008ff520008ff5a0008ff630008ff6b0008ff730008ff7b0008ff840008ff8c0008ff940008ff9c0008ffa50008ffad0008ffb50008ffbd0008ffc50008ffce0008ffd60008ffde0008ffe60008ffef0008fff70008ffff0008ff000808ff080808ff100808ff190808ff210808ff290808ff310808ff3a0808ff420808ff4a0808ff520808ff5a0808ff630808ff6b0808ff730808ff7b0808ff840808ff8c0808ff940808ff9c0808ffa50808ffad0808ffb50808ffbd0808ffc50808ffce0808ffd60808ffde0808ffe60808ffef0808fff70808ffff0808ff001008ff081008ff101008ff191008ff211008ff291008ff311008ff3a1008ff421008ff4a1008ff521008ff5a1008ff631008ff6b1008ff731008ff7b1008ff841008ff8c1008ff941008ff9c1008ffa51008ffad1008ffb51008ffbd1008ffc51008ffce1008ffd61008ffde1008ffe61008ffef1008fff71008ffff1008ff001908ff081908ff101908ff191908ff211908ff291908ff311908ff3a1908ff421908ff4a1908ff521908ff5a1908ff631908ff6b1908ff731908ff7b1908ff841908ff8c1908ff941908ff9c1908ffa51908ffad1908ffb51908ffbd1908ffc51908ffce1908ffd61908ffde1908ffe61908ffef1908fff71908ffff1908ff002108ff082108ff102108ff192108ff212108ff292108ff312108ff3a2108ff422108ff4a2108ff522108ff5a2108ff632108ff6b2108ff732108ff7b2108ff842108ff8c2108ff942108ff9c2108ffa52108ffad2108ffb52108ffbd2108ffc52108ffce2108ffd62108ffde2108ffe62108ffef2108fff72108ffff2108ff002908ff082908ff102908ff192908ff212908ff292908ff312908ff3a2908ff422908ff4a2908ff522908ff5a2908ff632908ff6b2908ff732908ff7b2908ff842908ff8c2908ff942908ff9c2908ffa52908ffad2908ffb52908ffbd2908ffc52908ffce2908ffd62908ffde2908ffe62908ffef2908fff72908ffff2908ff003108ff083108ff103108ff193108ff213108ff293108ff313108ff3a3108ff423108ff4a3108ff523108ff5a3108ff633108ff6b3108ff733108ff7b3108ff843108ff8c3108ff943108ff9c3108ffa53108ffad3108ffb53108ffbd3108ffc53108ffce3108ffd63108ffde3108ffe63108ffef3108fff73108ffff3108ff003a08ff083a08ff103a08ff193a08ff213a08ff293a08ff313a08ff3a3a08ff423a08ff4a3a08ff523a08ff5a3a08ff633a08ff6b3a08ff733a08ff7b3a08ff843a08ff8c3a08ff943a08ff9c3a08ffa53a08ffad3a08ffb53a08ffbd3a08ffc53a08ffce3a08ffd63a08ffde3a08ffe63a08ffef3a08fff73a08ffff3a08ff004208ff084208ff104208ff194208ff214208ff294208ff314208ff3a4208ff424208ff4a4208ff524208ff5a4208ff634208ff6b4208ff734208ff7b4208ff844208ff8c4208ff944208ff9c4208ffa54208ffad4208ffb54208ffbd4208ffc54208ffce4208ffd64208ffde4208ffe64208ffef4208fff74208ffff4208ff004a08ff084a08ff104a08ff194a08ff214a08ff294a08ff314a08ff3a4a08ff424a08ff4a4a08ff524a08ff5a4a08ff634a08ff6b4a08ff734a08ff7b4a08ff844a08ff8c4a08ff944a08ff9c4a08ffa54a08ffad4a08ffb54a08ffbd4a08ffc54a08ffce4a08ffd64a08ffde4a08ffe64a08ffef4a08fff74a08ffff4a08ff005208ff085208ff105208ff195208ff215208ff295208ff315208ff3a5208ff425208ff4a5208ff525208ff5a5208ff635208ff6b5208ff735208ff7b5208ff845208ff8c5208ff945208ff9c5208ffa55208ffad5208ffb55208ffbd5208ffc55208ffce5208ffd65208ffde5208ffe65208ffef5208fff75208ffff5208ff005a08ff085a08ff105a08ff195a08ff215a08ff295a08ff315a08ff3a5a08ff425a08ff4a5a08ff525a08ff5a5a08ff635a08ff6b5a08ff735a08ff7b5a08ff845a08ff8c5a08ff945a08ff9c5a08ffa55a08ffad5a08ffb55a08ffbd5a08ffc55a08ffce5a08ffd65a08ffde5a08ffe65a08ffef5a08fff75a08ffff5a08ff006308ff086308ff106308ff196308ff216308ff296308ff316308ff3a6308ff426308ff4a6308ff526308ff5a6308ff636308ff6b6308ff736308ff7b6308ff846308ff8c6308ff946308ff9c6308ffa56308ffad6308ffb56308ffbd6308ffc56308ffce6308ffd66308ffde6308ffe66308ffef6308fff76308ffff6308ff006b08ff086b08ff106b08ff196b08ff216b08ff296b08ff316b08ff3a6b08ff426b08ff4a6b08ff526b08ff5a6b08ff636b08ff6b6b08ff736b08ff7b6b08ff846b08ff8c6b08ff946b08ff9c6b08ffa56b08ffad6b08ffb56b08ffbd6b08ffc56b08ffce6b08ffd66b08ffde6b08ffe66b08ffef6b08fff76b08ffff6b08ff007308ff087308ff107308ff197308ff217308ff297308ff317308ff3a7308ff427308ff4a7308ff527308ff5a7308ff637308ff6b7308ff737308ff7b7308ff847308ff8c7308ff947308ff9c7308ffa57308ffad7308ffb57308ffbd7308ffc57308ffce7308ffd67308ffde7308ffe67308ffef7308fff77308ffff7308ff007b08ff087b08ff107b08ff197b08ff217b08ff297b08ff317b08ff3a7b08ff427b08ff4a7b08ff527b08ff5a7b08ff637b08ff6b7b08ff737b08ff7b7b08ff847b08ff8c7b08ff947b08ff9c7b08ffa57b08ffad7b08ffb57b08ffbd7b08ffc57b08ffce7b08ffd67b08ffde7b08ffe67b08ffef7b08fff77b08ffff7b08ff008408ff088408ff108408ff198408ff218408ff298408ff318408ff3a8408ff428408ff4a8408ff528408ff5a8408ff638408ff6b8408ff738408ff7b8408ff848408ff8c8408ff948408ff9c8408ffa58408ffad8408ffb58408ffbd8408ffc58408ffce8408ffd68408ffde8408ffe68408ffef8408fff78408ffff8408ff008c08ff088c08ff108c08ff198c08ff218c08ff298c08ff318c08ff3a8c08ff428c08ff4a8c08ff528c08ff5a8c08ff638c08ff6b8c08ff738c08ff7b8c08ff848c08ff8c8c08ff948c08ff9c8c08ffa58c08ffad8c08ffb58c08ffbd8c08ffc58c08ffce8c08ffd68c08ffde8c08ffe68c08ffef8c08fff78c08ffff8c08ff009408ff089408ff109408ff199408ff219408ff299408ff319408ff3a9408ff429408ff4a9408ff529408ff5a9408ff639408ff6b9408ff739408ff7b9408ff849408ff8c9408ff949408ff9c9408ffa59408ffad9408ffb59408ffbd9408ffc59408ffce9408ffd69408ffde9408ffe69408ffef9408fff79408ffff9408ff009c08ff089c08ff109c08ff199c08ff219c08ff299c08ff319c08ff3a9c08ff429c08ff4a9c08ff529c08ff5a9c08ff639c08ff6b9c08ff739c08ff7b9c08ff849c08ff8c9c08ff949c08ff9c9c08ffa59c08ffad9c08ffb59c08ffbd9c08ffc59c08ffce9c08ffd69c08ffde9c08ffe69c08ffef9c08fff79c08ffff9c08ff00a508ff08a508ff10a508ff19a508ff21a508ff29a508ff31a508ff3aa508ff42a508ff4aa508ff52a508ff5aa508ff63a508ff6ba508ff73a508ff7ba508ff84a508ff8ca508ff94a508ff9ca508ffa5a508ffada508ffb5a508ffbda508ffc5a508ffcea508ffd6a508ffdea508ffe6a508ffefa508fff7a508ffffa508ff00ad08ff08ad08ff10ad08ff19ad08ff21ad08ff29ad08ff31ad08ff3aad08ff42ad08ff4aad08ff52ad08ff5aad08ff63ad08ff6bad08ff73ad08ff7bad08ff84ad08ff8cad08ff94ad08ff9cad08ffa5ad08ffadad08ffb5ad08ffbdad08ffc5ad08ffcead08ffd6ad08ffdead08ffe6ad08ffefad08fff7ad08ffffad08ff00b508ff08b508ff10b508ff19b508ff21b508ff29b508ff31b508ff3ab508ff42b508ff4ab508ff52b508ff5ab508ff63b508ff6bb508ff73b508ff7bb508ff84b508ff8cb508ff94b508ff9cb508ffa5b508ffadb508ffb5b508ffbdb508ffc5b508ffceb508ffd6b508ffdeb508ffe6b508ffefb508fff7b508ffffb508ff00bd08ff08bd08ff10bd08ff19bd08ff21bd08ff29bd08ff31bd08ff3abd08ff42bd08ff4abd08ff52bd08ff5abd08ff63bd08ff6bbd08ff73bd08ff7bbd08ff84bd08ff8cbd08ff94bd08ff9cbd08ffa5bd08ffadbd08ffb5bd08ffbdbd08ffc5bd08ffcebd08ffd6bd08ffdebd08ffe6bd08ffefbd08fff7bd08ffffbd08ff00c508ff08c508ff10c508ff19c508ff21c508ff29c508ff31c508ff3ac508ff42c508ff4ac508ff52c508ff5ac508ff63c508ff6bc508ff73c508ff7bc508ff84c508ff8cc508ff94c508ff9cc508ffa5c508ffadc508ffb5c508ffbdc508ffc5c508ffcec508ffd6c508ffdec508ffe6c508ffefc508fff7c508ffffc508ff00ce08ff08ce08ff10ce08ff19ce08ff21ce08ff29ce08ff31ce08ff3ace08ff42ce08ff4ace08ff52ce08ff5ace08ff63ce08ff6bce08ff73ce08ff7bce08ff84ce08ff8cce08ff94ce08ff9cce08ffa5ce08ffadce08ffb5ce08ffbdce08ffc5ce08ffcece08ffd6ce08ffdece08ffe6ce08ffefce08fff7ce08ffffce08ff00d608ff08d608ff10d608ff19d608ff21d608ff29d608ff31d608ff3ad608ff42d608ff4ad608ff52d608ff5ad608ff63d608ff6bd608ff73d608ff7bd608ff84d608ff8cd608ff94d608ff9cd608ffa5d608ffadd608ffb5d608ffbdd608ffc5d608ffced608ffd6d608ffded608ffe6d608ffefd608fff7d608ffffd608ff00de08ff08de08ff10de08ff19de08ff21de08ff29de08ff31de08ff3ade08ff42de08ff4ade08ff52de08ff5ade08ff63de08ff6bde08ff73de08ff7bde08ff84de08ff8cde08ff94de08ff9cde08ffa5de08ffadde08ffb5de08ffbdde08ffc5de08ffcede08ffd6de08ffdede08ffe6de08ffefde08fff7de08ffffde08ff00e608ff08e608ff10e608ff19e608ff21e608ff29e608ff31e608ff3ae608ff42e608ff4ae608ff52e608ff5ae608ff63e608ff6be608ff73e608ff7be608ff84e608ff8ce608ff94e608ff9ce608ffa5e608ffade608ffb5e608ffbde608ffc5e608ffcee608ffd6e608ffdee608ffe6e608ffefe608fff7e608ffffe608ff00ef08ff08ef08ff10ef08ff19ef08ff21ef08ff29ef08ff31ef08ff3aef08ff42ef08ff4aef08ff52ef08ff5aef08ff63ef08ff6bef08ff73ef08ff7bef08ff84ef08ff8cef08ff94ef08ff9cef08ffa5ef08ffadef08ffb5ef08ffbdef08ffc5ef08ffceef08ffd6ef08ffdeef08ffe6ef08ffefef08fff7ef08ffffef08ff00f708ff08f708ff10f708ff19f708ff21f708ff29f708ff31f708ff3af708ff42f708ff4af708ff52f708ff5af708ff63f708ff6bf708ff73f708ff7bf708ff84f708ff8cf708ff94f708ff9cf708ffa5f708ffadf708ffb5f708ffbdf708ffc5f708ffcef708ffd6f708ffdef708ffe6f708ffeff708fff7f708fffff708ff00ff08ff08ff08ff10ff08ff19ff08ff21ff08ff29ff08ff31ff08ff3aff08ff42ff08ff4aff08ff52ff08ff5aff08ff63ff08ff6bff08ff73ff08ff7bff08ff84ff08ff8cff08ff94ff08ff9cff08ffa5ff08ffadff08ffb5ff08ffbdff08ffc5ff08ffceff08ffd6ff08ffdeff08ffe6ff08ffefff08fff7ff08ffffff08ff000010ff080010ff100010ff190010ff210010ff290010ff310010ff3a0010ff420010ff4a0010ff520010ff5a0010ff630010ff6b0010ff730010ff7b0010ff840010ff8c0010ff940010ff9c0010ffa50010ffad0010ffb50010ffbd0010ffc50010ffce0010ffd60010ffde0010ffe60010ffef0010fff70010ffff0010ff000810ff080810ff100810ff190810ff210810ff290810ff310810ff3a0810ff420810ff4a0810ff520810ff5a0810ff630810ff6b0810ff730810ff7b0810ff840810ff8c0810ff940810ff9c0810ffa50810ffad0810ffb50810ffbd0810ffc50810ffce0810ffd60810ffde0810ffe60810ffef0810fff70810ffff0810ff001010ff081010ff101010ff191010ff211010ff291010ff311010ff3a1010ff421010ff4a1010ff521010ff5a1010ff631010ff6b1010ff731010ff7b1010ff841010ff8c1010ff941010ff9c1010ffa51010ffad1010ffb51010ffbd1010ffc51010ffce1010ffd61010ffde1010ffe61010ffef1010fff71010ffff1010ff001910ff081910ff101910ff191910ff211910ff291910ff311910ff3a1910ff421910ff4a1910ff521910ff5a1910ff631910ff6b1910ff731910ff7b1910ff841910ff8c1910ff941910ff9c1910ffa51910ffad1910ffb51910ffbd1910ffc51910ffce1910ffd61910ffde1910ffe61910ffef1910fff71910ffff1910ff002110ff082110ff102110ff192110ff212110ff292110ff312110ff3a2110ff422110ff4a2110ff522110ff5a2110ff632110ff6b2110ff732110ff7b2110ff842110ff8c2110ff942110ff9c2110ffa52110ffad2110ffb52110ffbd2110ffc52110ffce2110ffd62110ffde2110ffe62110ffef2110fff72110ffff2110ff002910ff082910ff102910ff192910ff212910ff292910ff312910ff3a2910ff422910ff4a2910ff522910ff5a2910ff632910ff6b2910ff732910ff7b2910ff842910ff8c2910ff942910ff9c2910ffa52910ffad2910ffb52910ffbd2910ffc52910ffce2910ffd62910ffde2910ffe62910ffef2910fff72910ffff2910ff003110ff083110ff103110ff193110ff213110ff293110ff313110ff3a3110ff423110ff4a3110ff523110ff5a3110ff633110ff6b3110ff733110ff7b3110ff843110ff8c3110ff943110ff9c3110ffa53110ffad3110ffb53110ffbd3110ffc53110ffce3110ffd63110ffde3110ffe63110ffef3110fff73110ffff3110ff003a10ff083a10ff103a10ff193a10ff213a10ff293a10ff313a10ff3a3a10ff423a10ff4a3a10ff523a10ff5a3a10ff633a10ff6b3a10ff733a10ff7b3a10ff843a10ff8c3a10ff943a10ff9c3a10ffa53a10ffad3a10ffb53a10ffbd3a10ffc53a10ffce3a10ffd63a10ffde3a10ffe63a10ffef3a10fff73a10ffff3a10ff004210ff084210ff104210ff194210ff214210ff294210ff314210ff3a4210ff424210ff4a4210ff524210ff5a4210ff634210ff6b4210ff734210ff7b4210ff844210ff8c4210ff944210ff9c4210ffa54210ffad4210ffb54210ffbd4210ffc54210ffce4210ffd64210ffde4210ffe64210ffef4210fff74210ffff4210ff004a10ff084a10ff104a10ff194a10ff214a10ff294a10ff314a10ff3a4a10ff424a10ff4a4a10ff524a10ff5a4a10ff634a10ff6b4a10ff734a10ff7b4a10ff844a10ff8c4a10ff944a10ff9c4a10ffa54a10ffad4a10ffb54a10ffbd4a10ffc54a10ffce4a10ffd64a10ffde4a10ffe64a10ffef4a10fff74a10ffff4a10ff005210ff085210ff105210ff195210ff215210ff295210ff315210ff3a5210ff425210ff4a5210ff525210ff5a5210ff635210ff6b5210ff735210ff7b5210ff845210ff8c5210ff945210ff9c5210ffa55210ffad5210ffb55210ffbd5210ffc55210ffce5210ffd65210ffde5210ffe65210ffef5210fff75210ffff5210ff005a10ff085a10ff105a10ff195a10ff215a10ff295a10ff315a10ff3a5a10ff425a10ff4a5a10ff525a10ff5a5a10ff635a10ff6b5a10ff735a10ff7b5a10ff845a10ff8c5a10ff945a10ff9c5a10ffa55a10ffad5a10ffb55a10ffbd5a10ffc55a10ffce5a10ffd65a10ffde5a10ffe65a10ffef5a10fff75a10ffff5a10ff006310ff086310ff106310ff196310ff216310ff296310ff316310ff3a6310ff426310ff4a6310ff526310ff5a6310ff636310ff6b6310ff736310ff7b6310ff846310ff8c6310ff946310ff9c6310ffa56310ffad6310ffb56310ffbd6310ffc56310ffce6310ffd66310ffde6310ffe66310ffef6310fff76310ffff6310ff006b10ff086b10ff106b10ff196b10ff216b10ff296b10ff316b10ff3a6b10ff426b10ff4a6b10ff526b10ff5a6b10ff636b10ff6b6b10ff736b10ff7b6b10ff846b10ff8c6b10ff946b10ff9c6b10ffa56b10ffad6b10ffb56b10ffbd6b10ffc56b10ffce6b10ffd66b10ffde6b10ffe66b10ffef6b10fff76b10ffff6b10ff007310ff087310ff107310ff197310ff217310ff297310ff317310ff3a7310ff427310ff4a7310ff527310ff5a7310ff637310ff6b7310ff737310ff7b7310ff847310ff8c7310ff947310ff9c7310ffa57310ffad7310ffb57310ffbd7310ffc57310ffce7310ffd67310ffde7310ffe67310ffef7310fff77310ffff7310ff007b10ff087b10ff107b10ff197b10ff217b10ff297b10ff317b10ff3a7b10ff427b10ff4a7b10ff527b10ff5a7b10ff637b10ff6b7b10ff737b10ff7b7b10ff847b10ff8c7b10ff947b10ff9c7b10ffa57b10ffad7b10ffb57b10ffbd7b10ffc57b10ffce7b10ffd67b10ffde7b10ffe67b10ffef7b10fff77b10ffff7b10ff008410ff088410ff108410ff198410ff218410ff298410ff318410ff3a8410ff428410ff4a8410ff528410ff5a8410ff638410ff6b8410ff738410ff7b8410ff848410ff8c8410ff948410ff9c8410ffa58410ffad8410ffb58410ffbd8410ffc58410ffce8410ffd68410ffde8410ffe68410ffef8410fff78410ffff8410ff008c10ff088c10ff108c10ff198c10ff218c10ff298c10ff318c10ff3a8c10ff428c10ff4a8c10ff528c10ff5a8c10ff638c10ff6b8c10ff738c10ff7b8c10ff848c10ff8c8c10ff948c10ff9c8c10ffa58c10ffad8c10ffb58c10ffbd8c10ffc58c10ffce8c10ffd68c10ffde8c10ffe68c10ffef8c10fff78c10ffff8c10ff009410ff089410ff109410ff199410ff219410ff299410ff319410ff3a9410ff429410ff4a9410ff529410ff5a9410ff639410ff6b9410ff739410ff7b9410ff849410ff8c9410ff949410ff9c9410ffa59410ffad9410ffb59410ffbd9410ffc59410ffce9410ffd69410ffde9410ffe69410ffef9410fff79410ffff9410ff009c10ff089c10ff109c10ff199c10ff219c10ff299c10ff319c10ff3a9c10ff429c10ff4a9c10ff529c10ff5a9c10ff639c10ff6b9c10ff739c10ff7b9c10ff849c10ff8c9c10ff949c10ff9c9c10ffa59c10ffad9c10ffb59c10ffbd9c10ffc59c10ffce9c10ffd69c10ffde9c10ffe69c10ffef9c10fff79c10ffff9c10ff00a510ff08a510ff10a510ff19a510ff21a510ff29a510ff31a510ff3aa510ff42a510ff4aa510ff52a510ff5aa510ff63a510ff6ba510ff73a510ff7ba510ff84a510ff8ca510ff94a510ff9ca510ffa5a510ffada510ffb5a510ffbda510ffc5a510ffcea510ffd6a510ffdea510ffe6a510ffefa510fff7a510ffffa510ff00ad10ff08ad10ff10ad10ff19ad10ff21ad10ff29ad10ff31ad10ff3aad10ff42ad10ff4aad10ff52ad10ff5aad10ff63ad10ff6bad10ff73ad10ff7bad10ff84ad10ff8cad10ff94ad10ff9cad10ffa5ad10ffadad10ffb5ad10ffbdad10ffc5ad10ffcead10ffd6ad10ffdead10ffe6ad10ffefad10fff7ad10ffffad10ff00b510ff08b510ff10b510ff19b510ff21b510ff29b510ff31b510ff3ab510ff42b510ff4ab510ff52b510ff5ab510ff63b510ff6bb510ff73b510ff7bb510ff84b510ff8cb510ff94b510ff9cb510ffa5b510ffadb510ffb5b510ffbdb510ffc5b510ffceb510ffd6b510ffdeb510ffe6b510ffefb510fff7b510ffffb510ff00bd10ff08bd10ff10bd10ff19bd10ff21bd10ff29bd10ff31bd10ff3abd10ff42bd10ff4abd10ff52bd10ff5abd10ff63bd10ff6bbd10ff73bd10ff7bbd10ff84bd10ff8cbd10ff94bd10ff9cbd10ffa5bd10ffadbd10ffb5bd10ffbdbd10ffc5bd10ffcebd10ffd6bd10ffdebd10ffe6bd10ffefbd10fff7bd10ffffbd10ff00c510ff08c510ff10c510ff19c510ff21c510ff29c510ff31c510ff3ac510ff42c510ff4ac510ff52c510ff5ac510ff63c510ff6bc510ff73c510ff7bc510ff84c510ff8cc510ff94c510ff9cc510ffa5c510ffadc510ffb5c510ffbdc510ffc5c510ffcec510ffd6c510ffdec510ffe6c510ffefc510fff7c510ffffc510ff00ce10ff08ce10ff10ce10ff19ce10ff21ce10ff29ce10ff31ce10ff3ace10ff42ce10ff4ace10ff52ce10ff5ace10ff63ce10ff6bce10ff73ce10ff7bce10ff84ce10ff8cce10ff94ce10ff9cce10ffa5ce10ffadce10ffb5ce10ffbdce10ffc5ce10ffcece10ffd6ce10ffdece10ffe6ce10ffefce10fff7ce10ffffce10ff00d610ff08d610ff10d610ff19d610ff21d610ff29d610ff31d610ff3ad610ff42d610ff4ad610ff52d610ff5ad610ff63d610ff6bd610ff73d610ff7bd610ff84d610ff8cd610ff94d610ff9cd610ffa5d610ffadd610ffb5d610ffbdd610ffc5d610ffced610ffd6d610ffded610ffe6d610ffefd610fff7d610ffffd610ff00de10ff08de10ff10de10ff19de10ff21de10ff29de10ff31de10ff3ade10ff42de10ff4ade10ff52de10ff5ade10ff63de10ff6bde10ff73de10ff7bde10ff84de10ff8cde10ff94de10ff9cde10ffa5de10ffadde10ffb5de10ffbdde10ffc5de10ffcede10ffd6de10ffdede10ffe6de10ffefde10fff7de10ffffde10ff00e610ff08e610ff10e610ff19e610ff21e610ff29e610ff31e610ff3ae610ff42e610ff4ae610ff52e610ff5ae610ff63e610ff6be610ff73e610ff7be610ff84e610ff8ce610ff94e610ff9ce610ffa5e610ffade610ffb5e610ffbde610ffc5e610ffcee610ffd6e610ffdee610ffe6e610ffefe610fff7e610ffffe610ff00ef10ff08ef10ff10ef10ff19ef10ff21ef10ff29ef10ff31ef10ff3aef10ff42ef10ff4aef10ff52ef10ff5aef10ff63ef10ff6bef10ff73ef10ff7bef10ff84ef10ff8cef10ff94ef10ff9cef10ffa5ef10ffadef10ffb5ef10ffbdef10ffc5ef10ffceef10ffd6ef10ffdeef10ffe6ef10ffefef10fff7ef10ffffef10ff00f710ff08f710ff10f710ff19f710ff21f710ff29f710ff31f710ff3af710ff42f710ff4af710ff52f710ff5af710ff63f710ff6bf710ff73f710ff7bf710ff84f710ff8cf710ff94f710ff9cf710ffa5f710ffadf710ffb5f710ffbdf710ffc5f710ffcef710ffd6f710ffdef710ffe6f710ffeff710fff7f710fffff710ff00ff10ff08ff10ff10ff10ff19ff10ff21ff10ff29ff10ff31ff10ff3aff10ff42ff10ff4aff10ff52ff10ff5aff10ff63ff10ff6bff10ff73ff10ff7bff10ff84ff10ff8cff10ff94ff10ff9cff10ffa5ff10ffadff10ffb5ff10ffbdff10ffc5ff10ffceff10ffd6ff10ffdeff10ffe6ff10ffefff10fff7ff10ffffff10ff000019ff080019ff100019ff190019ff210019ff290019ff310019ff3a0019ff420019ff4a0019ff520019ff5a0019ff630019ff6b0019ff730019ff7b0019ff840019ff8c0019ff940019ff9c0019ffa50019ffad0019ffb50019ffbd0019ffc50019ffce0019ffd60019ffde0019ffe60019ffef0019fff70019ffff0019ff000819ff080819ff100819ff190819ff210819ff290819ff310819ff3a0819ff420819ff4a0819ff520819ff5a0819ff630819ff6b0819ff730819ff7b0819ff840819ff8c0819ff940819ff9c0819ffa50819ffad0819ffb50819ffbd0819ffc50819ffce0819ffd60819ffde0819ffe60819ffef0819fff70819ffff0819ff001019ff081019ff101019ff191019ff211019ff291019ff311019ff3a1019ff421019ff4a1019ff521019ff5a1019ff631019ff6b1019ff731019ff7b1019ff841019ff8c1019ff941019ff9c1019ffa51019ffad1019ffb51019ffbd1019ffc51019ffce1019ffd61019ffde1019ffe61019ffef1019fff71019ffff1019ff001919ff081919ff101919ff191919ff211919ff291919ff311919ff3a1919ff421919ff4a1919ff521919ff5a1919ff631919ff6b1919ff731919ff7b1919ff841919ff8c1919ff941919ff9c1919ffa51919ffad1919ffb51919ffbd1919ffc51919ffce1919ffd61919ffde1919ffe61919ffef1919fff71919ffff1919ff002119ff082119ff102119ff192119ff212119ff292119ff312119ff3a2119ff422119ff4a2119ff522119ff5a2119ff632119ff6b2119ff732119ff7b2119ff842119ff8c2119ff942119ff9c2119ffa52119ffad2119ffb52119ffbd2119ffc52119ffce2119ffd62119ffde2119ffe62119ffef2119fff72119ffff2119ff002919ff082919ff102919ff192919ff212919ff292919ff312919ff3a2919ff422919ff4a2919ff522919ff5a2919ff632919ff6b2919ff732919ff7b2919ff842919ff8c2919ff942919ff9c2919ffa52919ffad2919ffb52919ffbd2919ffc52919ffce2919ffd62919ffde2919ffe62919ffef2919fff72919ffff2919ff003119ff083119ff103119ff193119ff213119ff293119ff313119ff3a3119ff423119ff4a3119ff523119ff5a3119ff633119ff6b3119ff733119ff7b3119ff843119ff8c3119ff943119ff9c3119ffa53119ffad3119ffb53119ffbd3119ffc53119ffce3119ffd63119ffde3119ffe63119ffef3119fff73119ffff3119ff003a19ff083a19ff103a19ff193a19ff213a19ff293a19ff313a19ff3a3a19ff423a19ff4a3a19ff523a19ff5a3a19ff633a19ff6b3a19ff733a19ff7b3a19ff843a19ff8c3a19ff943a19ff9c3a19ffa53a19ffad3a19ffb53a19ffbd3a19ffc53a19ffce3a19ffd63a19ffde3a19ffe63a19ffef3a19fff73a19ffff3a19ff004219ff084219ff104219ff194219ff214219ff294219ff314219ff3a4219ff424219ff4a4219ff524219ff5a4219ff634219ff6b4219ff734219ff7b4219ff844219ff8c4219ff944219ff9c4219ffa54219ffad4219ffb54219ffbd4219ffc54219ffce4219ffd64219ffde4219ffe64219ffef4219fff74219ffff4219ff004a19ff084a19ff104a19ff194a19ff214a19ff294a19ff314a19ff3a4a19ff424a19ff4a4a19ff524a19ff5a4a19ff634a19ff6b4a19ff734a19ff7b4a19ff844a19ff8c4a19ff944a19ff9c4a19ffa54a19ffad4a19ffb54a19ffbd4a19ffc54a19ffce4a19ffd64a19ffde4a19ffe64a19ffef4a19fff74a19ffff4a19ff005219ff085219ff105219ff195219ff215219ff295219ff315219ff3a5219ff425219ff4a5219ff525219ff5a5219ff635219ff6b5219ff735219ff7b5219ff845219ff8c5219ff945219ff9c5219ffa55219ffad5219ffb55219ffbd5219ffc55219ffce5219ffd65219ffde5219ffe65219ffef5219fff75219ffff5219ff005a19ff085a19ff105a19ff195a19ff215a19ff295a19ff315a19ff3a5a19ff425a19ff4a5a19ff525a19ff5a5a19ff635a19ff6b5a19ff735a19ff7b5a19ff845a19ff8c5a19ff945a19ff9c5a19ffa55a19ffad5a19ffb55a19ffbd5a19ffc55a19ffce5a19ffd65a19ffde5a19ffe65a19ffef5a19fff75a19ffff5a19ff006319ff086319ff106319ff196319ff216319ff296319ff316319ff3a6319ff426319ff4a6319ff526319ff5a6319ff636319ff6b6319ff736319ff7b6319ff846319ff8c6319ff946319ff9c6319ffa56319ffad6319ffb56319ffbd6319ffc56319ffce6319ffd66319ffde6319ffe66319ffef6319fff76319ffff6319ff006b19ff086b19ff106b19ff196b19ff216b19ff296b19ff316b19ff3a6b19ff426b19ff4a6b19ff526b19ff5a6b19ff636b19ff6b6b19ff736b19ff7b6b19ff846b19ff8c6b19ff946b19ff9c6b19ffa56b19ffad6b19ffb56b19ffbd6b19ffc56b19ffce6b19ffd66b19ffde6b19ffe66b19ffef6b19fff76b19ffff6b19ff007319ff087319ff107319ff197319ff217319ff297319ff317319ff3a7319ff427319ff4a7319ff527319ff5a7319ff637319ff6b7319ff737319ff7b7319ff847319ff8c7319ff947319ff9c7319ffa57319ffad7319ffb57319ffbd7319ffc57319ffce7319ffd67319ffde7319ffe67319ffef7319fff77319ffff7319ff007b19ff087b19ff107b19ff197b19ff217b19ff297b19ff317b19ff3a7b19ff427b19ff4a7b19ff527b19ff5a7b19ff637b19ff6b7b19ff737b19ff7b7b19ff847b19ff8c7b19ff947b19ff9c7b19ffa57b19ffad7b19ffb57b19ffbd7b19ffc57b19ffce7b19ffd67b19ffde7b19ffe67b19ffef7b19fff77b19ffff7b19ff008419ff088419ff108419ff198419ff218419ff298419ff318419ff3a8419ff428419ff4a8419ff528419ff5a8419ff638419ff6b8419ff738419ff7b8419ff848419ff8c8419ff948419ff9c8419ffa58419ffad8419ffb58419ffbd8419ffc58419ffce8419ffd68419ffde8419ffe68419ffef8419fff78419ffff8419ff008c19ff088c19ff108c19ff198c19ff218c19ff298c19ff318c19ff3a8c19ff428c19ff4a8c19ff528c19ff5a8c19ff638c19ff6b8c19ff738c19ff7b8c19ff848c19ff8c8c19ff948c19ff9c8c19ffa58c19ffad8c19ffb58c19ffbd8c19ffc58c19ffce8c19ffd68c19ffde8c19ffe68c19ffef8c19fff78c19ffff8c19ff009419ff089419ff109419ff199419ff219419ff299419ff319419ff3a9419ff429419ff4a9419ff529419ff5a9419ff639419ff6b9419ff739419ff7b9419ff849419ff8c9419ff949419ff9c9419ffa59419ffad9419ffb59419ffbd9419ffc59419ffce9419ffd69419ffde9419ffe69419ffef9419fff79419ffff9419ff009c19ff089c19ff109c19ff199c19ff219c19ff299c19ff319c19ff3a9c19ff429c19ff4a9c19ff529c19ff5a9c19ff639c19ff6b9c19ff739c19ff7b9c19ff849c19ff8c9c19ff949c19ff9c9c19ffa59c19ffad9c19ffb59c19ffbd9c19ffc59c19ffce9c19ffd69c19ffde9c19ffe69c19ffef9c19fff79c19ffff9c19ff00a519ff08a519ff10a519ff19a519ff21a519ff29a519ff31a519ff3aa519ff42a519ff4aa519ff52a519ff5aa519ff63a519ff6ba519ff73a519ff7ba519ff84a519ff8ca519ff94a519ff9ca519ffa5a519ffada519ffb5a519ffbda519ffc5a519ffcea519ffd6a519ffdea519ffe6a519ffefa519fff7a519ffffa519ff00ad19ff08ad19ff10ad19ff19ad19ff21ad19ff29ad19ff31ad19ff3aad19ff42ad19ff4aad19ff52ad19ff5aad19ff63ad19ff6bad19ff73ad19ff7bad19ff84ad19ff8cad19ff94ad19ff9cad19ffa5ad19ffadad19ffb5ad19ffbdad19ffc5ad19ffcead19ffd6ad19ffdead19ffe6ad19ffefad19fff7ad19ffffad19ff00b519ff08b519ff10b519ff19b519ff21b519ff29b519ff31b519ff3ab519ff42b519ff4ab519ff52b519ff5ab519ff63b519ff6bb519ff73b519ff7bb519ff84b519ff8cb519ff94b519ff9cb519ffa5b519ffadb519ffb5b519ffbdb519ffc5b519ffceb519ffd6b519ffdeb519ffe6b519ffefb519fff7b519ffffb519ff00bd19ff08bd19ff10bd19ff19bd19ff21bd19ff29bd19ff31bd19ff3abd19ff42bd19ff4abd19ff52bd19ff5abd19ff63bd19ff6bbd19ff73bd19ff7bbd19ff84bd19ff8cbd19ff94bd19ff9cbd19ffa5bd19ffadbd19ffb5bd19ffbdbd19ffc5bd19ffcebd19ffd6bd19ffdebd19ffe6bd19ffefbd19fff7bd19ffffbd19ff00c519ff08c519ff10c519ff19c519ff21c519ff29c519ff31c519ff3ac519ff42c519ff4ac519ff52c519ff5ac519ff63c519ff6bc519ff73c519ff7bc519ff84c519ff8cc519ff94c519ff9cc519ffa5c519ffadc519ffb5c519ffbdc519ffc5c519ffcec519ffd6c519ffdec519ffe6c519ffefc519fff7c519ffffc519ff00ce19ff08ce19ff10ce19ff19ce19ff21ce19ff29ce19ff31ce19ff3ace19ff42ce19ff4ace19ff52ce19ff5ace19ff63ce19ff6bce19ff73ce19ff7bce19ff84ce19ff8cce19ff94ce19ff9cce19ffa5ce19ffadce19ffb5ce19ffbdce19ffc5ce19ffcece19ffd6ce19ffdece19ffe6ce19ffefce19fff7ce19ffffce19ff00d619ff08d619ff10d619ff19d619ff21d619ff29d619ff31d619ff3ad619ff42d619ff4ad619ff52d619ff5ad619ff63d619ff6bd619ff73d619ff7bd619ff84d619ff8cd619ff94d619ff9cd619ffa5d619ffadd619ffb5d619ffbdd619ffc5d619ffced619ffd6d619ffded619ffe6d619ffefd619fff7d619ffffd619ff00de19ff08de19ff10de19ff19de19ff21de19ff29de19ff31de19ff3ade19ff42de19ff4ade19ff52de19ff5ade19ff63de19ff6bde19ff73de19ff7bde19ff84de19ff8cde19ff94de19ff9cde19ffa5de19ffadde19ffb5de19ffbdde19ffc5de19ffcede19ffd6de19ffdede19ffe6de19ffefde19fff7de19ffffde19ff00e619ff08e619ff10e619ff19e619ff21e619ff29e619ff31e619ff3ae619ff42e619ff4ae619ff52e619ff5ae619ff63e619ff6be619ff73e619ff7be619ff84e619ff8ce619ff94e619ff9ce619ffa5e619ffade619ffb5e619ffbde619ffc5e619ffcee619ffd6e619ffdee619ffe6e619ffefe619fff7e619ffffe619ff00ef19ff08ef19ff10ef19ff19ef19ff21ef19ff29ef19ff31ef19ff3aef19ff42ef19ff4aef19ff52ef19ff5aef19ff63ef19ff6bef19ff73ef19ff7bef19ff84ef19ff8cef19ff94ef19ff9cef19ffa5ef19ffadef19ffb5ef19ffbdef19ffc5ef19ffceef19ffd6ef19ffdeef19ffe6ef19ffefef19fff7ef19ffffef19ff00f719ff08f719ff10f719ff19f719ff21f719ff29f719ff31f719ff3af719ff42f719ff4af719ff52f719ff5af719ff63f719ff6bf719ff73f719ff7bf719ff84f719ff8cf719ff94f719ff9cf719ffa5f719ffadf719ffb5f719ffbdf719ffc5f719ffcef719ffd6f719ffdef719ffe6f719ffeff719fff7f719fffff719ff00ff19ff08ff19ff10ff19ff19ff19ff21ff19ff29ff19ff31ff19ff3aff19ff42ff19ff4aff19ff52ff19ff5aff19ff63ff19ff6bff19ff73ff19ff7bff19ff84ff19ff8cff19ff94ff19ff9cff19ffa5ff19ffadff19ffb5ff19ffbdff19ffc5ff19ffceff19ffd6ff19ffdeff19ffe6ff19ffefff19fff7ff19ffffff19ff000021ff080021ff100021ff190021ff210021ff290021ff310021ff3a0021ff420021ff4a0021ff520021ff5a0021ff630021ff6b0021ff730021ff7b0021ff840021ff8c0021ff940021ff9c0021ffa50021ffad0021ffb50021ffbd0021ffc50021ffce0021ffd60021ffde0021ffe60021ffef0021fff70021ffff0021ff000821ff080821ff100821ff190821ff210821ff290821ff310821ff3a0821ff420821ff4a0821ff520821ff5a0821ff630821ff6b0821ff730821ff7b0821ff840821ff8c0821ff940821ff9c0821ffa50821ffad0821ffb50821ffbd0821ffc50821ffce0821ffd60821ffde0821ffe60821ffef0821fff70821ffff0821ff001021ff081021ff101021ff191021ff211021ff291021ff311021ff3a1021ff421021ff4a1021ff521021ff5a1021ff631021ff6b1021ff731021ff7b1021ff841021ff8c1021ff941021ff9c1021ffa51021ffad1021ffb51021ffbd1021ffc51021ffce1021ffd61021ffde1021ffe61021ffef1021fff71021ffff1021ff001921ff081921ff101921ff191921ff211921ff291921ff311921ff3a1921ff421921ff4a1921ff521921ff5a1921ff631921ff6b1921ff731921ff7b1921ff841921ff8c1921ff941921ff9c1921ffa51921ffad1921ffb51921ffbd1921ffc51921ffce1921ffd61921ffde1921ffe61921ffef1921fff71921ffff1921ff002121ff082121ff102121ff192121ff212121ff292121ff312121ff3a2121ff422121ff4a2121ff522121ff5a2121ff632121ff6b2121ff732121ff7b2121ff842121ff8c2121ff942121ff9c2121ffa52121ffad2121ffb52121ffbd2121ffc52121ffce2121ffd62121ffde2121ffe62121ffef2121fff72121ffff2121ff002921ff082921ff102921ff192921ff212921ff292921ff312921ff3a2921ff422921ff4a2921ff522921ff5a2921ff632921ff6b2921ff732921ff7b2921ff842921ff8c2921ff942921ff9c2921ffa52921ffad2921ffb52921ffbd2921ffc52921ffce2921ffd62921ffde2921ffe62921ffef2921fff72921ffff2921ff003121ff083121ff103121ff193121ff213121ff293121ff313121ff3a3121ff423121ff4a3121ff523121ff5a3121ff633121ff6b3121ff733121ff7b3121ff843121ff8c3121ff943121ff9c3121ffa53121ffad3121ffb53121ffbd3121ffc53121ffce3121ffd63121ffde3121ffe63121ffef3121fff73121ffff3121ff003a21ff083a21ff103a21ff193a21ff213a21ff293a21ff313a21ff3a3a21ff423a21ff4a3a21ff523a21ff5a3a21ff633a21ff6b3a21ff733a21ff7b3a21ff843a21ff8c3a21ff943a21ff9c3a21ffa53a21ffad3a21ffb53a21ffbd3a21ffc53a21ffce3a21ffd63a21ffde3a21ffe63a21ffef3a21fff73a21ffff3a21ff004221ff084221ff104221ff194221ff214221ff294221ff314221ff3a4221ff424221ff4a4221ff524221ff5a4221ff634221ff6b4221ff734221ff7b4221ff844221ff8c4221ff944221ff9c4221ffa54221ffad4221ffb54221ffbd4221ffc54221ffce4221ffd64221ffde4221ffe64221ffef4221fff74221ffff4221ff004a21ff084a21ff104a21ff194a21ff214a21ff294a21ff314a21ff3a4a21ff424a21ff4a4a21ff524a21ff5a4a21ff634a21ff6b4a21ff734a21ff7b4a21ff844a21ff8c4a21ff944a21ff9c4a21ffa54a21ffad4a21ffb54a21ffbd4a21ffc54a21ffce4a21ffd64a21ffde4a21ffe64a21ffef4a21fff74a21ffff4a21ff005221ff085221ff105221ff195221ff215221ff295221ff315221ff3a5221ff425221ff4a5221ff525221ff5a5221ff635221ff6b5221ff735221ff7b5221ff845221ff8c5221ff945221ff9c5221ffa55221ffad5221ffb55221ffbd5221ffc55221ffce5221ffd65221ffde5221ffe65221ffef5221fff75221ffff5221ff005a21ff085a21ff105a21ff195a21ff215a21ff295a21ff315a21ff3a5a21ff425a21ff4a5a21ff525a21ff5a5a21ff635a21ff6b5a21ff735a21ff7b5a21ff845a21ff8c5a21ff945a21ff9c5a21ffa55a21ffad5a21ffb55a21ffbd5a21ffc55a21ffce5a21ffd65a21ffde5a21ffe65a21ffef5a21fff75a21ffff5a21ff006321ff086321ff106321ff196321ff216321ff296321ff316321ff3a6321ff426321ff4a6321ff526321ff5a6321ff636321ff6b6321ff736321ff7b6321ff846321ff8c6321ff946321ff9c6321ffa56321ffad6321ffb56321ffbd6321ffc56321ffce6321ffd66321ffde6321ffe66321ffef6321fff76321ffff6321ff006b21ff086b21ff106b21ff196b21ff216b21ff296b21ff316b21ff3a6b21ff426b21ff4a6b21ff526b21ff5a6b21ff636b21ff6b6b21ff736b21ff7b6b21ff846b21ff8c6b21ff946b21ff9c6b21ffa56b21ffad6b21ffb56b21ffbd6b21ffc56b21ffce6b21ffd66b21ffde6b21ffe66b21ffef6b21fff76b21ffff6b21ff007321ff087321ff107321ff197321ff217321ff297321ff317321ff3a7321ff427321ff4a7321ff527321ff5a7321ff637321ff6b7321ff737321ff7b7321ff847321ff8c7321ff947321ff9c7321ffa57321ffad7321ffb57321ffbd7321ffc57321ffce7321ffd67321ffde7321ffe67321ffef7321fff77321ffff7321ff007b21ff087b21ff107b21ff197b21ff217b21ff297b21ff317b21ff3a7b21ff427b21ff4a7b21ff527b21ff5a7b21ff637b21ff6b7b21ff737b21ff7b7b21ff847b21ff8c7b21ff947b21ff9c7b21ffa57b21ffad7b21ffb57b21ffbd7b21ffc57b21ffce7b21ffd67b21ffde7b21ffe67b21ffef7b21fff77b21ffff7b21ff008421ff088421ff108421ff198421ff218421ff298421ff318421ff3a8421ff428421ff4a8421ff528421ff5a8421ff638421ff6b8421ff738421ff7b8421ff848421ff8c8421ff948421ff9c8421ffa58421ffad8421ffb58421ffbd8421ffc58421ffce8421ffd68421ffde8421ffe68421ffef8421fff78421ffff8421ff008c21ff088c21ff108c21ff198c21ff218c21ff298c21ff318c21ff3a8c21ff428c21ff4a8c21ff528c21ff5a8c21ff638c21ff6b8c21ff738c21ff7b8c21ff848c21ff8c8c21ff948c21ff9c8c21ffa58c21ffad8c21ffb58c21ffbd8c21ffc58c21ffce8c21ffd68c21ffde8c21ffe68c21ffef8c21fff78c21ffff8c21ff009421ff089421ff109421ff199421ff219421ff299421ff319421ff3a9421ff429421ff4a9421ff529421ff5a9421ff639421ff6b9421ff739421ff7b9421ff849421ff8c9421ff949421ff9c9421ffa59421ffad9421ffb59421ffbd9421ffc59421ffce9421ffd69421ffde9421ffe69421ffef9421fff79421ffff9421ff009c21ff089c21ff109c21ff199c21ff219c21ff299c21ff319c21ff3a9c21ff429c21ff4a9c21ff529c21ff5a9c21ff639c21ff6b9c21ff739c21ff7b9c21ff849c21ff8c9c21ff949c21ff9c9c21ffa59c21ffad9c21ffb59c21ffbd9c21ffc59c21ffce9c21ffd69c21ffde9c21ffe69c21ffef9c21fff79c21ffff9c21ff00a521ff08a521ff10a521ff19a521ff21a521ff29a521ff31a521ff3aa521ff42a521ff4aa521ff52a521ff5aa521ff63a521ff6ba521ff73a521ff7ba521ff84a521ff8ca521ff94a521ff9ca521ffa5a521ffada521ffb5a521ffbda521ffc5a521ffcea521ffd6a521ffdea521ffe6a521ffefa521fff7a521ffffa521ff00ad21ff08ad21ff10ad21ff19ad21ff21ad21ff29ad21ff31ad21ff3aad21ff42ad21ff4aad21ff52ad21ff5aad21ff63ad21ff6bad21ff73ad21ff7bad21ff84ad21ff8cad21ff94ad21ff9cad21ffa5ad21ffadad21ffb5ad21ffbdad21ffc5ad21ffcead21ffd6ad21ffdead21ffe6ad21ffefad21fff7ad21ffffad21ff00b521ff08b521ff10b521ff19b521ff21b521ff29b521ff31b521ff3ab521ff42b521ff4ab521ff52b521ff5ab521ff63b521ff6bb521ff73b521ff7bb521ff84b521ff8cb521ff94b521ff9cb521ffa5b521ffadb521ffb5b521ffbdb521ffc5b521ffceb521ffd6b521ffdeb521ffe6b521ffefb521fff7b521ffffb521ff00bd21ff08bd21ff10bd21ff19bd21ff21bd21ff29bd21ff31bd21ff3abd21ff42bd21ff4abd21ff52bd21ff5abd21ff63bd21ff6bbd21ff73bd21ff7bbd21ff84bd21ff8cbd21ff94bd21ff9cbd21ffa5bd21ffadbd21ffb5bd21ffbdbd21ffc5bd21ffcebd21ffd6bd21ffdebd21ffe6bd21ffefbd21fff7bd21ffffbd21ff00c521ff08c521ff10c521ff19c521ff21c521ff29c521ff31c521ff3ac521ff42c521ff4ac521ff52c521ff5ac521ff63c521ff6bc521ff73c521ff7bc521ff84c521ff8cc521ff94c521ff9cc521ffa5c521ffadc521ffb5c521ffbdc521ffc5c521ffcec521ffd6c521ffdec521ffe6c521ffefc521fff7c521ffffc521ff00ce21ff08ce21ff10ce21ff19ce21ff21ce21ff29ce21ff31ce21ff3ace21ff42ce21ff4ace21ff52ce21ff5ace21ff63ce21ff6bce21ff73ce21ff7bce21ff84ce21ff8cce21ff94ce21ff9cce21ffa5ce21ffadce21ffb5ce21ffbdce21ffc5ce21ffcece21ffd6ce21ffdece21ffe6ce21ffefce21fff7ce21ffffce21ff00d621ff08d621ff10d621ff19d621ff21d621ff29d621ff31d621ff3ad621ff42d621ff4ad621ff52d621ff5ad621ff63d621ff6bd621ff73d621ff7bd621ff84d621ff8cd621ff94d621ff9cd621ffa5d621ffadd621ffb5d621ffbdd621ffc5d621ffced621ffd6d621ffded621ffe6d621ffefd621fff7d621ffffd621ff00de21ff08de21ff10de21ff19de21ff21de21ff29de21ff31de21ff3ade21ff42de21ff4ade21ff52de21ff5ade21ff63de21ff6bde21ff73de21ff7bde21ff84de21ff8cde21ff94de21ff9cde21ffa5de21ffadde21ffb5de21ffbdde21ffc5de21ffcede21ffd6de21ffdede21ffe6de21ffefde21fff7de21ffffde21ff00e621ff08e621ff10e621ff19e621ff21e621ff29e621ff31e621ff3ae621ff42e621ff4ae621ff52e621ff5ae621ff63e621ff6be621ff73e621ff7be621ff84e621ff8ce621ff94e621ff9ce621ffa5e621ffade621ffb5e621ffbde621ffc5e621ffcee621ffd6e621ffdee621ffe6e621ffefe621fff7e621ffffe621ff00ef21ff08ef21ff10ef21ff19ef21ff21ef21ff29ef21ff31ef21ff3aef21ff42ef21ff4aef21ff52ef21ff5aef21ff63ef21ff6bef21ff73ef21ff7bef21ff84ef21ff8cef21ff94ef21ff9cef21ffa5ef21ffadef21ffb5ef21ffbdef21ffc5ef21ffceef21ffd6ef21ffdeef21ffe6ef21ffefef21fff7ef21ffffef21ff00f721ff08f721ff10f721ff19f721ff21f721ff29f721ff31f721ff3af721ff42f721ff4af721ff52f721ff5af721ff63f721ff6bf721ff73f721ff7bf721ff84f721ff8cf721ff94f721ff9cf721ffa5f721ffadf721ffb5f721ffbdf721ffc5f721ffcef721ffd6f721ffdef721ffe6f721ffeff721fff7f721fffff721ff00ff21ff08ff21ff10ff21ff19ff21ff21ff21ff29ff21ff31ff21ff3aff21ff42ff21ff4aff21ff52ff21ff5aff21ff63ff21ff6bff21ff73ff21ff7bff21ff84ff21ff8cff21ff94ff21ff9cff21ffa5ff21ffadff21ffb5ff21ffbdff21ffc5ff21ffceff21ffd6ff21ffdeff21ffe6ff21ffefff21fff7ff21ffffff21ff000029ff080029ff100029ff190029ff210029ff290029ff310029ff3a0029ff420029ff4a0029ff520029ff5a0029ff630029ff6b0029ff730029ff7b0029ff840029ff8c0029ff940029ff9c0029ffa50029ffad0029ffb50029ffbd0029ffc50029ffce0029ffd60029ffde0029ffe60029ffef0029fff70029ffff0029ff000829ff080829ff100829ff190829ff210829ff290829ff310829ff3a0829ff420829ff4a0829ff520829ff5a0829ff630829ff6b0829ff730829ff7b0829ff840829ff8c0829ff940829ff9c0829ffa50829ffad0829ffb50829ffbd0829ffc50829ffce0829ffd60829ffde0829ffe60829ffef0829fff70829ffff0829ff001029ff081029ff101029ff191029ff211029ff291029ff311029ff3a1029ff421029ff4a1029ff521029ff5a1029ff631029ff6b1029ff731029ff7b1029ff841029ff8c1029ff941029ff9c1029ffa51029ffad1029ffb51029ffbd1029ffc51029ffce1029ffd61029ffde1029ffe61029ffef1029fff71029ffff1029ff001929ff081929ff101929ff191929ff211929ff291929ff311929ff3a1929ff421929ff4a1929ff521929ff5a1929ff631929ff6b1929ff731929ff7b1929ff841929ff8c1929ff941929ff9c1929ffa51929ffad1929ffb51929ffbd1929ffc51929ffce1929ffd61929ffde1929ffe61929ffef1929fff71929ffff1929ff002129ff082129ff102129ff192129ff212129ff292129ff312129ff3a2129ff422129ff4a2129ff522129ff5a2129ff632129ff6b2129ff732129ff7b2129ff842129ff8c2129ff942129ff9c2129ffa52129ffad2129ffb52129ffbd2129ffc52129ffce2129ffd62129ffde2129ffe62129ffef2129fff72129ffff2129ff002929ff082929ff102929ff192929ff212929ff292929ff312929ff3a2929ff422929ff4a2929ff522929ff5a2929ff632929ff6b2929ff732929ff7b2929ff842929ff8c2929ff942929ff9c2929ffa52929ffad2929ffb52929ffbd2929ffc52929ffce2929ffd62929ffde2929ffe62929ffef2929fff72929ffff2929ff003129ff083129ff103129ff193129ff213129ff293129ff313129ff3a3129ff423129ff4a3129ff523129ff5a3129ff633129ff6b3129ff733129ff7b3129ff843129ff8c3129ff943129ff9c3129ffa53129ffad3129ffb53129ffbd3129ffc53129ffce3129ffd63129ffde3129ffe63129ffef3129fff73129ffff3129ff003a29ff083a29ff103a29ff193a29ff213a29ff293a29ff313a29ff3a3a29ff423a29ff4a3a29ff523a29ff5a3a29ff633a29ff6b3a29ff733a29ff7b3a29ff843a29ff8c3a29ff943a29ff9c3a29ffa53a29ffad3a29ffb53a29ffbd3a29ffc53a29ffce3a29ffd63a29ffde3a29ffe63a29ffef3a29fff73a29ffff3a29ff004229ff084229ff104229ff194229ff214229ff294229ff314229ff3a4229ff424229ff4a4229ff524229ff5a4229ff634229ff6b4229ff734229ff7b4229ff844229ff8c4229ff944229ff9c4229ffa54229ffad4229ffb54229ffbd4229ffc54229ffce4229ffd64229ffde4229ffe64229ffef4229fff74229ffff4229ff004a29ff084a29ff104a29ff194a29ff214a29ff294a29ff314a29ff3a4a29ff424a29ff4a4a29ff524a29ff5a4a29ff634a29ff6b4a29ff734a29ff7b4a29ff844a29ff8c4a29ff944a29ff9c4a29ffa54a29ffad4a29ffb54a29ffbd4a29ffc54a29ffce4a29ffd64a29ffde4a29ffe64a29ffef4a29fff74a29ffff4a29ff005229ff085229ff105229ff195229ff215229ff295229ff315229ff3a5229ff425229ff4a5229ff525229ff5a5229ff635229ff6b5229ff735229ff7b5229ff845229ff8c5229ff945229ff9c5229ffa55229ffad5229ffb55229ffbd5229ffc55229ffce5229ffd65229ffde5229ffe65229ffef5229fff75229ffff5229ff005a29ff085a29ff105a29ff195a29ff215a29ff295a29ff315a29ff3a5a29ff425a29ff4a5a29ff525a29ff5a5a29ff635a29ff6b5a29ff735a29ff7b5a29ff845a29ff8c5a29ff945a29ff9c5a29ffa55a29ffad5a29ffb55a29ffbd5a29ffc55a29ffce5a29ffd65a29ffde5a29ffe65a29ffef5a29fff75a29ffff5a29ff006329ff086329ff106329ff196329ff216329ff296329ff316329ff3a6329ff426329ff4a6329ff526329ff5a6329ff636329ff6b6329ff736329ff7b6329ff846329ff8c6329ff946329ff9c6329ffa56329ffad6329ffb56329ffbd6329ffc56329ffce6329ffd66329ffde6329ffe66329ffef6329fff76329ffff6329ff006b29ff086b29ff106b29ff196b29ff216b29ff296b29ff316b29ff3a6b29ff426b29ff4a6b29ff526b29ff5a6b29ff636b29ff6b6b29ff736b29ff7b6b29ff846b29ff8c6b29ff946b29ff9c6b29ffa56b29ffad6b29ffb56b29ffbd6b29ffc56b29ffce6b29ffd66b29ffde6b29ffe66b29ffef6b29fff76b29ffff6b29ff007329ff087329ff107329ff197329ff217329ff297329ff317329ff3a7329ff427329ff4a7329ff527329ff5a7329ff637329ff6b7329ff737329ff7b7329ff847329ff8c7329ff947329ff9c7329ffa57329ffad7329ffb57329ffbd7329ffc57329ffce7329ffd67329ffde7329ffe67329ffef7329fff77329ffff7329ff007b29ff087b29ff107b29ff197b29ff217b29ff297b29ff317b29ff3a7b29ff427b29ff4a7b29ff527b29ff5a7b29ff637b29ff6b7b29ff737b29ff7b7b29ff847b29ff8c7b29ff947b29ff9c7b29ffa57b29ffad7b29ffb57b29ffbd7b29ffc57b29ffce7b29ffd67b29ffde7b29ffe67b29ffef7b29fff77b29ffff7b29ff008429ff088429ff108429ff198429ff218429ff298429ff318429ff3a8429ff428429ff4a8429ff528429ff5a8429ff638429ff6b8429ff738429ff7b8429ff848429ff8c8429ff948429ff9c8429ffa58429ffad8429ffb58429ffbd8429ffc58429ffce8429ffd68429ffde8429ffe68429ffef8429fff78429ffff8429ff008c29ff088c29ff108c29ff198c29ff218c29ff298c29ff318c29ff3a8c29ff428c29ff4a8c29ff528c29ff5a8c29ff638c29ff6b8c29ff738c29ff7b8c29ff848c29ff8c8c29ff948c29ff9c8c29ffa58c29ffad8c29ffb58c29ffbd8c29ffc58c29ffce8c29ffd68c29ffde8c29ffe68c29ffef8c29fff78c29ffff8c29ff009429ff089429ff109429ff199429ff219429ff299429ff319429ff3a9429ff429429ff4a9429ff529429ff5a9429ff639429ff6b9429ff739429ff7b9429ff849429ff8c9429ff949429ff9c9429ffa59429ffad9429ffb59429ffbd9429ffc59429ffce9429ffd69429ffde9429ffe69429ffef9429fff79429ffff9429ff009c29ff089c29ff109c29ff199c29ff219c29ff299c29ff319c29ff3a9c29ff429c29ff4a9c29ff529c29ff5a9c29ff639c29ff6b9c29ff739c29ff7b9c29ff849c29ff8c9c29ff949c29ff9c9c29ffa59c29ffad9c29ffb59c29ffbd9c29ffc59c29ffce9c29ffd69c29ffde9c29ffe69c29ffef9c29fff79c29ffff9c29ff00a529ff08a529ff10a529ff19a529ff21a529ff29a529ff31a529ff3aa529ff42a529ff4aa529ff52a529ff5aa529ff63a529ff6ba529ff73a529ff7ba529ff84a529ff8ca529ff94a529ff9ca529ffa5a529ffada529ffb5a529ffbda529ffc5a529ffcea529ffd6a529ffdea529ffe6a529ffefa529fff7a529ffffa529ff00ad29ff08ad29ff10ad29ff19ad29ff21ad29ff29ad29ff31ad29ff3aad29ff42ad29ff4aad29ff52ad29ff5aad29ff63ad29ff6bad29ff73ad29ff7bad29ff84ad29ff8cad29ff94ad29ff9cad29ffa5ad29ffadad29ffb5ad29ffbdad29ffc5ad29ffcead29ffd6ad29ffdead29ffe6ad29ffefad29fff7ad29ffffad29ff00b529ff08b529ff10b529ff19b529ff21b529ff29b529ff31b529ff3ab529ff42b529ff4ab529ff52b529ff5ab529ff63b529ff6bb529ff73b529ff7bb529ff84b529ff8cb529ff94b529ff9cb529ffa5b529ffadb529ffb5b529ffbdb529ffc5b529ffceb529ffd6b529ffdeb529ffe6b529ffefb529fff7b529ffffb529ff00bd29ff08bd29ff10bd29ff19bd29ff21bd29ff29bd29ff31bd29ff3abd29ff42bd29ff4abd29ff52bd29ff5abd29ff63bd29ff6bbd29ff73bd29ff7bbd29ff84bd29ff8cbd29ff94bd29ff9cbd29ffa5bd29ffadbd29ffb5bd29ffbdbd29ffc5bd29ffcebd29ffd6bd29ffdebd29ffe6bd29ffefbd29fff7bd29ffffbd29ff00c529ff08c529ff10c529ff19c529ff21c529ff29c529ff31c529ff3ac529ff42c529ff4ac529ff52c529ff5ac529ff63c529ff6bc529ff73c529ff7bc529ff84c529ff8cc529ff94c529ff9cc529ffa5c529ffadc529ffb5c529ffbdc529ffc5c529ffcec529ffd6c529ffdec529ffe6c529ffefc529fff7c529ffffc529ff00ce29ff08ce29ff10ce29ff19ce29ff21ce29ff29ce29ff31ce29ff3ace29ff42ce29ff4ace29ff52ce29ff5ace29ff63ce29ff6bce29ff73ce29ff7bce29ff84ce29ff8cce29ff94ce29ff9cce29ffa5ce29ffadce29ffb5ce29ffbdce29ffc5ce29ffcece29ffd6ce29ffdece29ffe6ce29ffefce29fff7ce29ffffce29ff00d629ff08d629ff10d629ff19d629ff21d629ff29d629ff31d629ff3ad629ff42d629ff4ad629ff52d629ff5ad629ff63d629ff6bd629ff73d629ff7bd629ff84d629ff8cd629ff94d629ff9cd629ffa5d629ffadd629ffb5d629ffbdd629ffc5d629ffced629ffd6d629ffded629ffe6d629ffefd629fff7d629ffffd629ff00de29ff08de29ff10de29ff19de29ff21de29ff29de29ff31de29ff3ade29ff42de29ff4ade29ff52de29ff5ade29ff63de29ff6bde29ff73de29ff7bde29ff84de29ff8cde29ff94de29ff9cde29ffa5de29ffadde29ffb5de29ffbdde29ffc5de29ffcede29ffd6de29ffdede29ffe6de29ffefde29fff7de29ffffde29ff00e629ff08e629ff10e629ff19e629ff21e629ff29e629ff31e629ff3ae629ff42e629ff4ae629ff52e629ff5ae629ff63e629ff6be629ff73e629ff7be629ff84e629ff8ce629ff94e629ff9ce629ffa5e629ffade629ffb5e629ffbde629ffc5e629ffcee629ffd6e629ffdee629ffe6e629ffefe629fff7e629ffffe629ff00ef29ff08ef29ff10ef29ff19ef29ff21ef29ff29ef29ff31ef29ff3aef29ff42ef29ff4aef29ff52ef29ff5aef29ff63ef29ff6bef29ff73ef29ff7bef29ff84ef29ff8cef29ff94ef29ff9cef29ffa5ef29ffadef29ffb5ef29ffbdef29ffc5ef29ffceef29ffd6ef29ffdeef29ffe6ef29ffefef29fff7ef29ffffef29ff00f729ff08f729ff10f729ff19f729ff21f729ff29f729ff31f729ff3af729ff42f729ff4af729ff52f729ff5af729ff63f729ff6bf729ff73f729ff7bf729ff84f729ff8cf729ff94f729ff9cf729ffa5f729ffadf729ffb5f729ffbdf729ffc5f729ffcef729ffd6f729ffdef729ffe6f729ffeff729fff7f729fffff729ff00ff29ff08ff29ff10ff29ff19ff29ff21ff29ff29ff29ff31ff29ff3aff29ff42ff29ff4aff29ff52ff29ff5aff29ff63ff29ff6bff29ff73ff29ff7bff29ff84ff29ff8cff29ff94ff29ff9cff29ffa5ff29ffadff29ffb5ff29ffbdff29ffc5ff29ffceff29ffd6ff29ffdeff29ffe6ff29ffefff29fff7ff29ffffff29ff000031ff080031ff100031ff190031ff210031ff290031ff310031ff3a0031ff420031ff4a0031ff520031ff5a0031ff630031ff6b0031ff730031ff7b0031ff840031ff8c0031ff940031ff9c0031ffa50031ffad0031ffb50031ffbd0031ffc50031ffce0031ffd60031ffde0031ffe60031ffef0031fff70031ffff0031ff000831ff080831ff100831ff190831ff210831ff290831ff310831ff3a0831ff420831ff4a0831ff520831ff5a0831ff630831ff6b0831ff730831ff7b0831ff840831ff8c0831ff940831ff9c0831ffa50831ffad0831ffb50831ffbd0831ffc50831ffce0831ffd60831ffde0831ffe60831ffef0831fff70831ffff0831ff001031ff081031ff101031ff191031ff211031ff291031ff311031ff3a1031ff421031ff4a1031ff521031ff5a1031ff631031ff6b1031ff731031ff7b1031ff841031ff8c1031ff941031ff9c1031ffa51031ffad1031ffb51031ffbd1031ffc51031ffce1031ffd61031ffde1031ffe61031ffef1031fff71031ffff1031ff001931ff081931ff101931ff191931ff211931ff291931ff311931ff3a1931ff421931ff4a1931ff521931ff5a1931ff631931ff6b1931ff731931ff7b1931ff841931ff8c1931ff941931ff9c1931ffa51931ffad1931ffb51931ffbd1931ffc51931ffce1931ffd61931ffde1931ffe61931ffef1931fff71931ffff1931ff002131ff082131ff102131ff192131ff212131ff292131ff312131ff3a2131ff422131ff4a2131ff522131ff5a2131ff632131ff6b2131ff732131ff7b2131ff842131ff8c2131ff942131ff9c2131ffa52131ffad2131ffb52131ffbd2131ffc52131ffce2131ffd62131ffde2131ffe62131ffef2131fff72131ffff2131ff002931ff082931ff102931ff192931ff212931ff292931ff312931ff3a2931ff422931ff4a2931ff522931ff5a2931ff632931ff6b2931ff732931ff7b2931ff842931ff8c2931ff942931ff9c2931ffa52931ffad2931ffb52931ffbd2931ffc52931ffce2931ffd62931ffde2931ffe62931ffef2931fff72931ffff2931ff003131ff083131ff103131ff193131ff213131ff293131ff313131ff3a3131ff423131ff4a3131ff523131ff5a3131ff633131ff6b3131ff733131ff7b3131ff843131ff8c3131ff943131ff9c3131ffa53131ffad3131ffb53131ffbd3131ffc53131ffce3131ffd63131ffde3131ffe63131ffef3131fff73131ffff3131ff003a31ff083a31ff103a31ff193a31ff213a31ff293a31ff313a31ff3a3a31ff423a31ff4a3a31ff523a31ff5a3a31ff633a31ff6b3a31ff733a31ff7b3a31ff843a31ff8c3a31ff943a31ff9c3a31ffa53a31ffad3a31ffb53a31ffbd3a31ffc53a31ffce3a31ffd63a31ffde3a31ffe63a31ffef3a31fff73a31ffff3a31ff004231ff084231ff104231ff194231ff214231ff294231ff314231ff3a4231ff424231ff4a4231ff524231ff5a4231ff634231ff6b4231ff734231ff7b4231ff844231ff8c4231ff944231ff9c4231ffa54231ffad4231ffb54231ffbd4231ffc54231ffce4231ffd64231ffde4231ffe64231ffef4231fff74231ffff4231ff004a31ff084a31ff104a31ff194a31ff214a31ff294a31ff314a31ff3a4a31ff424a31ff4a4a31ff524a31ff5a4a31ff634a31ff6b4a31ff734a31ff7b4a31ff844a31ff8c4a31ff944a31ff9c4a31ffa54a31ffad4a31ffb54a31ffbd4a31ffc54a31ffce4a31ffd64a31ffde4a31ffe64a31ffef4a31fff74a31ffff4a31ff005231ff085231ff105231ff195231ff215231ff295231ff315231ff3a5231ff425231ff4a5231ff525231ff5a5231ff635231ff6b5231ff735231ff7b5231ff845231ff8c5231ff945231ff9c5231ffa55231ffad5231ffb55231ffbd5231ffc55231ffce5231ffd65231ffde5231ffe65231ffef5231fff75231ffff5231ff005a31ff085a31ff105a31ff195a31ff215a31ff295a31ff315a31ff3a5a31ff425a31ff4a5a31ff525a31ff5a5a31ff635a31ff6b5a31ff735a31ff7b5a31ff845a31ff8c5a31ff945a31ff9c5a31ffa55a31ffad5a31ffb55a31ffbd5a31ffc55a31ffce5a31ffd65a31ffde5a31ffe65a31ffef5a31fff75a31ffff5a31ff006331ff086331ff106331ff196331ff216331ff296331ff316331ff3a6331ff426331ff4a6331ff526331ff5a6331ff636331ff6b6331ff736331ff7b6331ff846331ff8c6331ff946331ff9c6331ffa56331ffad6331ffb56331ffbd6331ffc56331ffce6331ffd66331ffde6331ffe66331ffef6331fff76331ffff6331ff006b31ff086b31ff106b31ff196b31ff216b31ff296b31ff316b31ff3a6b31ff426b31ff4a6b31ff526b31ff5a6b31ff636b31ff6b6b31ff736b31ff7b6b31ff846b31ff8c6b31ff946b31ff9c6b31ffa56b31ffad6b31ffb56b31ffbd6b31ffc56b31ffce6b31ffd66b31ffde6b31ffe66b31ffef6b31fff76b31ffff6b31ff007331ff087331ff107331ff197331ff217331ff297331ff317331ff3a7331ff427331ff4a7331ff527331ff5a7331ff637331ff6b7331ff737331ff7b7331ff847331ff8c7331ff947331ff9c7331ffa57331ffad7331ffb57331ffbd7331ffc57331ffce7331ffd67331ffde7331ffe67331ffef7331fff77331ffff7331ff007b31ff087b31ff107b31ff197b31ff217b31ff297b31ff317b31ff3a7b31ff427b31ff4a7b31ff527b31ff5a7b31ff637b31ff6b7b31ff737b31ff7b7b31ff847b31ff8c7b31ff947b31ff9c7b31ffa57b31ffad7b31ffb57b31ffbd7b31ffc57b31ffce7b31ffd67b31ffde7b31ffe67b31ffef7b31fff77b31ffff7b31ff008431ff088431ff108431ff198431ff218431ff298431ff318431ff3a8431ff428431ff4a8431ff528431ff5a8431ff638431ff6b8431ff738431ff7b8431ff848431ff8c8431ff948431ff9c8431ffa58431ffad8431ffb58431ffbd8431ffc58431ffce8431ffd68431ffde8431ffe68431ffef8431fff78431ffff8431ff008c31ff088c31ff108c31ff198c31ff218c31ff298c31ff318c31ff3a8c31ff428c31ff4a8c31ff528c31ff5a8c31ff638c31ff6b8c31ff738c31ff7b8c31ff848c31ff8c8c31ff948c31ff9c8c31ffa58c31ffad8c31ffb58c31ffbd8c31ffc58c31ffce8c31ffd68c31ffde8c31ffe68c31ffef8c31fff78c31ffff8c31ff009431ff089431ff109431ff199431ff219431ff299431ff319431ff3a9431ff429431ff4a9431ff529431ff5a9431ff639431ff6b9431ff739431ff7b9431ff849431ff8c9431ff949431ff9c9431ffa59431ffad9431ffb59431ffbd9431ffc59431ffce9431ffd69431ffde9431ffe69431ffef9431fff79431ffff9431ff009c31ff089c31ff109c31ff199c31ff219c31ff299c31ff319c31ff3a9c31ff429c31ff4a9c31ff529c31ff5a9c31ff639c31ff6b9c31ff739c31ff7b9c31ff849c31ff8c9c31ff949c31ff9c9c31ffa59c31ffad9c31ffb59c31ffbd9c31ffc59c31ffce9c31ffd69c31ffde9c31ffe69c31ffef9c31fff79c31ffff9c31ff00a531ff08a531ff10a531ff19a531ff21a531ff29a531ff31a531ff3aa531ff42a531ff4aa531ff52a531ff5aa531ff63a531ff6ba531ff73a531ff7ba531ff84a531ff8ca531ff94a531ff9ca531ffa5a531ffada531ffb5a531ffbda531ffc5a531ffcea531ffd6a531ffdea531ffe6a531ffefa531fff7a531ffffa531ff00ad31ff08ad31ff10ad31ff19ad31ff21ad31ff29ad31ff31ad31ff3aad31ff42ad31ff4aad31ff52ad31ff5aad31ff63ad31ff6bad31ff73ad31ff7bad31ff84ad31ff8cad31ff94ad31ff9cad31ffa5ad31ffadad31ffb5ad31ffbdad31ffc5ad31ffcead31ffd6ad31ffdead31ffe6ad31ffefad31fff7ad31ffffad31ff00b531ff08b531ff10b531ff19b531ff21b531ff29b531ff31b531ff3ab531ff42b531ff4ab531ff52b531ff5ab531ff63b531ff6bb531ff73b531ff7bb531ff84b531ff8cb531ff94b531ff9cb531ffa5b531ffadb531ffb5b531ffbdb531ffc5b531ffceb531ffd6b531ffdeb531ffe6b531ffefb531fff7b531ffffb531ff00bd31ff08bd31ff10bd31ff19bd31ff21bd31ff29bd31ff31bd31ff3abd31ff42bd31ff4abd31ff52bd31ff5abd31ff63bd31ff6bbd31ff73bd31ff7bbd31ff84bd31ff8cbd31ff94bd31ff9cbd31ffa5bd31ffadbd31ffb5bd31ffbdbd31ffc5bd31ffcebd31ffd6bd31ffdebd31ffe6bd31ffefbd31fff7bd31ffffbd31ff00c531ff08c531ff10c531ff19c531ff21c531ff29c531ff31c531ff3ac531ff42c531ff4ac531ff52c531ff5ac531ff63c531ff6bc531ff73c531ff7bc531ff84c531ff8cc531ff94c531ff9cc531ffa5c531ffadc531ffb5c531ffbdc531ffc5c531ffcec531ffd6c531ffdec531ffe6c531ffefc531fff7c531ffffc531ff00ce31ff08ce31ff10ce31ff19ce31ff21ce31ff29ce31ff31ce31ff3ace31ff42ce31ff4ace31ff52ce31ff5ace31ff63ce31ff6bce31ff73ce31ff7bce31ff84ce31ff8cce31ff94ce31ff9cce31ffa5ce31ffadce31ffb5ce31ffbdce31ffc5ce31ffcece31ffd6ce31ffdece31ffe6ce31ffefce31fff7ce31ffffce31ff00d631ff08d631ff10d631ff19d631ff21d631ff29d631ff31d631ff3ad631ff42d631ff4ad631ff52d631ff5ad631ff63d631ff6bd631ff73d631ff7bd631ff84d631ff8cd631ff94d631ff9cd631ffa5d631ffadd631ffb5d631ffbdd631ffc5d631ffced631ffd6d631ffded631ffe6d631ffefd631fff7d631ffffd631ff00de31ff08de31ff10de31ff19de31ff21de31ff29de31ff31de31ff3ade31ff42de31ff4ade31ff52de31ff5ade31ff63de31ff6bde31ff73de31ff7bde31ff84de31ff8cde31ff94de31ff9cde31ffa5de31ffadde31ffb5de31ffbdde31ffc5de31ffcede31ffd6de31ffdede31ffe6de31ffefde31fff7de31ffffde31ff00e631ff08e631ff10e631ff19e631ff21e631ff29e631ff31e631ff3ae631ff42e631ff4ae631ff52e631ff5ae631ff63e631ff6be631ff73e631ff7be631ff84e631ff8ce631ff94e631ff9ce631ffa5e631ffade631ffb5e631ffbde631ffc5e631ffcee631ffd6e631ffdee631ffe6e631ffefe631fff7e631ffffe631ff00ef31ff08ef31ff10ef31ff19ef31ff21ef31ff29ef31ff31ef31ff3aef31ff42ef31ff4aef31ff52ef31ff5aef31ff63ef31ff6bef31ff73ef31ff7bef31ff84ef31ff8cef31ff94ef31ff9cef31ffa5ef31ffadef31ffb5ef31ffbdef31ffc5ef31ffceef31ffd6ef31ffdeef31ffe6ef31ffefef31fff7ef31ffffef31ff00f731ff08f731ff10f731ff19f731ff21f731ff29f731ff31f731ff3af731ff42f731ff4af731ff52f731ff5af731ff63f731ff6bf731ff73f731ff7bf731ff84f731ff8cf731ff94f731ff9cf731ffa5f731ffadf731ffb5f731ffbdf731ffc5f731ffcef731ffd6f731ffdef731ffe6f731ffeff731fff7f731fffff731ff00ff31ff08ff31ff10ff31ff19ff31ff21ff31ff29ff31ff31ff31ff3aff31ff42ff31ff4aff31ff52ff31ff5aff31ff63ff31ff6bff31ff73ff31ff7bff31ff84ff31ff8cff31ff94ff31ff9cff31ffa5ff31ffadff31ffb5ff31ffbdff31ffc5ff31ffceff31ffd6ff31ffdeff31ffe6ff31ffefff31fff7ff31ffffff31ff00003aff08003aff10003aff19003aff21003aff29003aff31003aff3a003aff42003aff4a003aff52003aff5a003aff63003aff6b003aff73003aff7b003aff84003aff8c003aff94003aff9c003affa5003affad003affb5003affbd003affc5003affce003affd6003affde003affe6003affef003afff7003affff003aff00083aff08083aff10083aff19083aff21083aff29083aff31083aff3a083aff42083aff4a083aff52083aff5a083aff63083aff6b083aff73083aff7b083aff84083aff8c083aff94083aff9c083affa5083affad083affb5083affbd083affc5083affce083affd6083affde083affe6083affef083afff7083affff083aff00103aff08103aff10103aff19103aff21103aff29103aff31103aff3a103aff42103aff4a103aff52103aff5a103aff63103aff6b103aff73103aff7b103aff84103aff8c103aff94103aff9c103affa5103affad103affb5103affbd103affc5103affce103affd6103affde103affe6103affef103afff7103affff103aff00193aff08193aff10193aff19193aff21193aff29193aff31193aff3a193aff42193aff4a193aff52193aff5a193aff63193aff6b193aff73193aff7b193aff84193aff8c193aff94193aff9c193affa5193affad193affb5193affbd193affc5193affce193affd6193affde193affe6193affef193afff7193affff193aff00213aff08213aff10213aff19213aff21213aff29213aff31213aff3a213aff42213aff4a213aff52213aff5a213aff63213aff6b213aff73213aff7b213aff84213aff8c213aff94213aff9c213affa5213affad213affb5213affbd213affc5213affce213affd6213affde213affe6213affef213afff7213affff213aff00293aff08293aff10293aff19293aff21293aff29293aff31293aff3a293aff42293aff4a293aff52293aff5a293aff63293aff6b293aff73293aff7b293aff84293aff8c293aff94293aff9c293affa5293affad293affb5293affbd293affc5293affce293affd6293affde293affe6293affef293afff7293affff293aff00313aff08313aff10313aff19313aff21313aff29313aff31313aff3a313aff42313aff4a313aff52313aff5a313aff63313aff6b313aff73313aff7b313aff84313aff8c313aff94313aff9c313affa5313affad313affb5313affbd313affc5313affce313affd6313affde313affe6313affef313afff7313affff313aff003a3aff083a3aff103a3aff193a3aff213a3aff293a3aff313a3aff3a3a3aff423a3aff4a3a3aff523a3aff5a3a3aff633a3aff6b3a3aff733a3aff7b3a3aff843a3aff8c3a3aff943a3aff9c3a3affa53a3affad3a3affb53a3affbd3a3affc53a3affce3a3affd63a3affde3a3affe63a3affef3a3afff73a3affff3a3aff00423aff08423aff10423aff19423aff21423aff29423aff31423aff3a423aff42423aff4a423aff52423aff5a423aff63423aff6b423aff73423aff7b423aff84423aff8c423aff94423aff9c423affa5423affad423affb5423affbd423affc5423affce423affd6423affde423affe6423affef423afff7423affff423aff004a3aff084a3aff104a3aff194a3aff214a3aff294a3aff314a3aff3a4a3aff424a3aff4a4a3aff524a3aff5a4a3aff634a3aff6b4a3aff734a3aff7b4a3aff844a3aff8c4a3aff944a3aff9c4a3affa54a3affad4a3affb54a3affbd4a3affc54a3affce4a3affd64a3affde4a3affe64a3affef4a3afff74a3affff4a3aff00523aff08523aff10523aff19523aff21523aff29523aff31523aff3a523aff42523aff4a523aff52523aff5a523aff63523aff6b523aff73523aff7b523aff84523aff8c523aff94523aff9c523affa5523affad523affb5523affbd523affc5523affce523affd6523affde523affe6523affef523afff7523affff523aff005a3aff085a3aff105a3aff195a3aff215a3aff295a3aff315a3aff3a5a3aff425a3aff4a5a3aff525a3aff5a5a3aff635a3aff6b5a3aff735a3aff7b5a3aff845a3aff8c5a3aff945a3aff9c5a3affa55a3affad5a3affb55a3affbd5a3affc55a3affce5a3affd65a3affde5a3affe65a3affef5a3afff75a3affff5a3aff00633aff08633aff10633aff19633aff21633aff29633aff31633aff3a633aff42633aff4a633aff52633aff5a633aff63633aff6b633aff73633aff7b633aff84633aff8c633aff94633aff9c633affa5633affad633affb5633affbd633affc5633affce633affd6633affde633affe6633affef633afff7633affff633aff006b3aff086b3aff106b3aff196b3aff216b3aff296b3aff316b3aff3a6b3aff426b3aff4a6b3aff526b3aff5a6b3aff636b3aff6b6b3aff736b3aff7b6b3aff846b3aff8c6b3aff946b3aff9c6b3affa56b3affad6b3affb56b3affbd6b3affc56b3affce6b3affd66b3affde6b3affe66b3affef6b3afff76b3affff6b3aff00733aff08733aff10733aff19733aff21733aff29733aff31733aff3a733aff42733aff4a733aff52733aff5a733aff63733aff6b733aff73733aff7b733aff84733aff8c733aff94733aff9c733affa5733affad733affb5733affbd733affc5733affce733affd6733affde733affe6733affef733afff7733affff733aff007b3aff087b3aff107b3aff197b3aff217b3aff297b3aff317b3aff3a7b3aff427b3aff4a7b3aff527b3aff5a7b3aff637b3aff6b7b3aff737b3aff7b7b3aff847b3aff8c7b3aff947b3aff9c7b3affa57b3affad7b3affb57b3affbd7b3affc57b3affce7b3affd67b3affde7b3affe67b3affef7b3afff77b3affff7b3aff00843aff08843aff10843aff19843aff21843aff29843aff31843aff3a843aff42843aff4a843aff52843aff5a843aff63843aff6b843aff73843aff7b843aff84843aff8c843aff94843aff9c843affa5843affad843affb5843affbd843affc5843affce843affd6843affde843affe6843affef843afff7843affff843aff008c3aff088c3aff108c3aff198c3aff218c3aff298c3aff318c3aff3a8c3aff428c3aff4a8c3aff528c3aff5a8c3aff638c3aff6b8c3aff738c3aff7b8c3aff848c3aff8c8c3aff948c3aff9c8c3affa58c3affad8c3affb58c3affbd8c3affc58c3affce8c3affd68c3affde8c3affe68c3affef8c3afff78c3affff8c3aff00943aff08943aff10943aff19943aff21943aff29943aff31943aff3a943aff42943aff4a943aff52943aff5a943aff63943aff6b943aff73943aff7b943aff84943aff8c943aff94943aff9c943affa5943affad943affb5943affbd943affc5943affce943affd6943affde943affe6943affef943afff7943affff943aff009c3aff089c3aff109c3aff199c3aff219c3aff299c3aff319c3aff3a9c3aff429c3aff4a9c3aff529c3aff5a9c3aff639c3aff6b9c3aff739c3aff7b9c3aff849c3aff8c9c3aff949c3aff9c9c3affa59c3affad9c3affb59c3affbd9c3affc59c3affce9c3affd69c3affde9c3affe69c3affef9c3afff79c3affff9c3aff00a53aff08a53aff10a53aff19a53aff21a53aff29a53aff31a53aff3aa53aff42a53aff4aa53aff52a53aff5aa53aff63a53aff6ba53aff73a53aff7ba53aff84a53aff8ca53aff94a53aff9ca53affa5a53affada53affb5a53affbda53affc5a53affcea53affd6a53affdea53affe6a53affefa53afff7a53affffa53aff00ad3aff08ad3aff10ad3aff19ad3aff21ad3aff29ad3aff31ad3aff3aad3aff42ad3aff4aad3aff52ad3aff5aad3aff63ad3aff6bad3aff73ad3aff7bad3aff84ad3aff8cad3aff94ad3aff9cad3affa5ad3affadad3affb5ad3affbdad3affc5ad3affcead3affd6ad3affdead3affe6ad3affefad3afff7ad3affffad3aff00b53aff08b53aff10b53aff19b53aff21b53aff29b53aff31b53aff3ab53aff42b53aff4ab53aff52b53aff5ab53aff63b53aff6bb53aff73b53aff7bb53aff84b53aff8cb53aff94b53aff9cb53affa5b53affadb53affb5b53affbdb53affc5b53affceb53affd6b53affdeb53affe6b53affefb53afff7b53affffb53aff00bd3aff08bd3aff10bd3aff19bd3aff21bd3aff29bd3aff31bd3aff3abd3aff42bd3aff4abd3aff52bd3aff5abd3aff63bd3aff6bbd3aff73bd3aff7bbd3aff84bd3aff8cbd3aff94bd3aff9cbd3affa5bd3affadbd3affb5bd3affbdbd3affc5bd3affcebd3affd6bd3affdebd3affe6bd3affefbd3afff7bd3affffbd3aff00c53aff08c53aff10c53aff19c53aff21c53aff29c53aff31c53aff3ac53aff42c53aff4ac53aff52c53aff5ac53aff63c53aff6bc53aff73c53aff7bc53aff84c53aff8cc53aff94c53aff9cc53affa5c53affadc53affb5c53affbdc53affc5c53affcec53affd6c53affdec53affe6c53affefc53afff7c53affffc53aff00ce3aff08ce3aff10ce3aff19ce3aff21ce3aff29ce3aff31ce3aff3ace3aff42ce3aff4ace3aff52ce3aff5ace3aff63ce3aff6bce3aff73ce3aff7bce3aff84ce3aff8cce3aff94ce3aff9cce3affa5ce3affadce3affb5ce3affbdce3affc5ce3affcece3affd6ce3affdece3affe6ce3affefce3afff7ce3affffce3aff00d63aff08d63aff10d63aff19d63aff21d63aff29d63aff31d63aff3ad63aff42d63aff4ad63aff52d63aff5ad63aff63d63aff6bd63aff73d63aff7bd63aff84d63aff8cd63aff94d63aff9cd63affa5d63affadd63affb5d63affbdd63affc5d63affced63affd6d63affded63affe6d63affefd63afff7d63affffd63aff00de3aff08de3aff10de3aff19de3aff21de3aff29de3aff31de3aff3ade3aff42de3aff4ade3aff52de3aff5ade3aff63de3aff6bde3aff73de3aff7bde3aff84de3aff8cde3aff94de3aff9cde3affa5de3affadde3affb5de3affbdde3affc5de3affcede3affd6de3affdede3affe6de3affefde3afff7de3affffde3aff00e63aff08e63aff10e63aff19e63aff21e63aff29e63aff31e63aff3ae63aff42e63aff4ae63aff52e63aff5ae63aff63e63aff6be63aff73e63aff7be63aff84e63aff8ce63aff94e63aff9ce63affa5e63affade63affb5e63affbde63affc5e63affcee63affd6e63affdee63affe6e63affefe63afff7e63affffe63aff00ef3aff08ef3aff10ef3aff19ef3aff21ef3aff29ef3aff31ef3aff3aef3aff42ef3aff4aef3aff52ef3aff5aef3aff63ef3aff6bef3aff73ef3aff7bef3aff84ef3aff8cef3aff94ef3aff9cef3affa5ef3affadef3affb5ef3affbdef3affc5ef3affceef3affd6ef3affdeef3affe6ef3affefef3afff7ef3affffef3aff00f73aff08f73aff10f73aff19f73aff21f73aff29f73aff31f73aff3af73aff42f73aff4af73aff52f73aff5af73aff63f73aff6bf73aff73f73aff7bf73aff84f73aff8cf73aff94f73aff9cf73affa5f73affadf73affb5f73affbdf73affc5f73affcef73affd6f73affdef73affe6f73affeff73afff7f73afffff73aff00ff3aff08ff3aff10ff3aff19ff3aff21ff3aff29ff3aff31ff3aff3aff3aff42ff3aff4aff3aff52ff3aff5aff3aff63ff3aff6bff3aff73ff3aff7bff3aff84ff3aff8cff3aff94ff3aff9cff3affa5ff3affadff3affb5ff3affbdff3affc5ff3affceff3affd6ff3affdeff3affe6ff3affefff3afff7ff3affffff3aff000042ff080042ff100042ff190042ff210042ff290042ff310042ff3a0042ff420042ff4a0042ff520042ff5a0042ff630042ff6b0042ff730042ff7b0042ff840042ff8c0042ff940042ff9c0042ffa50042ffad0042ffb50042ffbd0042ffc50042ffce0042ffd60042ffde0042ffe60042ffef0042fff70042ffff0042ff000842ff080842ff100842ff190842ff210842ff290842ff310842ff3a0842ff420842ff4a0842ff520842ff5a0842ff630842ff6b0842ff730842ff7b0842ff840842ff8c0842ff940842ff9c0842ffa50842ffad0842ffb50842ffbd0842ffc50842ffce0842ffd60842ffde0842ffe60842ffef0842fff70842ffff0842ff001042ff081042ff101042ff191042ff211042ff291042ff311042ff3a1042ff421042ff4a1042ff521042ff5a1042ff631042ff6b1042ff731042ff7b1042ff841042ff8c1042ff941042ff9c1042ffa51042ffad1042ffb51042ffbd1042ffc51042ffce1042ffd61042ffde1042ffe61042ffef1042fff71042ffff1042ff001942ff081942ff101942ff191942ff211942ff291942ff311942ff3a1942ff421942ff4a1942ff521942ff5a1942ff631942ff6b1942ff731942ff7b1942ff841942ff8c1942ff941942ff9c1942ffa51942ffad1942ffb51942ffbd1942ffc51942ffce1942ffd61942ffde1942ffe61942ffef1942fff71942ffff1942ff002142ff082142ff102142ff192142ff212142ff292142ff312142ff3a2142ff422142ff4a2142ff522142ff5a2142ff632142ff6b2142ff732142ff7b2142ff842142ff8c2142ff942142ff9c2142ffa52142ffad2142ffb52142ffbd2142ffc52142ffce2142ffd62142ffde2142ffe62142ffef2142fff72142ffff2142ff002942ff082942ff102942ff192942ff212942ff292942ff312942ff3a2942ff422942ff4a2942ff522942ff5a2942ff632942ff6b2942ff732942ff7b2942ff842942ff8c2942ff942942ff9c2942ffa52942ffad2942ffb52942ffbd2942ffc52942ffce2942ffd62942ffde2942ffe62942ffef2942fff72942ffff2942ff003142ff083142ff103142ff193142ff213142ff293142ff313142ff3a3142ff423142ff4a3142ff523142ff5a3142ff633142ff6b3142ff733142ff7b3142ff843142ff8c3142ff943142ff9c3142ffa53142ffad3142ffb53142ffbd3142ffc53142ffce3142ffd63142ffde3142ffe63142ffef3142fff73142ffff3142ff003a42ff083a42ff103a42ff193a42ff213a42ff293a42ff313a42ff3a3a42ff423a42ff4a3a42ff523a42ff5a3a42ff633a42ff6b3a42ff733a42ff7b3a42ff843a42ff8c3a42ff943a42ff9c3a42ffa53a42ffad3a42ffb53a42ffbd3a42ffc53a42ffce3a42ffd63a42ffde3a42ffe63a42ffef3a42fff73a42ffff3a42ff004242ff084242ff104242ff194242ff214242ff294242ff314242ff3a4242ff424242ff4a4242ff524242ff5a4242ff634242ff6b4242ff734242ff7b4242ff844242ff8c4242ff944242ff9c4242ffa54242ffad4242ffb54242ffbd4242ffc54242ffce4242ffd64242ffde4242ffe64242ffef4242fff74242ffff4242ff004a42ff084a42ff104a42ff194a42ff214a42ff294a42ff314a42ff3a4a42ff424a42ff4a4a42ff524a42ff5a4a42ff634a42ff6b4a42ff734a42ff7b4a42ff844a42ff8c4a42ff944a42ff9c4a42ffa54a42ffad4a42ffb54a42ffbd4a42ffc54a42ffce4a42ffd64a42ffde4a42ffe64a42ffef4a42fff74a42ffff4a42ff005242ff085242ff105242ff195242ff215242ff295242ff315242ff3a5242ff425242ff4a5242ff525242ff5a5242ff635242ff6b5242ff735242ff7b5242ff845242ff8c5242ff945242ff9c5242ffa55242ffad5242ffb55242ffbd5242ffc55242ffce5242ffd65242ffde5242ffe65242ffef5242fff75242ffff5242ff005a42ff085a42ff105a42ff195a42ff215a42ff295a42ff315a42ff3a5a42ff425a42ff4a5a42ff525a42ff5a5a42ff635a42ff6b5a42ff735a42ff7b5a42ff845a42ff8c5a42ff945a42ff9c5a42ffa55a42ffad5a42ffb55a42ffbd5a42ffc55a42ffce5a42ffd65a42ffde5a42ffe65a42ffef5a42fff75a42ffff5a42ff006342ff086342ff106342ff196342ff216342ff296342ff316342ff3a6342ff426342ff4a6342ff526342ff5a6342ff636342ff6b6342ff736342ff7b6342ff846342ff8c6342ff946342ff9c6342ffa56342ffad6342ffb56342ffbd6342ffc56342ffce6342ffd66342ffde6342ffe66342ffef6342fff76342ffff6342ff006b42ff086b42ff106b42ff196b42ff216b42ff296b42ff316b42ff3a6b42ff426b42ff4a6b42ff526b42ff5a6b42ff636b42ff6b6b42ff736b42ff7b6b42ff846b42ff8c6b42ff946b42ff9c6b42ffa56b42ffad6b42ffb56b42ffbd6b42ffc56b42ffce6b42ffd66b42ffde6b42ffe66b42ffef6b42fff76b42ffff6b42ff007342ff087342ff107342ff197342ff217342ff297342ff317342ff3a7342ff427342ff4a7342ff527342ff5a7342ff637342ff6b7342ff737342ff7b7342ff847342ff8c7342ff947342ff9c7342ffa57342ffad7342ffb57342ffbd7342ffc57342ffce7342ffd67342ffde7342ffe67342ffef7342fff77342ffff7342ff007b42ff087b42ff107b42ff197b42ff217b42ff297b42ff317b42ff3a7b42ff427b42ff4a7b42ff527b42ff5a7b42ff637b42ff6b7b42ff737b42ff7b7b42ff847b42ff8c7b42ff947b42ff9c7b42ffa57b42ffad7b42ffb57b42ffbd7b42ffc57b42ffce7b42ffd67b42ffde7b42ffe67b42ffef7b42fff77b42ffff7b42ff008442ff088442ff108442ff198442ff218442ff298442ff318442ff3a8442ff428442ff4a8442ff528442ff5a8442ff638442ff6b8442ff738442ff7b8442ff848442ff8c8442ff948442ff9c8442ffa58442ffad8442ffb58442ffbd8442ffc58442ffce8442ffd68442ffde8442ffe68442ffef8442fff78442ffff8442ff008c42ff088c42ff108c42ff198c42ff218c42ff298c42ff318c42ff3a8c42ff428c42ff4a8c42ff528c42ff5a8c42ff638c42ff6b8c42ff738c42ff7b8c42ff848c42ff8c8c42ff948c42ff9c8c42ffa58c42ffad8c42ffb58c42ffbd8c42ffc58c42ffce8c42ffd68c42ffde8c42ffe68c42ffef8c42fff78c42ffff8c42ff009442ff089442ff109442ff199442ff219442ff299442ff319442ff3a9442ff429442ff4a9442ff529442ff5a9442ff639442ff6b9442ff739442ff7b9442ff849442ff8c9442ff949442ff9c9442ffa59442ffad9442ffb59442ffbd9442ffc59442ffce9442ffd69442ffde9442ffe69442ffef9442fff79442ffff9442ff009c42ff089c42ff109c42ff199c42ff219c42ff299c42ff319c42ff3a9c42ff429c42ff4a9c42ff529c42ff5a9c42ff639c42ff6b9c42ff739c42ff7b9c42ff849c42ff8c9c42ff949c42ff9c9c42ffa59c42ffad9c42ffb59c42ffbd9c42ffc59c42ffce9c42ffd69c42ffde9c42ffe69c42ffef9c42fff79c42ffff9c42ff00a542ff08a542ff10a542ff19a542ff21a542ff29a542ff31a542ff3aa542ff42a542ff4aa542ff52a542ff5aa542ff63a542ff6ba542ff73a542ff7ba542ff84a542ff8ca542ff94a542ff9ca542ffa5a542ffada542ffb5a542ffbda542ffc5a542ffcea542ffd6a542ffdea542ffe6a542ffefa542fff7a542ffffa542ff00ad42ff08ad42ff10ad42ff19ad42ff21ad42ff29ad42ff31ad42ff3aad42ff42ad42ff4aad42ff52ad42ff5aad42ff63ad42ff6bad42ff73ad42ff7bad42ff84ad42ff8cad42ff94ad42ff9cad42ffa5ad42ffadad42ffb5ad42ffbdad42ffc5ad42ffcead42ffd6ad42ffdead42ffe6ad42ffefad42fff7ad42ffffad42ff00b542ff08b542ff10b542ff19b542ff21b542ff29b542ff31b542ff3ab542ff42b542ff4ab542ff52b542ff5ab542ff63b542ff6bb542ff73b542ff7bb542ff84b542ff8cb542ff94b542ff9cb542ffa5b542ffadb542ffb5b542ffbdb542ffc5b542ffceb542ffd6b542ffdeb542ffe6b542ffefb542fff7b542ffffb542ff00bd42ff08bd42ff10bd42ff19bd42ff21bd42ff29bd42ff31bd42ff3abd42ff42bd42ff4abd42ff52bd42ff5abd42ff63bd42ff6bbd42ff73bd42ff7bbd42ff84bd42ff8cbd42ff94bd42ff9cbd42ffa5bd42ffadbd42ffb5bd42ffbdbd42ffc5bd42ffcebd42ffd6bd42ffdebd42ffe6bd42ffefbd42fff7bd42ffffbd42ff00c542ff08c542ff10c542ff19c542ff21c542ff29c542ff31c542ff3ac542ff42c542ff4ac542ff52c542ff5ac542ff63c542ff6bc542ff73c542ff7bc542ff84c542ff8cc542ff94c542ff9cc542ffa5c542ffadc542ffb5c542ffbdc542ffc5c542ffcec542ffd6c542ffdec542ffe6c542ffefc542fff7c542ffffc542ff00ce42ff08ce42ff10ce42ff19ce42ff21ce42ff29ce42ff31ce42ff3ace42ff42ce42ff4ace42ff52ce42ff5ace42ff63ce42ff6bce42ff73ce42ff7bce42ff84ce42ff8cce42ff94ce42ff9cce42ffa5ce42ffadce42ffb5ce42ffbdce42ffc5ce42ffcece42ffd6ce42ffdece42ffe6ce42ffefce42fff7ce42ffffce42ff00d642ff08d642ff10d642ff19d642ff21d642ff29d642ff31d642ff3ad642ff42d642ff4ad642ff52d642ff5ad642ff63d642ff6bd642ff73d642ff7bd642ff84d642ff8cd642ff94d642ff9cd642ffa5d642ffadd642ffb5d642ffbdd642ffc5d642ffced642ffd6d642ffded642ffe6d642ffefd642fff7d642ffffd642ff00de42ff08de42ff10de42ff19de42ff21de42ff29de42ff31de42ff3ade42ff42de42ff4ade42ff52de42ff5ade42ff63de42ff6bde42ff73de42ff7bde42ff84de42ff8cde42ff94de42ff9cde42ffa5de42ffadde42ffb5de42ffbdde42ffc5de42ffcede42ffd6de42ffdede42ffe6de42ffefde42fff7de42ffffde42ff00e642ff08e642ff10e642ff19e642ff21e642ff29e642ff31e642ff3ae642ff42e642ff4ae642ff52e642ff5ae642ff63e642ff6be642ff73e642ff7be642ff84e642ff8ce642ff94e642ff9ce642ffa5e642ffade642ffb5e642ffbde642ffc5e642ffcee642ffd6e642ffdee642ffe6e642ffefe642fff7e642ffffe642ff00ef42ff08ef42ff10ef42ff19ef42ff21ef42ff29ef42ff31ef42ff3aef42ff42ef42ff4aef42ff52ef42ff5aef42ff63ef42ff6bef42ff73ef42ff7bef42ff84ef42ff8cef42ff94ef42ff9cef42ffa5ef42ffadef42ffb5ef42ffbdef42ffc5ef42ffceef42ffd6ef42ffdeef42ffe6ef42ffefef42fff7ef42ffffef42ff00f742ff08f742ff10f742ff19f742ff21f742ff29f742ff31f742ff3af742ff42f742ff4af742ff52f742ff5af742ff63f742ff6bf742ff73f742ff7bf742ff84f742ff8cf742ff94f742ff9cf742ffa5f742ffadf742ffb5f742ffbdf742ffc5f742ffcef742ffd6f742ffdef742ffe6f742ffeff742fff7f742fffff742ff00ff42ff08ff42ff10ff42ff19ff42ff21ff42ff29ff42ff31ff42ff3aff42ff42ff42ff4aff42ff52ff42ff5aff42ff63ff42ff6bff42ff73ff42ff7bff42ff84ff42ff8cff42ff94ff42ff9cff42ffa5ff42ffadff42ffb5ff42ffbdff42ffc5ff42ffceff42ffd6ff42ffdeff42ffe6ff42ffefff42fff7ff42ffffff42ff00004aff08004aff10004aff19004aff21004aff29004aff31004aff3a004aff42004aff4a004aff52004aff5a004aff63004aff6b004aff73004aff7b004aff84004aff8c004aff94004aff9c004affa5004affad004affb5004affbd004affc5004affce004affd6004affde004affe6004affef004afff7004affff004aff00084aff08084aff10084aff19084aff21084aff29084aff31084aff3a084aff42084aff4a084aff52084aff5a084aff63084aff6b084aff73084aff7b084aff84084aff8c084aff94084aff9c084affa5084affad084affb5084affbd084affc5084affce084affd6084affde084affe6084affef084afff7084affff084aff00104aff08104aff10104aff19104aff21104aff29104aff31104aff3a104aff42104aff4a104aff52104aff5a104aff63104aff6b104aff73104aff7b104aff84104aff8c104aff94104aff9c104affa5104affad104affb5104affbd104affc5104affce104affd6104affde104affe6104affef104afff7104affff104aff00194aff08194aff10194aff19194aff21194aff29194aff31194aff3a194aff42194aff4a194aff52194aff5a194aff63194aff6b194aff73194aff7b194aff84194aff8c194aff94194aff9c194affa5194affad194affb5194affbd194affc5194affce194affd6194affde194affe6194affef194afff7194affff194aff00214aff08214aff10214aff19214aff21214aff29214aff31214aff3a214aff42214aff4a214aff52214aff5a214aff63214aff6b214aff73214aff7b214aff84214aff8c214aff94214aff9c214affa5214affad214affb5214affbd214affc5214affce214affd6214affde214affe6214affef214afff7214affff214aff00294aff08294aff10294aff19294aff21294aff29294aff31294aff3a294aff42294aff4a294aff52294aff5a294aff63294aff6b294aff73294aff7b294aff84294aff8c294aff94294aff9c294affa5294affad294affb5294affbd294affc5294affce294affd6294affde294affe6294affef294afff7294affff294aff00314aff08314aff10314aff19314aff21314aff29314aff31314aff3a314aff42314aff4a314aff52314aff5a314aff63314aff6b314aff73314aff7b314aff84314aff8c314aff94314aff9c314affa5314affad314affb5314affbd314affc5314affce314affd6314affde314affe6314affef314afff7314affff314aff003a4aff083a4aff103a4aff193a4aff213a4aff293a4aff313a4aff3a3a4aff423a4aff4a3a4aff523a4aff5a3a4aff633a4aff6b3a4aff733a4aff7b3a4aff843a4aff8c3a4aff943a4aff9c3a4affa53a4affad3a4affb53a4affbd3a4affc53a4affce3a4affd63a4affde3a4affe63a4affef3a4afff73a4affff3a4aff00424aff08424aff10424aff19424aff21424aff29424aff31424aff3a424aff42424aff4a424aff52424aff5a424aff63424aff6b424aff73424aff7b424aff84424aff8c424aff94424aff9c424affa5424affad424affb5424affbd424affc5424affce424affd6424affde424affe6424affef424afff7424affff424aff004a4aff084a4aff104a4aff194a4aff214a4aff294a4aff314a4aff3a4a4aff424a4aff4a4a4aff524a4aff5a4a4aff634a4aff6b4a4aff734a4aff7b4a4aff844a4aff8c4a4aff944a4aff9c4a4affa54a4affad4a4affb54a4affbd4a4affc54a4affce4a4affd64a4affde4a4affe64a4affef4a4afff74a4affff4a4aff00524aff08524aff10524aff19524aff21524aff29524aff31524aff3a524aff42524aff4a524aff52524aff5a524aff63524aff6b524aff73524aff7b524aff84524aff8c524aff94524aff9c524affa5524affad524affb5524affbd524affc5524affce524affd6524affde524affe6524affef524afff7524affff524aff005a4aff085a4aff105a4aff195a4aff215a4aff295a4aff315a4aff3a5a4aff425a4aff4a5a4aff525a4aff5a5a4aff635a4aff6b5a4aff735a4aff7b5a4aff845a4aff8c5a4aff945a4aff9c5a4affa55a4affad5a4affb55a4affbd5a4affc55a4affce5a4affd65a4affde5a4affe65a4affef5a4afff75a4affff5a4aff00634aff08634aff10634aff19634aff21634aff29634aff31634aff3a634aff42634aff4a634aff52634aff5a634aff63634aff6b634aff73634aff7b634aff84634aff8c634aff94634aff9c634affa5634affad634affb5634affbd634affc5634affce634affd6634affde634affe6634affef634afff7634affff634aff006b4aff086b4aff106b4aff196b4aff216b4aff296b4aff316b4aff3a6b4aff426b4aff4a6b4aff526b4aff5a6b4aff636b4aff6b6b4aff736b4aff7b6b4aff846b4aff8c6b4aff946b4aff9c6b4affa56b4affad6b4affb56b4affbd6b4affc56b4affce6b4affd66b4affde6b4affe66b4affef6b4afff76b4affff6b4aff00734aff08734aff10734aff19734aff21734aff29734aff31734aff3a734aff42734aff4a734aff52734aff5a734aff63734aff6b734aff73734aff7b734aff84734aff8c734aff94734aff9c734affa5734affad734affb5734affbd734affc5734affce734affd6734affde734affe6734affef734afff7734affff734aff007b4aff087b4aff107b4aff197b4aff217b4aff297b4aff317b4aff3a7b4aff427b4aff4a7b4aff527b4aff5a7b4aff637b4aff6b7b4aff737b4aff7b7b4aff847b4aff8c7b4aff947b4aff9c7b4affa57b4affad7b4affb57b4affbd7b4affc57b4affce7b4affd67b4affde7b4affe67b4affef7b4afff77b4affff7b4aff00844aff08844aff10844aff19844aff21844aff29844aff31844aff3a844aff42844aff4a844aff52844aff5a844aff63844aff6b844aff73844aff7b844aff84844aff8c844aff94844aff9c844affa5844affad844affb5844affbd844affc5844affce844affd6844affde844affe6844affef844afff7844affff844aff008c4aff088c4aff108c4aff198c4aff218c4aff298c4aff318c4aff3a8c4aff428c4aff4a8c4aff528c4aff5a8c4aff638c4aff6b8c4aff738c4aff7b8c4aff848c4aff8c8c4aff948c4aff9c8c4affa58c4affad8c4affb58c4affbd8c4affc58c4affce8c4affd68c4affde8c4affe68c4affef8c4afff78c4affff8c4aff00944aff08944aff10944aff19944aff21944aff29944aff31944aff3a944aff42944aff4a944aff52944aff5a944aff63944aff6b944aff73944aff7b944aff84944aff8c944aff94944aff9c944affa5944affad944affb5944affbd944affc5944affce944affd6944affde944affe6944affef944afff7944affff944aff009c4aff089c4aff109c4aff199c4aff219c4aff299c4aff319c4aff3a9c4aff429c4aff4a9c4aff529c4aff5a9c4aff639c4aff6b9c4aff739c4aff7b9c4aff849c4aff8c9c4aff949c4aff9c9c4affa59c4affad9c4affb59c4affbd9c4affc59c4affce9c4affd69c4affde9c4affe69c4affef9c4afff79c4affff9c4aff00a54aff08a54aff10a54aff19a54aff21a54aff29a54aff31a54aff3aa54aff42a54aff4aa54aff52a54aff5aa54aff63a54aff6ba54aff73a54aff7ba54aff84a54aff8ca54aff94a54aff9ca54affa5a54affada54affb5a54affbda54affc5a54affcea54affd6a54affdea54affe6a54affefa54afff7a54affffa54aff00ad4aff08ad4aff10ad4aff19ad4aff21ad4aff29ad4aff31ad4aff3aad4aff42ad4aff4aad4aff52ad4aff5aad4aff63ad4aff6bad4aff73ad4aff7bad4aff84ad4aff8cad4aff94ad4aff9cad4affa5ad4affadad4affb5ad4affbdad4affc5ad4affcead4affd6ad4affdead4affe6ad4affefad4afff7ad4affffad4aff00b54aff08b54aff10b54aff19b54aff21b54aff29b54aff31b54aff3ab54aff42b54aff4ab54aff52b54aff5ab54aff63b54aff6bb54aff73b54aff7bb54aff84b54aff8cb54aff94b54aff9cb54affa5b54affadb54affb5b54affbdb54affc5b54affceb54affd6b54affdeb54affe6b54affefb54afff7b54affffb54aff00bd4aff08bd4aff10bd4aff19bd4aff21bd4aff29bd4aff31bd4aff3abd4aff42bd4aff4abd4aff52bd4aff5abd4aff63bd4aff6bbd4aff73bd4aff7bbd4aff84bd4aff8cbd4aff94bd4aff9cbd4affa5bd4affadbd4affb5bd4affbdbd4affc5bd4affcebd4affd6bd4affdebd4affe6bd4affefbd4afff7bd4affffbd4aff00c54aff08c54aff10c54aff19c54aff21c54aff29c54aff31c54aff3ac54aff42c54aff4ac54aff52c54aff5ac54aff63c54aff6bc54aff73c54aff7bc54aff84c54aff8cc54aff94c54aff9cc54affa5c54affadc54affb5c54affbdc54affc5c54affcec54affd6c54affdec54affe6c54affefc54afff7c54affffc54aff00ce4aff08ce4aff10ce4aff19ce4aff21ce4aff29ce4aff31ce4aff3ace4aff42ce4aff4ace4aff52ce4aff5ace4aff63ce4aff6bce4aff73ce4aff7bce4aff84ce4aff8cce4aff94ce4aff9cce4affa5ce4affadce4affb5ce4affbdce4affc5ce4affcece4affd6ce4affdece4affe6ce4affefce4afff7ce4affffce4aff00d64aff08d64aff10d64aff19d64aff21d64aff29d64aff31d64aff3ad64aff42d64aff4ad64aff52d64aff5ad64aff63d64aff6bd64aff73d64aff7bd64aff84d64aff8cd64aff94d64aff9cd64affa5d64affadd64affb5d64affbdd64affc5d64affced64affd6d64affded64affe6d64affefd64afff7d64affffd64aff00de4aff08de4aff10de4aff19de4aff21de4aff29de4aff31de4aff3ade4aff42de4aff4ade4aff52de4aff5ade4aff63de4aff6bde4aff73de4aff7bde4aff84de4aff8cde4aff94de4aff9cde4affa5de4affadde4affb5de4affbdde4affc5de4affcede4affd6de4affdede4affe6de4affefde4afff7de4affffde4aff00e64aff08e64aff10e64aff19e64aff21e64aff29e64aff31e64aff3ae64aff42e64aff4ae64aff52e64aff5ae64aff63e64aff6be64aff73e64aff7be64aff84e64aff8ce64aff94e64aff9ce64affa5e64affade64affb5e64affbde64affc5e64affcee64affd6e64affdee64affe6e64affefe64afff7e64affffe64aff00ef4aff08ef4aff10ef4aff19ef4aff21ef4aff29ef4aff31ef4aff3aef4aff42ef4aff4aef4aff52ef4aff5aef4aff63ef4aff6bef4aff73ef4aff7bef4aff84ef4aff8cef4aff94ef4aff9cef4affa5ef4affadef4affb5ef4affbdef4affc5ef4affceef4affd6ef4affdeef4affe6ef4affefef4afff7ef4affffef4aff00f74aff08f74aff10f74aff19f74aff21f74aff29f74aff31f74aff3af74aff42f74aff4af74aff52f74aff5af74aff63f74aff6bf74aff73f74aff7bf74aff84f74aff8cf74aff94f74aff9cf74affa5f74affadf74affb5f74affbdf74affc5f74affcef74affd6f74affdef74affe6f74affeff74afff7f74afffff74aff00ff4aff08ff4aff10ff4aff19ff4aff21ff4aff29ff4aff31ff4aff3aff4aff42ff4aff4aff4aff52ff4aff5aff4aff63ff4aff6bff4aff73ff4aff7bff4aff84ff4aff8cff4aff94ff4aff9cff4affa5ff4affadff4affb5ff4affbdff4affc5ff4affceff4affd6ff4affdeff4affe6ff4affefff4afff7ff4affffff4aff000052ff080052ff100052ff190052ff210052ff290052ff310052ff3a0052ff420052ff4a0052ff520052ff5a0052ff630052ff6b0052ff730052ff7b0052ff840052ff8c0052ff940052ff9c0052ffa50052ffad0052ffb50052ffbd0052ffc50052ffce0052ffd60052ffde0052ffe60052ffef0052fff70052ffff0052ff000852ff080852ff100852ff190852ff210852ff290852ff310852ff3a0852ff420852ff4a0852ff520852ff5a0852ff630852ff6b0852ff730852ff7b0852ff840852ff8c0852ff940852ff9c0852ffa50852ffad0852ffb50852ffbd0852ffc50852ffce0852ffd60852ffde0852ffe60852ffef0852fff70852ffff0852ff001052ff081052ff101052ff191052ff211052ff291052ff311052ff3a1052ff421052ff4a1052ff521052ff5a1052ff631052ff6b1052ff731052ff7b1052ff841052ff8c1052ff941052ff9c1052ffa51052ffad1052ffb51052ffbd1052ffc51052ffce1052ffd61052ffde1052ffe61052ffef1052fff71052ffff1052ff001952ff081952ff101952ff191952ff211952ff291952ff311952ff3a1952ff421952ff4a1952ff521952ff5a1952ff631952ff6b1952ff731952ff7b1952ff841952ff8c1952ff941952ff9c1952ffa51952ffad1952ffb51952ffbd1952ffc51952ffce1952ffd61952ffde1952ffe61952ffef1952fff71952ffff1952ff002152ff082152ff102152ff192152ff212152ff292152ff312152ff3a2152ff422152ff4a2152ff522152ff5a2152ff632152ff6b2152ff732152ff7b2152ff842152ff8c2152ff942152ff9c2152ffa52152ffad2152ffb52152ffbd2152ffc52152ffce2152ffd62152ffde2152ffe62152ffef2152fff72152ffff2152ff002952ff082952ff102952ff192952ff212952ff292952ff312952ff3a2952ff422952ff4a2952ff522952ff5a2952ff632952ff6b2952ff732952ff7b2952ff842952ff8c2952ff942952ff9c2952ffa52952ffad2952ffb52952ffbd2952ffc52952ffce2952ffd62952ffde2952ffe62952ffef2952fff72952ffff2952ff003152ff083152ff103152ff193152ff213152ff293152ff313152ff3a3152ff423152ff4a3152ff523152ff5a3152ff633152ff6b3152ff733152ff7b3152ff843152ff8c3152ff943152ff9c3152ffa53152ffad3152ffb53152ffbd3152ffc53152ffce3152ffd63152ffde3152ffe63152ffef3152fff73152ffff3152ff003a52ff083a52ff103a52ff193a52ff213a52ff293a52ff313a52ff3a3a52ff423a52ff4a3a52ff523a52ff5a3a52ff633a52ff6b3a52ff733a52ff7b3a52ff843a52ff8c3a52ff943a52ff9c3a52ffa53a52ffad3a52ffb53a52ffbd3a52ffc53a52ffce3a52ffd63a52ffde3a52ffe63a52ffef3a52fff73a52ffff3a52ff004252ff084252ff104252ff194252ff214252ff294252ff314252ff3a4252ff424252ff4a4252ff524252ff5a4252ff634252ff6b4252ff734252ff7b4252ff844252ff8c4252ff944252ff9c4252ffa54252ffad4252ffb54252ffbd4252ffc54252ffce4252ffd64252ffde4252ffe64252ffef4252fff74252ffff4252ff004a52ff084a52ff104a52ff194a52ff214a52ff294a52ff314a52ff3a4a52ff424a52ff4a4a52ff524a52ff5a4a52ff634a52ff6b4a52ff734a52ff7b4a52ff844a52ff8c4a52ff944a52ff9c4a52ffa54a52ffad4a52ffb54a52ffbd4a52ffc54a52ffce4a52ffd64a52ffde4a52ffe64a52ffef4a52fff74a52ffff4a52ff005252ff085252ff105252ff195252ff215252ff295252ff315252ff3a5252ff425252ff4a5252ff525252ff5a5252ff635252ff6b5252ff735252ff7b5252ff845252ff8c5252ff945252ff9c5252ffa55252ffad5252ffb55252ffbd5252ffc55252ffce5252ffd65252ffde5252ffe65252ffef5252fff75252ffff5252ff005a52ff085a52ff105a52ff195a52ff215a52ff295a52ff315a52ff3a5a52ff425a52ff4a5a52ff525a52ff5a5a52ff635a52ff6b5a52ff735a52ff7b5a52ff845a52ff8c5a52ff945a52ff9c5a52ffa55a52ffad5a52ffb55a52ffbd5a52ffc55a52ffce5a52ffd65a52ffde5a52ffe65a52ffef5a52fff75a52ffff5a52ff006352ff086352ff106352ff196352ff216352ff296352ff316352ff3a6352ff426352ff4a6352ff526352ff5a6352ff636352ff6b6352ff736352ff7b6352ff846352ff8c6352ff946352ff9c6352ffa56352ffad6352ffb56352ffbd6352ffc56352ffce6352ffd66352ffde6352ffe66352ffef6352fff76352ffff6352ff006b52ff086b52ff106b52ff196b52ff216b52ff296b52ff316b52ff3a6b52ff426b52ff4a6b52ff526b52ff5a6b52ff636b52ff6b6b52ff736b52ff7b6b52ff846b52ff8c6b52ff946b52ff9c6b52ffa56b52ffad6b52ffb56b52ffbd6b52ffc56b52ffce6b52ffd66b52ffde6b52ffe66b52ffef6b52fff76b52ffff6b52ff007352ff087352ff107352ff197352ff217352ff297352ff317352ff3a7352ff427352ff4a7352ff527352ff5a7352ff637352ff6b7352ff737352ff7b7352ff847352ff8c7352ff947352ff9c7352ffa57352ffad7352ffb57352ffbd7352ffc57352ffce7352ffd67352ffde7352ffe67352ffef7352fff77352ffff7352ff007b52ff087b52ff107b52ff197b52ff217b52ff297b52ff317b52ff3a7b52ff427b52ff4a7b52ff527b52ff5a7b52ff637b52ff6b7b52ff737b52ff7b7b52ff847b52ff8c7b52ff947b52ff9c7b52ffa57b52ffad7b52ffb57b52ffbd7b52ffc57b52ffce7b52ffd67b52ffde7b52ffe67b52ffef7b52fff77b52ffff7b52ff008452ff088452ff108452ff198452ff218452ff298452ff318452ff3a8452ff428452ff4a8452ff528452ff5a8452ff638452ff6b8452ff738452ff7b8452ff848452ff8c8452ff948452ff9c8452ffa58452ffad8452ffb58452ffbd8452ffc58452ffce8452ffd68452ffde8452ffe68452ffef8452fff78452ffff8452ff008c52ff088c52ff108c52ff198c52ff218c52ff298c52ff318c52ff3a8c52ff428c52ff4a8c52ff528c52ff5a8c52ff638c52ff6b8c52ff738c52ff7b8c52ff848c52ff8c8c52ff948c52ff9c8c52ffa58c52ffad8c52ffb58c52ffbd8c52ffc58c52ffce8c52ffd68c52ffde8c52ffe68c52ffef8c52fff78c52ffff8c52ff009452ff089452ff109452ff199452ff219452ff299452ff319452ff3a9452ff429452ff4a9452ff529452ff5a9452ff639452ff6b9452ff739452ff7b9452ff849452ff8c9452ff949452ff9c9452ffa59452ffad9452ffb59452ffbd9452ffc59452ffce9452ffd69452ffde9452ffe69452ffef9452fff79452ffff9452ff009c52ff089c52ff109c52ff199c52ff219c52ff299c52ff319c52ff3a9c52ff429c52ff4a9c52ff529c52ff5a9c52ff639c52ff6b9c52ff739c52ff7b9c52ff849c52ff8c9c52ff949c52ff9c9c52ffa59c52ffad9c52ffb59c52ffbd9c52ffc59c52ffce9c52ffd69c52ffde9c52ffe69c52ffef9c52fff79c52ffff9c52ff00a552ff08a552ff10a552ff19a552ff21a552ff29a552ff31a552ff3aa552ff42a552ff4aa552ff52a552ff5aa552ff63a552ff6ba552ff73a552ff7ba552ff84a552ff8ca552ff94a552ff9ca552ffa5a552ffada552ffb5a552ffbda552ffc5a552ffcea552ffd6a552ffdea552ffe6a552ffefa552fff7a552ffffa552ff00ad52ff08ad52ff10ad52ff19ad52ff21ad52ff29ad52ff31ad52ff3aad52ff42ad52ff4aad52ff52ad52ff5aad52ff63ad52ff6bad52ff73ad52ff7bad52ff84ad52ff8cad52ff94ad52ff9cad52ffa5ad52ffadad52ffb5ad52ffbdad52ffc5ad52ffcead52ffd6ad52ffdead52ffe6ad52ffefad52fff7ad52ffffad52ff00b552ff08b552ff10b552ff19b552ff21b552ff29b552ff31b552ff3ab552ff42b552ff4ab552ff52b552ff5ab552ff63b552ff6bb552ff73b552ff7bb552ff84b552ff8cb552ff94b552ff9cb552ffa5b552ffadb552ffb5b552ffbdb552ffc5b552ffceb552ffd6b552ffdeb552ffe6b552ffefb552fff7b552ffffb552ff00bd52ff08bd52ff10bd52ff19bd52ff21bd52ff29bd52ff31bd52ff3abd52ff42bd52ff4abd52ff52bd52ff5abd52ff63bd52ff6bbd52ff73bd52ff7bbd52ff84bd52ff8cbd52ff94bd52ff9cbd52ffa5bd52ffadbd52ffb5bd52ffbdbd52ffc5bd52ffcebd52ffd6bd52ffdebd52ffe6bd52ffefbd52fff7bd52ffffbd52ff00c552ff08c552ff10c552ff19c552ff21c552ff29c552ff31c552ff3ac552ff42c552ff4ac552ff52c552ff5ac552ff63c552ff6bc552ff73c552ff7bc552ff84c552ff8cc552ff94c552ff9cc552ffa5c552ffadc552ffb5c552ffbdc552ffc5c552ffcec552ffd6c552ffdec552ffe6c552ffefc552fff7c552ffffc552ff00ce52ff08ce52ff10ce52ff19ce52ff21ce52ff29ce52ff31ce52ff3ace52ff42ce52ff4ace52ff52ce52ff5ace52ff63ce52ff6bce52ff73ce52ff7bce52ff84ce52ff8cce52ff94ce52ff9cce52ffa5ce52ffadce52ffb5ce52ffbdce52ffc5ce52ffcece52ffd6ce52ffdece52ffe6ce52ffefce52fff7ce52ffffce52ff00d652ff08d652ff10d652ff19d652ff21d652ff29d652ff31d652ff3ad652ff42d652ff4ad652ff52d652ff5ad652ff63d652ff6bd652ff73d652ff7bd652ff84d652ff8cd652ff94d652ff9cd652ffa5d652ffadd652ffb5d652ffbdd652ffc5d652ffced652ffd6d652ffded652ffe6d652ffefd652fff7d652ffffd652ff00de52ff08de52ff10de52ff19de52ff21de52ff29de52ff31de52ff3ade52ff42de52ff4ade52ff52de52ff5ade52ff63de52ff6bde52ff73de52ff7bde52ff84de52ff8cde52ff94de52ff9cde52ffa5de52ffadde52ffb5de52ffbdde52ffc5de52ffcede52ffd6de52ffdede52ffe6de52ffefde52fff7de52ffffde52ff00e652ff08e652ff10e652ff19e652ff21e652ff29e652ff31e652ff3ae652ff42e652ff4ae652ff52e652ff5ae652ff63e652ff6be652ff73e652ff7be652ff84e652ff8ce652ff94e652ff9ce652ffa5e652ffade652ffb5e652ffbde652ffc5e652ffcee652ffd6e652ffdee652ffe6e652ffefe652fff7e652ffffe652ff00ef52ff08ef52ff10ef52ff19ef52ff21ef52ff29ef52ff31ef52ff3aef52ff42ef52ff4aef52ff52ef52ff5aef52ff63ef52ff6bef52ff73ef52ff7bef52ff84ef52ff8cef52ff94ef52ff9cef52ffa5ef52ffadef52ffb5ef52ffbdef52ffc5ef52ffceef52ffd6ef52ffdeef52ffe6ef52ffefef52fff7ef52ffffef52ff00f752ff08f752ff10f752ff19f752ff21f752ff29f752ff31f752ff3af752ff42f752ff4af752ff52f752ff5af752ff63f752ff6bf752ff73f752ff7bf752ff84f752ff8cf752ff94f752ff9cf752ffa5f752ffadf752ffb5f752ffbdf752ffc5f752ffcef752ffd6f752ffdef752ffe6f752ffeff752fff7f752fffff752ff00ff52ff08ff52ff10ff52ff19ff52ff21ff52ff29ff52ff31ff52ff3aff52ff42ff52ff4aff52ff52ff52ff5aff52ff63ff52ff6bff52ff73ff52ff7bff52ff84ff52ff8cff52ff94ff52ff9cff52ffa5ff52ffadff52ffb5ff52ffbdff52ffc5ff52ffceff52ffd6ff52ffdeff52ffe6ff52ffefff52fff7ff52ffffff52ff00005aff08005aff10005aff19005aff21005aff29005aff31005aff3a005aff42005aff4a005aff52005aff5a005aff63005aff6b005aff73005aff7b005aff84005aff8c005aff94005aff9c005affa5005affad005affb5005affbd005affc5005affce005affd6005affde005affe6005affef005afff7005affff005aff00085aff08085aff10085aff19085aff21085aff29085aff31085aff3a085aff42085aff4a085aff52085aff5a085aff63085aff6b085aff73085aff7b085aff84085aff8c085aff94085aff9c085affa5085affad085affb5085affbd085affc5085affce085affd6085affde085affe6085affef085afff7085affff085aff00105aff08105aff10105aff19105aff21105aff29105aff31105aff3a105aff42105aff4a105aff52105aff5a105aff63105aff6b105aff73105aff7b105aff84105aff8c105aff94105aff9c105affa5105affad105affb5105affbd105affc5105affce105affd6105affde105affe6105affef105afff7105affff105aff00195aff08195aff10195aff19195aff21195aff29195aff31195aff3a195aff42195aff4a195aff52195aff5a195aff63195aff6b195aff73195aff7b195aff84195aff8c195aff94195aff9c195affa5195affad195affb5195affbd195affc5195affce195affd6195affde195affe6195affef195afff7195affff195aff00215aff08215aff10215aff19215aff21215aff29215aff31215aff3a215aff42215aff4a215aff52215aff5a215aff63215aff6b215aff73215aff7b215aff84215aff8c215aff94215aff9c215affa5215affad215affb5215affbd215affc5215affce215affd6215affde215affe6215affef215afff7215affff215aff00295aff08295aff10295aff19295aff21295aff29295aff31295aff3a295aff42295aff4a295aff52295aff5a295aff63295aff6b295aff73295aff7b295aff84295aff8c295aff94295aff9c295affa5295affad295affb5295affbd295affc5295affce295affd6295affde295affe6295affef295afff7295affff295aff00315aff08315aff10315aff19315aff21315aff29315aff31315aff3a315aff42315aff4a315aff52315aff5a315aff63315aff6b315aff73315aff7b315aff84315aff8c315aff94315aff9c315affa5315affad315affb5315affbd315affc5315affce315affd6315affde315affe6315affef315afff7315affff315aff003a5aff083a5aff103a5aff193a5aff213a5aff293a5aff313a5aff3a3a5aff423a5aff4a3a5aff523a5aff5a3a5aff633a5aff6b3a5aff733a5aff7b3a5aff843a5aff8c3a5aff943a5aff9c3a5affa53a5affad3a5affb53a5affbd3a5affc53a5affce3a5affd63a5affde3a5affe63a5affef3a5afff73a5affff3a5aff00425aff08425aff10425aff19425aff21425aff29425aff31425aff3a425aff42425aff4a425aff52425aff5a425aff63425aff6b425aff73425aff7b425aff84425aff8c425aff94425aff9c425affa5425affad425affb5425affbd425affc5425affce425affd6425affde425affe6425affef425afff7425affff425aff004a5aff084a5aff104a5aff194a5aff214a5aff294a5aff314a5aff3a4a5aff424a5aff4a4a5aff524a5aff5a4a5aff634a5aff6b4a5aff734a5aff7b4a5aff844a5aff8c4a5aff944a5aff9c4a5affa54a5affad4a5affb54a5affbd4a5affc54a5affce4a5affd64a5affde4a5affe64a5affef4a5afff74a5affff4a5aff00525aff08525aff10525aff19525aff21525aff29525aff31525aff3a525aff42525aff4a525aff52525aff5a525aff63525aff6b525aff73525aff7b525aff84525aff8c525aff94525aff9c525affa5525affad525affb5525affbd525affc5525affce525affd6525affde525affe6525affef525afff7525affff525aff005a5aff085a5aff105a5aff195a5aff215a5aff295a5aff315a5aff3a5a5aff425a5aff4a5a5aff525a5aff5a5a5aff635a5aff6b5a5aff735a5aff7b5a5aff845a5aff8c5a5aff945a5aff9c5a5affa55a5affad5a5affb55a5affbd5a5affc55a5affce5a5affd65a5affde5a5affe65a5affef5a5afff75a5affff5a5aff00635aff08635aff10635aff19635aff21635aff29635aff31635aff3a635aff42635aff4a635aff52635aff5a635aff63635aff6b635aff73635aff7b635aff84635aff8c635aff94635aff9c635affa5635affad635affb5635affbd635affc5635affce635affd6635affde635affe6635affef635afff7635affff635aff006b5aff086b5aff106b5aff196b5aff216b5aff296b5aff316b5aff3a6b5aff426b5aff4a6b5aff526b5aff5a6b5aff636b5aff6b6b5aff736b5aff7b6b5aff846b5aff8c6b5aff946b5aff9c6b5affa56b5affad6b5affb56b5affbd6b5affc56b5affce6b5affd66b5affde6b5affe66b5affef6b5afff76b5affff6b5aff00735aff08735aff10735aff19735aff21735aff29735aff31735aff3a735aff42735aff4a735aff52735aff5a735aff63735aff6b735aff73735aff7b735aff84735aff8c735aff94735aff9c735affa5735affad735affb5735affbd735affc5735affce735affd6735affde735affe6735affef735afff7735affff735aff007b5aff087b5aff107b5aff197b5aff217b5aff297b5aff317b5aff3a7b5aff427b5aff4a7b5aff527b5aff5a7b5aff637b5aff6b7b5aff737b5aff7b7b5aff847b5aff8c7b5aff947b5aff9c7b5affa57b5affad7b5affb57b5affbd7b5affc57b5affce7b5affd67b5affde7b5affe67b5affef7b5afff77b5affff7b5aff00845aff08845aff10845aff19845aff21845aff29845aff31845aff3a845aff42845aff4a845aff52845aff5a845aff63845aff6b845aff73845aff7b845aff84845aff8c845aff94845aff9c845affa5845affad845affb5845affbd845affc5845affce845affd6845affde845affe6845affef845afff7845affff845aff008c5aff088c5aff108c5aff198c5aff218c5aff298c5aff318c5aff3a8c5aff428c5aff4a8c5aff528c5aff5a8c5aff638c5aff6b8c5aff738c5aff7b8c5aff848c5aff8c8c5aff948c5aff9c8c5affa58c5affad8c5affb58c5affbd8c5affc58c5affce8c5affd68c5affde8c5affe68c5affef8c5afff78c5affff8c5aff00945aff08945aff10945aff19945aff21945aff29945aff31945aff3a945aff42945aff4a945aff52945aff5a945aff63945aff6b945aff73945aff7b945aff84945aff8c945aff94945aff9c945affa5945affad945affb5945affbd945affc5945affce945affd6945affde945affe6945affef945afff7945affff945aff009c5aff089c5aff109c5aff199c5aff219c5aff299c5aff319c5aff3a9c5aff429c5aff4a9c5aff529c5aff5a9c5aff639c5aff6b9c5aff739c5aff7b9c5aff849c5aff8c9c5aff949c5aff9c9c5affa59c5affad9c5affb59c5affbd9c5affc59c5affce9c5affd69c5affde9c5affe69c5affef9c5afff79c5affff9c5aff00a55aff08a55aff10a55aff19a55aff21a55aff29a55aff31a55aff3aa55aff42a55aff4aa55aff52a55aff5aa55aff63a55aff6ba55aff73a55aff7ba55aff84a55aff8ca55aff94a55aff9ca55affa5a55affada55affb5a55affbda55affc5a55affcea55affd6a55affdea55affe6a55affefa55afff7a55affffa55aff00ad5aff08ad5aff10ad5aff19ad5aff21ad5aff29ad5aff31ad5aff3aad5aff42ad5aff4aad5aff52ad5aff5aad5aff63ad5aff6bad5aff73ad5aff7bad5aff84ad5aff8cad5aff94ad5aff9cad5affa5ad5affadad5affb5ad5affbdad5affc5ad5affcead5affd6ad5affdead5affe6ad5affefad5afff7ad5affffad5aff00b55aff08b55aff10b55aff19b55aff21b55aff29b55aff31b55aff3ab55aff42b55aff4ab55aff52b55aff5ab55aff63b55aff6bb55aff73b55aff7bb55aff84b55aff8cb55aff94b55aff9cb55affa5b55affadb55affb5b55affbdb55affc5b55affceb55affd6b55affdeb55affe6b55affefb55afff7b55affffb55aff00bd5aff08bd5aff10bd5aff19bd5aff21bd5aff29bd5aff31bd5aff3abd5aff42bd5aff4abd5aff52bd5aff5abd5aff63bd5aff6bbd5aff73bd5aff7bbd5aff84bd5aff8cbd5aff94bd5aff9cbd5affa5bd5affadbd5affb5bd5affbdbd5affc5bd5affcebd5affd6bd5affdebd5affe6bd5affefbd5afff7bd5affffbd5aff00c55aff08c55aff10c55aff19c55aff21c55aff29c55aff31c55aff3ac55aff42c55aff4ac55aff52c55aff5ac55aff63c55aff6bc55aff73c55aff7bc55aff84c55aff8cc55aff94c55aff9cc55affa5c55affadc55affb5c55affbdc55affc5c55affcec55affd6c55affdec55affe6c55affefc55afff7c55affffc55aff00ce5aff08ce5aff10ce5aff19ce5aff21ce5aff29ce5aff31ce5aff3ace5aff42ce5aff4ace5aff52ce5aff5ace5aff63ce5aff6bce5aff73ce5aff7bce5aff84ce5aff8cce5aff94ce5aff9cce5affa5ce5affadce5affb5ce5affbdce5affc5ce5affcece5affd6ce5affdece5affe6ce5affefce5afff7ce5affffce5aff00d65aff08d65aff10d65aff19d65aff21d65aff29d65aff31d65aff3ad65aff42d65aff4ad65aff52d65aff5ad65aff63d65aff6bd65aff73d65aff7bd65aff84d65aff8cd65aff94d65aff9cd65affa5d65affadd65affb5d65affbdd65affc5d65affced65affd6d65affded65affe6d65affefd65afff7d65affffd65aff00de5aff08de5aff10de5aff19de5aff21de5aff29de5aff31de5aff3ade5aff42de5aff4ade5aff52de5aff5ade5aff63de5aff6bde5aff73de5aff7bde5aff84de5aff8cde5aff94de5aff9cde5affa5de5affadde5affb5de5affbdde5affc5de5affcede5affd6de5affdede5affe6de5affefde5afff7de5affffde5aff00e65aff08e65aff10e65aff19e65aff21e65aff29e65aff31e65aff3ae65aff42e65aff4ae65aff52e65aff5ae65aff63e65aff6be65aff73e65aff7be65aff84e65aff8ce65aff94e65aff9ce65affa5e65affade65affb5e65affbde65affc5e65affcee65affd6e65affdee65affe6e65affefe65afff7e65affffe65aff00ef5aff08ef5aff10ef5aff19ef5aff21ef5aff29ef5aff31ef5aff3aef5aff42ef5aff4aef5aff52ef5aff5aef5aff63ef5aff6bef5aff73ef5aff7bef5aff84ef5aff8cef5aff94ef5aff9cef5affa5ef5affadef5affb5ef5affbdef5affc5ef5affceef5affd6ef5affdeef5affe6ef5affefef5afff7ef5affffef5aff00f75aff08f75aff10f75aff19f75aff21f75aff29f75aff31f75aff3af75aff42f75aff4af75aff52f75aff5af75aff63f75aff6bf75aff73f75aff7bf75aff84f75aff8cf75aff94f75aff9cf75affa5f75affadf75affb5f75affbdf75affc5f75affcef75affd6f75affdef75affe6f75affeff75afff7f75afffff75aff00ff5aff08ff5aff10ff5aff19ff5aff21ff5aff29ff5aff31ff5aff3aff5aff42ff5aff4aff5aff52ff5aff5aff5aff63ff5aff6bff5aff73ff5aff7bff5aff84ff5aff8cff5aff94ff5aff9cff5affa5ff5affadff5affb5ff5affbdff5affc5ff5affceff5affd6ff5affdeff5affe6ff5affefff5afff7ff5affffff5aff000063ff080063ff100063ff190063ff210063ff290063ff310063ff3a0063ff420063ff4a0063ff520063ff5a0063ff630063ff6b0063ff730063ff7b0063ff840063ff8c0063ff940063ff9c0063ffa50063ffad0063ffb50063ffbd0063ffc50063ffce0063ffd60063ffde0063ffe60063ffef0063fff70063ffff0063ff000863ff080863ff100863ff190863ff210863ff290863ff310863ff3a0863ff420863ff4a0863ff520863ff5a0863ff630863ff6b0863ff730863ff7b0863ff840863ff8c0863ff940863ff9c0863ffa50863ffad0863ffb50863ffbd0863ffc50863ffce0863ffd60863ffde0863ffe60863ffef0863fff70863ffff0863ff001063ff081063ff101063ff191063ff211063ff291063ff311063ff3a1063ff421063ff4a1063ff521063ff5a1063ff631063ff6b1063ff731063ff7b1063ff841063ff8c1063ff941063ff9c1063ffa51063ffad1063ffb51063ffbd1063ffc51063ffce1063ffd61063ffde1063ffe61063ffef1063fff71063ffff1063ff001963ff081963ff101963ff191963ff211963ff291963ff311963ff3a1963ff421963ff4a1963ff521963ff5a1963ff631963ff6b1963ff731963ff7b1963ff841963ff8c1963ff941963ff9c1963ffa51963ffad1963ffb51963ffbd1963ffc51963ffce1963ffd61963ffde1963ffe61963ffef1963fff71963ffff1963ff002163ff082163ff102163ff192163ff212163ff292163ff312163ff3a2163ff422163ff4a2163ff522163ff5a2163ff632163ff6b2163ff732163ff7b2163ff842163ff8c2163ff942163ff9c2163ffa52163ffad2163ffb52163ffbd2163ffc52163ffce2163ffd62163ffde2163ffe62163ffef2163fff72163ffff2163ff002963ff082963ff102963ff192963ff212963ff292963ff312963ff3a2963ff422963ff4a2963ff522963ff5a2963ff632963ff6b2963ff732963ff7b2963ff842963ff8c2963ff942963ff9c2963ffa52963ffad2963ffb52963ffbd2963ffc52963ffce2963ffd62963ffde2963ffe62963ffef2963fff72963ffff2963ff003163ff083163ff103163ff193163ff213163ff293163ff313163ff3a3163ff423163ff4a3163ff523163ff5a3163ff633163ff6b3163ff733163ff7b3163ff843163ff8c3163ff943163ff9c3163ffa53163ffad3163ffb53163ffbd3163ffc53163ffce3163ffd63163ffde3163ffe63163ffef3163fff73163ffff3163ff003a63ff083a63ff103a63ff193a63ff213a63ff293a63ff313a63ff3a3a63ff423a63ff4a3a63ff523a63ff5a3a63ff633a63ff6b3a63ff733a63ff7b3a63ff843a63ff8c3a63ff943a63ff9c3a63ffa53a63ffad3a63ffb53a63ffbd3a63ffc53a63ffce3a63ffd63a63ffde3a63ffe63a63ffef3a63fff73a63ffff3a63ff004263ff084263ff104263ff194263ff214263ff294263ff314263ff3a4263ff424263ff4a4263ff524263ff5a4263ff634263ff6b4263ff734263ff7b4263ff844263ff8c4263ff944263ff9c4263ffa54263ffad4263ffb54263ffbd4263ffc54263ffce4263ffd64263ffde4263ffe64263ffef4263fff74263ffff4263ff004a63ff084a63ff104a63ff194a63ff214a63ff294a63ff314a63ff3a4a63ff424a63ff4a4a63ff524a63ff5a4a63ff634a63ff6b4a63ff734a63ff7b4a63ff844a63ff8c4a63ff944a63ff9c4a63ffa54a63ffad4a63ffb54a63ffbd4a63ffc54a63ffce4a63ffd64a63ffde4a63ffe64a63ffef4a63fff74a63ffff4a63ff005263ff085263ff105263ff195263ff215263ff295263ff315263ff3a5263ff425263ff4a5263ff525263ff5a5263ff635263ff6b5263ff735263ff7b5263ff845263ff8c5263ff945263ff9c5263ffa55263ffad5263ffb55263ffbd5263ffc55263ffce5263ffd65263ffde5263ffe65263ffef5263fff75263ffff5263ff005a63ff085a63ff105a63ff195a63ff215a63ff295a63ff315a63ff3a5a63ff425a63ff4a5a63ff525a63ff5a5a63ff635a63ff6b5a63ff735a63ff7b5a63ff845a63ff8c5a63ff945a63ff9c5a63ffa55a63ffad5a63ffb55a63ffbd5a63ffc55a63ffce5a63ffd65a63ffde5a63ffe65a63ffef5a63fff75a63ffff5a63ff006363ff086363ff106363ff196363ff216363ff296363ff316363ff3a6363ff426363ff4a6363ff526363ff5a6363ff636363ff6b6363ff736363ff7b6363ff846363ff8c6363ff946363ff9c6363ffa56363ffad6363ffb56363ffbd6363ffc56363ffce6363ffd66363ffde6363ffe66363ffef6363fff76363ffff6363ff006b63ff086b63ff106b63ff196b63ff216b63ff296b63ff316b63ff3a6b63ff426b63ff4a6b63ff526b63ff5a6b63ff636b63ff6b6b63ff736b63ff7b6b63ff846b63ff8c6b63ff946b63ff9c6b63ffa56b63ffad6b63ffb56b63ffbd6b63ffc56b63ffce6b63ffd66b63ffde6b63ffe66b63ffef6b63fff76b63ffff6b63ff007363ff087363ff107363ff197363ff217363ff297363ff317363ff3a7363ff427363ff4a7363ff527363ff5a7363ff637363ff6b7363ff737363ff7b7363ff847363ff8c7363ff947363ff9c7363ffa57363ffad7363ffb57363ffbd7363ffc57363ffce7363ffd67363ffde7363ffe67363ffef7363fff77363ffff7363ff007b63ff087b63ff107b63ff197b63ff217b63ff297b63ff317b63ff3a7b63ff427b63ff4a7b63ff527b63ff5a7b63ff637b63ff6b7b63ff737b63ff7b7b63ff847b63ff8c7b63ff947b63ff9c7b63ffa57b63ffad7b63ffb57b63ffbd7b63ffc57b63ffce7b63ffd67b63ffde7b63ffe67b63ffef7b63fff77b63ffff7b63ff008463ff088463ff108463ff198463ff218463ff298463ff318463ff3a8463ff428463ff4a8463ff528463ff5a8463ff638463ff6b8463ff738463ff7b8463ff848463ff8c8463ff948463ff9c8463ffa58463ffad8463ffb58463ffbd8463ffc58463ffce8463ffd68463ffde8463ffe68463ffef8463fff78463ffff8463ff008c63ff088c63ff108c63ff198c63ff218c63ff298c63ff318c63ff3a8c63ff428c63ff4a8c63ff528c63ff5a8c63ff638c63ff6b8c63ff738c63ff7b8c63ff848c63ff8c8c63ff948c63ff9c8c63ffa58c63ffad8c63ffb58c63ffbd8c63ffc58c63ffce8c63ffd68c63ffde8c63ffe68c63ffef8c63fff78c63ffff8c63ff009463ff089463ff109463ff199463ff219463ff299463ff319463ff3a9463ff429463ff4a9463ff529463ff5a9463ff639463ff6b9463ff739463ff7b9463ff849463ff8c9463ff949463ff9c9463ffa59463ffad9463ffb59463ffbd9463ffc59463ffce9463ffd69463ffde9463ffe69463ffef9463fff79463ffff9463ff009c63ff089c63ff109c63ff199c63ff219c63ff299c63ff319c63ff3a9c63ff429c63ff4a9c63ff529c63ff5a9c63ff639c63ff6b9c63ff739c63ff7b9c63ff849c63ff8c9c63ff949c63ff9c9c63ffa59c63ffad9c63ffb59c63ffbd9c63ffc59c63ffce9c63ffd69c63ffde9c63ffe69c63ffef9c63fff79c63ffff9c63ff00a563ff08a563ff10a563ff19a563ff21a563ff29a563ff31a563ff3aa563ff42a563ff4aa563ff52a563ff5aa563ff63a563ff6ba563ff73a563ff7ba563ff84a563ff8ca563ff94a563ff9ca563ffa5a563ffada563ffb5a563ffbda563ffc5a563ffcea563ffd6a563ffdea563ffe6a563ffefa563fff7a563ffffa563ff00ad63ff08ad63ff10ad63ff19ad63ff21ad63ff29ad63ff31ad63ff3aad63ff42ad63ff4aad63ff52ad63ff5aad63ff63ad63ff6bad63ff73ad63ff7bad63ff84ad63ff8cad63ff94ad63ff9cad63ffa5ad63ffadad63ffb5ad63ffbdad63ffc5ad63ffcead63ffd6ad63ffdead63ffe6ad63ffefad63fff7ad63ffffad63ff00b563ff08b563ff10b563ff19b563ff21b563ff29b563ff31b563ff3ab563ff42b563ff4ab563ff52b563ff5ab563ff63b563ff6bb563ff73b563ff7bb563ff84b563ff8cb563ff94b563ff9cb563ffa5b563ffadb563ffb5b563ffbdb563ffc5b563ffceb563ffd6b563ffdeb563ffe6b563ffefb563fff7b563ffffb563ff00bd63ff08bd63ff10bd63ff19bd63ff21bd63ff29bd63ff31bd63ff3abd63ff42bd63ff4abd63ff52bd63ff5abd63ff63bd63ff6bbd63ff73bd63ff7bbd63ff84bd63ff8cbd63ff94bd63ff9cbd63ffa5bd63ffadbd63ffb5bd63ffbdbd63ffc5bd63ffcebd63ffd6bd63ffdebd63ffe6bd63ffefbd63fff7bd63ffffbd63ff00c563ff08c563ff10c563ff19c563ff21c563ff29c563ff31c563ff3ac563ff42c563ff4ac563ff52c563ff5ac563ff63c563ff6bc563ff73c563ff7bc563ff84c563ff8cc563ff94c563ff9cc563ffa5c563ffadc563ffb5c563ffbdc563ffc5c563ffcec563ffd6c563ffdec563ffe6c563ffefc563fff7c563ffffc563ff00ce63ff08ce63ff10ce63ff19ce63ff21ce63ff29ce63ff31ce63ff3ace63ff42ce63ff4ace63ff52ce63ff5ace63ff63ce63ff6bce63ff73ce63ff7bce63ff84ce63ff8cce63ff94ce63ff9cce63ffa5ce63ffadce63ffb5ce63ffbdce63ffc5ce63ffcece63ffd6ce63ffdece63ffe6ce63ffefce63fff7ce63ffffce63ff00d663ff08d663ff10d663ff19d663ff21d663ff29d663ff31d663ff3ad663ff42d663ff4ad663ff52d663ff5ad663ff63d663ff6bd663ff73d663ff7bd663ff84d663ff8cd663ff94d663ff9cd663ffa5d663ffadd663ffb5d663ffbdd663ffc5d663ffced663ffd6d663ffded663ffe6d663ffefd663fff7d663ffffd663ff00de63ff08de63ff10de63ff19de63ff21de63ff29de63ff31de63ff3ade63ff42de63ff4ade63ff52de63ff5ade63ff63de63ff6bde63ff73de63ff7bde63ff84de63ff8cde63ff94de63ff9cde63ffa5de63ffadde63ffb5de63ffbdde63ffc5de63ffcede63ffd6de63ffdede63ffe6de63ffefde63fff7de63ffffde63ff00e663ff08e663ff10e663ff19e663ff21e663ff29e663ff31e663ff3ae663ff42e663ff4ae663ff52e663ff5ae663ff63e663ff6be663ff73e663ff7be663ff84e663ff8ce663ff94e663ff9ce663ffa5e663ffade663ffb5e663ffbde663ffc5e663ffcee663ffd6e663ffdee663ffe6e663ffefe663fff7e663ffffe663ff00ef63ff08ef63ff10ef63ff19ef63ff21ef63ff29ef63ff31ef63ff3aef63ff42ef63ff4aef63ff52ef63ff5aef63ff63ef63ff6bef63ff73ef63ff7bef63ff84ef63ff8cef63ff94ef63ff9cef63ffa5ef63ffadef63ffb5ef63ffbdef63ffc5ef63ffceef63ffd6ef63ffdeef63ffe6ef63ffefef63fff7ef63ffffef63ff00f763ff08f763ff10f763ff19f763ff21f763ff29f763ff31f763ff3af763ff42f763ff4af763ff52f763ff5af763ff63f763ff6bf763ff73f763ff7bf763ff84f763ff8cf763ff94f763ff9cf763ffa5f763ffadf763ffb5f763ffbdf763ffc5f763ffcef763ffd6f763ffdef763ffe6f763ffeff763fff7f763fffff763ff00ff63ff08ff63ff10ff63ff19ff63ff21ff63ff29ff63ff31ff63ff3aff63ff42ff63ff4aff63ff52ff63ff5aff63ff63ff63ff6bff63ff73ff63ff7bff63ff84ff63ff8cff63ff94ff63ff9cff63ffa5ff63ffadff63ffb5ff63ffbdff63ffc5ff63ffceff63ffd6ff63ffdeff63ffe6ff63ffefff63fff7ff63ffffff63ff00006bff08006bff10006bff19006bff21006bff29006bff31006bff3a006bff42006bff4a006bff52006bff5a006bff63006bff6b006bff73006bff7b006bff84006bff8c006bff94006bff9c006bffa5006bffad006bffb5006bffbd006bffc5006bffce006bffd6006bffde006bffe6006bffef006bfff7006bffff006bff00086bff08086bff10086bff19086bff21086bff29086bff31086bff3a086bff42086bff4a086bff52086bff5a086bff63086bff6b086bff73086bff7b086bff84086bff8c086bff94086bff9c086bffa5086bffad086bffb5086bffbd086bffc5086bffce086bffd6086bffde086bffe6086bffef086bfff7086bffff086bff00106bff08106bff10106bff19106bff21106bff29106bff31106bff3a106bff42106bff4a106bff52106bff5a106bff63106bff6b106bff73106bff7b106bff84106bff8c106bff94106bff9c106bffa5106bffad106bffb5106bffbd106bffc5106bffce106bffd6106bffde106bffe6106bffef106bfff7106bffff106bff00196bff08196bff10196bff19196bff21196bff29196bff31196bff3a196bff42196bff4a196bff52196bff5a196bff63196bff6b196bff73196bff7b196bff84196bff8c196bff94196bff9c196bffa5196bffad196bffb5196bffbd196bffc5196bffce196bffd6196bffde196bffe6196bffef196bfff7196bffff196bff00216bff08216bff10216bff19216bff21216bff29216bff31216bff3a216bff42216bff4a216bff52216bff5a216bff63216bff6b216bff73216bff7b216bff84216bff8c216bff94216bff9c216bffa5216bffad216bffb5216bffbd216bffc5216bffce216bffd6216bffde216bffe6216bffef216bfff7216bffff216bff00296bff08296bff10296bff19296bff21296bff29296bff31296bff3a296bff42296bff4a296bff52296bff5a296bff63296bff6b296bff73296bff7b296bff84296bff8c296bff94296bff9c296bffa5296bffad296bffb5296bffbd296bffc5296bffce296bffd6296bffde296bffe6296bffef296bfff7296bffff296bff00316bff08316bff10316bff19316bff21316bff29316bff31316bff3a316bff42316bff4a316bff52316bff5a316bff63316bff6b316bff73316bff7b316bff84316bff8c316bff94316bff9c316bffa5316bffad316bffb5316bffbd316bffc5316bffce316bffd6316bffde316bffe6316bffef316bfff7316bffff316bff003a6bff083a6bff103a6bff193a6bff213a6bff293a6bff313a6bff3a3a6bff423a6bff4a3a6bff523a6bff5a3a6bff633a6bff6b3a6bff733a6bff7b3a6bff843a6bff8c3a6bff943a6bff9c3a6bffa53a6bffad3a6bffb53a6bffbd3a6bffc53a6bffce3a6bffd63a6bffde3a6bffe63a6bffef3a6bfff73a6bffff3a6bff00426bff08426bff10426bff19426bff21426bff29426bff31426bff3a426bff42426bff4a426bff52426bff5a426bff63426bff6b426bff73426bff7b426bff84426bff8c426bff94426bff9c426bffa5426bffad426bffb5426bffbd426bffc5426bffce426bffd6426bffde426bffe6426bffef426bfff7426bffff426bff004a6bff084a6bff104a6bff194a6bff214a6bff294a6bff314a6bff3a4a6bff424a6bff4a4a6bff524a6bff5a4a6bff634a6bff6b4a6bff734a6bff7b4a6bff844a6bff8c4a6bff944a6bff9c4a6bffa54a6bffad4a6bffb54a6bffbd4a6bffc54a6bffce4a6bffd64a6bffde4a6bffe64a6bffef4a6bfff74a6bffff4a6bff00526bff08526bff10526bff19526bff21526bff29526bff31526bff3a526bff42526bff4a526bff52526bff5a526bff63526bff6b526bff73526bff7b526bff84526bff8c526bff94526bff9c526bffa5526bffad526bffb5526bffbd526bffc5526bffce526bffd6526bffde526bffe6526bffef526bfff7526bffff526bff005a6bff085a6bff105a6bff195a6bff215a6bff295a6bff315a6bff3a5a6bff425a6bff4a5a6bff525a6bff5a5a6bff635a6bff6b5a6bff735a6bff7b5a6bff845a6bff8c5a6bff945a6bff9c5a6bffa55a6bffad5a6bffb55a6bffbd5a6bffc55a6bffce5a6bffd65a6bffde5a6bffe65a6bffef5a6bfff75a6bffff5a6bff00636bff08636bff10636bff19636bff21636bff29636bff31636bff3a636bff42636bff4a636bff52636bff5a636bff63636bff6b636bff73636bff7b636bff84636bff8c636bff94636bff9c636bffa5636bffad636bffb5636bffbd636bffc5636bffce636bffd6636bffde636bffe6636bffef636bfff7636bffff636bff006b6bff086b6bff106b6bff196b6bff216b6bff296b6bff316b6bff3a6b6bff426b6bff4a6b6bff526b6bff5a6b6bff636b6bff6b6b6bff736b6bff7b6b6bff846b6bff8c6b6bff946b6bff9c6b6bffa56b6bffad6b6bffb56b6bffbd6b6bffc56b6bffce6b6bffd66b6bffde6b6bffe66b6bffef6b6bfff76b6bffff6b6bff00736bff08736bff10736bff19736bff21736bff29736bff31736bff3a736bff42736bff4a736bff52736bff5a736bff63736bff6b736bff73736bff7b736bff84736bff8c736bff94736bff9c736bffa5736bffad736bffb5736bffbd736bffc5736bffce736bffd6736bffde736bffe6736bffef736bfff7736bffff736bff007b6bff087b6bff107b6bff197b6bff217b6bff297b6bff317b6bff3a7b6bff427b6bff4a7b6bff527b6bff5a7b6bff637b6bff6b7b6bff737b6bff7b7b6bff847b6bff8c7b6bff947b6bff9c7b6bffa57b6bffad7b6bffb57b6bffbd7b6bffc57b6bffce7b6bffd67b6bffde7b6bffe67b6bffef7b6bfff77b6bffff7b6bff00846bff08846bff10846bff19846bff21846bff29846bff31846bff3a846bff42846bff4a846bff52846bff5a846bff63846bff6b846bff73846bff7b846bff84846bff8c846bff94846bff9c846bffa5846bffad846bffb5846bffbd846bffc5846bffce846bffd6846bffde846bffe6846bffef846bfff7846bffff846bff008c6bff088c6bff108c6bff198c6bff218c6bff298c6bff318c6bff3a8c6bff428c6bff4a8c6bff528c6bff5a8c6bff638c6bff6b8c6bff738c6bff7b8c6bff848c6bff8c8c6bff948c6bff9c8c6bffa58c6bffad8c6bffb58c6bffbd8c6bffc58c6bffce8c6bffd68c6bffde8c6bffe68c6bffef8c6bfff78c6bffff8c6bff00946bff08946bff10946bff19946bff21946bff29946bff31946bff3a946bff42946bff4a946bff52946bff5a946bff63946bff6b946bff73946bff7b946bff84946bff8c946bff94946bff9c946bffa5946bffad946bffb5946bffbd946bffc5946bffce946bffd6946bffde946bffe6946bffef946bfff7946bffff946bff009c6bff089c6bff109c6bff199c6bff219c6bff299c6bff319c6bff3a9c6bff429c6bff4a9c6bff529c6bff5a9c6bff639c6bff6b9c6bff739c6bff7b9c6bff849c6bff8c9c6bff949c6bff9c9c6bffa59c6bffad9c6bffb59c6bffbd9c6bffc59c6bffce9c6bffd69c6bffde9c6bffe69c6bffef9c6bfff79c6bffff9c6bff00a56bff08a56bff10a56bff19a56bff21a56bff29a56bff31a56bff3aa56bff42a56bff4aa56bff52a56bff5aa56bff63a56bff6ba56bff73a56bff7ba56bff84a56bff8ca56bff94a56bff9ca56bffa5a56bffada56bffb5a56bffbda56bffc5a56bffcea56bffd6a56bffdea56bffe6a56bffefa56bfff7a56bffffa56bff00ad6bff08ad6bff10ad6bff19ad6bff21ad6bff29ad6bff31ad6bff3aad6bff42ad6bff4aad6bff52ad6bff5aad6bff63ad6bff6bad6bff73ad6bff7bad6bff84ad6bff8cad6bff94ad6bff9cad6bffa5ad6bffadad6bffb5ad6bffbdad6bffc5ad6bffcead6bffd6ad6bffdead6bffe6ad6bffefad6bfff7ad6bffffad6bff00b56bff08b56bff10b56bff19b56bff21b56bff29b56bff31b56bff3ab56bff42b56bff4ab56bff52b56bff5ab56bff63b56bff6bb56bff73b56bff7bb56bff84b56bff8cb56bff94b56bff9cb56bffa5b56bffadb56bffb5b56bffbdb56bffc5b56bffceb56bffd6b56bffdeb56bffe6b56bffefb56bfff7b56bffffb56bff00bd6bff08bd6bff10bd6bff19bd6bff21bd6bff29bd6bff31bd6bff3abd6bff42bd6bff4abd6bff52bd6bff5abd6bff63bd6bff6bbd6bff73bd6bff7bbd6bff84bd6bff8cbd6bff94bd6bff9cbd6bffa5bd6bffadbd6bffb5bd6bffbdbd6bffc5bd6bffcebd6bffd6bd6bffdebd6bffe6bd6bffefbd6bfff7bd6bffffbd6bff00c56bff08c56bff10c56bff19c56bff21c56bff29c56bff31c56bff3ac56bff42c56bff4ac56bff52c56bff5ac56bff63c56bff6bc56bff73c56bff7bc56bff84c56bff8cc56bff94c56bff9cc56bffa5c56bffadc56bffb5c56bffbdc56bffc5c56bffcec56bffd6c56bffdec56bffe6c56bffefc56bfff7c56bffffc56bff00ce6bff08ce6bff10ce6bff19ce6bff21ce6bff29ce6bff31ce6bff3ace6bff42ce6bff4ace6bff52ce6bff5ace6bff63ce6bff6bce6bff73ce6bff7bce6bff84ce6bff8cce6bff94ce6bff9cce6bffa5ce6bffadce6bffb5ce6bffbdce6bffc5ce6bffcece6bffd6ce6bffdece6bffe6ce6bffefce6bfff7ce6bffffce6bff00d66bff08d66bff10d66bff19d66bff21d66bff29d66bff31d66bff3ad66bff42d66bff4ad66bff52d66bff5ad66bff63d66bff6bd66bff73d66bff7bd66bff84d66bff8cd66bff94d66bff9cd66bffa5d66bffadd66bffb5d66bffbdd66bffc5d66bffced66bffd6d66bffded66bffe6d66bffefd66bfff7d66bffffd66bff00de6bff08de6bff10de6bff19de6bff21de6bff29de6bff31de6bff3ade6bff42de6bff4ade6bff52de6bff5ade6bff63de6bff6bde6bff73de6bff7bde6bff84de6bff8cde6bff94de6bff9cde6bffa5de6bffadde6bffb5de6bffbdde6bffc5de6bffcede6bffd6de6bffdede6bffe6de6bffefde6bfff7de6bffffde6bff00e66bff08e66bff10e66bff19e66bff21e66bff29e66bff31e66bff3ae66bff42e66bff4ae66bff52e66bff5ae66bff63e66bff6be66bff73e66bff7be66bff84e66bff8ce66bff94e66bff9ce66bffa5e66bffade66bffb5e66bffbde66bffc5e66bffcee66bffd6e66bffdee66bffe6e66bffefe66bfff7e66bffffe66bff00ef6bff08ef6bff10ef6bff19ef6bff21ef6bff29ef6bff31ef6bff3aef6bff42ef6bff4aef6bff52ef6bff5aef6bff63ef6bff6bef6bff73ef6bff7bef6bff84ef6bff8cef6bff94ef6bff9cef6bffa5ef6bffadef6bffb5ef6bffbdef6bffc5ef6bffceef6bffd6ef6bffdeef6bffe6ef6bffefef6bfff7ef6bffffef6bff00f76bff08f76bff10f76bff19f76bff21f76bff29f76bff31f76bff3af76bff42f76bff4af76bff52f76bff5af76bff63f76bff6bf76bff73f76bff7bf76bff84f76bff8cf76bff94f76bff9cf76bffa5f76bffadf76bffb5f76bffbdf76bffc5f76bffcef76bffd6f76bffdef76bffe6f76bffeff76bfff7f76bfffff76bff00ff6bff08ff6bff10ff6bff19ff6bff21ff6bff29ff6bff31ff6bff3aff6bff42ff6bff4aff6bff52ff6bff5aff6bff63ff6bff6bff6bff73ff6bff7bff6bff84ff6bff8cff6bff94ff6bff9cff6bffa5ff6bffadff6bffb5ff6bffbdff6bffc5ff6bffceff6bffd6ff6bffdeff6bffe6ff6bffefff6bfff7ff6bffffff6bff000073ff080073ff100073ff190073ff210073ff290073ff310073ff3a0073ff420073ff4a0073ff520073ff5a0073ff630073ff6b0073ff730073ff7b0073ff840073ff8c0073ff940073ff9c0073ffa50073ffad0073ffb50073ffbd0073ffc50073ffce0073ffd60073ffde0073ffe60073ffef0073fff70073ffff0073ff000873ff080873ff100873ff190873ff210873ff290873ff310873ff3a0873ff420873ff4a0873ff520873ff5a0873ff630873ff6b0873ff730873ff7b0873ff840873ff8c0873ff940873ff9c0873ffa50873ffad0873ffb50873ffbd0873ffc50873ffce0873ffd60873ffde0873ffe60873ffef0873fff70873ffff0873ff001073ff081073ff101073ff191073ff211073ff291073ff311073ff3a1073ff421073ff4a1073ff521073ff5a1073ff631073ff6b1073ff731073ff7b1073ff841073ff8c1073ff941073ff9c1073ffa51073ffad1073ffb51073ffbd1073ffc51073ffce1073ffd61073ffde1073ffe61073ffef1073fff71073ffff1073ff001973ff081973ff101973ff191973ff211973ff291973ff311973ff3a1973ff421973ff4a1973ff521973ff5a1973ff631973ff6b1973ff731973ff7b1973ff841973ff8c1973ff941973ff9c1973ffa51973ffad1973ffb51973ffbd1973ffc51973ffce1973ffd61973ffde1973ffe61973ffef1973fff71973ffff1973ff002173ff082173ff102173ff192173ff212173ff292173ff312173ff3a2173ff422173ff4a2173ff522173ff5a2173ff632173ff6b2173ff732173ff7b2173ff842173ff8c2173ff942173ff9c2173ffa52173ffad2173ffb52173ffbd2173ffc52173ffce2173ffd62173ffde2173ffe62173ffef2173fff72173ffff2173ff002973ff082973ff102973ff192973ff212973ff292973ff312973ff3a2973ff422973ff4a2973ff522973ff5a2973ff632973ff6b2973ff732973ff7b2973ff842973ff8c2973ff942973ff9c2973ffa52973ffad2973ffb52973ffbd2973ffc52973ffce2973ffd62973ffde2973ffe62973ffef2973fff72973ffff2973ff003173ff083173ff103173ff193173ff213173ff293173ff313173ff3a3173ff423173ff4a3173ff523173ff5a3173ff633173ff6b3173ff733173ff7b3173ff843173ff8c3173ff943173ff9c3173ffa53173ffad3173ffb53173ffbd3173ffc53173ffce3173ffd63173ffde3173ffe63173ffef3173fff73173ffff3173ff003a73ff083a73ff103a73ff193a73ff213a73ff293a73ff313a73ff3a3a73ff423a73ff4a3a73ff523a73ff5a3a73ff633a73ff6b3a73ff733a73ff7b3a73ff843a73ff8c3a73ff943a73ff9c3a73ffa53a73ffad3a73ffb53a73ffbd3a73ffc53a73ffce3a73ffd63a73ffde3a73ffe63a73ffef3a73fff73a73ffff3a73ff004273ff084273ff104273ff194273ff214273ff294273ff314273ff3a4273ff424273ff4a4273ff524273ff5a4273ff634273ff6b4273ff734273ff7b4273ff844273ff8c4273ff944273ff9c4273ffa54273ffad4273ffb54273ffbd4273ffc54273ffce4273ffd64273ffde4273ffe64273ffef4273fff74273ffff4273ff004a73ff084a73ff104a73ff194a73ff214a73ff294a73ff314a73ff3a4a73ff424a73ff4a4a73ff524a73ff5a4a73ff634a73ff6b4a73ff734a73ff7b4a73ff844a73ff8c4a73ff944a73ff9c4a73ffa54a73ffad4a73ffb54a73ffbd4a73ffc54a73ffce4a73ffd64a73ffde4a73ffe64a73ffef4a73fff74a73ffff4a73ff005273ff085273ff105273ff195273ff215273ff295273ff315273ff3a5273ff425273ff4a5273ff525273ff5a5273ff635273ff6b5273ff735273ff7b5273ff845273ff8c5273ff945273ff9c5273ffa55273ffad5273ffb55273ffbd5273ffc55273ffce5273ffd65273ffde5273ffe65273ffef5273fff75273ffff5273ff005a73ff085a73ff105a73ff195a73ff215a73ff295a73ff315a73ff3a5a73ff425a73ff4a5a73ff525a73ff5a5a73ff635a73ff6b5a73ff735a73ff7b5a73ff845a73ff8c5a73ff945a73ff9c5a73ffa55a73ffad5a73ffb55a73ffbd5a73ffc55a73ffce5a73ffd65a73ffde5a73ffe65a73ffef5a73fff75a73ffff5a73ff006373ff086373ff106373ff196373ff216373ff296373ff316373ff3a6373ff426373ff4a6373ff526373ff5a6373ff636373ff6b6373ff736373ff7b6373ff846373ff8c6373ff946373ff9c6373ffa56373ffad6373ffb56373ffbd6373ffc56373ffce6373ffd66373ffde6373ffe66373ffef6373fff76373ffff6373ff006b73ff086b73ff106b73ff196b73ff216b73ff296b73ff316b73ff3a6b73ff426b73ff4a6b73ff526b73ff5a6b73ff636b73ff6b6b73ff736b73ff7b6b73ff846b73ff8c6b73ff946b73ff9c6b73ffa56b73ffad6b73ffb56b73ffbd6b73ffc56b73ffce6b73ffd66b73ffde6b73ffe66b73ffef6b73fff76b73ffff6b73ff007373ff087373ff107373ff197373ff217373ff297373ff317373ff3a7373ff427373ff4a7373ff527373ff5a7373ff637373ff6b7373ff737373ff7b7373ff847373ff8c7373ff947373ff9c7373ffa57373ffad7373ffb57373ffbd7373ffc57373ffce7373ffd67373ffde7373ffe67373ffef7373fff77373ffff7373ff007b73ff087b73ff107b73ff197b73ff217b73ff297b73ff317b73ff3a7b73ff427b73ff4a7b73ff527b73ff5a7b73ff637b73ff6b7b73ff737b73ff7b7b73ff847b73ff8c7b73ff947b73ff9c7b73ffa57b73ffad7b73ffb57b73ffbd7b73ffc57b73ffce7b73ffd67b73ffde7b73ffe67b73ffef7b73fff77b73ffff7b73ff008473ff088473ff108473ff198473ff218473ff298473ff318473ff3a8473ff428473ff4a8473ff528473ff5a8473ff638473ff6b8473ff738473ff7b8473ff848473ff8c8473ff948473ff9c8473ffa58473ffad8473ffb58473ffbd8473ffc58473ffce8473ffd68473ffde8473ffe68473ffef8473fff78473ffff8473ff008c73ff088c73ff108c73ff198c73ff218c73ff298c73ff318c73ff3a8c73ff428c73ff4a8c73ff528c73ff5a8c73ff638c73ff6b8c73ff738c73ff7b8c73ff848c73ff8c8c73ff948c73ff9c8c73ffa58c73ffad8c73ffb58c73ffbd8c73ffc58c73ffce8c73ffd68c73ffde8c73ffe68c73ffef8c73fff78c73ffff8c73ff009473ff089473ff109473ff199473ff219473ff299473ff319473ff3a9473ff429473ff4a9473ff529473ff5a9473ff639473ff6b9473ff739473ff7b9473ff849473ff8c9473ff949473ff9c9473ffa59473ffad9473ffb59473ffbd9473ffc59473ffce9473ffd69473ffde9473ffe69473ffef9473fff79473ffff9473ff009c73ff089c73ff109c73ff199c73ff219c73ff299c73ff319c73ff3a9c73ff429c73ff4a9c73ff529c73ff5a9c73ff639c73ff6b9c73ff739c73ff7b9c73ff849c73ff8c9c73ff949c73ff9c9c73ffa59c73ffad9c73ffb59c73ffbd9c73ffc59c73ffce9c73ffd69c73ffde9c73ffe69c73ffef9c73fff79c73ffff9c73ff00a573ff08a573ff10a573ff19a573ff21a573ff29a573ff31a573ff3aa573ff42a573ff4aa573ff52a573ff5aa573ff63a573ff6ba573ff73a573ff7ba573ff84a573ff8ca573ff94a573ff9ca573ffa5a573ffada573ffb5a573ffbda573ffc5a573ffcea573ffd6a573ffdea573ffe6a573ffefa573fff7a573ffffa573ff00ad73ff08ad73ff10ad73ff19ad73ff21ad73ff29ad73ff31ad73ff3aad73ff42ad73ff4aad73ff52ad73ff5aad73ff63ad73ff6bad73ff73ad73ff7bad73ff84ad73ff8cad73ff94ad73ff9cad73ffa5ad73ffadad73ffb5ad73ffbdad73ffc5ad73ffcead73ffd6ad73ffdead73ffe6ad73ffefad73fff7ad73ffffad73ff00b573ff08b573ff10b573ff19b573ff21b573ff29b573ff31b573ff3ab573ff42b573ff4ab573ff52b573ff5ab573ff63b573ff6bb573ff73b573ff7bb573ff84b573ff8cb573ff94b573ff9cb573ffa5b573ffadb573ffb5b573ffbdb573ffc5b573ffceb573ffd6b573ffdeb573ffe6b573ffefb573fff7b573ffffb573ff00bd73ff08bd73ff10bd73ff19bd73ff21bd73ff29bd73ff31bd73ff3abd73ff42bd73ff4abd73ff52bd73ff5abd73ff63bd73ff6bbd73ff73bd73ff7bbd73ff84bd73ff8cbd73ff94bd73ff9cbd73ffa5bd73ffadbd73ffb5bd73ffbdbd73ffc5bd73ffcebd73ffd6bd73ffdebd73ffe6bd73ffefbd73fff7bd73ffffbd73ff00c573ff08c573ff10c573ff19c573ff21c573ff29c573ff31c573ff3ac573ff42c573ff4ac573ff52c573ff5ac573ff63c573ff6bc573ff73c573ff7bc573ff84c573ff8cc573ff94c573ff9cc573ffa5c573ffadc573ffb5c573ffbdc573ffc5c573ffcec573ffd6c573ffdec573ffe6c573ffefc573fff7c573ffffc573ff00ce73ff08ce73ff10ce73ff19ce73ff21ce73ff29ce73ff31ce73ff3ace73ff42ce73ff4ace73ff52ce73ff5ace73ff63ce73ff6bce73ff73ce73ff7bce73ff84ce73ff8cce73ff94ce73ff9cce73ffa5ce73ffadce73ffb5ce73ffbdce73ffc5ce73ffcece73ffd6ce73ffdece73ffe6ce73ffefce73fff7ce73ffffce73ff00d673ff08d673ff10d673ff19d673ff21d673ff29d673ff31d673ff3ad673ff42d673ff4ad673ff52d673ff5ad673ff63d673ff6bd673ff73d673ff7bd673ff84d673ff8cd673ff94d673ff9cd673ffa5d673ffadd673ffb5d673ffbdd673ffc5d673ffced673ffd6d673ffded673ffe6d673ffefd673fff7d673ffffd673ff00de73ff08de73ff10de73ff19de73ff21de73ff29de73ff31de73ff3ade73ff42de73ff4ade73ff52de73ff5ade73ff63de73ff6bde73ff73de73ff7bde73ff84de73ff8cde73ff94de73ff9cde73ffa5de73ffadde73ffb5de73ffbdde73ffc5de73ffcede73ffd6de73ffdede73ffe6de73ffefde73fff7de73ffffde73ff00e673ff08e673ff10e673ff19e673ff21e673ff29e673ff31e673ff3ae673ff42e673ff4ae673ff52e673ff5ae673ff63e673ff6be673ff73e673ff7be673ff84e673ff8ce673ff94e673ff9ce673ffa5e673ffade673ffb5e673ffbde673ffc5e673ffcee673ffd6e673ffdee673ffe6e673ffefe673fff7e673ffffe673ff00ef73ff08ef73ff10ef73ff19ef73ff21ef73ff29ef73ff31ef73ff3aef73ff42ef73ff4aef73ff52ef73ff5aef73ff63ef73ff6bef73ff73ef73ff7bef73ff84ef73ff8cef73ff94ef73ff9cef73ffa5ef73ffadef73ffb5ef73ffbdef73ffc5ef73ffceef73ffd6ef73ffdeef73ffe6ef73ffefef73fff7ef73ffffef73ff00f773ff08f773ff10f773ff19f773ff21f773ff29f773ff31f773ff3af773ff42f773ff4af773ff52f773ff5af773ff63f773ff6bf773ff73f773ff7bf773ff84f773ff8cf773ff94f773ff9cf773ffa5f773ffadf773ffb5f773ffbdf773ffc5f773ffcef773ffd6f773ffdef773ffe6f773ffeff773fff7f773fffff773ff00ff73ff08ff73ff10ff73ff19ff73ff21ff73ff29ff73ff31ff73ff3aff73ff42ff73ff4aff73ff52ff73ff5aff73ff63ff73ff6bff73ff73ff73ff7bff73ff84ff73ff8cff73ff94ff73ff9cff73ffa5ff73ffadff73ffb5ff73ffbdff73ffc5ff73ffceff73ffd6ff73ffdeff73ffe6ff73ffefff73fff7ff73ffffff73ff00007bff08007bff10007bff19007bff21007bff29007bff31007bff3a007bff42007bff4a007bff52007bff5a007bff63007bff6b007bff73007bff7b007bff84007bff8c007bff94007bff9c007bffa5007bffad007bffb5007bffbd007bffc5007bffce007bffd6007bffde007bffe6007bffef007bfff7007bffff007bff00087bff08087bff10087bff19087bff21087bff29087bff31087bff3a087bff42087bff4a087bff52087bff5a087bff63087bff6b087bff73087bff7b087bff84087bff8c087bff94087bff9c087bffa5087bffad087bffb5087bffbd087bffc5087bffce087bffd6087bffde087bffe6087bffef087bfff7087bffff087bff00107bff08107bff10107bff19107bff21107bff29107bff31107bff3a107bff42107bff4a107bff52107bff5a107bff63107bff6b107bff73107bff7b107bff84107bff8c107bff94107bff9c107bffa5107bffad107bffb5107bffbd107bffc5107bffce107bffd6107bffde107bffe6107bffef107bfff7107bffff107bff00197bff08197bff10197bff19197bff21197bff29197bff31197bff3a197bff42197bff4a197bff52197bff5a197bff63197bff6b197bff73197bff7b197bff84197bff8c197bff94197bff9c197bffa5197bffad197bffb5197bffbd197bffc5197bffce197bffd6197bffde197bffe6197bffef197bfff7197bffff197bff00217bff08217bff10217bff19217bff21217bff29217bff31217bff3a217bff42217bff4a217bff52217bff5a217bff63217bff6b217bff73217bff7b217bff84217bff8c217bff94217bff9c217bffa5217bffad217bffb5217bffbd217bffc5217bffce217bffd6217bffde217bffe6217bffef217bfff7217bffff217bff00297bff08297bff10297bff19297bff21297bff29297bff31297bff3a297bff42297bff4a297bff52297bff5a297bff63297bff6b297bff73297bff7b297bff84297bff8c297bff94297bff9c297bffa5297bffad297bffb5297bffbd297bffc5297bffce297bffd6297bffde297bffe6297bffef297bfff7297bffff297bff00317bff08317bff10317bff19317bff21317bff29317bff31317bff3a317bff42317bff4a317bff52317bff5a317bff63317bff6b317bff73317bff7b317bff84317bff8c317bff94317bff9c317bffa5317bffad317bffb5317bffbd317bffc5317bffce317bffd6317bffde317bffe6317bffef317bfff7317bffff317bff003a7bff083a7bff103a7bff193a7bff213a7bff293a7bff313a7bff3a3a7bff423a7bff4a3a7bff523a7bff5a3a7bff633a7bff6b3a7bff733a7bff7b3a7bff843a7bff8c3a7bff943a7bff9c3a7bffa53a7bffad3a7bffb53a7bffbd3a7bffc53a7bffce3a7bffd63a7bffde3a7bffe63a7bffef3a7bfff73a7bffff3a7bff00427bff08427bff10427bff19427bff21427bff29427bff31427bff3a427bff42427bff4a427bff52427bff5a427bff63427bff6b427bff73427bff7b427bff84427bff8c427bff94427bff9c427bffa5427bffad427bffb5427bffbd427bffc5427bffce427bffd6427bffde427bffe6427bffef427bfff7427bffff427bff004a7bff084a7bff104a7bff194a7bff214a7bff294a7bff314a7bff3a4a7bff424a7bff4a4a7bff524a7bff5a4a7bff634a7bff6b4a7bff734a7bff7b4a7bff844a7bff8c4a7bff944a7bff9c4a7bffa54a7bffad4a7bffb54a7bffbd4a7bffc54a7bffce4a7bffd64a7bffde4a7bffe64a7bffef4a7bfff74a7bffff4a7bff00527bff08527bff10527bff19527bff21527bff29527bff31527bff3a527bff42527bff4a527bff52527bff5a527bff63527bff6b527bff73527bff7b527bff84527bff8c527bff94527bff9c527bffa5527bffad527bffb5527bffbd527bffc5527bffce527bffd6527bffde527bffe6527bffef527bfff7527bffff527bff005a7bff085a7bff105a7bff195a7bff215a7bff295a7bff315a7bff3a5a7bff425a7bff4a5a7bff525a7bff5a5a7bff635a7bff6b5a7bff735a7bff7b5a7bff845a7bff8c5a7bff945a7bff9c5a7bffa55a7bffad5a7bffb55a7bffbd5a7bffc55a7bffce5a7bffd65a7bffde5a7bffe65a7bffef5a7bfff75a7bffff5a7bff00637bff08637bff10637bff19637bff21637bff29637bff31637bff3a637bff42637bff4a637bff52637bff5a637bff63637bff6b637bff73637bff7b637bff84637bff8c637bff94637bff9c637bffa5637bffad637bffb5637bffbd637bffc5637bffce637bffd6637bffde637bffe6637bffef637bfff7637bffff637bff006b7bff086b7bff106b7bff196b7bff216b7bff296b7bff316b7bff3a6b7bff426b7bff4a6b7bff526b7bff5a6b7bff636b7bff6b6b7bff736b7bff7b6b7bff846b7bff8c6b7bff946b7bff9c6b7bffa56b7bffad6b7bffb56b7bffbd6b7bffc56b7bffce6b7bffd66b7bffde6b7bffe66b7bffef6b7bfff76b7bffff6b7bff00737bff08737bff10737bff19737bff21737bff29737bff31737bff3a737bff42737bff4a737bff52737bff5a737bff63737bff6b737bff73737bff7b737bff84737bff8c737bff94737bff9c737bffa5737bffad737bffb5737bffbd737bffc5737bffce737bffd6737bffde737bffe6737bffef737bfff7737bffff737bff007b7bff087b7bff107b7bff197b7bff217b7bff297b7bff317b7bff3a7b7bff427b7bff4a7b7bff527b7bff5a7b7bff637b7bff6b7b7bff737b7bff7b7b7bff847b7bff8c7b7bff947b7bff9c7b7bffa57b7bffad7b7bffb57b7bffbd7b7bffc57b7bffce7b7bffd67b7bffde7b7bffe67b7bffef7b7bfff77b7bffff7b7bff00847bff08847bff10847bff19847bff21847bff29847bff31847bff3a847bff42847bff4a847bff52847bff5a847bff63847bff6b847bff73847bff7b847bff84847bff8c847bff94847bff9c847bffa5847bffad847bffb5847bffbd847bffc5847bffce847bffd6847bffde847bffe6847bffef847bfff7847bffff847bff008c7bff088c7bff108c7bff198c7bff218c7bff298c7bff318c7bff3a8c7bff428c7bff4a8c7bff528c7bff5a8c7bff638c7bff6b8c7bff738c7bff7b8c7bff848c7bff8c8c7bff948c7bff9c8c7bffa58c7bffad8c7bffb58c7bffbd8c7bffc58c7bffce8c7bffd68c7bffde8c7bffe68c7bffef8c7bfff78c7bffff8c7bff00947bff08947bff10947bff19947bff21947bff29947bff31947bff3a947bff42947bff4a947bff52947bff5a947bff63947bff6b947bff73947bff7b947bff84947bff8c947bff94947bff9c947bffa5947bffad947bffb5947bffbd947bffc5947bffce947bffd6947bffde947bffe6947bffef947bfff7947bffff947bff009c7bff089c7bff109c7bff199c7bff219c7bff299c7bff319c7bff3a9c7bff429c7bff4a9c7bff529c7bff5a9c7bff639c7bff6b9c7bff739c7bff7b9c7bff849c7bff8c9c7bff949c7bff9c9c7bffa59c7bffad9c7bffb59c7bffbd9c7bffc59c7bffce9c7bffd69c7bffde9c7bffe69c7bffef9c7bfff79c7bffff9c7bff00a57bff08a57bff10a57bff19a57bff21a57bff29a57bff31a57bff3aa57bff42a57bff4aa57bff52a57bff5aa57bff63a57bff6ba57bff73a57bff7ba57bff84a57bff8ca57bff94a57bff9ca57bffa5a57bffada57bffb5a57bffbda57bffc5a57bffcea57bffd6a57bffdea57bffe6a57bffefa57bfff7a57bffffa57bff00ad7bff08ad7bff10ad7bff19ad7bff21ad7bff29ad7bff31ad7bff3aad7bff42ad7bff4aad7bff52ad7bff5aad7bff63ad7bff6bad7bff73ad7bff7bad7bff84ad7bff8cad7bff94ad7bff9cad7bffa5ad7bffadad7bffb5ad7bffbdad7bffc5ad7bffcead7bffd6ad7bffdead7bffe6ad7bffefad7bfff7ad7bffffad7bff00b57bff08b57bff10b57bff19b57bff21b57bff29b57bff31b57bff3ab57bff42b57bff4ab57bff52b57bff5ab57bff63b57bff6bb57bff73b57bff7bb57bff84b57bff8cb57bff94b57bff9cb57bffa5b57bffadb57bffb5b57bffbdb57bffc5b57bffceb57bffd6b57bffdeb57bffe6b57bffefb57bfff7b57bffffb57bff00bd7bff08bd7bff10bd7bff19bd7bff21bd7bff29bd7bff31bd7bff3abd7bff42bd7bff4abd7bff52bd7bff5abd7bff63bd7bff6bbd7bff73bd7bff7bbd7bff84bd7bff8cbd7bff94bd7bff9cbd7bffa5bd7bffadbd7bffb5bd7bffbdbd7bffc5bd7bffcebd7bffd6bd7bffdebd7bffe6bd7bffefbd7bfff7bd7bffffbd7bff00c57bff08c57bff10c57bff19c57bff21c57bff29c57bff31c57bff3ac57bff42c57bff4ac57bff52c57bff5ac57bff63c57bff6bc57bff73c57bff7bc57bff84c57bff8cc57bff94c57bff9cc57bffa5c57bffadc57bffb5c57bffbdc57bffc5c57bffcec57bffd6c57bffdec57bffe6c57bffefc57bfff7c57bffffc57bff00ce7bff08ce7bff10ce7bff19ce7bff21ce7bff29ce7bff31ce7bff3ace7bff42ce7bff4ace7bff52ce7bff5ace7bff63ce7bff6bce7bff73ce7bff7bce7bff84ce7bff8cce7bff94ce7bff9cce7bffa5ce7bffadce7bffb5ce7bffbdce7bffc5ce7bffcece7bffd6ce7bffdece7bffe6ce7bffefce7bfff7ce7bffffce7bff00d67bff08d67bff10d67bff19d67bff21d67bff29d67bff31d67bff3ad67bff42d67bff4ad67bff52d67bff5ad67bff63d67bff6bd67bff73d67bff7bd67bff84d67bff8cd67bff94d67bff9cd67bffa5d67bffadd67bffb5d67bffbdd67bffc5d67bffced67bffd6d67bffded67bffe6d67bffefd67bfff7d67bffffd67bff00de7bff08de7bff10de7bff19de7bff21de7bff29de7bff31de7bff3ade7bff42de7bff4ade7bff52de7bff5ade7bff63de7bff6bde7bff73de7bff7bde7bff84de7bff8cde7bff94de7bff9cde7bffa5de7bffadde7bffb5de7bffbdde7bffc5de7bffcede7bffd6de7bffdede7bffe6de7bffefde7bfff7de7bffffde7bff00e67bff08e67bff10e67bff19e67bff21e67bff29e67bff31e67bff3ae67bff42e67bff4ae67bff52e67bff5ae67bff63e67bff6be67bff73e67bff7be67bff84e67bff8ce67bff94e67bff9ce67bffa5e67bffade67bffb5e67bffbde67bffc5e67bffcee67bffd6e67bffdee67bffe6e67bffefe67bfff7e67bffffe67bff00ef7bff08ef7bff10ef7bff19ef7bff21ef7bff29ef7bff31ef7bff3aef7bff42ef7bff4aef7bff52ef7bff5aef7bff63ef7bff6bef7bff73ef7bff7bef7bff84ef7bff8cef7bff94ef7bff9cef7bffa5ef7bffadef7bffb5ef7bffbdef7bffc5ef7bffceef7bffd6ef7bffdeef7bffe6ef7bffefef7bfff7ef7bffffef7bff00f77bff08f77bff10f77bff19f77bff21f77bff29f77bff31f77bff3af77bff42f77bff4af77bff52f77bff5af77bff63f77bff6bf77bff73f77bff7bf77bff84f77bff8cf77bff94f77bff9cf77bffa5f77bffadf77bffb5f77bffbdf77bffc5f77bffcef77bffd6f77bffdef77bffe6f77bffeff77bfff7f77bfffff77bff00ff7bff08ff7bff10ff7bff19ff7bff21ff7bff29ff7bff31ff7bff3aff7bff42ff7bff4aff7bff52ff7bff5aff7bff63ff7bff6bff7bff73ff7bff7bff7bff84ff7bff8cff7bff94ff7bff9cff7bffa5ff7bffadff7bffb5ff7bffbdff7bffc5ff7bffceff7bffd6ff7bffdeff7bffe6ff7bffefff7bfff7ff7bffffff7bff000084ff080084ff100084ff190084ff210084ff290084ff310084ff3a0084ff420084ff4a0084ff520084ff5a0084ff630084ff6b0084ff730084ff7b0084ff840084ff8c0084ff940084ff9c0084ffa50084ffad0084ffb50084ffbd0084ffc50084ffce0084ffd60084ffde0084ffe60084ffef0084fff70084ffff0084ff000884ff080884ff100884ff190884ff210884ff290884ff310884ff3a0884ff420884ff4a0884ff520884ff5a0884ff630884ff6b0884ff730884ff7b0884ff840884ff8c0884ff940884ff9c0884ffa50884ffad0884ffb50884ffbd0884ffc50884ffce0884ffd60884ffde0884ffe60884ffef0884fff70884ffff0884ff001084ff081084ff101084ff191084ff211084ff291084ff311084ff3a1084ff421084ff4a1084ff521084ff5a1084ff631084ff6b1084ff731084ff7b1084ff841084ff8c1084ff941084ff9c1084ffa51084ffad1084ffb51084ffbd1084ffc51084ffce1084ffd61084ffde1084ffe61084ffef1084fff71084ffff1084ff001984ff081984ff101984ff191984ff211984ff291984ff311984ff3a1984ff421984ff4a1984ff521984ff5a1984ff631984ff6b1984ff731984ff7b1984ff841984ff8c1984ff941984ff9c1984ffa51984ffad1984ffb51984ffbd1984ffc51984ffce1984ffd61984ffde1984ffe61984ffef1984fff71984ffff1984ff002184ff082184ff102184ff192184ff212184ff292184ff312184ff3a2184ff422184ff4a2184ff522184ff5a2184ff632184ff6b2184ff732184ff7b2184ff842184ff8c2184ff942184ff9c2184ffa52184ffad2184ffb52184ffbd2184ffc52184ffce2184ffd62184ffde2184ffe62184ffef2184fff72184ffff2184ff002984ff082984ff102984ff192984ff212984ff292984ff312984ff3a2984ff422984ff4a2984ff522984ff5a2984ff632984ff6b2984ff732984ff7b2984ff842984ff8c2984ff942984ff9c2984ffa52984ffad2984ffb52984ffbd2984ffc52984ffce2984ffd62984ffde2984ffe62984ffef2984fff72984ffff2984ff003184ff083184ff103184ff193184ff213184ff293184ff313184ff3a3184ff423184ff4a3184ff523184ff5a3184ff633184ff6b3184ff733184ff7b3184ff843184ff8c3184ff943184ff9c3184ffa53184ffad3184ffb53184ffbd3184ffc53184ffce3184ffd63184ffde3184ffe63184ffef3184fff73184ffff3184ff003a84ff083a84ff103a84ff193a84ff213a84ff293a84ff313a84ff3a3a84ff423a84ff4a3a84ff523a84ff5a3a84ff633a84ff6b3a84ff733a84ff7b3a84ff843a84ff8c3a84ff943a84ff9c3a84ffa53a84ffad3a84ffb53a84ffbd3a84ffc53a84ffce3a84ffd63a84ffde3a84ffe63a84ffef3a84fff73a84ffff3a84ff004284ff084284ff104284ff194284ff214284ff294284ff314284ff3a4284ff424284ff4a4284ff524284ff5a4284ff634284ff6b4284ff734284ff7b4284ff844284ff8c4284ff944284ff9c4284ffa54284ffad4284ffb54284ffbd4284ffc54284ffce4284ffd64284ffde4284ffe64284ffef4284fff74284ffff4284ff004a84ff084a84ff104a84ff194a84ff214a84ff294a84ff314a84ff3a4a84ff424a84ff4a4a84ff524a84ff5a4a84ff634a84ff6b4a84ff734a84ff7b4a84ff844a84ff8c4a84ff944a84ff9c4a84ffa54a84ffad4a84ffb54a84ffbd4a84ffc54a84ffce4a84ffd64a84ffde4a84ffe64a84ffef4a84fff74a84ffff4a84ff005284ff085284ff105284ff195284ff215284ff295284ff315284ff3a5284ff425284ff4a5284ff525284ff5a5284ff635284ff6b5284ff735284ff7b5284ff845284ff8c5284ff945284ff9c5284ffa55284ffad5284ffb55284ffbd5284ffc55284ffce5284ffd65284ffde5284ffe65284ffef5284fff75284ffff5284ff005a84ff085a84ff105a84ff195a84ff215a84ff295a84ff315a84ff3a5a84ff425a84ff4a5a84ff525a84ff5a5a84ff635a84ff6b5a84ff735a84ff7b5a84ff845a84ff8c5a84ff945a84ff9c5a84ffa55a84ffad5a84ffb55a84ffbd5a84ffc55a84ffce5a84ffd65a84ffde5a84ffe65a84ffef5a84fff75a84ffff5a84ff006384ff086384ff106384ff196384ff216384ff296384ff316384ff3a6384ff426384ff4a6384ff526384ff5a6384ff636384ff6b6384ff736384ff7b6384ff846384ff8c6384ff946384ff9c6384ffa56384ffad6384ffb56384ffbd6384ffc56384ffce6384ffd66384ffde6384ffe66384ffef6384fff76384ffff6384ff006b84ff086b84ff106b84ff196b84ff216b84ff296b84ff316b84ff3a6b84ff426b84ff4a6b84ff526b84ff5a6b84ff636b84ff6b6b84ff736b84ff7b6b84ff846b84ff8c6b84ff946b84ff9c6b84ffa56b84ffad6b84ffb56b84ffbd6b84ffc56b84ffce6b84ffd66b84ffde6b84ffe66b84ffef6b84fff76b84ffff6b84ff007384ff087384ff107384ff197384ff217384ff297384ff317384ff3a7384ff427384ff4a7384ff527384ff5a7384ff637384ff6b7384ff737384ff7b7384ff847384ff8c7384ff947384ff9c7384ffa57384ffad7384ffb57384ffbd7384ffc57384ffce7384ffd67384ffde7384ffe67384ffef7384fff77384ffff7384ff007b84ff087b84ff107b84ff197b84ff217b84ff297b84ff317b84ff3a7b84ff427b84ff4a7b84ff527b84ff5a7b84ff637b84ff6b7b84ff737b84ff7b7b84ff847b84ff8c7b84ff947b84ff9c7b84ffa57b84ffad7b84ffb57b84ffbd7b84ffc57b84ffce7b84ffd67b84ffde7b84ffe67b84ffef7b84fff77b84ffff7b84ff008484ff088484ff108484ff198484ff218484ff298484ff318484ff3a8484ff428484ff4a8484ff528484ff5a8484ff638484ff6b8484ff738484ff7b8484ff848484ff8c8484ff948484ff9c8484ffa58484ffad8484ffb58484ffbd8484ffc58484ffce8484ffd68484ffde8484ffe68484ffef8484fff78484ffff8484ff008c84ff088c84ff108c84ff198c84ff218c84ff298c84ff318c84ff3a8c84ff428c84ff4a8c84ff528c84ff5a8c84ff638c84ff6b8c84ff738c84ff7b8c84ff848c84ff8c8c84ff948c84ff9c8c84ffa58c84ffad8c84ffb58c84ffbd8c84ffc58c84ffce8c84ffd68c84ffde8c84ffe68c84ffef8c84fff78c84ffff8c84ff009484ff089484ff109484ff199484ff219484ff299484ff319484ff3a9484ff429484ff4a9484ff529484ff5a9484ff639484ff6b9484ff739484ff7b9484ff849484ff8c9484ff949484ff9c9484ffa59484ffad9484ffb59484ffbd9484ffc59484ffce9484ffd69484ffde9484ffe69484ffef9484fff79484ffff9484ff009c84ff089c84ff109c84ff199c84ff219c84ff299c84ff319c84ff3a9c84ff429c84ff4a9c84ff529c84ff5a9c84ff639c84ff6b9c84ff739c84ff7b9c84ff849c84ff8c9c84ff949c84ff9c9c84ffa59c84ffad9c84ffb59c84ffbd9c84ffc59c84ffce9c84ffd69c84ffde9c84ffe69c84ffef9c84fff79c84ffff9c84ff00a584ff08a584ff10a584ff19a584ff21a584ff29a584ff31a584ff3aa584ff42a584ff4aa584ff52a584ff5aa584ff63a584ff6ba584ff73a584ff7ba584ff84a584ff8ca584ff94a584ff9ca584ffa5a584ffada584ffb5a584ffbda584ffc5a584ffcea584ffd6a584ffdea584ffe6a584ffefa584fff7a584ffffa584ff00ad84ff08ad84ff10ad84ff19ad84ff21ad84ff29ad84ff31ad84ff3aad84ff42ad84ff4aad84ff52ad84ff5aad84ff63ad84ff6bad84ff73ad84ff7bad84ff84ad84ff8cad84ff94ad84ff9cad84ffa5ad84ffadad84ffb5ad84ffbdad84ffc5ad84ffcead84ffd6ad84ffdead84ffe6ad84ffefad84fff7ad84ffffad84ff00b584ff08b584ff10b584ff19b584ff21b584ff29b584ff31b584ff3ab584ff42b584ff4ab584ff52b584ff5ab584ff63b584ff6bb584ff73b584ff7bb584ff84b584ff8cb584ff94b584ff9cb584ffa5b584ffadb584ffb5b584ffbdb584ffc5b584ffceb584ffd6b584ffdeb584ffe6b584ffefb584fff7b584ffffb584ff00bd84ff08bd84ff10bd84ff19bd84ff21bd84ff29bd84ff31bd84ff3abd84ff42bd84ff4abd84ff52bd84ff5abd84ff63bd84ff6bbd84ff73bd84ff7bbd84ff84bd84ff8cbd84ff94bd84ff9cbd84ffa5bd84ffadbd84ffb5bd84ffbdbd84ffc5bd84ffcebd84ffd6bd84ffdebd84ffe6bd84ffefbd84fff7bd84ffffbd84ff00c584ff08c584ff10c584ff19c584ff21c584ff29c584ff31c584ff3ac584ff42c584ff4ac584ff52c584ff5ac584ff63c584ff6bc584ff73c584ff7bc584ff84c584ff8cc584ff94c584ff9cc584ffa5c584ffadc584ffb5c584ffbdc584ffc5c584ffcec584ffd6c584ffdec584ffe6c584ffefc584fff7c584ffffc584ff00ce84ff08ce84ff10ce84ff19ce84ff21ce84ff29ce84ff31ce84ff3ace84ff42ce84ff4ace84ff52ce84ff5ace84ff63ce84ff6bce84ff73ce84ff7bce84ff84ce84ff8cce84ff94ce84ff9cce84ffa5ce84ffadce84ffb5ce84ffbdce84ffc5ce84ffcece84ffd6ce84ffdece84ffe6ce84ffefce84fff7ce84ffffce84ff00d684ff08d684ff10d684ff19d684ff21d684ff29d684ff31d684ff3ad684ff42d684ff4ad684ff52d684ff5ad684ff63d684ff6bd684ff73d684ff7bd684ff84d684ff8cd684ff94d684ff9cd684ffa5d684ffadd684ffb5d684ffbdd684ffc5d684ffced684ffd6d684ffded684ffe6d684ffefd684fff7d684ffffd684ff00de84ff08de84ff10de84ff19de84ff21de84ff29de84ff31de84ff3ade84ff42de84ff4ade84ff52de84ff5ade84ff63de84ff6bde84ff73de84ff7bde84ff84de84ff8cde84ff94de84ff9cde84ffa5de84ffadde84ffb5de84ffbdde84ffc5de84ffcede84ffd6de84ffdede84ffe6de84ffefde84fff7de84ffffde84ff00e684ff08e684ff10e684ff19e684ff21e684ff29e684ff31e684ff3ae684ff42e684ff4ae684ff52e684ff5ae684ff63e684ff6be684ff73e684ff7be684ff84e684ff8ce684ff94e684ff9ce684ffa5e684ffade684ffb5e684ffbde684ffc5e684ffcee684ffd6e684ffdee684ffe6e684ffefe684fff7e684ffffe684ff00ef84ff08ef84ff10ef84ff19ef84ff21ef84ff29ef84ff31ef84ff3aef84ff42ef84ff4aef84ff52ef84ff5aef84ff63ef84ff6bef84ff73ef84ff7bef84ff84ef84ff8cef84ff94ef84ff9cef84ffa5ef84ffadef84ffb5ef84ffbdef84ffc5ef84ffceef84ffd6ef84ffdeef84ffe6ef84ffefef84fff7ef84ffffef84ff00f784ff08f784ff10f784ff19f784ff21f784ff29f784ff31f784ff3af784ff42f784ff4af784ff52f784ff5af784ff63f784ff6bf784ff73f784ff7bf784ff84f784ff8cf784ff94f784ff9cf784ffa5f784ffadf784ffb5f784ffbdf784ffc5f784ffcef784ffd6f784ffdef784ffe6f784ffeff784fff7f784fffff784ff00ff84ff08ff84ff10ff84ff19ff84ff21ff84ff29ff84ff31ff84ff3aff84ff42ff84ff4aff84ff52ff84ff5aff84ff63ff84ff6bff84ff73ff84ff7bff84ff84ff84ff8cff84ff94ff84ff9cff84ffa5ff84ffadff84ffb5ff84ffbdff84ffc5ff84ffceff84ffd6ff84ffdeff84ffe6ff84ffefff84fff7ff84ffffff84ff00008cff08008cff10008cff19008cff21008cff29008cff31008cff3a008cff42008cff4a008cff52008cff5a008cff63008cff6b008cff73008cff7b008cff84008cff8c008cff94008cff9c008cffa5008cffad008cffb5008cffbd008cffc5008cffce008cffd6008cffde008cffe6008cffef008cfff7008cffff008cff00088cff08088cff10088cff19088cff21088cff29088cff31088cff3a088cff42088cff4a088cff52088cff5a088cff63088cff6b088cff73088cff7b088cff84088cff8c088cff94088cff9c088cffa5088cffad088cffb5088cffbd088cffc5088cffce088cffd6088cffde088cffe6088cffef088cfff7088cffff088cff00108cff08108cff10108cff19108cff21108cff29108cff31108cff3a108cff42108cff4a108cff52108cff5a108cff63108cff6b108cff73108cff7b108cff84108cff8c108cff94108cff9c108cffa5108cffad108cffb5108cffbd108cffc5108cffce108cffd6108cffde108cffe6108cffef108cfff7108cffff108cff00198cff08198cff10198cff19198cff21198cff29198cff31198cff3a198cff42198cff4a198cff52198cff5a198cff63198cff6b198cff73198cff7b198cff84198cff8c198cff94198cff9c198cffa5198cffad198cffb5198cffbd198cffc5198cffce198cffd6198cffde198cffe6198cffef198cfff7198cffff198cff00218cff08218cff10218cff19218cff21218cff29218cff31218cff3a218cff42218cff4a218cff52218cff5a218cff63218cff6b218cff73218cff7b218cff84218cff8c218cff94218cff9c218cffa5218cffad218cffb5218cffbd218cffc5218cffce218cffd6218cffde218cffe6218cffef218cfff7218cffff218cff00298cff08298cff10298cff19298cff21298cff29298cff31298cff3a298cff42298cff4a298cff52298cff5a298cff63298cff6b298cff73298cff7b298cff84298cff8c298cff94298cff9c298cffa5298cffad298cffb5298cffbd298cffc5298cffce298cffd6298cffde298cffe6298cffef298cfff7298cffff298cff00318cff08318cff10318cff19318cff21318cff29318cff31318cff3a318cff42318cff4a318cff52318cff5a318cff63318cff6b318cff73318cff7b318cff84318cff8c318cff94318cff9c318cffa5318cffad318cffb5318cffbd318cffc5318cffce318cffd6318cffde318cffe6318cffef318cfff7318cffff318cff003a8cff083a8cff103a8cff193a8cff213a8cff293a8cff313a8cff3a3a8cff423a8cff4a3a8cff523a8cff5a3a8cff633a8cff6b3a8cff733a8cff7b3a8cff843a8cff8c3a8cff943a8cff9c3a8cffa53a8cffad3a8cffb53a8cffbd3a8cffc53a8cffce3a8cffd63a8cffde3a8cffe63a8cffef3a8cfff73a8cffff3a8cff00428cff08428cff10428cff19428cff21428cff29428cff31428cff3a428cff42428cff4a428cff52428cff5a428cff63428cff6b428cff73428cff7b428cff84428cff8c428cff94428cff9c428cffa5428cffad428cffb5428cffbd428cffc5428cffce428cffd6428cffde428cffe6428cffef428cfff7428cffff428cff004a8cff084a8cff104a8cff194a8cff214a8cff294a8cff314a8cff3a4a8cff424a8cff4a4a8cff524a8cff5a4a8cff634a8cff6b4a8cff734a8cff7b4a8cff844a8cff8c4a8cff944a8cff9c4a8cffa54a8cffad4a8cffb54a8cffbd4a8cffc54a8cffce4a8cffd64a8cffde4a8cffe64a8cffef4a8cfff74a8cffff4a8cff00528cff08528cff10528cff19528cff21528cff29528cff31528cff3a528cff42528cff4a528cff52528cff5a528cff63528cff6b528cff73528cff7b528cff84528cff8c528cff94528cff9c528cffa5528cffad528cffb5528cffbd528cffc5528cffce528cffd6528cffde528cffe6528cffef528cfff7528cffff528cff005a8cff085a8cff105a8cff195a8cff215a8cff295a8cff315a8cff3a5a8cff425a8cff4a5a8cff525a8cff5a5a8cff635a8cff6b5a8cff735a8cff7b5a8cff845a8cff8c5a8cff945a8cff9c5a8cffa55a8cffad5a8cffb55a8cffbd5a8cffc55a8cffce5a8cffd65a8cffde5a8cffe65a8cffef5a8cfff75a8cffff5a8cff00638cff08638cff10638cff19638cff21638cff29638cff31638cff3a638cff42638cff4a638cff52638cff5a638cff63638cff6b638cff73638cff7b638cff84638cff8c638cff94638cff9c638cffa5638cffad638cffb5638cffbd638cffc5638cffce638cffd6638cffde638cffe6638cffef638cfff7638cffff638cff006b8cff086b8cff106b8cff196b8cff216b8cff296b8cff316b8cff3a6b8cff426b8cff4a6b8cff526b8cff5a6b8cff636b8cff6b6b8cff736b8cff7b6b8cff846b8cff8c6b8cff946b8cff9c6b8cffa56b8cffad6b8cffb56b8cffbd6b8cffc56b8cffce6b8cffd66b8cffde6b8cffe66b8cffef6b8cfff76b8cffff6b8cff00738cff08738cff10738cff19738cff21738cff29738cff31738cff3a738cff42738cff4a738cff52738cff5a738cff63738cff6b738cff73738cff7b738cff84738cff8c738cff94738cff9c738cffa5738cffad738cffb5738cffbd738cffc5738cffce738cffd6738cffde738cffe6738cffef738cfff7738cffff738cff007b8cff087b8cff107b8cff197b8cff217b8cff297b8cff317b8cff3a7b8cff427b8cff4a7b8cff527b8cff5a7b8cff637b8cff6b7b8cff737b8cff7b7b8cff847b8cff8c7b8cff947b8cff9c7b8cffa57b8cffad7b8cffb57b8cffbd7b8cffc57b8cffce7b8cffd67b8cffde7b8cffe67b8cffef7b8cfff77b8cffff7b8cff00848cff08848cff10848cff19848cff21848cff29848cff31848cff3a848cff42848cff4a848cff52848cff5a848cff63848cff6b848cff73848cff7b848cff84848cff8c848cff94848cff9c848cffa5848cffad848cffb5848cffbd848cffc5848cffce848cffd6848cffde848cffe6848cffef848cfff7848cffff848cff008c8cff088c8cff108c8cff198c8cff218c8cff298c8cff318c8cff3a8c8cff428c8cff4a8c8cff528c8cff5a8c8cff638c8cff6b8c8cff738c8cff7b8c8cff848c8cff8c8c8cff948c8cff9c8c8cffa58c8cffad8c8cffb58c8cffbd8c8cffc58c8cffce8c8cffd68c8cffde8c8cffe68c8cffef8c8cfff78c8cffff8c8cff00948cff08948cff10948cff19948cff21948cff29948cff31948cff3a948cff42948cff4a948cff52948cff5a948cff63948cff6b948cff73948cff7b948cff84948cff8c948cff94948cff9c948cffa5948cffad948cffb5948cffbd948cffc5948cffce948cffd6948cffde948cffe6948cffef948cfff7948cffff948cff009c8cff089c8cff109c8cff199c8cff219c8cff299c8cff319c8cff3a9c8cff429c8cff4a9c8cff529c8cff5a9c8cff639c8cff6b9c8cff739c8cff7b9c8cff849c8cff8c9c8cff949c8cff9c9c8cffa59c8cffad9c8cffb59c8cffbd9c8cffc59c8cffce9c8cffd69c8cffde9c8cffe69c8cffef9c8cfff79c8cffff9c8cff00a58cff08a58cff10a58cff19a58cff21a58cff29a58cff31a58cff3aa58cff42a58cff4aa58cff52a58cff5aa58cff63a58cff6ba58cff73a58cff7ba58cff84a58cff8ca58cff94a58cff9ca58cffa5a58cffada58cffb5a58cffbda58cffc5a58cffcea58cffd6a58cffdea58cffe6a58cffefa58cfff7a58cffffa58cff00ad8cff08ad8cff10ad8cff19ad8cff21ad8cff29ad8cff31ad8cff3aad8cff42ad8cff4aad8cff52ad8cff5aad8cff63ad8cff6bad8cff73ad8cff7bad8cff84ad8cff8cad8cff94ad8cff9cad8cffa5ad8cffadad8cffb5ad8cffbdad8cffc5ad8cffcead8cffd6ad8cffdead8cffe6ad8cffefad8cfff7ad8cffffad8cff00b58cff08b58cff10b58cff19b58cff21b58cff29b58cff31b58cff3ab58cff42b58cff4ab58cff52b58cff5ab58cff63b58cff6bb58cff73b58cff7bb58cff84b58cff8cb58cff94b58cff9cb58cffa5b58cffadb58cffb5b58cffbdb58cffc5b58cffceb58cffd6b58cffdeb58cffe6b58cffefb58cfff7b58cffffb58cff00bd8cff08bd8cff10bd8cff19bd8cff21bd8cff29bd8cff31bd8cff3abd8cff42bd8cff4abd8cff52bd8cff5abd8cff63bd8cff6bbd8cff73bd8cff7bbd8cff84bd8cff8cbd8cff94bd8cff9cbd8cffa5bd8cffadbd8cffb5bd8cffbdbd8cffc5bd8cffcebd8cffd6bd8cffdebd8cffe6bd8cffefbd8cfff7bd8cffffbd8cff00c58cff08c58cff10c58cff19c58cff21c58cff29c58cff31c58cff3ac58cff42c58cff4ac58cff52c58cff5ac58cff63c58cff6bc58cff73c58cff7bc58cff84c58cff8cc58cff94c58cff9cc58cffa5c58cffadc58cffb5c58cffbdc58cffc5c58cffcec58cffd6c58cffdec58cffe6c58cffefc58cfff7c58cffffc58cff00ce8cff08ce8cff10ce8cff19ce8cff21ce8cff29ce8cff31ce8cff3ace8cff42ce8cff4ace8cff52ce8cff5ace8cff63ce8cff6bce8cff73ce8cff7bce8cff84ce8cff8cce8cff94ce8cff9cce8cffa5ce8cffadce8cffb5ce8cffbdce8cffc5ce8cffcece8cffd6ce8cffdece8cffe6ce8cffefce8cfff7ce8cffffce8cff00d68cff08d68cff10d68cff19d68cff21d68cff29d68cff31d68cff3ad68cff42d68cff4ad68cff52d68cff5ad68cff63d68cff6bd68cff73d68cff7bd68cff84d68cff8cd68cff94d68cff9cd68cffa5d68cffadd68cffb5d68cffbdd68cffc5d68cffced68cffd6d68cffded68cffe6d68cffefd68cfff7d68cffffd68cff00de8cff08de8cff10de8cff19de8cff21de8cff29de8cff31de8cff3ade8cff42de8cff4ade8cff52de8cff5ade8cff63de8cff6bde8cff73de8cff7bde8cff84de8cff8cde8cff94de8cff9cde8cffa5de8cffadde8cffb5de8cffbdde8cffc5de8cffcede8cffd6de8cffdede8cffe6de8cffefde8cfff7de8cffffde8cff00e68cff08e68cff10e68cff19e68cff21e68cff29e68cff31e68cff3ae68cff42e68cff4ae68cff52e68cff5ae68cff63e68cff6be68cff73e68cff7be68cff84e68cff8ce68cff94e68cff9ce68cffa5e68cffade68cffb5e68cffbde68cffc5e68cffcee68cffd6e68cffdee68cffe6e68cffefe68cfff7e68cffffe68cff00ef8cff08ef8cff10ef8cff19ef8cff21ef8cff29ef8cff31ef8cff3aef8cff42ef8cff4aef8cff52ef8cff5aef8cff63ef8cff6bef8cff73ef8cff7bef8cff84ef8cff8cef8cff94ef8cff9cef8cffa5ef8cffadef8cffb5ef8cffbdef8cffc5ef8cffceef8cffd6ef8cffdeef8cffe6ef8cffefef8cfff7ef8cffffef8cff00f78cff08f78cff10f78cff19f78cff21f78cff29f78cff31f78cff3af78cff42f78cff4af78cff52f78cff5af78cff63f78cff6bf78cff73f78cff7bf78cff84f78cff8cf78cff94f78cff9cf78cffa5f78cffadf78cffb5f78cffbdf78cffc5f78cffcef78cffd6f78cffdef78cffe6f78cffeff78cfff7f78cfffff78cff00ff8cff08ff8cff10ff8cff19ff8cff21ff8cff29ff8cff31ff8cff3aff8cff42ff8cff4aff8cff52ff8cff5aff8cff63ff8cff6bff8cff73ff8cff7bff8cff84ff8cff8cff8cff94ff8cff9cff8cffa5ff8cffadff8cffb5ff8cffbdff8cffc5ff8cffceff8cffd6ff8cffdeff8cffe6ff8cffefff8cfff7ff8cffffff8cff000094ff080094ff100094ff190094ff210094ff290094ff310094ff3a0094ff420094ff4a0094ff520094ff5a0094ff630094ff6b0094ff730094ff7b0094ff840094ff8c0094ff940094ff9c0094ffa50094ffad0094ffb50094ffbd0094ffc50094ffce0094ffd60094ffde0094ffe60094ffef0094fff70094ffff0094ff000894ff080894ff100894ff190894ff210894ff290894ff310894ff3a0894ff420894ff4a0894ff520894ff5a0894ff630894ff6b0894ff730894ff7b0894ff840894ff8c0894ff940894ff9c0894ffa50894ffad0894ffb50894ffbd0894ffc50894ffce0894ffd60894ffde0894ffe60894ffef0894fff70894ffff0894ff001094ff081094ff101094ff191094ff211094ff291094ff311094ff3a1094ff421094ff4a1094ff521094ff5a1094ff631094ff6b1094ff731094ff7b1094ff841094ff8c1094ff941094ff9c1094ffa51094ffad1094ffb51094ffbd1094ffc51094ffce1094ffd61094ffde1094ffe61094ffef1094fff71094ffff1094ff001994ff081994ff101994ff191994ff211994ff291994ff311994ff3a1994ff421994ff4a1994ff521994ff5a1994ff631994ff6b1994ff731994ff7b1994ff841994ff8c1994ff941994ff9c1994ffa51994ffad1994ffb51994ffbd1994ffc51994ffce1994ffd61994ffde1994ffe61994ffef1994fff71994ffff1994ff002194ff082194ff102194ff192194ff212194ff292194ff312194ff3a2194ff422194ff4a2194ff522194ff5a2194ff632194ff6b2194ff732194ff7b2194ff842194ff8c2194ff942194ff9c2194ffa52194ffad2194ffb52194ffbd2194ffc52194ffce2194ffd62194ffde2194ffe62194ffef2194fff72194ffff2194ff002994ff082994ff102994ff192994ff212994ff292994ff312994ff3a2994ff422994ff4a2994ff522994ff5a2994ff632994ff6b2994ff732994ff7b2994ff842994ff8c2994ff942994ff9c2994ffa52994ffad2994ffb52994ffbd2994ffc52994ffce2994ffd62994ffde2994ffe62994ffef2994fff72994ffff2994ff003194ff083194ff103194ff193194ff213194ff293194ff313194ff3a3194ff423194ff4a3194ff523194ff5a3194ff633194ff6b3194ff733194ff7b3194ff843194ff8c3194ff943194ff9c3194ffa53194ffad3194ffb53194ffbd3194ffc53194ffce3194ffd63194ffde3194ffe63194ffef3194fff73194ffff3194ff003a94ff083a94ff103a94ff193a94ff213a94ff293a94ff313a94ff3a3a94ff423a94ff4a3a94ff523a94ff5a3a94ff633a94ff6b3a94ff733a94ff7b3a94ff843a94ff8c3a94ff943a94ff9c3a94ffa53a94ffad3a94ffb53a94ffbd3a94ffc53a94ffce3a94ffd63a94ffde3a94ffe63a94ffef3a94fff73a94ffff3a94ff004294ff084294ff104294ff194294ff214294ff294294ff314294ff3a4294ff424294ff4a4294ff524294ff5a4294ff634294ff6b4294ff734294ff7b4294ff844294ff8c4294ff944294ff9c4294ffa54294ffad4294ffb54294ffbd4294ffc54294ffce4294ffd64294ffde4294ffe64294ffef4294fff74294ffff4294ff004a94ff084a94ff104a94ff194a94ff214a94ff294a94ff314a94ff3a4a94ff424a94ff4a4a94ff524a94ff5a4a94ff634a94ff6b4a94ff734a94ff7b4a94ff844a94ff8c4a94ff944a94ff9c4a94ffa54a94ffad4a94ffb54a94ffbd4a94ffc54a94ffce4a94ffd64a94ffde4a94ffe64a94ffef4a94fff74a94ffff4a94ff005294ff085294ff105294ff195294ff215294ff295294ff315294ff3a5294ff425294ff4a5294ff525294ff5a5294ff635294ff6b5294ff735294ff7b5294ff845294ff8c5294ff945294ff9c5294ffa55294ffad5294ffb55294ffbd5294ffc55294ffce5294ffd65294ffde5294ffe65294ffef5294fff75294ffff5294ff005a94ff085a94ff105a94ff195a94ff215a94ff295a94ff315a94ff3a5a94ff425a94ff4a5a94ff525a94ff5a5a94ff635a94ff6b5a94ff735a94ff7b5a94ff845a94ff8c5a94ff945a94ff9c5a94ffa55a94ffad5a94ffb55a94ffbd5a94ffc55a94ffce5a94ffd65a94ffde5a94ffe65a94ffef5a94fff75a94ffff5a94ff006394ff086394ff106394ff196394ff216394ff296394ff316394ff3a6394ff426394ff4a6394ff526394ff5a6394ff636394ff6b6394ff736394ff7b6394ff846394ff8c6394ff946394ff9c6394ffa56394ffad6394ffb56394ffbd6394ffc56394ffce6394ffd66394ffde6394ffe66394ffef6394fff76394ffff6394ff006b94ff086b94ff106b94ff196b94ff216b94ff296b94ff316b94ff3a6b94ff426b94ff4a6b94ff526b94ff5a6b94ff636b94ff6b6b94ff736b94ff7b6b94ff846b94ff8c6b94ff946b94ff9c6b94ffa56b94ffad6b94ffb56b94ffbd6b94ffc56b94ffce6b94ffd66b94ffde6b94ffe66b94ffef6b94fff76b94ffff6b94ff007394ff087394ff107394ff197394ff217394ff297394ff317394ff3a7394ff427394ff4a7394ff527394ff5a7394ff637394ff6b7394ff737394ff7b7394ff847394ff8c7394ff947394ff9c7394ffa57394ffad7394ffb57394ffbd7394ffc57394ffce7394ffd67394ffde7394ffe67394ffef7394fff77394ffff7394ff007b94ff087b94ff107b94ff197b94ff217b94ff297b94ff317b94ff3a7b94ff427b94ff4a7b94ff527b94ff5a7b94ff637b94ff6b7b94ff737b94ff7b7b94ff847b94ff8c7b94ff947b94ff9c7b94ffa57b94ffad7b94ffb57b94ffbd7b94ffc57b94ffce7b94ffd67b94ffde7b94ffe67b94ffef7b94fff77b94ffff7b94ff008494ff088494ff108494ff198494ff218494ff298494ff318494ff3a8494ff428494ff4a8494ff528494ff5a8494ff638494ff6b8494ff738494ff7b8494ff848494ff8c8494ff948494ff9c8494ffa58494ffad8494ffb58494ffbd8494ffc58494ffce8494ffd68494ffde8494ffe68494ffef8494fff78494ffff8494ff008c94ff088c94ff108c94ff198c94ff218c94ff298c94ff318c94ff3a8c94ff428c94ff4a8c94ff528c94ff5a8c94ff638c94ff6b8c94ff738c94ff7b8c94ff848c94ff8c8c94ff948c94ff9c8c94ffa58c94ffad8c94ffb58c94ffbd8c94ffc58c94ffce8c94ffd68c94ffde8c94ffe68c94ffef8c94fff78c94ffff8c94ff009494ff089494ff109494ff199494ff219494ff299494ff319494ff3a9494ff429494ff4a9494ff529494ff5a9494ff639494ff6b9494ff739494ff7b9494ff849494ff8c9494ff949494ff9c9494ffa59494ffad9494ffb59494ffbd9494ffc59494ffce9494ffd69494ffde9494ffe69494ffef9494fff79494ffff9494ff009c94ff089c94ff109c94ff199c94ff219c94ff299c94ff319c94ff3a9c94ff429c94ff4a9c94ff529c94ff5a9c94ff639c94ff6b9c94ff739c94ff7b9c94ff849c94ff8c9c94ff949c94ff9c9c94ffa59c94ffad9c94ffb59c94ffbd9c94ffc59c94ffce9c94ffd69c94ffde9c94ffe69c94ffef9c94fff79c94ffff9c94ff00a594ff08a594ff10a594ff19a594ff21a594ff29a594ff31a594ff3aa594ff42a594ff4aa594ff52a594ff5aa594ff63a594ff6ba594ff73a594ff7ba594ff84a594ff8ca594ff94a594ff9ca594ffa5a594ffada594ffb5a594ffbda594ffc5a594ffcea594ffd6a594ffdea594ffe6a594ffefa594fff7a594ffffa594ff00ad94ff08ad94ff10ad94ff19ad94ff21ad94ff29ad94ff31ad94ff3aad94ff42ad94ff4aad94ff52ad94ff5aad94ff63ad94ff6bad94ff73ad94ff7bad94ff84ad94ff8cad94ff94ad94ff9cad94ffa5ad94ffadad94ffb5ad94ffbdad94ffc5ad94ffcead94ffd6ad94ffdead94ffe6ad94ffefad94fff7ad94ffffad94ff00b594ff08b594ff10b594ff19b594ff21b594ff29b594ff31b594ff3ab594ff42b594ff4ab594ff52b594ff5ab594ff63b594ff6bb594ff73b594ff7bb594ff84b594ff8cb594ff94b594ff9cb594ffa5b594ffadb594ffb5b594ffbdb594ffc5b594ffceb594ffd6b594ffdeb594ffe6b594ffefb594fff7b594ffffb594ff00bd94ff08bd94ff10bd94ff19bd94ff21bd94ff29bd94ff31bd94ff3abd94ff42bd94ff4abd94ff52bd94ff5abd94ff63bd94ff6bbd94ff73bd94ff7bbd94ff84bd94ff8cbd94ff94bd94ff9cbd94ffa5bd94ffadbd94ffb5bd94ffbdbd94ffc5bd94ffcebd94ffd6bd94ffdebd94ffe6bd94ffefbd94fff7bd94ffffbd94ff00c594ff08c594ff10c594ff19c594ff21c594ff29c594ff31c594ff3ac594ff42c594ff4ac594ff52c594ff5ac594ff63c594ff6bc594ff73c594ff7bc594ff84c594ff8cc594ff94c594ff9cc594ffa5c594ffadc594ffb5c594ffbdc594ffc5c594ffcec594ffd6c594ffdec594ffe6c594ffefc594fff7c594ffffc594ff00ce94ff08ce94ff10ce94ff19ce94ff21ce94ff29ce94ff31ce94ff3ace94ff42ce94ff4ace94ff52ce94ff5ace94ff63ce94ff6bce94ff73ce94ff7bce94ff84ce94ff8cce94ff94ce94ff9cce94ffa5ce94ffadce94ffb5ce94ffbdce94ffc5ce94ffcece94ffd6ce94ffdece94ffe6ce94ffefce94fff7ce94ffffce94ff00d694ff08d694ff10d694ff19d694ff21d694ff29d694ff31d694ff3ad694ff42d694ff4ad694ff52d694ff5ad694ff63d694ff6bd694ff73d694ff7bd694ff84d694ff8cd694ff94d694ff9cd694ffa5d694ffadd694ffb5d694ffbdd694ffc5d694ffced694ffd6d694ffded694ffe6d694ffefd694fff7d694ffffd694ff00de94ff08de94ff10de94ff19de94ff21de94ff29de94ff31de94ff3ade94ff42de94ff4ade94ff52de94ff5ade94ff63de94ff6bde94ff73de94ff7bde94ff84de94ff8cde94ff94de94ff9cde94ffa5de94ffadde94ffb5de94ffbdde94ffc5de94ffcede94ffd6de94ffdede94ffe6de94ffefde94fff7de94ffffde94ff00e694ff08e694ff10e694ff19e694ff21e694ff29e694ff31e694ff3ae694ff42e694ff4ae694ff52e694ff5ae694ff63e694ff6be694ff73e694ff7be694ff84e694ff8ce694ff94e694ff9ce694ffa5e694ffade694ffb5e694ffbde694ffc5e694ffcee694ffd6e694ffdee694ffe6e694ffefe694fff7e694ffffe694ff00ef94ff08ef94ff10ef94ff19ef94ff21ef94ff29ef94ff31ef94ff3aef94ff42ef94ff4aef94ff52ef94ff5aef94ff63ef94ff6bef94ff73ef94ff7bef94ff84ef94ff8cef94ff94ef94ff9cef94ffa5ef94ffadef94ffb5ef94ffbdef94ffc5ef94ffceef94ffd6ef94ffdeef94ffe6ef94ffefef94fff7ef94ffffef94ff00f794ff08f794ff10f794ff19f794ff21f794ff29f794ff31f794ff3af794ff42f794ff4af794ff52f794ff5af794ff63f794ff6bf794ff73f794ff7bf794ff84f794ff8cf794ff94f794ff9cf794ffa5f794ffadf794ffb5f794ffbdf794ffc5f794ffcef794ffd6f794ffdef794ffe6f794ffeff794fff7f794fffff794ff00ff94ff08ff94ff10ff94ff19ff94ff21ff94ff29ff94ff31ff94ff3aff94ff42ff94ff4aff94ff52ff94ff5aff94ff63ff94ff6bff94ff73ff94ff7bff94ff84ff94ff8cff94ff94ff94ff9cff94ffa5ff94ffadff94ffb5ff94ffbdff94ffc5ff94ffceff94ffd6ff94ffdeff94ffe6ff94ffefff94fff7ff94ffffff94ff00009cff08009cff10009cff19009cff21009cff29009cff31009cff3a009cff42009cff4a009cff52009cff5a009cff63009cff6b009cff73009cff7b009cff84009cff8c009cff94009cff9c009cffa5009cffad009cffb5009cffbd009cffc5009cffce009cffd6009cffde009cffe6009cffef009cfff7009cffff009cff00089cff08089cff10089cff19089cff21089cff29089cff31089cff3a089cff42089cff4a089cff52089cff5a089cff63089cff6b089cff73089cff7b089cff84089cff8c089cff94089cff9c089cffa5089cffad089cffb5089cffbd089cffc5089cffce089cffd6089cffde089cffe6089cffef089cfff7089cffff089cff00109cff08109cff10109cff19109cff21109cff29109cff31109cff3a109cff42109cff4a109cff52109cff5a109cff63109cff6b109cff73109cff7b109cff84109cff8c109cff94109cff9c109cffa5109cffad109cffb5109cffbd109cffc5109cffce109cffd6109cffde109cffe6109cffef109cfff7109cffff109cff00199cff08199cff10199cff19199cff21199cff29199cff31199cff3a199cff42199cff4a199cff52199cff5a199cff63199cff6b199cff73199cff7b199cff84199cff8c199cff94199cff9c199cffa5199cffad199cffb5199cffbd199cffc5199cffce199cffd6199cffde199cffe6199cffef199cfff7199cffff199cff00219cff08219cff10219cff19219cff21219cff29219cff31219cff3a219cff42219cff4a219cff52219cff5a219cff63219cff6b219cff73219cff7b219cff84219cff8c219cff94219cff9c219cffa5219cffad219cffb5219cffbd219cffc5219cffce219cffd6219cffde219cffe6219cffef219cfff7219cffff219cff00299cff08299cff10299cff19299cff21299cff29299cff31299cff3a299cff42299cff4a299cff52299cff5a299cff63299cff6b299cff73299cff7b299cff84299cff8c299cff94299cff9c299cffa5299cffad299cffb5299cffbd299cffc5299cffce299cffd6299cffde299cffe6299cffef299cfff7299cffff299cff00319cff08319cff10319cff19319cff21319cff29319cff31319cff3a319cff42319cff4a319cff52319cff5a319cff63319cff6b319cff73319cff7b319cff84319cff8c319cff94319cff9c319cffa5319cffad319cffb5319cffbd319cffc5319cffce319cffd6319cffde319cffe6319cffef319cfff7319cffff319cff003a9cff083a9cff103a9cff193a9cff213a9cff293a9cff313a9cff3a3a9cff423a9cff4a3a9cff523a9cff5a3a9cff633a9cff6b3a9cff733a9cff7b3a9cff843a9cff8c3a9cff943a9cff9c3a9cffa53a9cffad3a9cffb53a9cffbd3a9cffc53a9cffce3a9cffd63a9cffde3a9cffe63a9cffef3a9cfff73a9cffff3a9cff00429cff08429cff10429cff19429cff21429cff29429cff31429cff3a429cff42429cff4a429cff52429cff5a429cff63429cff6b429cff73429cff7b429cff84429cff8c429cff94429cff9c429cffa5429cffad429cffb5429cffbd429cffc5429cffce429cffd6429cffde429cffe6429cffef429cfff7429cffff429cff004a9cff084a9cff104a9cff194a9cff214a9cff294a9cff314a9cff3a4a9cff424a9cff4a4a9cff524a9cff5a4a9cff634a9cff6b4a9cff734a9cff7b4a9cff844a9cff8c4a9cff944a9cff9c4a9cffa54a9cffad4a9cffb54a9cffbd4a9cffc54a9cffce4a9cffd64a9cffde4a9cffe64a9cffef4a9cfff74a9cffff4a9cff00529cff08529cff10529cff19529cff21529cff29529cff31529cff3a529cff42529cff4a529cff52529cff5a529cff63529cff6b529cff73529cff7b529cff84529cff8c529cff94529cff9c529cffa5529cffad529cffb5529cffbd529cffc5529cffce529cffd6529cffde529cffe6529cffef529cfff7529cffff529cff005a9cff085a9cff105a9cff195a9cff215a9cff295a9cff315a9cff3a5a9cff425a9cff4a5a9cff525a9cff5a5a9cff635a9cff6b5a9cff735a9cff7b5a9cff845a9cff8c5a9cff945a9cff9c5a9cffa55a9cffad5a9cffb55a9cffbd5a9cffc55a9cffce5a9cffd65a9cffde5a9cffe65a9cffef5a9cfff75a9cffff5a9cff00639cff08639cff10639cff19639cff21639cff29639cff31639cff3a639cff42639cff4a639cff52639cff5a639cff63639cff6b639cff73639cff7b639cff84639cff8c639cff94639cff9c639cffa5639cffad639cffb5639cffbd639cffc5639cffce639cffd6639cffde639cffe6639cffef639cfff7639cffff639cff006b9cff086b9cff106b9cff196b9cff216b9cff296b9cff316b9cff3a6b9cff426b9cff4a6b9cff526b9cff5a6b9cff636b9cff6b6b9cff736b9cff7b6b9cff846b9cff8c6b9cff946b9cff9c6b9cffa56b9cffad6b9cffb56b9cffbd6b9cffc56b9cffce6b9cffd66b9cffde6b9cffe66b9cffef6b9cfff76b9cffff6b9cff00739cff08739cff10739cff19739cff21739cff29739cff31739cff3a739cff42739cff4a739cff52739cff5a739cff63739cff6b739cff73739cff7b739cff84739cff8c739cff94739cff9c739cffa5739cffad739cffb5739cffbd739cffc5739cffce739cffd6739cffde739cffe6739cffef739cfff7739cffff739cff007b9cff087b9cff107b9cff197b9cff217b9cff297b9cff317b9cff3a7b9cff427b9cff4a7b9cff527b9cff5a7b9cff637b9cff6b7b9cff737b9cff7b7b9cff847b9cff8c7b9cff947b9cff9c7b9cffa57b9cffad7b9cffb57b9cffbd7b9cffc57b9cffce7b9cffd67b9cffde7b9cffe67b9cffef7b9cfff77b9cffff7b9cff00849cff08849cff10849cff19849cff21849cff29849cff31849cff3a849cff42849cff4a849cff52849cff5a849cff63849cff6b849cff73849cff7b849cff84849cff8c849cff94849cff9c849cffa5849cffad849cffb5849cffbd849cffc5849cffce849cffd6849cffde849cffe6849cffef849cfff7849cffff849cff008c9cff088c9cff108c9cff198c9cff218c9cff298c9cff318c9cff3a8c9cff428c9cff4a8c9cff528c9cff5a8c9cff638c9cff6b8c9cff738c9cff7b8c9cff848c9cff8c8c9cff948c9cff9c8c9cffa58c9cffad8c9cffb58c9cffbd8c9cffc58c9cffce8c9cffd68c9cffde8c9cffe68c9cffef8c9cfff78c9cffff8c9cff00949cff08949cff10949cff19949cff21949cff29949cff31949cff3a949cff42949cff4a949cff52949cff5a949cff63949cff6b949cff73949cff7b949cff84949cff8c949cff94949cff9c949cffa5949cffad949cffb5949cffbd949cffc5949cffce949cffd6949cffde949cffe6949cffef949cfff7949cffff949cff009c9cff089c9cff109c9cff199c9cff219c9cff299c9cff319c9cff3a9c9cff429c9cff4a9c9cff529c9cff5a9c9cff639c9cff6b9c9cff739c9cff7b9c9cff849c9cff8c9c9cff949c9cff9c9c9cffa59c9cffad9c9cffb59c9cffbd9c9cffc59c9cffce9c9cffd69c9cffde9c9cffe69c9cffef9c9cfff79c9cffff9c9cff00a59cff08a59cff10a59cff19a59cff21a59cff29a59cff31a59cff3aa59cff42a59cff4aa59cff52a59cff5aa59cff63a59cff6ba59cff73a59cff7ba59cff84a59cff8ca59cff94a59cff9ca59cffa5a59cffada59cffb5a59cffbda59cffc5a59cffcea59cffd6a59cffdea59cffe6a59cffefa59cfff7a59cffffa59cff00ad9cff08ad9cff10ad9cff19ad9cff21ad9cff29ad9cff31ad9cff3aad9cff42ad9cff4aad9cff52ad9cff5aad9cff63ad9cff6bad9cff73ad9cff7bad9cff84ad9cff8cad9cff94ad9cff9cad9cffa5ad9cffadad9cffb5ad9cffbdad9cffc5ad9cffcead9cffd6ad9cffdead9cffe6ad9cffefad9cfff7ad9cffffad9cff00b59cff08b59cff10b59cff19b59cff21b59cff29b59cff31b59cff3ab59cff42b59cff4ab59cff52b59cff5ab59cff63b59cff6bb59cff73b59cff7bb59cff84b59cff8cb59cff94b59cff9cb59cffa5b59cffadb59cffb5b59cffbdb59cffc5b59cffceb59cffd6b59cffdeb59cffe6b59cffefb59cfff7b59cffffb59cff00bd9cff08bd9cff10bd9cff19bd9cff21bd9cff29bd9cff31bd9cff3abd9cff42bd9cff4abd9cff52bd9cff5abd9cff63bd9cff6bbd9cff73bd9cff7bbd9cff84bd9cff8cbd9cff94bd9cff9cbd9cffa5bd9cffadbd9cffb5bd9cffbdbd9cffc5bd9cffcebd9cffd6bd9cffdebd9cffe6bd9cffefbd9cfff7bd9cffffbd9cff00c59cff08c59cff10c59cff19c59cff21c59cff29c59cff31c59cff3ac59cff42c59cff4ac59cff52c59cff5ac59cff63c59cff6bc59cff73c59cff7bc59cff84c59cff8cc59cff94c59cff9cc59cffa5c59cffadc59cffb5c59cffbdc59cffc5c59cffcec59cffd6c59cffdec59cffe6c59cffefc59cfff7c59cffffc59cff00ce9cff08ce9cff10ce9cff19ce9cff21ce9cff29ce9cff31ce9cff3ace9cff42ce9cff4ace9cff52ce9cff5ace9cff63ce9cff6bce9cff73ce9cff7bce9cff84ce9cff8cce9cff94ce9cff9cce9cffa5ce9cffadce9cffb5ce9cffbdce9cffc5ce9cffcece9cffd6ce9cffdece9cffe6ce9cffefce9cfff7ce9cffffce9cff00d69cff08d69cff10d69cff19d69cff21d69cff29d69cff31d69cff3ad69cff42d69cff4ad69cff52d69cff5ad69cff63d69cff6bd69cff73d69cff7bd69cff84d69cff8cd69cff94d69cff9cd69cffa5d69cffadd69cffb5d69cffbdd69cffc5d69cffced69cffd6d69cffded69cffe6d69cffefd69cfff7d69cffffd69cff00de9cff08de9cff10de9cff19de9cff21de9cff29de9cff31de9cff3ade9cff42de9cff4ade9cff52de9cff5ade9cff63de9cff6bde9cff73de9cff7bde9cff84de9cff8cde9cff94de9cff9cde9cffa5de9cffadde9cffb5de9cffbdde9cffc5de9cffcede9cffd6de9cffdede9cffe6de9cffefde9cfff7de9cffffde9cff00e69cff08e69cff10e69cff19e69cff21e69cff29e69cff31e69cff3ae69cff42e69cff4ae69cff52e69cff5ae69cff63e69cff6be69cff73e69cff7be69cff84e69cff8ce69cff94e69cff9ce69cffa5e69cffade69cffb5e69cffbde69cffc5e69cffcee69cffd6e69cffdee69cffe6e69cffefe69cfff7e69cffffe69cff00ef9cff08ef9cff10ef9cff19ef9cff21ef9cff29ef9cff31ef9cff3aef9cff42ef9cff4aef9cff52ef9cff5aef9cff63ef9cff6bef9cff73ef9cff7bef9cff84ef9cff8cef9cff94ef9cff9cef9cffa5ef9cffadef9cffb5ef9cffbdef9cffc5ef9cffceef9cffd6ef9cffdeef9cffe6ef9cffefef9cfff7ef9cffffef9cff00f79cff08f79cff10f79cff19f79cff21f79cff29f79cff31f79cff3af79cff42f79cff4af79cff52f79cff5af79cff63f79cff6bf79cff73f79cff7bf79cff84f79cff8cf79cff94f79cff9cf79cffa5f79cffadf79cffb5f79cffbdf79cffc5f79cffcef79cffd6f79cffdef79cffe6f79cffeff79cfff7f79cfffff79cff00ff9cff08ff9cff10ff9cff19ff9cff21ff9cff29ff9cff31ff9cff3aff9cff42ff9cff4aff9cff52ff9cff5aff9cff63ff9cff6bff9cff73ff9cff7bff9cff84ff9cff8cff9cff94ff9cff9cff9cffa5ff9cffadff9cffb5ff9cffbdff9cffc5ff9cffceff9cffd6ff9cffdeff9cffe6ff9cffefff9cfff7ff9cffffff9cff0000a5ff0800a5ff1000a5ff1900a5ff2100a5ff2900a5ff3100a5ff3a00a5ff4200a5ff4a00a5ff5200a5ff5a00a5ff6300a5ff6b00a5ff7300a5ff7b00a5ff8400a5ff8c00a5ff9400a5ff9c00a5ffa500a5ffad00a5ffb500a5ffbd00a5ffc500a5ffce00a5ffd600a5ffde00a5ffe600a5ffef00a5fff700a5ffff00a5ff0008a5ff0808a5ff1008a5ff1908a5ff2108a5ff2908a5ff3108a5ff3a08a5ff4208a5ff4a08a5ff5208a5ff5a08a5ff6308a5ff6b08a5ff7308a5ff7b08a5ff8408a5ff8c08a5ff9408a5ff9c08a5ffa508a5ffad08a5ffb508a5ffbd08a5ffc508a5ffce08a5ffd608a5ffde08a5ffe608a5ffef08a5fff708a5ffff08a5ff0010a5ff0810a5ff1010a5ff1910a5ff2110a5ff2910a5ff3110a5ff3a10a5ff4210a5ff4a10a5ff5210a5ff5a10a5ff6310a5ff6b10a5ff7310a5ff7b10a5ff8410a5ff8c10a5ff9410a5ff9c10a5ffa510a5ffad10a5ffb510a5ffbd10a5ffc510a5ffce10a5ffd610a5ffde10a5ffe610a5ffef10a5fff710a5ffff10a5ff0019a5ff0819a5ff1019a5ff1919a5ff2119a5ff2919a5ff3119a5ff3a19a5ff4219a5ff4a19a5ff5219a5ff5a19a5ff6319a5ff6b19a5ff7319a5ff7b19a5ff8419a5ff8c19a5ff9419a5ff9c19a5ffa519a5ffad19a5ffb519a5ffbd19a5ffc519a5ffce19a5ffd619a5ffde19a5ffe619a5ffef19a5fff719a5ffff19a5ff0021a5ff0821a5ff1021a5ff1921a5ff2121a5ff2921a5ff3121a5ff3a21a5ff4221a5ff4a21a5ff5221a5ff5a21a5ff6321a5ff6b21a5ff7321a5ff7b21a5ff8421a5ff8c21a5ff9421a5ff9c21a5ffa521a5ffad21a5ffb521a5ffbd21a5ffc521a5ffce21a5ffd621a5ffde21a5ffe621a5ffef21a5fff721a5ffff21a5ff0029a5ff0829a5ff1029a5ff1929a5ff2129a5ff2929a5ff3129a5ff3a29a5ff4229a5ff4a29a5ff5229a5ff5a29a5ff6329a5ff6b29a5ff7329a5ff7b29a5ff8429a5ff8c29a5ff9429a5ff9c29a5ffa529a5ffad29a5ffb529a5ffbd29a5ffc529a5ffce29a5ffd629a5ffde29a5ffe629a5ffef29a5fff729a5ffff29a5ff0031a5ff0831a5ff1031a5ff1931a5ff2131a5ff2931a5ff3131a5ff3a31a5ff4231a5ff4a31a5ff5231a5ff5a31a5ff6331a5ff6b31a5ff7331a5ff7b31a5ff8431a5ff8c31a5ff9431a5ff9c31a5ffa531a5ffad31a5ffb531a5ffbd31a5ffc531a5ffce31a5ffd631a5ffde31a5ffe631a5ffef31a5fff731a5ffff31a5ff003aa5ff083aa5ff103aa5ff193aa5ff213aa5ff293aa5ff313aa5ff3a3aa5ff423aa5ff4a3aa5ff523aa5ff5a3aa5ff633aa5ff6b3aa5ff733aa5ff7b3aa5ff843aa5ff8c3aa5ff943aa5ff9c3aa5ffa53aa5ffad3aa5ffb53aa5ffbd3aa5ffc53aa5ffce3aa5ffd63aa5ffde3aa5ffe63aa5ffef3aa5fff73aa5ffff3aa5ff0042a5ff0842a5ff1042a5ff1942a5ff2142a5ff2942a5ff3142a5ff3a42a5ff4242a5ff4a42a5ff5242a5ff5a42a5ff6342a5ff6b42a5ff7342a5ff7b42a5ff8442a5ff8c42a5ff9442a5ff9c42a5ffa542a5ffad42a5ffb542a5ffbd42a5ffc542a5ffce42a5ffd642a5ffde42a5ffe642a5ffef42a5fff742a5ffff42a5ff004aa5ff084aa5ff104aa5ff194aa5ff214aa5ff294aa5ff314aa5ff3a4aa5ff424aa5ff4a4aa5ff524aa5ff5a4aa5ff634aa5ff6b4aa5ff734aa5ff7b4aa5ff844aa5ff8c4aa5ff944aa5ff9c4aa5ffa54aa5ffad4aa5ffb54aa5ffbd4aa5ffc54aa5ffce4aa5ffd64aa5ffde4aa5ffe64aa5ffef4aa5fff74aa5ffff4aa5ff0052a5ff0852a5ff1052a5ff1952a5ff2152a5ff2952a5ff3152a5ff3a52a5ff4252a5ff4a52a5ff5252a5ff5a52a5ff6352a5ff6b52a5ff7352a5ff7b52a5ff8452a5ff8c52a5ff9452a5ff9c52a5ffa552a5ffad52a5ffb552a5ffbd52a5ffc552a5ffce52a5ffd652a5ffde52a5ffe652a5ffef52a5fff752a5ffff52a5ff005aa5ff085aa5ff105aa5ff195aa5ff215aa5ff295aa5ff315aa5ff3a5aa5ff425aa5ff4a5aa5ff525aa5ff5a5aa5ff635aa5ff6b5aa5ff735aa5ff7b5aa5ff845aa5ff8c5aa5ff945aa5ff9c5aa5ffa55aa5ffad5aa5ffb55aa5ffbd5aa5ffc55aa5ffce5aa5ffd65aa5ffde5aa5ffe65aa5ffef5aa5fff75aa5ffff5aa5ff0063a5ff0863a5ff1063a5ff1963a5ff2163a5ff2963a5ff3163a5ff3a63a5ff4263a5ff4a63a5ff5263a5ff5a63a5ff6363a5ff6b63a5ff7363a5ff7b63a5ff8463a5ff8c63a5ff9463a5ff9c63a5ffa563a5ffad63a5ffb563a5ffbd63a5ffc563a5ffce63a5ffd663a5ffde63a5ffe663a5ffef63a5fff763a5ffff63a5ff006ba5ff086ba5ff106ba5ff196ba5ff216ba5ff296ba5ff316ba5ff3a6ba5ff426ba5ff4a6ba5ff526ba5ff5a6ba5ff636ba5ff6b6ba5ff736ba5ff7b6ba5ff846ba5ff8c6ba5ff946ba5ff9c6ba5ffa56ba5ffad6ba5ffb56ba5ffbd6ba5ffc56ba5ffce6ba5ffd66ba5ffde6ba5ffe66ba5ffef6ba5fff76ba5ffff6ba5ff0073a5ff0873a5ff1073a5ff1973a5ff2173a5ff2973a5ff3173a5ff3a73a5ff4273a5ff4a73a5ff5273a5ff5a73a5ff6373a5ff6b73a5ff7373a5ff7b73a5ff8473a5ff8c73a5ff9473a5ff9c73a5ffa573a5ffad73a5ffb573a5ffbd73a5ffc573a5ffce73a5ffd673a5ffde73a5ffe673a5ffef73a5fff773a5ffff73a5ff007ba5ff087ba5ff107ba5ff197ba5ff217ba5ff297ba5ff317ba5ff3a7ba5ff427ba5ff4a7ba5ff527ba5ff5a7ba5ff637ba5ff6b7ba5ff737ba5ff7b7ba5ff847ba5ff8c7ba5ff947ba5ff9c7ba5ffa57ba5ffad7ba5ffb57ba5ffbd7ba5ffc57ba5ffce7ba5ffd67ba5ffde7ba5ffe67ba5ffef7ba5fff77ba5ffff7ba5ff0084a5ff0884a5ff1084a5ff1984a5ff2184a5ff2984a5ff3184a5ff3a84a5ff4284a5ff4a84a5ff5284a5ff5a84a5ff6384a5ff6b84a5ff7384a5ff7b84a5ff8484a5ff8c84a5ff9484a5ff9c84a5ffa584a5ffad84a5ffb584a5ffbd84a5ffc584a5ffce84a5ffd684a5ffde84a5ffe684a5ffef84a5fff784a5ffff84a5ff008ca5ff088ca5ff108ca5ff198ca5ff218ca5ff298ca5ff318ca5ff3a8ca5ff428ca5ff4a8ca5ff528ca5ff5a8ca5ff638ca5ff6b8ca5ff738ca5ff7b8ca5ff848ca5ff8c8ca5ff948ca5ff9c8ca5ffa58ca5ffad8ca5ffb58ca5ffbd8ca5ffc58ca5ffce8ca5ffd68ca5ffde8ca5ffe68ca5ffef8ca5fff78ca5ffff8ca5ff0094a5ff0894a5ff1094a5ff1994a5ff2194a5ff2994a5ff3194a5ff3a94a5ff4294a5ff4a94a5ff5294a5ff5a94a5ff6394a5ff6b94a5ff7394a5ff7b94a5ff8494a5ff8c94a5ff9494a5ff9c94a5ffa594a5ffad94a5ffb594a5ffbd94a5ffc594a5ffce94a5ffd694a5ffde94a5ffe694a5ffef94a5fff794a5ffff94a5ff009ca5ff089ca5ff109ca5ff199ca5ff219ca5ff299ca5ff319ca5ff3a9ca5ff429ca5ff4a9ca5ff529ca5ff5a9ca5ff639ca5ff6b9ca5ff739ca5ff7b9ca5ff849ca5ff8c9ca5ff949ca5ff9c9ca5ffa59ca5ffad9ca5ffb59ca5ffbd9ca5ffc59ca5ffce9ca5ffd69ca5ffde9ca5ffe69ca5ffef9ca5fff79ca5ffff9ca5ff00a5a5ff08a5a5ff10a5a5ff19a5a5ff21a5a5ff29a5a5ff31a5a5ff3aa5a5ff42a5a5ff4aa5a5ff52a5a5ff5aa5a5ff63a5a5ff6ba5a5ff73a5a5ff7ba5a5ff84a5a5ff8ca5a5ff94a5a5ff9ca5a5ffa5a5a5ffada5a5ffb5a5a5ffbda5a5ffc5a5a5ffcea5a5ffd6a5a5ffdea5a5ffe6a5a5ffefa5a5fff7a5a5ffffa5a5ff00ada5ff08ada5ff10ada5ff19ada5ff21ada5ff29ada5ff31ada5ff3aada5ff42ada5ff4aada5ff52ada5ff5aada5ff63ada5ff6bada5ff73ada5ff7bada5ff84ada5ff8cada5ff94ada5ff9cada5ffa5ada5ffadada5ffb5ada5ffbdada5ffc5ada5ffceada5ffd6ada5ffdeada5ffe6ada5ffefada5fff7ada5ffffada5ff00b5a5ff08b5a5ff10b5a5ff19b5a5ff21b5a5ff29b5a5ff31b5a5ff3ab5a5ff42b5a5ff4ab5a5ff52b5a5ff5ab5a5ff63b5a5ff6bb5a5ff73b5a5ff7bb5a5ff84b5a5ff8cb5a5ff94b5a5ff9cb5a5ffa5b5a5ffadb5a5ffb5b5a5ffbdb5a5ffc5b5a5ffceb5a5ffd6b5a5ffdeb5a5ffe6b5a5ffefb5a5fff7b5a5ffffb5a5ff00bda5ff08bda5ff10bda5ff19bda5ff21bda5ff29bda5ff31bda5ff3abda5ff42bda5ff4abda5ff52bda5ff5abda5ff63bda5ff6bbda5ff73bda5ff7bbda5ff84bda5ff8cbda5ff94bda5ff9cbda5ffa5bda5ffadbda5ffb5bda5ffbdbda5ffc5bda5ffcebda5ffd6bda5ffdebda5ffe6bda5ffefbda5fff7bda5ffffbda5ff00c5a5ff08c5a5ff10c5a5ff19c5a5ff21c5a5ff29c5a5ff31c5a5ff3ac5a5ff42c5a5ff4ac5a5ff52c5a5ff5ac5a5ff63c5a5ff6bc5a5ff73c5a5ff7bc5a5ff84c5a5ff8cc5a5ff94c5a5ff9cc5a5ffa5c5a5ffadc5a5ffb5c5a5ffbdc5a5ffc5c5a5ffcec5a5ffd6c5a5ffdec5a5ffe6c5a5ffefc5a5fff7c5a5ffffc5a5ff00cea5ff08cea5ff10cea5ff19cea5ff21cea5ff29cea5ff31cea5ff3acea5ff42cea5ff4acea5ff52cea5ff5acea5ff63cea5ff6bcea5ff73cea5ff7bcea5ff84cea5ff8ccea5ff94cea5ff9ccea5ffa5cea5ffadcea5ffb5cea5ffbdcea5ffc5cea5ffcecea5ffd6cea5ffdecea5ffe6cea5ffefcea5fff7cea5ffffcea5ff00d6a5ff08d6a5ff10d6a5ff19d6a5ff21d6a5ff29d6a5ff31d6a5ff3ad6a5ff42d6a5ff4ad6a5ff52d6a5ff5ad6a5ff63d6a5ff6bd6a5ff73d6a5ff7bd6a5ff84d6a5ff8cd6a5ff94d6a5ff9cd6a5ffa5d6a5ffadd6a5ffb5d6a5ffbdd6a5ffc5d6a5ffced6a5ffd6d6a5ffded6a5ffe6d6a5ffefd6a5fff7d6a5ffffd6a5ff00dea5ff08dea5ff10dea5ff19dea5ff21dea5ff29dea5ff31dea5ff3adea5ff42dea5ff4adea5ff52dea5ff5adea5ff63dea5ff6bdea5ff73dea5ff7bdea5ff84dea5ff8cdea5ff94dea5ff9cdea5ffa5dea5ffaddea5ffb5dea5ffbddea5ffc5dea5ffcedea5ffd6dea5ffdedea5ffe6dea5ffefdea5fff7dea5ffffdea5ff00e6a5ff08e6a5ff10e6a5ff19e6a5ff21e6a5ff29e6a5ff31e6a5ff3ae6a5ff42e6a5ff4ae6a5ff52e6a5ff5ae6a5ff63e6a5ff6be6a5ff73e6a5ff7be6a5ff84e6a5ff8ce6a5ff94e6a5ff9ce6a5ffa5e6a5ffade6a5ffb5e6a5ffbde6a5ffc5e6a5ffcee6a5ffd6e6a5ffdee6a5ffe6e6a5ffefe6a5fff7e6a5ffffe6a5ff00efa5ff08efa5ff10efa5ff19efa5ff21efa5ff29efa5ff31efa5ff3aefa5ff42efa5ff4aefa5ff52efa5ff5aefa5ff63efa5ff6befa5ff73efa5ff7befa5ff84efa5ff8cefa5ff94efa5ff9cefa5ffa5efa5ffadefa5ffb5efa5ffbdefa5ffc5efa5ffceefa5ffd6efa5ffdeefa5ffe6efa5ffefefa5fff7efa5ffffefa5ff00f7a5ff08f7a5ff10f7a5ff19f7a5ff21f7a5ff29f7a5ff31f7a5ff3af7a5ff42f7a5ff4af7a5ff52f7a5ff5af7a5ff63f7a5ff6bf7a5ff73f7a5ff7bf7a5ff84f7a5ff8cf7a5ff94f7a5ff9cf7a5ffa5f7a5ffadf7a5ffb5f7a5ffbdf7a5ffc5f7a5ffcef7a5ffd6f7a5ffdef7a5ffe6f7a5ffeff7a5fff7f7a5fffff7a5ff00ffa5ff08ffa5ff10ffa5ff19ffa5ff21ffa5ff29ffa5ff31ffa5ff3affa5ff42ffa5ff4affa5ff52ffa5ff5affa5ff63ffa5ff6bffa5ff73ffa5ff7bffa5ff84ffa5ff8cffa5ff94ffa5ff9cffa5ffa5ffa5ffadffa5ffb5ffa5ffbdffa5ffc5ffa5ffceffa5ffd6ffa5ffdeffa5ffe6ffa5ffefffa5fff7ffa5ffffffa5ff0000adff0800adff1000adff1900adff2100adff2900adff3100adff3a00adff4200adff4a00adff5200adff5a00adff6300adff6b00adff7300adff7b00adff8400adff8c00adff9400adff9c00adffa500adffad00adffb500adffbd00adffc500adffce00adffd600adffde00adffe600adffef00adfff700adffff00adff0008adff0808adff1008adff1908adff2108adff2908adff3108adff3a08adff4208adff4a08adff5208adff5a08adff6308adff6b08adff7308adff7b08adff8408adff8c08adff9408adff9c08adffa508adffad08adffb508adffbd08adffc508adffce08adffd608adffde08adffe608adffef08adfff708adffff08adff0010adff0810adff1010adff1910adff2110adff2910adff3110adff3a10adff4210adff4a10adff5210adff5a10adff6310adff6b10adff7310adff7b10adff8410adff8c10adff9410adff9c10adffa510adffad10adffb510adffbd10adffc510adffce10adffd610adffde10adffe610adffef10adfff710adffff10adff0019adff0819adff1019adff1919adff2119adff2919adff3119adff3a19adff4219adff4a19adff5219adff5a19adff6319adff6b19adff7319adff7b19adff8419adff8c19adff9419adff9c19adffa519adffad19adffb519adffbd19adffc519adffce19adffd619adffde19adffe619adffef19adfff719adffff19adff0021adff0821adff1021adff1921adff2121adff2921adff3121adff3a21adff4221adff4a21adff5221adff5a21adff6321adff6b21adff7321adff7b21adff8421adff8c21adff9421adff9c21adffa521adffad21adffb521adffbd21adffc521adffce21adffd621adffde21adffe621adffef21adfff721adffff21adff0029adff0829adff1029adff1929adff2129adff2929adff3129adff3a29adff4229adff4a29adff5229adff5a29adff6329adff6b29adff7329adff7b29adff8429adff8c29adff9429adff9c29adffa529adffad29adffb529adffbd29adffc529adffce29adffd629adffde29adffe629adffef29adfff729adffff29adff0031adff0831adff1031adff1931adff2131adff2931adff3131adff3a31adff4231adff4a31adff5231adff5a31adff6331adff6b31adff7331adff7b31adff8431adff8c31adff9431adff9c31adffa531adffad31adffb531adffbd31adffc531adffce31adffd631adffde31adffe631adffef31adfff731adffff31adff003aadff083aadff103aadff193aadff213aadff293aadff313aadff3a3aadff423aadff4a3aadff523aadff5a3aadff633aadff6b3aadff733aadff7b3aadff843aadff8c3aadff943aadff9c3aadffa53aadffad3aadffb53aadffbd3aadffc53aadffce3aadffd63aadffde3aadffe63aadffef3aadfff73aadffff3aadff0042adff0842adff1042adff1942adff2142adff2942adff3142adff3a42adff4242adff4a42adff5242adff5a42adff6342adff6b42adff7342adff7b42adff8442adff8c42adff9442adff9c42adffa542adffad42adffb542adffbd42adffc542adffce42adffd642adffde42adffe642adffef42adfff742adffff42adff004aadff084aadff104aadff194aadff214aadff294aadff314aadff3a4aadff424aadff4a4aadff524aadff5a4aadff634aadff6b4aadff734aadff7b4aadff844aadff8c4aadff944aadff9c4aadffa54aadffad4aadffb54aadffbd4aadffc54aadffce4aadffd64aadffde4aadffe64aadffef4aadfff74aadffff4aadff0052adff0852adff1052adff1952adff2152adff2952adff3152adff3a52adff4252adff4a52adff5252adff5a52adff6352adff6b52adff7352adff7b52adff8452adff8c52adff9452adff9c52adffa552adffad52adffb552adffbd52adffc552adffce52adffd652adffde52adffe652adffef52adfff752adffff52adff005aadff085aadff105aadff195aadff215aadff295aadff315aadff3a5aadff425aadff4a5aadff525aadff5a5aadff635aadff6b5aadff735aadff7b5aadff845aadff8c5aadff945aadff9c5aadffa55aadffad5aadffb55aadffbd5aadffc55aadffce5aadffd65aadffde5aadffe65aadffef5aadfff75aadffff5aadff0063adff0863adff1063adff1963adff2163adff2963adff3163adff3a63adff4263adff4a63adff5263adff5a63adff6363adff6b63adff7363adff7b63adff8463adff8c63adff9463adff9c63adffa563adffad63adffb563adffbd63adffc563adffce63adffd663adffde63adffe663adffef63adfff763adffff63adff006badff086badff106badff196badff216badff296badff316badff3a6badff426badff4a6badff526badff5a6badff636badff6b6badff736badff7b6badff846badff8c6badff946badff9c6badffa56badffad6badffb56badffbd6badffc56badffce6badffd66badffde6badffe66badffef6badfff76badffff6badff0073adff0873adff1073adff1973adff2173adff2973adff3173adff3a73adff4273adff4a73adff5273adff5a73adff6373adff6b73adff7373adff7b73adff8473adff8c73adff9473adff9c73adffa573adffad73adffb573adffbd73adffc573adffce73adffd673adffde73adffe673adffef73adfff773adffff73adff007badff087badff107badff197badff217badff297badff317badff3a7badff427badff4a7badff527badff5a7badff637badff6b7badff737badff7b7badff847badff8c7badff947badff9c7badffa57badffad7badffb57badffbd7badffc57badffce7badffd67badffde7badffe67badffef7badfff77badffff7badff0084adff0884adff1084adff1984adff2184adff2984adff3184adff3a84adff4284adff4a84adff5284adff5a84adff6384adff6b84adff7384adff7b84adff8484adff8c84adff9484adff9c84adffa584adffad84adffb584adffbd84adffc584adffce84adffd684adffde84adffe684adffef84adfff784adffff84adff008cadff088cadff108cadff198cadff218cadff298cadff318cadff3a8cadff428cadff4a8cadff528cadff5a8cadff638cadff6b8cadff738cadff7b8cadff848cadff8c8cadff948cadff9c8cadffa58cadffad8cadffb58cadffbd8cadffc58cadffce8cadffd68cadffde8cadffe68cadffef8cadfff78cadffff8cadff0094adff0894adff1094adff1994adff2194adff2994adff3194adff3a94adff4294adff4a94adff5294adff5a94adff6394adff6b94adff7394adff7b94adff8494adff8c94adff9494adff9c94adffa594adffad94adffb594adffbd94adffc594adffce94adffd694adffde94adffe694adffef94adfff794adffff94adff009cadff089cadff109cadff199cadff219cadff299cadff319cadff3a9cadff429cadff4a9cadff529cadff5a9cadff639cadff6b9cadff739cadff7b9cadff849cadff8c9cadff949cadff9c9cadffa59cadffad9cadffb59cadffbd9cadffc59cadffce9cadffd69cadffde9cadffe69cadffef9cadfff79cadffff9cadff00a5adff08a5adff10a5adff19a5adff21a5adff29a5adff31a5adff3aa5adff42a5adff4aa5adff52a5adff5aa5adff63a5adff6ba5adff73a5adff7ba5adff84a5adff8ca5adff94a5adff9ca5adffa5a5adffada5adffb5a5adffbda5adffc5a5adffcea5adffd6a5adffdea5adffe6a5adffefa5adfff7a5adffffa5adff00adadff08adadff10adadff19adadff21adadff29adadff31adadff3aadadff42adadff4aadadff52adadff5aadadff63adadff6badadff73adadff7badadff84adadff8cadadff94adadff9cadadffa5adadffadadadffb5adadffbdadadffc5adadffceadadffd6adadffdeadadffe6adadffefadadfff7adadffffadadff00b5adff08b5adff10b5adff19b5adff21b5adff29b5adff31b5adff3ab5adff42b5adff4ab5adff52b5adff5ab5adff63b5adff6bb5adff73b5adff7bb5adff84b5adff8cb5adff94b5adff9cb5adffa5b5adffadb5adffb5b5adffbdb5adffc5b5adffceb5adffd6b5adffdeb5adffe6b5adffefb5adfff7b5adffffb5adff00bdadff08bdadff10bdadff19bdadff21bdadff29bdadff31bdadff3abdadff42bdadff4abdadff52bdadff5abdadff63bdadff6bbdadff73bdadff7bbdadff84bdadff8cbdadff94bdadff9cbdadffa5bdadffadbdadffb5bdadffbdbdadffc5bdadffcebdadffd6bdadffdebdadffe6bdadffefbdadfff7bdadffffbdadff00c5adff08c5adff10c5adff19c5adff21c5adff29c5adff31c5adff3ac5adff42c5adff4ac5adff52c5adff5ac5adff63c5adff6bc5adff73c5adff7bc5adff84c5adff8cc5adff94c5adff9cc5adffa5c5adffadc5adffb5c5adffbdc5adffc5c5adffcec5adffd6c5adffdec5adffe6c5adffefc5adfff7c5adffffc5adff00ceadff08ceadff10ceadff19ceadff21ceadff29ceadff31ceadff3aceadff42ceadff4aceadff52ceadff5aceadff63ceadff6bceadff73ceadff7bceadff84ceadff8cceadff94ceadff9cceadffa5ceadffadceadffb5ceadffbdceadffc5ceadffceceadffd6ceadffdeceadffe6ceadffefceadfff7ceadffffceadff00d6adff08d6adff10d6adff19d6adff21d6adff29d6adff31d6adff3ad6adff42d6adff4ad6adff52d6adff5ad6adff63d6adff6bd6adff73d6adff7bd6adff84d6adff8cd6adff94d6adff9cd6adffa5d6adffadd6adffb5d6adffbdd6adffc5d6adffced6adffd6d6adffded6adffe6d6adffefd6adfff7d6adffffd6adff00deadff08deadff10deadff19deadff21deadff29deadff31deadff3adeadff42deadff4adeadff52deadff5adeadff63deadff6bdeadff73deadff7bdeadff84deadff8cdeadff94deadff9cdeadffa5deadffaddeadffb5deadffbddeadffc5deadffcedeadffd6deadffdedeadffe6deadffefdeadfff7deadffffdeadff00e6adff08e6adff10e6adff19e6adff21e6adff29e6adff31e6adff3ae6adff42e6adff4ae6adff52e6adff5ae6adff63e6adff6be6adff73e6adff7be6adff84e6adff8ce6adff94e6adff9ce6adffa5e6adffade6adffb5e6adffbde6adffc5e6adffcee6adffd6e6adffdee6adffe6e6adffefe6adfff7e6adffffe6adff00efadff08efadff10efadff19efadff21efadff29efadff31efadff3aefadff42efadff4aefadff52efadff5aefadff63efadff6befadff73efadff7befadff84efadff8cefadff94efadff9cefadffa5efadffadefadffb5efadffbdefadffc5efadffceefadffd6efadffdeefadffe6efadffefefadfff7efadffffefadff00f7adff08f7adff10f7adff19f7adff21f7adff29f7adff31f7adff3af7adff42f7adff4af7adff52f7adff5af7adff63f7adff6bf7adff73f7adff7bf7adff84f7adff8cf7adff94f7adff9cf7adffa5f7adffadf7adffb5f7adffbdf7adffc5f7adffcef7adffd6f7adffdef7adffe6f7adffeff7adfff7f7adfffff7adff00ffadff08ffadff10ffadff19ffadff21ffadff29ffadff31ffadff3affadff42ffadff4affadff52ffadff5affadff63ffadff6bffadff73ffadff7bffadff84ffadff8cffadff94ffadff9cffadffa5ffadffadffadffb5ffadffbdffadffc5ffadffceffadffd6ffadffdeffadffe6ffadffefffadfff7ffadffffffadff0000b5ff0800b5ff1000b5ff1900b5ff2100b5ff2900b5ff3100b5ff3a00b5ff4200b5ff4a00b5ff5200b5ff5a00b5ff6300b5ff6b00b5ff7300b5ff7b00b5ff8400b5ff8c00b5ff9400b5ff9c00b5ffa500b5ffad00b5ffb500b5ffbd00b5ffc500b5ffce00b5ffd600b5ffde00b5ffe600b5ffef00b5fff700b5ffff00b5ff0008b5ff0808b5ff1008b5ff1908b5ff2108b5ff2908b5ff3108b5ff3a08b5ff4208b5ff4a08b5ff5208b5ff5a08b5ff6308b5ff6b08b5ff7308b5ff7b08b5ff8408b5ff8c08b5ff9408b5ff9c08b5ffa508b5ffad08b5ffb508b5ffbd08b5ffc508b5ffce08b5ffd608b5ffde08b5ffe608b5ffef08b5fff708b5ffff08b5ff0010b5ff0810b5ff1010b5ff1910b5ff2110b5ff2910b5ff3110b5ff3a10b5ff4210b5ff4a10b5ff5210b5ff5a10b5ff6310b5ff6b10b5ff7310b5ff7b10b5ff8410b5ff8c10b5ff9410b5ff9c10b5ffa510b5ffad10b5ffb510b5ffbd10b5ffc510b5ffce10b5ffd610b5ffde10b5ffe610b5ffef10b5fff710b5ffff10b5ff0019b5ff0819b5ff1019b5ff1919b5ff2119b5ff2919b5ff3119b5ff3a19b5ff4219b5ff4a19b5ff5219b5ff5a19b5ff6319b5ff6b19b5ff7319b5ff7b19b5ff8419b5ff8c19b5ff9419b5ff9c19b5ffa519b5ffad19b5ffb519b5ffbd19b5ffc519b5ffce19b5ffd619b5ffde19b5ffe619b5ffef19b5fff719b5ffff19b5ff0021b5ff0821b5ff1021b5ff1921b5ff2121b5ff2921b5ff3121b5ff3a21b5ff4221b5ff4a21b5ff5221b5ff5a21b5ff6321b5ff6b21b5ff7321b5ff7b21b5ff8421b5ff8c21b5ff9421b5ff9c21b5ffa521b5ffad21b5ffb521b5ffbd21b5ffc521b5ffce21b5ffd621b5ffde21b5ffe621b5ffef21b5fff721b5ffff21b5ff0029b5ff0829b5ff1029b5ff1929b5ff2129b5ff2929b5ff3129b5ff3a29b5ff4229b5ff4a29b5ff5229b5ff5a29b5ff6329b5ff6b29b5ff7329b5ff7b29b5ff8429b5ff8c29b5ff9429b5ff9c29b5ffa529b5ffad29b5ffb529b5ffbd29b5ffc529b5ffce29b5ffd629b5ffde29b5ffe629b5ffef29b5fff729b5ffff29b5ff0031b5ff0831b5ff1031b5ff1931b5ff2131b5ff2931b5ff3131b5ff3a31b5ff4231b5ff4a31b5ff5231b5ff5a31b5ff6331b5ff6b31b5ff7331b5ff7b31b5ff8431b5ff8c31b5ff9431b5ff9c31b5ffa531b5ffad31b5ffb531b5ffbd31b5ffc531b5ffce31b5ffd631b5ffde31b5ffe631b5ffef31b5fff731b5ffff31b5ff003ab5ff083ab5ff103ab5ff193ab5ff213ab5ff293ab5ff313ab5ff3a3ab5ff423ab5ff4a3ab5ff523ab5ff5a3ab5ff633ab5ff6b3ab5ff733ab5ff7b3ab5ff843ab5ff8c3ab5ff943ab5ff9c3ab5ffa53ab5ffad3ab5ffb53ab5ffbd3ab5ffc53ab5ffce3ab5ffd63ab5ffde3ab5ffe63ab5ffef3ab5fff73ab5ffff3ab5ff0042b5ff0842b5ff1042b5ff1942b5ff2142b5ff2942b5ff3142b5ff3a42b5ff4242b5ff4a42b5ff5242b5ff5a42b5ff6342b5ff6b42b5ff7342b5ff7b42b5ff8442b5ff8c42b5ff9442b5ff9c42b5ffa542b5ffad42b5ffb542b5ffbd42b5ffc542b5ffce42b5ffd642b5ffde42b5ffe642b5ffef42b5fff742b5ffff42b5ff004ab5ff084ab5ff104ab5ff194ab5ff214ab5ff294ab5ff314ab5ff3a4ab5ff424ab5ff4a4ab5ff524ab5ff5a4ab5ff634ab5ff6b4ab5ff734ab5ff7b4ab5ff844ab5ff8c4ab5ff944ab5ff9c4ab5ffa54ab5ffad4ab5ffb54ab5ffbd4ab5ffc54ab5ffce4ab5ffd64ab5ffde4ab5ffe64ab5ffef4ab5fff74ab5ffff4ab5ff0052b5ff0852b5ff1052b5ff1952b5ff2152b5ff2952b5ff3152b5ff3a52b5ff4252b5ff4a52b5ff5252b5ff5a52b5ff6352b5ff6b52b5ff7352b5ff7b52b5ff8452b5ff8c52b5ff9452b5ff9c52b5ffa552b5ffad52b5ffb552b5ffbd52b5ffc552b5ffce52b5ffd652b5ffde52b5ffe652b5ffef52b5fff752b5ffff52b5ff005ab5ff085ab5ff105ab5ff195ab5ff215ab5ff295ab5ff315ab5ff3a5ab5ff425ab5ff4a5ab5ff525ab5ff5a5ab5ff635ab5ff6b5ab5ff735ab5ff7b5ab5ff845ab5ff8c5ab5ff945ab5ff9c5ab5ffa55ab5ffad5ab5ffb55ab5ffbd5ab5ffc55ab5ffce5ab5ffd65ab5ffde5ab5ffe65ab5ffef5ab5fff75ab5ffff5ab5ff0063b5ff0863b5ff1063b5ff1963b5ff2163b5ff2963b5ff3163b5ff3a63b5ff4263b5ff4a63b5ff5263b5ff5a63b5ff6363b5ff6b63b5ff7363b5ff7b63b5ff8463b5ff8c63b5ff9463b5ff9c63b5ffa563b5ffad63b5ffb563b5ffbd63b5ffc563b5ffce63b5ffd663b5ffde63b5ffe663b5ffef63b5fff763b5ffff63b5ff006bb5ff086bb5ff106bb5ff196bb5ff216bb5ff296bb5ff316bb5ff3a6bb5ff426bb5ff4a6bb5ff526bb5ff5a6bb5ff636bb5ff6b6bb5ff736bb5ff7b6bb5ff846bb5ff8c6bb5ff946bb5ff9c6bb5ffa56bb5ffad6bb5ffb56bb5ffbd6bb5ffc56bb5ffce6bb5ffd66bb5ffde6bb5ffe66bb5ffef6bb5fff76bb5ffff6bb5ff0073b5ff0873b5ff1073b5ff1973b5ff2173b5ff2973b5ff3173b5ff3a73b5ff4273b5ff4a73b5ff5273b5ff5a73b5ff6373b5ff6b73b5ff7373b5ff7b73b5ff8473b5ff8c73b5ff9473b5ff9c73b5ffa573b5ffad73b5ffb573b5ffbd73b5ffc573b5ffce73b5ffd673b5ffde73b5ffe673b5ffef73b5fff773b5ffff73b5ff007bb5ff087bb5ff107bb5ff197bb5ff217bb5ff297bb5ff317bb5ff3a7bb5ff427bb5ff4a7bb5ff527bb5ff5a7bb5ff637bb5ff6b7bb5ff737bb5ff7b7bb5ff847bb5ff8c7bb5ff947bb5ff9c7bb5ffa57bb5ffad7bb5ffb57bb5ffbd7bb5ffc57bb5ffce7bb5ffd67bb5ffde7bb5ffe67bb5ffef7bb5fff77bb5ffff7bb5ff0084b5ff0884b5ff1084b5ff1984b5ff2184b5ff2984b5ff3184b5ff3a84b5ff4284b5ff4a84b5ff5284b5ff5a84b5ff6384b5ff6b84b5ff7384b5ff7b84b5ff8484b5ff8c84b5ff9484b5ff9c84b5ffa584b5ffad84b5ffb584b5ffbd84b5ffc584b5ffce84b5ffd684b5ffde84b5ffe684b5ffef84b5fff784b5ffff84b5ff008cb5ff088cb5ff108cb5ff198cb5ff218cb5ff298cb5ff318cb5ff3a8cb5ff428cb5ff4a8cb5ff528cb5ff5a8cb5ff638cb5ff6b8cb5ff738cb5ff7b8cb5ff848cb5ff8c8cb5ff948cb5ff9c8cb5ffa58cb5ffad8cb5ffb58cb5ffbd8cb5ffc58cb5ffce8cb5ffd68cb5ffde8cb5ffe68cb5ffef8cb5fff78cb5ffff8cb5ff0094b5ff0894b5ff1094b5ff1994b5ff2194b5ff2994b5ff3194b5ff3a94b5ff4294b5ff4a94b5ff5294b5ff5a94b5ff6394b5ff6b94b5ff7394b5ff7b94b5ff8494b5ff8c94b5ff9494b5ff9c94b5ffa594b5ffad94b5ffb594b5ffbd94b5ffc594b5ffce94b5ffd694b5ffde94b5ffe694b5ffef94b5fff794b5ffff94b5ff009cb5ff089cb5ff109cb5ff199cb5ff219cb5ff299cb5ff319cb5ff3a9cb5ff429cb5ff4a9cb5ff529cb5ff5a9cb5ff639cb5ff6b9cb5ff739cb5ff7b9cb5ff849cb5ff8c9cb5ff949cb5ff9c9cb5ffa59cb5ffad9cb5ffb59cb5ffbd9cb5ffc59cb5ffce9cb5ffd69cb5ffde9cb5ffe69cb5ffef9cb5fff79cb5ffff9cb5ff00a5b5ff08a5b5ff10a5b5ff19a5b5ff21a5b5ff29a5b5ff31a5b5ff3aa5b5ff42a5b5ff4aa5b5ff52a5b5ff5aa5b5ff63a5b5ff6ba5b5ff73a5b5ff7ba5b5ff84a5b5ff8ca5b5ff94a5b5ff9ca5b5ffa5a5b5ffada5b5ffb5a5b5ffbda5b5ffc5a5b5ffcea5b5ffd6a5b5ffdea5b5ffe6a5b5ffefa5b5fff7a5b5ffffa5b5ff00adb5ff08adb5ff10adb5ff19adb5ff21adb5ff29adb5ff31adb5ff3aadb5ff42adb5ff4aadb5ff52adb5ff5aadb5ff63adb5ff6badb5ff73adb5ff7badb5ff84adb5ff8cadb5ff94adb5ff9cadb5ffa5adb5ffadadb5ffb5adb5ffbdadb5ffc5adb5ffceadb5ffd6adb5ffdeadb5ffe6adb5ffefadb5fff7adb5ffffadb5ff00b5b5ff08b5b5ff10b5b5ff19b5b5ff21b5b5ff29b5b5ff31b5b5ff3ab5b5ff42b5b5ff4ab5b5ff52b5b5ff5ab5b5ff63b5b5ff6bb5b5ff73b5b5ff7bb5b5ff84b5b5ff8cb5b5ff94b5b5ff9cb5b5ffa5b5b5ffadb5b5ffb5b5b5ffbdb5b5ffc5b5b5ffceb5b5ffd6b5b5ffdeb5b5ffe6b5b5ffefb5b5fff7b5b5ffffb5b5ff00bdb5ff08bdb5ff10bdb5ff19bdb5ff21bdb5ff29bdb5ff31bdb5ff3abdb5ff42bdb5ff4abdb5ff52bdb5ff5abdb5ff63bdb5ff6bbdb5ff73bdb5ff7bbdb5ff84bdb5ff8cbdb5ff94bdb5ff9cbdb5ffa5bdb5ffadbdb5ffb5bdb5ffbdbdb5ffc5bdb5ffcebdb5ffd6bdb5ffdebdb5ffe6bdb5ffefbdb5fff7bdb5ffffbdb5ff00c5b5ff08c5b5ff10c5b5ff19c5b5ff21c5b5ff29c5b5ff31c5b5ff3ac5b5ff42c5b5ff4ac5b5ff52c5b5ff5ac5b5ff63c5b5ff6bc5b5ff73c5b5ff7bc5b5ff84c5b5ff8cc5b5ff94c5b5ff9cc5b5ffa5c5b5ffadc5b5ffb5c5b5ffbdc5b5ffc5c5b5ffcec5b5ffd6c5b5ffdec5b5ffe6c5b5ffefc5b5fff7c5b5ffffc5b5ff00ceb5ff08ceb5ff10ceb5ff19ceb5ff21ceb5ff29ceb5ff31ceb5ff3aceb5ff42ceb5ff4aceb5ff52ceb5ff5aceb5ff63ceb5ff6bceb5ff73ceb5ff7bceb5ff84ceb5ff8cceb5ff94ceb5ff9cceb5ffa5ceb5ffadceb5ffb5ceb5ffbdceb5ffc5ceb5ffceceb5ffd6ceb5ffdeceb5ffe6ceb5ffefceb5fff7ceb5ffffceb5ff00d6b5ff08d6b5ff10d6b5ff19d6b5ff21d6b5ff29d6b5ff31d6b5ff3ad6b5ff42d6b5ff4ad6b5ff52d6b5ff5ad6b5ff63d6b5ff6bd6b5ff73d6b5ff7bd6b5ff84d6b5ff8cd6b5ff94d6b5ff9cd6b5ffa5d6b5ffadd6b5ffb5d6b5ffbdd6b5ffc5d6b5ffced6b5ffd6d6b5ffded6b5ffe6d6b5ffefd6b5fff7d6b5ffffd6b5ff00deb5ff08deb5ff10deb5ff19deb5ff21deb5ff29deb5ff31deb5ff3adeb5ff42deb5ff4adeb5ff52deb5ff5adeb5ff63deb5ff6bdeb5ff73deb5ff7bdeb5ff84deb5ff8cdeb5ff94deb5ff9cdeb5ffa5deb5ffaddeb5ffb5deb5ffbddeb5ffc5deb5ffcedeb5ffd6deb5ffdedeb5ffe6deb5ffefdeb5fff7deb5ffffdeb5ff00e6b5ff08e6b5ff10e6b5ff19e6b5ff21e6b5ff29e6b5ff31e6b5ff3ae6b5ff42e6b5ff4ae6b5ff52e6b5ff5ae6b5ff63e6b5ff6be6b5ff73e6b5ff7be6b5ff84e6b5ff8ce6b5ff94e6b5ff9ce6b5ffa5e6b5ffade6b5ffb5e6b5ffbde6b5ffc5e6b5ffcee6b5ffd6e6b5ffdee6b5ffe6e6b5ffefe6b5fff7e6b5ffffe6b5ff00efb5ff08efb5ff10efb5ff19efb5ff21efb5ff29efb5ff31efb5ff3aefb5ff42efb5ff4aefb5ff52efb5ff5aefb5ff63efb5ff6befb5ff73efb5ff7befb5ff84efb5ff8cefb5ff94efb5ff9cefb5ffa5efb5ffadefb5ffb5efb5ffbdefb5ffc5efb5ffceefb5ffd6efb5ffdeefb5ffe6efb5ffefefb5fff7efb5ffffefb5ff00f7b5ff08f7b5ff10f7b5ff19f7b5ff21f7b5ff29f7b5ff31f7b5ff3af7b5ff42f7b5ff4af7b5ff52f7b5ff5af7b5ff63f7b5ff6bf7b5ff73f7b5ff7bf7b5ff84f7b5ff8cf7b5ff94f7b5ff9cf7b5ffa5f7b5ffadf7b5ffb5f7b5ffbdf7b5ffc5f7b5ffcef7b5ffd6f7b5ffdef7b5ffe6f7b5ffeff7b5fff7f7b5fffff7b5ff00ffb5ff08ffb5ff10ffb5ff19ffb5ff21ffb5ff29ffb5ff31ffb5ff3affb5ff42ffb5ff4affb5ff52ffb5ff5affb5ff63ffb5ff6bffb5ff73ffb5ff7bffb5ff84ffb5ff8cffb5ff94ffb5ff9cffb5ffa5ffb5ffadffb5ffb5ffb5ffbdffb5ffc5ffb5ffceffb5ffd6ffb5ffdeffb5ffe6ffb5ffefffb5fff7ffb5ffffffb5ff0000bdff0800bdff1000bdff1900bdff2100bdff2900bdff3100bdff3a00bdff4200bdff4a00bdff5200bdff5a00bdff6300bdff6b00bdff7300bdff7b00bdff8400bdff8c00bdff9400bdff9c00bdffa500bdffad00bdffb500bdffbd00bdffc500bdffce00bdffd600bdffde00bdffe600bdffef00bdfff700bdffff00bdff0008bdff0808bdff1008bdff1908bdff2108bdff2908bdff3108bdff3a08bdff4208bdff4a08bdff5208bdff5a08bdff6308bdff6b08bdff7308bdff7b08bdff8408bdff8c08bdff9408bdff9c08bdffa508bdffad08bdffb508bdffbd08bdffc508bdffce08bdffd608bdffde08bdffe608bdffef08bdfff708bdffff08bdff0010bdff0810bdff1010bdff1910bdff2110bdff2910bdff3110bdff3a10bdff4210bdff4a10bdff5210bdff5a10bdff6310bdff6b10bdff7310bdff7b10bdff8410bdff8c10bdff9410bdff9c10bdffa510bdffad10bdffb510bdffbd10bdffc510bdffce10bdffd610bdffde10bdffe610bdffef10bdfff710bdffff10bdff0019bdff0819bdff1019bdff1919bdff2119bdff2919bdff3119bdff3a19bdff4219bdff4a19bdff5219bdff5a19bdff6319bdff6b19bdff7319bdff7b19bdff8419bdff8c19bdff9419bdff9c19bdffa519bdffad19bdffb519bdffbd19bdffc519bdffce19bdffd619bdffde19bdffe619bdffef19bdfff719bdffff19bdff0021bdff0821bdff1021bdff1921bdff2121bdff2921bdff3121bdff3a21bdff4221bdff4a21bdff5221bdff5a21bdff6321bdff6b21bdff7321bdff7b21bdff8421bdff8c21bdff9421bdff9c21bdffa521bdffad21bdffb521bdffbd21bdffc521bdffce21bdffd621bdffde21bdffe621bdffef21bdfff721bdffff21bdff0029bdff0829bdff1029bdff1929bdff2129bdff2929bdff3129bdff3a29bdff4229bdff4a29bdff5229bdff5a29bdff6329bdff6b29bdff7329bdff7b29bdff8429bdff8c29bdff9429bdff9c29bdffa529bdffad29bdffb529bdffbd29bdffc529bdffce29bdffd629bdffde29bdffe629bdffef29bdfff729bdffff29bdff0031bdff0831bdff1031bdff1931bdff2131bdff2931bdff3131bdff3a31bdff4231bdff4a31bdff5231bdff5a31bdff6331bdff6b31bdff7331bdff7b31bdff8431bdff8c31bdff9431bdff9c31bdffa531bdffad31bdffb531bdffbd31bdffc531bdffce31bdffd631bdffde31bdffe631bdffef31bdfff731bdffff31bdff003abdff083abdff103abdff193abdff213abdff293abdff313abdff3a3abdff423abdff4a3abdff523abdff5a3abdff633abdff6b3abdff733abdff7b3abdff843abdff8c3abdff943abdff9c3abdffa53abdffad3abdffb53abdffbd3abdffc53abdffce3abdffd63abdffde3abdffe63abdffef3abdfff73abdffff3abdff0042bdff0842bdff1042bdff1942bdff2142bdff2942bdff3142bdff3a42bdff4242bdff4a42bdff5242bdff5a42bdff6342bdff6b42bdff7342bdff7b42bdff8442bdff8c42bdff9442bdff9c42bdffa542bdffad42bdffb542bdffbd42bdffc542bdffce42bdffd642bdffde42bdffe642bdffef42bdfff742bdffff42bdff004abdff084abdff104abdff194abdff214abdff294abdff314abdff3a4abdff424abdff4a4abdff524abdff5a4abdff634abdff6b4abdff734abdff7b4abdff844abdff8c4abdff944abdff9c4abdffa54abdffad4abdffb54abdffbd4abdffc54abdffce4abdffd64abdffde4abdffe64abdffef4abdfff74abdffff4abdff0052bdff0852bdff1052bdff1952bdff2152bdff2952bdff3152bdff3a52bdff4252bdff4a52bdff5252bdff5a52bdff6352bdff6b52bdff7352bdff7b52bdff8452bdff8c52bdff9452bdff9c52bdffa552bdffad52bdffb552bdffbd52bdffc552bdffce52bdffd652bdffde52bdffe652bdffef52bdfff752bdffff52bdff005abdff085abdff105abdff195abdff215abdff295abdff315abdff3a5abdff425abdff4a5abdff525abdff5a5abdff635abdff6b5abdff735abdff7b5abdff845abdff8c5abdff945abdff9c5abdffa55abdffad5abdffb55abdffbd5abdffc55abdffce5abdffd65abdffde5abdffe65abdffef5abdfff75abdffff5abdff0063bdff0863bdff1063bdff1963bdff2163bdff2963bdff3163bdff3a63bdff4263bdff4a63bdff5263bdff5a63bdff6363bdff6b63bdff7363bdff7b63bdff8463bdff8c63bdff9463bdff9c63bdffa563bdffad63bdffb563bdffbd63bdffc563bdffce63bdffd663bdffde63bdffe663bdffef63bdfff763bdffff63bdff006bbdff086bbdff106bbdff196bbdff216bbdff296bbdff316bbdff3a6bbdff426bbdff4a6bbdff526bbdff5a6bbdff636bbdff6b6bbdff736bbdff7b6bbdff846bbdff8c6bbdff946bbdff9c6bbdffa56bbdffad6bbdffb56bbdffbd6bbdffc56bbdffce6bbdffd66bbdffde6bbdffe66bbdffef6bbdfff76bbdffff6bbdff0073bdff0873bdff1073bdff1973bdff2173bdff2973bdff3173bdff3a73bdff4273bdff4a73bdff5273bdff5a73bdff6373bdff6b73bdff7373bdff7b73bdff8473bdff8c73bdff9473bdff9c73bdffa573bdffad73bdffb573bdffbd73bdffc573bdffce73bdffd673bdffde73bdffe673bdffef73bdfff773bdffff73bdff007bbdff087bbdff107bbdff197bbdff217bbdff297bbdff317bbdff3a7bbdff427bbdff4a7bbdff527bbdff5a7bbdff637bbdff6b7bbdff737bbdff7b7bbdff847bbdff8c7bbdff947bbdff9c7bbdffa57bbdffad7bbdffb57bbdffbd7bbdffc57bbdffce7bbdffd67bbdffde7bbdffe67bbdffef7bbdfff77bbdffff7bbdff0084bdff0884bdff1084bdff1984bdff2184bdff2984bdff3184bdff3a84bdff4284bdff4a84bdff5284bdff5a84bdff6384bdff6b84bdff7384bdff7b84bdff8484bdff8c84bdff9484bdff9c84bdffa584bdffad84bdffb584bdffbd84bdffc584bdffce84bdffd684bdffde84bdffe684bdffef84bdfff784bdffff84bdff008cbdff088cbdff108cbdff198cbdff218cbdff298cbdff318cbdff3a8cbdff428cbdff4a8cbdff528cbdff5a8cbdff638cbdff6b8cbdff738cbdff7b8cbdff848cbdff8c8cbdff948cbdff9c8cbdffa58cbdffad8cbdffb58cbdffbd8cbdffc58cbdffce8cbdffd68cbdffde8cbdffe68cbdffef8cbdfff78cbdffff8cbdff0094bdff0894bdff1094bdff1994bdff2194bdff2994bdff3194bdff3a94bdff4294bdff4a94bdff5294bdff5a94bdff6394bdff6b94bdff7394bdff7b94bdff8494bdff8c94bdff9494bdff9c94bdffa594bdffad94bdffb594bdffbd94bdffc594bdffce94bdffd694bdffde94bdffe694bdffef94bdfff794bdffff94bdff009cbdff089cbdff109cbdff199cbdff219cbdff299cbdff319cbdff3a9cbdff429cbdff4a9cbdff529cbdff5a9cbdff639cbdff6b9cbdff739cbdff7b9cbdff849cbdff8c9cbdff949cbdff9c9cbdffa59cbdffad9cbdffb59cbdffbd9cbdffc59cbdffce9cbdffd69cbdffde9cbdffe69cbdffef9cbdfff79cbdffff9cbdff00a5bdff08a5bdff10a5bdff19a5bdff21a5bdff29a5bdff31a5bdff3aa5bdff42a5bdff4aa5bdff52a5bdff5aa5bdff63a5bdff6ba5bdff73a5bdff7ba5bdff84a5bdff8ca5bdff94a5bdff9ca5bdffa5a5bdffada5bdffb5a5bdffbda5bdffc5a5bdffcea5bdffd6a5bdffdea5bdffe6a5bdffefa5bdfff7a5bdffffa5bdff00adbdff08adbdff10adbdff19adbdff21adbdff29adbdff31adbdff3aadbdff42adbdff4aadbdff52adbdff5aadbdff63adbdff6badbdff73adbdff7badbdff84adbdff8cadbdff94adbdff9cadbdffa5adbdffadadbdffb5adbdffbdadbdffc5adbdffceadbdffd6adbdffdeadbdffe6adbdffefadbdfff7adbdffffadbdff00b5bdff08b5bdff10b5bdff19b5bdff21b5bdff29b5bdff31b5bdff3ab5bdff42b5bdff4ab5bdff52b5bdff5ab5bdff63b5bdff6bb5bdff73b5bdff7bb5bdff84b5bdff8cb5bdff94b5bdff9cb5bdffa5b5bdffadb5bdffb5b5bdffbdb5bdffc5b5bdffceb5bdffd6b5bdffdeb5bdffe6b5bdffefb5bdfff7b5bdffffb5bdff00bdbdff08bdbdff10bdbdff19bdbdff21bdbdff29bdbdff31bdbdff3abdbdff42bdbdff4abdbdff52bdbdff5abdbdff63bdbdff6bbdbdff73bdbdff7bbdbdff84bdbdff8cbdbdff94bdbdff9cbdbdffa5bdbdffadbdbdffb5bdbdffbdbdbdffc5bdbdffcebdbdffd6bdbdffdebdbdffe6bdbdffefbdbdfff7bdbdffffbdbdff00c5bdff08c5bdff10c5bdff19c5bdff21c5bdff29c5bdff31c5bdff3ac5bdff42c5bdff4ac5bdff52c5bdff5ac5bdff63c5bdff6bc5bdff73c5bdff7bc5bdff84c5bdff8cc5bdff94c5bdff9cc5bdffa5c5bdffadc5bdffb5c5bdffbdc5bdffc5c5bdffcec5bdffd6c5bdffdec5bdffe6c5bdffefc5bdfff7c5bdffffc5bdff00cebdff08cebdff10cebdff19cebdff21cebdff29cebdff31cebdff3acebdff42cebdff4acebdff52cebdff5acebdff63cebdff6bcebdff73cebdff7bcebdff84cebdff8ccebdff94cebdff9ccebdffa5cebdffadcebdffb5cebdffbdcebdffc5cebdffcecebdffd6cebdffdecebdffe6cebdffefcebdfff7cebdffffcebdff00d6bdff08d6bdff10d6bdff19d6bdff21d6bdff29d6bdff31d6bdff3ad6bdff42d6bdff4ad6bdff52d6bdff5ad6bdff63d6bdff6bd6bdff73d6bdff7bd6bdff84d6bdff8cd6bdff94d6bdff9cd6bdffa5d6bdffadd6bdffb5d6bdffbdd6bdffc5d6bdffced6bdffd6d6bdffded6bdffe6d6bdffefd6bdfff7d6bdffffd6bdff00debdff08debdff10debdff19debdff21debdff29debdff31debdff3adebdff42debdff4adebdff52debdff5adebdff63debdff6bdebdff73debdff7bdebdff84debdff8cdebdff94debdff9cdebdffa5debdffaddebdffb5debdffbddebdffc5debdffcedebdffd6debdffdedebdffe6debdffefdebdfff7debdffffdebdff00e6bdff08e6bdff10e6bdff19e6bdff21e6bdff29e6bdff31e6bdff3ae6bdff42e6bdff4ae6bdff52e6bdff5ae6bdff63e6bdff6be6bdff73e6bdff7be6bdff84e6bdff8ce6bdff94e6bdff9ce6bdffa5e6bdffade6bdffb5e6bdffbde6bdffc5e6bdffcee6bdffd6e6bdffdee6bdffe6e6bdffefe6bdfff7e6bdffffe6bdff00efbdff08efbdff10efbdff19efbdff21efbdff29efbdff31efbdff3aefbdff42efbdff4aefbdff52efbdff5aefbdff63efbdff6befbdff73efbdff7befbdff84efbdff8cefbdff94efbdff9cefbdffa5efbdffadefbdffb5efbdffbdefbdffc5efbdffceefbdffd6efbdffdeefbdffe6efbdffefefbdfff7efbdffffefbdff00f7bdff08f7bdff10f7bdff19f7bdff21f7bdff29f7bdff31f7bdff3af7bdff42f7bdff4af7bdff52f7bdff5af7bdff63f7bdff6bf7bdff73f7bdff7bf7bdff84f7bdff8cf7bdff94f7bdff9cf7bdffa5f7bdffadf7bdffb5f7bdffbdf7bdffc5f7bdffcef7bdffd6f7bdffdef7bdffe6f7bdffeff7bdfff7f7bdfffff7bdff00ffbdff08ffbdff10ffbdff19ffbdff21ffbdff29ffbdff31ffbdff3affbdff42ffbdff4affbdff52ffbdff5affbdff63ffbdff6bffbdff73ffbdff7bffbdff84ffbdff8cffbdff94ffbdff9cffbdffa5ffbdffadffbdffb5ffbdffbdffbdffc5ffbdffceffbdffd6ffbdffdeffbdffe6ffbdffefffbdfff7ffbdffffffbdff0000c5ff0800c5ff1000c5ff1900c5ff2100c5ff2900c5ff3100c5ff3a00c5ff4200c5ff4a00c5ff5200c5ff5a00c5ff6300c5ff6b00c5ff7300c5ff7b00c5ff8400c5ff8c00c5ff9400c5ff9c00c5ffa500c5ffad00c5ffb500c5ffbd00c5ffc500c5ffce00c5ffd600c5ffde00c5ffe600c5ffef00c5fff700c5ffff00c5ff0008c5ff0808c5ff1008c5ff1908c5ff2108c5ff2908c5ff3108c5ff3a08c5ff4208c5ff4a08c5ff5208c5ff5a08c5ff6308c5ff6b08c5ff7308c5ff7b08c5ff8408c5ff8c08c5ff9408c5ff9c08c5ffa508c5ffad08c5ffb508c5ffbd08c5ffc508c5ffce08c5ffd608c5ffde08c5ffe608c5ffef08c5fff708c5ffff08c5ff0010c5ff0810c5ff1010c5ff1910c5ff2110c5ff2910c5ff3110c5ff3a10c5ff4210c5ff4a10c5ff5210c5ff5a10c5ff6310c5ff6b10c5ff7310c5ff7b10c5ff8410c5ff8c10c5ff9410c5ff9c10c5ffa510c5ffad10c5ffb510c5ffbd10c5ffc510c5ffce10c5ffd610c5ffde10c5ffe610c5ffef10c5fff710c5ffff10c5ff0019c5ff0819c5ff1019c5ff1919c5ff2119c5ff2919c5ff3119c5ff3a19c5ff4219c5ff4a19c5ff5219c5ff5a19c5ff6319c5ff6b19c5ff7319c5ff7b19c5ff8419c5ff8c19c5ff9419c5ff9c19c5ffa519c5ffad19c5ffb519c5ffbd19c5ffc519c5ffce19c5ffd619c5ffde19c5ffe619c5ffef19c5fff719c5ffff19c5ff0021c5ff0821c5ff1021c5ff1921c5ff2121c5ff2921c5ff3121c5ff3a21c5ff4221c5ff4a21c5ff5221c5ff5a21c5ff6321c5ff6b21c5ff7321c5ff7b21c5ff8421c5ff8c21c5ff9421c5ff9c21c5ffa521c5ffad21c5ffb521c5ffbd21c5ffc521c5ffce21c5ffd621c5ffde21c5ffe621c5ffef21c5fff721c5ffff21c5ff0029c5ff0829c5ff1029c5ff1929c5ff2129c5ff2929c5ff3129c5ff3a29c5ff4229c5ff4a29c5ff5229c5ff5a29c5ff6329c5ff6b29c5ff7329c5ff7b29c5ff8429c5ff8c29c5ff9429c5ff9c29c5ffa529c5ffad29c5ffb529c5ffbd29c5ffc529c5ffce29c5ffd629c5ffde29c5ffe629c5ffef29c5fff729c5ffff29c5ff0031c5ff0831c5ff1031c5ff1931c5ff2131c5ff2931c5ff3131c5ff3a31c5ff4231c5ff4a31c5ff5231c5ff5a31c5ff6331c5ff6b31c5ff7331c5ff7b31c5ff8431c5ff8c31c5ff9431c5ff9c31c5ffa531c5ffad31c5ffb531c5ffbd31c5ffc531c5ffce31c5ffd631c5ffde31c5ffe631c5ffef31c5fff731c5ffff31c5ff003ac5ff083ac5ff103ac5ff193ac5ff213ac5ff293ac5ff313ac5ff3a3ac5ff423ac5ff4a3ac5ff523ac5ff5a3ac5ff633ac5ff6b3ac5ff733ac5ff7b3ac5ff843ac5ff8c3ac5ff943ac5ff9c3ac5ffa53ac5ffad3ac5ffb53ac5ffbd3ac5ffc53ac5ffce3ac5ffd63ac5ffde3ac5ffe63ac5ffef3ac5fff73ac5ffff3ac5ff0042c5ff0842c5ff1042c5ff1942c5ff2142c5ff2942c5ff3142c5ff3a42c5ff4242c5ff4a42c5ff5242c5ff5a42c5ff6342c5ff6b42c5ff7342c5ff7b42c5ff8442c5ff8c42c5ff9442c5ff9c42c5ffa542c5ffad42c5ffb542c5ffbd42c5ffc542c5ffce42c5ffd642c5ffde42c5ffe642c5ffef42c5fff742c5ffff42c5ff004ac5ff084ac5ff104ac5ff194ac5ff214ac5ff294ac5ff314ac5ff3a4ac5ff424ac5ff4a4ac5ff524ac5ff5a4ac5ff634ac5ff6b4ac5ff734ac5ff7b4ac5ff844ac5ff8c4ac5ff944ac5ff9c4ac5ffa54ac5ffad4ac5ffb54ac5ffbd4ac5ffc54ac5ffce4ac5ffd64ac5ffde4ac5ffe64ac5ffef4ac5fff74ac5ffff4ac5ff0052c5ff0852c5ff1052c5ff1952c5ff2152c5ff2952c5ff3152c5ff3a52c5ff4252c5ff4a52c5ff5252c5ff5a52c5ff6352c5ff6b52c5ff7352c5ff7b52c5ff8452c5ff8c52c5ff9452c5ff9c52c5ffa552c5ffad52c5ffb552c5ffbd52c5ffc552c5ffce52c5ffd652c5ffde52c5ffe652c5ffef52c5fff752c5ffff52c5ff005ac5ff085ac5ff105ac5ff195ac5ff215ac5ff295ac5ff315ac5ff3a5ac5ff425ac5ff4a5ac5ff525ac5ff5a5ac5ff635ac5ff6b5ac5ff735ac5ff7b5ac5ff845ac5ff8c5ac5ff945ac5ff9c5ac5ffa55ac5ffad5ac5ffb55ac5ffbd5ac5ffc55ac5ffce5ac5ffd65ac5ffde5ac5ffe65ac5ffef5ac5fff75ac5ffff5ac5ff0063c5ff0863c5ff1063c5ff1963c5ff2163c5ff2963c5ff3163c5ff3a63c5ff4263c5ff4a63c5ff5263c5ff5a63c5ff6363c5ff6b63c5ff7363c5ff7b63c5ff8463c5ff8c63c5ff9463c5ff9c63c5ffa563c5ffad63c5ffb563c5ffbd63c5ffc563c5ffce63c5ffd663c5ffde63c5ffe663c5ffef63c5fff763c5ffff63c5ff006bc5ff086bc5ff106bc5ff196bc5ff216bc5ff296bc5ff316bc5ff3a6bc5ff426bc5ff4a6bc5ff526bc5ff5a6bc5ff636bc5ff6b6bc5ff736bc5ff7b6bc5ff846bc5ff8c6bc5ff946bc5ff9c6bc5ffa56bc5ffad6bc5ffb56bc5ffbd6bc5ffc56bc5ffce6bc5ffd66bc5ffde6bc5ffe66bc5ffef6bc5fff76bc5ffff6bc5ff0073c5ff0873c5ff1073c5ff1973c5ff2173c5ff2973c5ff3173c5ff3a73c5ff4273c5ff4a73c5ff5273c5ff5a73c5ff6373c5ff6b73c5ff7373c5ff7b73c5ff8473c5ff8c73c5ff9473c5ff9c73c5ffa573c5ffad73c5ffb573c5ffbd73c5ffc573c5ffce73c5ffd673c5ffde73c5ffe673c5ffef73c5fff773c5ffff73c5ff007bc5ff087bc5ff107bc5ff197bc5ff217bc5ff297bc5ff317bc5ff3a7bc5ff427bc5ff4a7bc5ff527bc5ff5a7bc5ff637bc5ff6b7bc5ff737bc5ff7b7bc5ff847bc5ff8c7bc5ff947bc5ff9c7bc5ffa57bc5ffad7bc5ffb57bc5ffbd7bc5ffc57bc5ffce7bc5ffd67bc5ffde7bc5ffe67bc5ffef7bc5fff77bc5ffff7bc5ff0084c5ff0884c5ff1084c5ff1984c5ff2184c5ff2984c5ff3184c5ff3a84c5ff4284c5ff4a84c5ff5284c5ff5a84c5ff6384c5ff6b84c5ff7384c5ff7b84c5ff8484c5ff8c84c5ff9484c5ff9c84c5ffa584c5ffad84c5ffb584c5ffbd84c5ffc584c5ffce84c5ffd684c5ffde84c5ffe684c5ffef84c5fff784c5ffff84c5ff008cc5ff088cc5ff108cc5ff198cc5ff218cc5ff298cc5ff318cc5ff3a8cc5ff428cc5ff4a8cc5ff528cc5ff5a8cc5ff638cc5ff6b8cc5ff738cc5ff7b8cc5ff848cc5ff8c8cc5ff948cc5ff9c8cc5ffa58cc5ffad8cc5ffb58cc5ffbd8cc5ffc58cc5ffce8cc5ffd68cc5ffde8cc5ffe68cc5ffef8cc5fff78cc5ffff8cc5ff0094c5ff0894c5ff1094c5ff1994c5ff2194c5ff2994c5ff3194c5ff3a94c5ff4294c5ff4a94c5ff5294c5ff5a94c5ff6394c5ff6b94c5ff7394c5ff7b94c5ff8494c5ff8c94c5ff9494c5ff9c94c5ffa594c5ffad94c5ffb594c5ffbd94c5ffc594c5ffce94c5ffd694c5ffde94c5ffe694c5ffef94c5fff794c5ffff94c5ff009cc5ff089cc5ff109cc5ff199cc5ff219cc5ff299cc5ff319cc5ff3a9cc5ff429cc5ff4a9cc5ff529cc5ff5a9cc5ff639cc5ff6b9cc5ff739cc5ff7b9cc5ff849cc5ff8c9cc5ff949cc5ff9c9cc5ffa59cc5ffad9cc5ffb59cc5ffbd9cc5ffc59cc5ffce9cc5ffd69cc5ffde9cc5ffe69cc5ffef9cc5fff79cc5ffff9cc5ff00a5c5ff08a5c5ff10a5c5ff19a5c5ff21a5c5ff29a5c5ff31a5c5ff3aa5c5ff42a5c5ff4aa5c5ff52a5c5ff5aa5c5ff63a5c5ff6ba5c5ff73a5c5ff7ba5c5ff84a5c5ff8ca5c5ff94a5c5ff9ca5c5ffa5a5c5ffada5c5ffb5a5c5ffbda5c5ffc5a5c5ffcea5c5ffd6a5c5ffdea5c5ffe6a5c5ffefa5c5fff7a5c5ffffa5c5ff00adc5ff08adc5ff10adc5ff19adc5ff21adc5ff29adc5ff31adc5ff3aadc5ff42adc5ff4aadc5ff52adc5ff5aadc5ff63adc5ff6badc5ff73adc5ff7badc5ff84adc5ff8cadc5ff94adc5ff9cadc5ffa5adc5ffadadc5ffb5adc5ffbdadc5ffc5adc5ffceadc5ffd6adc5ffdeadc5ffe6adc5ffefadc5fff7adc5ffffadc5ff00b5c5ff08b5c5ff10b5c5ff19b5c5ff21b5c5ff29b5c5ff31b5c5ff3ab5c5ff42b5c5ff4ab5c5ff52b5c5ff5ab5c5ff63b5c5ff6bb5c5ff73b5c5ff7bb5c5ff84b5c5ff8cb5c5ff94b5c5ff9cb5c5ffa5b5c5ffadb5c5ffb5b5c5ffbdb5c5ffc5b5c5ffceb5c5ffd6b5c5ffdeb5c5ffe6b5c5ffefb5c5fff7b5c5ffffb5c5ff00bdc5ff08bdc5ff10bdc5ff19bdc5ff21bdc5ff29bdc5ff31bdc5ff3abdc5ff42bdc5ff4abdc5ff52bdc5ff5abdc5ff63bdc5ff6bbdc5ff73bdc5ff7bbdc5ff84bdc5ff8cbdc5ff94bdc5ff9cbdc5ffa5bdc5ffadbdc5ffb5bdc5ffbdbdc5ffc5bdc5ffcebdc5ffd6bdc5ffdebdc5ffe6bdc5ffefbdc5fff7bdc5ffffbdc5ff00c5c5ff08c5c5ff10c5c5ff19c5c5ff21c5c5ff29c5c5ff31c5c5ff3ac5c5ff42c5c5ff4ac5c5ff52c5c5ff5ac5c5ff63c5c5ff6bc5c5ff73c5c5ff7bc5c5ff84c5c5ff8cc5c5ff94c5c5ff9cc5c5ffa5c5c5ffadc5c5ffb5c5c5ffbdc5c5ffc5c5c5ffcec5c5ffd6c5c5ffdec5c5ffe6c5c5ffefc5c5fff7c5c5ffffc5c5ff00cec5ff08cec5ff10cec5ff19cec5ff21cec5ff29cec5ff31cec5ff3acec5ff42cec5ff4acec5ff52cec5ff5acec5ff63cec5ff6bcec5ff73cec5ff7bcec5ff84cec5ff8ccec5ff94cec5ff9ccec5ffa5cec5ffadcec5ffb5cec5ffbdcec5ffc5cec5ffcecec5ffd6cec5ffdecec5ffe6cec5ffefcec5fff7cec5ffffcec5ff00d6c5ff08d6c5ff10d6c5ff19d6c5ff21d6c5ff29d6c5ff31d6c5ff3ad6c5ff42d6c5ff4ad6c5ff52d6c5ff5ad6c5ff63d6c5ff6bd6c5ff73d6c5ff7bd6c5ff84d6c5ff8cd6c5ff94d6c5ff9cd6c5ffa5d6c5ffadd6c5ffb5d6c5ffbdd6c5ffc5d6c5ffced6c5ffd6d6c5ffded6c5ffe6d6c5ffefd6c5fff7d6c5ffffd6c5ff00dec5ff08dec5ff10dec5ff19dec5ff21dec5ff29dec5ff31dec5ff3adec5ff42dec5ff4adec5ff52dec5ff5adec5ff63dec5ff6bdec5ff73dec5ff7bdec5ff84dec5ff8cdec5ff94dec5ff9cdec5ffa5dec5ffaddec5ffb5dec5ffbddec5ffc5dec5ffcedec5ffd6dec5ffdedec5ffe6dec5ffefdec5fff7dec5ffffdec5ff00e6c5ff08e6c5ff10e6c5ff19e6c5ff21e6c5ff29e6c5ff31e6c5ff3ae6c5ff42e6c5ff4ae6c5ff52e6c5ff5ae6c5ff63e6c5ff6be6c5ff73e6c5ff7be6c5ff84e6c5ff8ce6c5ff94e6c5ff9ce6c5ffa5e6c5ffade6c5ffb5e6c5ffbde6c5ffc5e6c5ffcee6c5ffd6e6c5ffdee6c5ffe6e6c5ffefe6c5fff7e6c5ffffe6c5ff00efc5ff08efc5ff10efc5ff19efc5ff21efc5ff29efc5ff31efc5ff3aefc5ff42efc5ff4aefc5ff52efc5ff5aefc5ff63efc5ff6befc5ff73efc5ff7befc5ff84efc5ff8cefc5ff94efc5ff9cefc5ffa5efc5ffadefc5ffb5efc5ffbdefc5ffc5efc5ffceefc5ffd6efc5ffdeefc5ffe6efc5ffefefc5fff7efc5ffffefc5ff00f7c5ff08f7c5ff10f7c5ff19f7c5ff21f7c5ff29f7c5ff31f7c5ff3af7c5ff42f7c5ff4af7c5ff52f7c5ff5af7c5ff63f7c5ff6bf7c5ff73f7c5ff7bf7c5ff84f7c5ff8cf7c5ff94f7c5ff9cf7c5ffa5f7c5ffadf7c5ffb5f7c5ffbdf7c5ffc5f7c5ffcef7c5ffd6f7c5ffdef7c5ffe6f7c5ffeff7c5fff7f7c5fffff7c5ff00ffc5ff08ffc5ff10ffc5ff19ffc5ff21ffc5ff29ffc5ff31ffc5ff3affc5ff42ffc5ff4affc5ff52ffc5ff5affc5ff63ffc5ff6bffc5ff73ffc5ff7bffc5ff84ffc5ff8cffc5ff94ffc5ff9cffc5ffa5ffc5ffadffc5ffb5ffc5ffbdffc5ffc5ffc5ffceffc5ffd6ffc5ffdeffc5ffe6ffc5ffefffc5fff7ffc5ffffffc5ff0000ceff0800ceff1000ceff1900ceff2100ceff2900ceff3100ceff3a00ceff4200ceff4a00ceff5200ceff5a00ceff6300ceff6b00ceff7300ceff7b00ceff8400ceff8c00ceff9400ceff9c00ceffa500ceffad00ceffb500ceffbd00ceffc500ceffce00ceffd600ceffde00ceffe600ceffef00cefff700ceffff00ceff0008ceff0808ceff1008ceff1908ceff2108ceff2908ceff3108ceff3a08ceff4208ceff4a08ceff5208ceff5a08ceff6308ceff6b08ceff7308ceff7b08ceff8408ceff8c08ceff9408ceff9c08ceffa508ceffad08ceffb508ceffbd08ceffc508ceffce08ceffd608ceffde08ceffe608ceffef08cefff708ceffff08ceff0010ceff0810ceff1010ceff1910ceff2110ceff2910ceff3110ceff3a10ceff4210ceff4a10ceff5210ceff5a10ceff6310ceff6b10ceff7310ceff7b10ceff8410ceff8c10ceff9410ceff9c10ceffa510ceffad10ceffb510ceffbd10ceffc510ceffce10ceffd610ceffde10ceffe610ceffef10cefff710ceffff10ceff0019ceff0819ceff1019ceff1919ceff2119ceff2919ceff3119ceff3a19ceff4219ceff4a19ceff5219ceff5a19ceff6319ceff6b19ceff7319ceff7b19ceff8419ceff8c19ceff9419ceff9c19ceffa519ceffad19ceffb519ceffbd19ceffc519ceffce19ceffd619ceffde19ceffe619ceffef19cefff719ceffff19ceff0021ceff0821ceff1021ceff1921ceff2121ceff2921ceff3121ceff3a21ceff4221ceff4a21ceff5221ceff5a21ceff6321ceff6b21ceff7321ceff7b21ceff8421ceff8c21ceff9421ceff9c21ceffa521ceffad21ceffb521ceffbd21ceffc521ceffce21ceffd621ceffde21ceffe621ceffef21cefff721ceffff21ceff0029ceff0829ceff1029ceff1929ceff2129ceff2929ceff3129ceff3a29ceff4229ceff4a29ceff5229ceff5a29ceff6329ceff6b29ceff7329ceff7b29ceff8429ceff8c29ceff9429ceff9c29ceffa529ceffad29ceffb529ceffbd29ceffc529ceffce29ceffd629ceffde29ceffe629ceffef29cefff729ceffff29ceff0031ceff0831ceff1031ceff1931ceff2131ceff2931ceff3131ceff3a31ceff4231ceff4a31ceff5231ceff5a31ceff6331ceff6b31ceff7331ceff7b31ceff8431ceff8c31ceff9431ceff9c31ceffa531ceffad31ceffb531ceffbd31ceffc531ceffce31ceffd631ceffde31ceffe631ceffef31cefff731ceffff31ceff003aceff083aceff103aceff193aceff213aceff293aceff313aceff3a3aceff423aceff4a3aceff523aceff5a3aceff633aceff6b3aceff733aceff7b3aceff843aceff8c3aceff943aceff9c3aceffa53aceffad3aceffb53aceffbd3aceffc53aceffce3aceffd63aceffde3aceffe63aceffef3acefff73aceffff3aceff0042ceff0842ceff1042ceff1942ceff2142ceff2942ceff3142ceff3a42ceff4242ceff4a42ceff5242ceff5a42ceff6342ceff6b42ceff7342ceff7b42ceff8442ceff8c42ceff9442ceff9c42ceffa542ceffad42ceffb542ceffbd42ceffc542ceffce42ceffd642ceffde42ceffe642ceffef42cefff742ceffff42ceff004aceff084aceff104aceff194aceff214aceff294aceff314aceff3a4aceff424aceff4a4aceff524aceff5a4aceff634aceff6b4aceff734aceff7b4aceff844aceff8c4aceff944aceff9c4aceffa54aceffad4aceffb54aceffbd4aceffc54aceffce4aceffd64aceffde4aceffe64aceffef4acefff74aceffff4aceff0052ceff0852ceff1052ceff1952ceff2152ceff2952ceff3152ceff3a52ceff4252ceff4a52ceff5252ceff5a52ceff6352ceff6b52ceff7352ceff7b52ceff8452ceff8c52ceff9452ceff9c52ceffa552ceffad52ceffb552ceffbd52ceffc552ceffce52ceffd652ceffde52ceffe652ceffef52cefff752ceffff52ceff005aceff085aceff105aceff195aceff215aceff295aceff315aceff3a5aceff425aceff4a5aceff525aceff5a5aceff635aceff6b5aceff735aceff7b5aceff845aceff8c5aceff945aceff9c5aceffa55aceffad5aceffb55aceffbd5aceffc55aceffce5aceffd65aceffde5aceffe65aceffef5acefff75aceffff5aceff0063ceff0863ceff1063ceff1963ceff2163ceff2963ceff3163ceff3a63ceff4263ceff4a63ceff5263ceff5a63ceff6363ceff6b63ceff7363ceff7b63ceff8463ceff8c63ceff9463ceff9c63ceffa563ceffad63ceffb563ceffbd63ceffc563ceffce63ceffd663ceffde63ceffe663ceffef63cefff763ceffff63ceff006bceff086bceff106bceff196bceff216bceff296bceff316bceff3a6bceff426bceff4a6bceff526bceff5a6bceff636bceff6b6bceff736bceff7b6bceff846bceff8c6bceff946bceff9c6bceffa56bceffad6bceffb56bceffbd6bceffc56bceffce6bceffd66bceffde6bceffe66bceffef6bcefff76bceffff6bceff0073ceff0873ceff1073ceff1973ceff2173ceff2973ceff3173ceff3a73ceff4273ceff4a73ceff5273ceff5a73ceff6373ceff6b73ceff7373ceff7b73ceff8473ceff8c73ceff9473ceff9c73ceffa573ceffad73ceffb573ceffbd73ceffc573ceffce73ceffd673ceffde73ceffe673ceffef73cefff773ceffff73ceff007bceff087bceff107bceff197bceff217bceff297bceff317bceff3a7bceff427bceff4a7bceff527bceff5a7bceff637bceff6b7bceff737bceff7b7bceff847bceff8c7bceff947bceff9c7bceffa57bceffad7bceffb57bceffbd7bceffc57bceffce7bceffd67bceffde7bceffe67bceffef7bcefff77bceffff7bceff0084ceff0884ceff1084ceff1984ceff2184ceff2984ceff3184ceff3a84ceff4284ceff4a84ceff5284ceff5a84ceff6384ceff6b84ceff7384ceff7b84ceff8484ceff8c84ceff9484ceff9c84ceffa584ceffad84ceffb584ceffbd84ceffc584ceffce84ceffd684ceffde84ceffe684ceffef84cefff784ceffff84ceff008cceff088cceff108cceff198cceff218cceff298cceff318cceff3a8cceff428cceff4a8cceff528cceff5a8cceff638cceff6b8cceff738cceff7b8cceff848cceff8c8cceff948cceff9c8cceffa58cceffad8cceffb58cceffbd8cceffc58cceffce8cceffd68cceffde8cceffe68cceffef8ccefff78cceffff8cceff0094ceff0894ceff1094ceff1994ceff2194ceff2994ceff3194ceff3a94ceff4294ceff4a94ceff5294ceff5a94ceff6394ceff6b94ceff7394ceff7b94ceff8494ceff8c94ceff9494ceff9c94ceffa594ceffad94ceffb594ceffbd94ceffc594ceffce94ceffd694ceffde94ceffe694ceffef94cefff794ceffff94ceff009cceff089cceff109cceff199cceff219cceff299cceff319cceff3a9cceff429cceff4a9cceff529cceff5a9cceff639cceff6b9cceff739cceff7b9cceff849cceff8c9cceff949cceff9c9cceffa59cceffad9cceffb59cceffbd9cceffc59cceffce9cceffd69cceffde9cceffe69cceffef9ccefff79cceffff9cceff00a5ceff08a5ceff10a5ceff19a5ceff21a5ceff29a5ceff31a5ceff3aa5ceff42a5ceff4aa5ceff52a5ceff5aa5ceff63a5ceff6ba5ceff73a5ceff7ba5ceff84a5ceff8ca5ceff94a5ceff9ca5ceffa5a5ceffada5ceffb5a5ceffbda5ceffc5a5ceffcea5ceffd6a5ceffdea5ceffe6a5ceffefa5cefff7a5ceffffa5ceff00adceff08adceff10adceff19adceff21adceff29adceff31adceff3aadceff42adceff4aadceff52adceff5aadceff63adceff6badceff73adceff7badceff84adceff8cadceff94adceff9cadceffa5adceffadadceffb5adceffbdadceffc5adceffceadceffd6adceffdeadceffe6adceffefadcefff7adceffffadceff00b5ceff08b5ceff10b5ceff19b5ceff21b5ceff29b5ceff31b5ceff3ab5ceff42b5ceff4ab5ceff52b5ceff5ab5ceff63b5ceff6bb5ceff73b5ceff7bb5ceff84b5ceff8cb5ceff94b5ceff9cb5ceffa5b5ceffadb5ceffb5b5ceffbdb5ceffc5b5ceffceb5ceffd6b5ceffdeb5ceffe6b5ceffefb5cefff7b5ceffffb5ceff00bdceff08bdceff10bdceff19bdceff21bdceff29bdceff31bdceff3abdceff42bdceff4abdceff52bdceff5abdceff63bdceff6bbdceff73bdceff7bbdceff84bdceff8cbdceff94bdceff9cbdceffa5bdceffadbdceffb5bdceffbdbdceffc5bdceffcebdceffd6bdceffdebdceffe6bdceffefbdcefff7bdceffffbdceff00c5ceff08c5ceff10c5ceff19c5ceff21c5ceff29c5ceff31c5ceff3ac5ceff42c5ceff4ac5ceff52c5ceff5ac5ceff63c5ceff6bc5ceff73c5ceff7bc5ceff84c5ceff8cc5ceff94c5ceff9cc5ceffa5c5ceffadc5ceffb5c5ceffbdc5ceffc5c5ceffcec5ceffd6c5ceffdec5ceffe6c5ceffefc5cefff7c5ceffffc5ceff00ceceff08ceceff10ceceff19ceceff21ceceff29ceceff31ceceff3aceceff42ceceff4aceceff52ceceff5aceceff63ceceff6bceceff73ceceff7bceceff84ceceff8cceceff94ceceff9cceceffa5ceceffadceceffb5ceceffbdceceffc5ceceffcececeffd6ceceffdececeffe6ceceffefcecefff7ceceffffceceff00d6ceff08d6ceff10d6ceff19d6ceff21d6ceff29d6ceff31d6ceff3ad6ceff42d6ceff4ad6ceff52d6ceff5ad6ceff63d6ceff6bd6ceff73d6ceff7bd6ceff84d6ceff8cd6ceff94d6ceff9cd6ceffa5d6ceffadd6ceffb5d6ceffbdd6ceffc5d6ceffced6ceffd6d6ceffded6ceffe6d6ceffefd6cefff7d6ceffffd6ceff00deceff08deceff10deceff19deceff21deceff29deceff31deceff3adeceff42deceff4adeceff52deceff5adeceff63deceff6bdeceff73deceff7bdeceff84deceff8cdeceff94deceff9cdeceffa5deceffaddeceffb5deceffbddeceffc5deceffcedeceffd6deceffdedeceffe6deceffefdecefff7deceffffdeceff00e6ceff08e6ceff10e6ceff19e6ceff21e6ceff29e6ceff31e6ceff3ae6ceff42e6ceff4ae6ceff52e6ceff5ae6ceff63e6ceff6be6ceff73e6ceff7be6ceff84e6ceff8ce6ceff94e6ceff9ce6ceffa5e6ceffade6ceffb5e6ceffbde6ceffc5e6ceffcee6ceffd6e6ceffdee6ceffe6e6ceffefe6cefff7e6ceffffe6ceff00efceff08efceff10efceff19efceff21efceff29efceff31efceff3aefceff42efceff4aefceff52efceff5aefceff63efceff6befceff73efceff7befceff84efceff8cefceff94efceff9cefceffa5efceffadefceffb5efceffbdefceffc5efceffceefceffd6efceffdeefceffe6efceffefefcefff7efceffffefceff00f7ceff08f7ceff10f7ceff19f7ceff21f7ceff29f7ceff31f7ceff3af7ceff42f7ceff4af7ceff52f7ceff5af7ceff63f7ceff6bf7ceff73f7ceff7bf7ceff84f7ceff8cf7ceff94f7ceff9cf7ceffa5f7ceffadf7ceffb5f7ceffbdf7ceffc5f7ceffcef7ceffd6f7ceffdef7ceffe6f7ceffeff7cefff7f7cefffff7ceff00ffceff08ffceff10ffceff19ffceff21ffceff29ffceff31ffceff3affceff42ffceff4affceff52ffceff5affceff63ffceff6bffceff73ffceff7bffceff84ffceff8cffceff94ffceff9cffceffa5ffceffadffceffb5ffceffbdffceffc5ffceffceffceffd6ffceffdeffceffe6ffceffefffcefff7ffceffffffceff0000d6ff0800d6ff1000d6ff1900d6ff2100d6ff2900d6ff3100d6ff3a00d6ff4200d6ff4a00d6ff5200d6ff5a00d6ff6300d6ff6b00d6ff7300d6ff7b00d6ff8400d6ff8c00d6ff9400d6ff9c00d6ffa500d6ffad00d6ffb500d6ffbd00d6ffc500d6ffce00d6ffd600d6ffde00d6ffe600d6ffef00d6fff700d6ffff00d6ff0008d6ff0808d6ff1008d6ff1908d6ff2108d6ff2908d6ff3108d6ff3a08d6ff4208d6ff4a08d6ff5208d6ff5a08d6ff6308d6ff6b08d6ff7308d6ff7b08d6ff8408d6ff8c08d6ff9408d6ff9c08d6ffa508d6ffad08d6ffb508d6ffbd08d6ffc508d6ffce08d6ffd608d6ffde08d6ffe608d6ffef08d6fff708d6ffff08d6ff0010d6ff0810d6ff1010d6ff1910d6ff2110d6ff2910d6ff3110d6ff3a10d6ff4210d6ff4a10d6ff5210d6ff5a10d6ff6310d6ff6b10d6ff7310d6ff7b10d6ff8410d6ff8c10d6ff9410d6ff9c10d6ffa510d6ffad10d6ffb510d6ffbd10d6ffc510d6ffce10d6ffd610d6ffde10d6ffe610d6ffef10d6fff710d6ffff10d6ff0019d6ff0819d6ff1019d6ff1919d6ff2119d6ff2919d6ff3119d6ff3a19d6ff4219d6ff4a19d6ff5219d6ff5a19d6ff6319d6ff6b19d6ff7319d6ff7b19d6ff8419d6ff8c19d6ff9419d6ff9c19d6ffa519d6ffad19d6ffb519d6ffbd19d6ffc519d6ffce19d6ffd619d6ffde19d6ffe619d6ffef19d6fff719d6ffff19d6ff0021d6ff0821d6ff1021d6ff1921d6ff2121d6ff2921d6ff3121d6ff3a21d6ff4221d6ff4a21d6ff5221d6ff5a21d6ff6321d6ff6b21d6ff7321d6ff7b21d6ff8421d6ff8c21d6ff9421d6ff9c21d6ffa521d6ffad21d6ffb521d6ffbd21d6ffc521d6ffce21d6ffd621d6ffde21d6ffe621d6ffef21d6fff721d6ffff21d6ff0029d6ff0829d6ff1029d6ff1929d6ff2129d6ff2929d6ff3129d6ff3a29d6ff4229d6ff4a29d6ff5229d6ff5a29d6ff6329d6ff6b29d6ff7329d6ff7b29d6ff8429d6ff8c29d6ff9429d6ff9c29d6ffa529d6ffad29d6ffb529d6ffbd29d6ffc529d6ffce29d6ffd629d6ffde29d6ffe629d6ffef29d6fff729d6ffff29d6ff0031d6ff0831d6ff1031d6ff1931d6ff2131d6ff2931d6ff3131d6ff3a31d6ff4231d6ff4a31d6ff5231d6ff5a31d6ff6331d6ff6b31d6ff7331d6ff7b31d6ff8431d6ff8c31d6ff9431d6ff9c31d6ffa531d6ffad31d6ffb531d6ffbd31d6ffc531d6ffce31d6ffd631d6ffde31d6ffe631d6ffef31d6fff731d6ffff31d6ff003ad6ff083ad6ff103ad6ff193ad6ff213ad6ff293ad6ff313ad6ff3a3ad6ff423ad6ff4a3ad6ff523ad6ff5a3ad6ff633ad6ff6b3ad6ff733ad6ff7b3ad6ff843ad6ff8c3ad6ff943ad6ff9c3ad6ffa53ad6ffad3ad6ffb53ad6ffbd3ad6ffc53ad6ffce3ad6ffd63ad6ffde3ad6ffe63ad6ffef3ad6fff73ad6ffff3ad6ff0042d6ff0842d6ff1042d6ff1942d6ff2142d6ff2942d6ff3142d6ff3a42d6ff4242d6ff4a42d6ff5242d6ff5a42d6ff6342d6ff6b42d6ff7342d6ff7b42d6ff8442d6ff8c42d6ff9442d6ff9c42d6ffa542d6ffad42d6ffb542d6ffbd42d6ffc542d6ffce42d6ffd642d6ffde42d6ffe642d6ffef42d6fff742d6ffff42d6ff004ad6ff084ad6ff104ad6ff194ad6ff214ad6ff294ad6ff314ad6ff3a4ad6ff424ad6ff4a4ad6ff524ad6ff5a4ad6ff634ad6ff6b4ad6ff734ad6ff7b4ad6ff844ad6ff8c4ad6ff944ad6ff9c4ad6ffa54ad6ffad4ad6ffb54ad6ffbd4ad6ffc54ad6ffce4ad6ffd64ad6ffde4ad6ffe64ad6ffef4ad6fff74ad6ffff4ad6ff0052d6ff0852d6ff1052d6ff1952d6ff2152d6ff2952d6ff3152d6ff3a52d6ff4252d6ff4a52d6ff5252d6ff5a52d6ff6352d6ff6b52d6ff7352d6ff7b52d6ff8452d6ff8c52d6ff9452d6ff9c52d6ffa552d6ffad52d6ffb552d6ffbd52d6ffc552d6ffce52d6ffd652d6ffde52d6ffe652d6ffef52d6fff752d6ffff52d6ff005ad6ff085ad6ff105ad6ff195ad6ff215ad6ff295ad6ff315ad6ff3a5ad6ff425ad6ff4a5ad6ff525ad6ff5a5ad6ff635ad6ff6b5ad6ff735ad6ff7b5ad6ff845ad6ff8c5ad6ff945ad6ff9c5ad6ffa55ad6ffad5ad6ffb55ad6ffbd5ad6ffc55ad6ffce5ad6ffd65ad6ffde5ad6ffe65ad6ffef5ad6fff75ad6ffff5ad6ff0063d6ff0863d6ff1063d6ff1963d6ff2163d6ff2963d6ff3163d6ff3a63d6ff4263d6ff4a63d6ff5263d6ff5a63d6ff6363d6ff6b63d6ff7363d6ff7b63d6ff8463d6ff8c63d6ff9463d6ff9c63d6ffa563d6ffad63d6ffb563d6ffbd63d6ffc563d6ffce63d6ffd663d6ffde63d6ffe663d6ffef63d6fff763d6ffff63d6ff006bd6ff086bd6ff106bd6ff196bd6ff216bd6ff296bd6ff316bd6ff3a6bd6ff426bd6ff4a6bd6ff526bd6ff5a6bd6ff636bd6ff6b6bd6ff736bd6ff7b6bd6ff846bd6ff8c6bd6ff946bd6ff9c6bd6ffa56bd6ffad6bd6ffb56bd6ffbd6bd6ffc56bd6ffce6bd6ffd66bd6ffde6bd6ffe66bd6ffef6bd6fff76bd6ffff6bd6ff0073d6ff0873d6ff1073d6ff1973d6ff2173d6ff2973d6ff3173d6ff3a73d6ff4273d6ff4a73d6ff5273d6ff5a73d6ff6373d6ff6b73d6ff7373d6ff7b73d6ff8473d6ff8c73d6ff9473d6ff9c73d6ffa573d6ffad73d6ffb573d6ffbd73d6ffc573d6ffce73d6ffd673d6ffde73d6ffe673d6ffef73d6fff773d6ffff73d6ff007bd6ff087bd6ff107bd6ff197bd6ff217bd6ff297bd6ff317bd6ff3a7bd6ff427bd6ff4a7bd6ff527bd6ff5a7bd6ff637bd6ff6b7bd6ff737bd6ff7b7bd6ff847bd6ff8c7bd6ff947bd6ff9c7bd6ffa57bd6ffad7bd6ffb57bd6ffbd7bd6ffc57bd6ffce7bd6ffd67bd6ffde7bd6ffe67bd6ffef7bd6fff77bd6ffff7bd6ff0084d6ff0884d6ff1084d6ff1984d6ff2184d6ff2984d6ff3184d6ff3a84d6ff4284d6ff4a84d6ff5284d6ff5a84d6ff6384d6ff6b84d6ff7384d6ff7b84d6ff8484d6ff8c84d6ff9484d6ff9c84d6ffa584d6ffad84d6ffb584d6ffbd84d6ffc584d6ffce84d6ffd684d6ffde84d6ffe684d6ffef84d6fff784d6ffff84d6ff008cd6ff088cd6ff108cd6ff198cd6ff218cd6ff298cd6ff318cd6ff3a8cd6ff428cd6ff4a8cd6ff528cd6ff5a8cd6ff638cd6ff6b8cd6ff738cd6ff7b8cd6ff848cd6ff8c8cd6ff948cd6ff9c8cd6ffa58cd6ffad8cd6ffb58cd6ffbd8cd6ffc58cd6ffce8cd6ffd68cd6ffde8cd6ffe68cd6ffef8cd6fff78cd6ffff8cd6ff0094d6ff0894d6ff1094d6ff1994d6ff2194d6ff2994d6ff3194d6ff3a94d6ff4294d6ff4a94d6ff5294d6ff5a94d6ff6394d6ff6b94d6ff7394d6ff7b94d6ff8494d6ff8c94d6ff9494d6ff9c94d6ffa594d6ffad94d6ffb594d6ffbd94d6ffc594d6ffce94d6ffd694d6ffde94d6ffe694d6ffef94d6fff794d6ffff94d6ff009cd6ff089cd6ff109cd6ff199cd6ff219cd6ff299cd6ff319cd6ff3a9cd6ff429cd6ff4a9cd6ff529cd6ff5a9cd6ff639cd6ff6b9cd6ff739cd6ff7b9cd6ff849cd6ff8c9cd6ff949cd6ff9c9cd6ffa59cd6ffad9cd6ffb59cd6ffbd9cd6ffc59cd6ffce9cd6ffd69cd6ffde9cd6ffe69cd6ffef9cd6fff79cd6ffff9cd6ff00a5d6ff08a5d6ff10a5d6ff19a5d6ff21a5d6ff29a5d6ff31a5d6ff3aa5d6ff42a5d6ff4aa5d6ff52a5d6ff5aa5d6ff63a5d6ff6ba5d6ff73a5d6ff7ba5d6ff84a5d6ff8ca5d6ff94a5d6ff9ca5d6ffa5a5d6ffada5d6ffb5a5d6ffbda5d6ffc5a5d6ffcea5d6ffd6a5d6ffdea5d6ffe6a5d6ffefa5d6fff7a5d6ffffa5d6ff00add6ff08add6ff10add6ff19add6ff21add6ff29add6ff31add6ff3aadd6ff42add6ff4aadd6ff52add6ff5aadd6ff63add6ff6badd6ff73add6ff7badd6ff84add6ff8cadd6ff94add6ff9cadd6ffa5add6ffadadd6ffb5add6ffbdadd6ffc5add6ffceadd6ffd6add6ffdeadd6ffe6add6ffefadd6fff7add6ffffadd6ff00b5d6ff08b5d6ff10b5d6ff19b5d6ff21b5d6ff29b5d6ff31b5d6ff3ab5d6ff42b5d6ff4ab5d6ff52b5d6ff5ab5d6ff63b5d6ff6bb5d6ff73b5d6ff7bb5d6ff84b5d6ff8cb5d6ff94b5d6ff9cb5d6ffa5b5d6ffadb5d6ffb5b5d6ffbdb5d6ffc5b5d6ffceb5d6ffd6b5d6ffdeb5d6ffe6b5d6ffefb5d6fff7b5d6ffffb5d6ff00bdd6ff08bdd6ff10bdd6ff19bdd6ff21bdd6ff29bdd6ff31bdd6ff3abdd6ff42bdd6ff4abdd6ff52bdd6ff5abdd6ff63bdd6ff6bbdd6ff73bdd6ff7bbdd6ff84bdd6ff8cbdd6ff94bdd6ff9cbdd6ffa5bdd6ffadbdd6ffb5bdd6ffbdbdd6ffc5bdd6ffcebdd6ffd6bdd6ffdebdd6ffe6bdd6ffefbdd6fff7bdd6ffffbdd6ff00c5d6ff08c5d6ff10c5d6ff19c5d6ff21c5d6ff29c5d6ff31c5d6ff3ac5d6ff42c5d6ff4ac5d6ff52c5d6ff5ac5d6ff63c5d6ff6bc5d6ff73c5d6ff7bc5d6ff84c5d6ff8cc5d6ff94c5d6ff9cc5d6ffa5c5d6ffadc5d6ffb5c5d6ffbdc5d6ffc5c5d6ffcec5d6ffd6c5d6ffdec5d6ffe6c5d6ffefc5d6fff7c5d6ffffc5d6ff00ced6ff08ced6ff10ced6ff19ced6ff21ced6ff29ced6ff31ced6ff3aced6ff42ced6ff4aced6ff52ced6ff5aced6ff63ced6ff6bced6ff73ced6ff7bced6ff84ced6ff8cced6ff94ced6ff9cced6ffa5ced6ffadced6ffb5ced6ffbdced6ffc5ced6ffceced6ffd6ced6ffdeced6ffe6ced6ffefced6fff7ced6ffffced6ff00d6d6ff08d6d6ff10d6d6ff19d6d6ff21d6d6ff29d6d6ff31d6d6ff3ad6d6ff42d6d6ff4ad6d6ff52d6d6ff5ad6d6ff63d6d6ff6bd6d6ff73d6d6ff7bd6d6ff84d6d6ff8cd6d6ff94d6d6ff9cd6d6ffa5d6d6ffadd6d6ffb5d6d6ffbdd6d6ffc5d6d6ffced6d6ffd6d6d6ffded6d6ffe6d6d6ffefd6d6fff7d6d6ffffd6d6ff00ded6ff08ded6ff10ded6ff19ded6ff21ded6ff29ded6ff31ded6ff3aded6ff42ded6ff4aded6ff52ded6ff5aded6ff63ded6ff6bded6ff73ded6ff7bded6ff84ded6ff8cded6ff94ded6ff9cded6ffa5ded6ffadded6ffb5ded6ffbdded6ffc5ded6ffceded6ffd6ded6ffdeded6ffe6ded6ffefded6fff7ded6ffffded6ff00e6d6ff08e6d6ff10e6d6ff19e6d6ff21e6d6ff29e6d6ff31e6d6ff3ae6d6ff42e6d6ff4ae6d6ff52e6d6ff5ae6d6ff63e6d6ff6be6d6ff73e6d6ff7be6d6ff84e6d6ff8ce6d6ff94e6d6ff9ce6d6ffa5e6d6ffade6d6ffb5e6d6ffbde6d6ffc5e6d6ffcee6d6ffd6e6d6ffdee6d6ffe6e6d6ffefe6d6fff7e6d6ffffe6d6ff00efd6ff08efd6ff10efd6ff19efd6ff21efd6ff29efd6ff31efd6ff3aefd6ff42efd6ff4aefd6ff52efd6ff5aefd6ff63efd6ff6befd6ff73efd6ff7befd6ff84efd6ff8cefd6ff94efd6ff9cefd6ffa5efd6ffadefd6ffb5efd6ffbdefd6ffc5efd6ffceefd6ffd6efd6ffdeefd6ffe6efd6ffefefd6fff7efd6ffffefd6ff00f7d6ff08f7d6ff10f7d6ff19f7d6ff21f7d6ff29f7d6ff31f7d6ff3af7d6ff42f7d6ff4af7d6ff52f7d6ff5af7d6ff63f7d6ff6bf7d6ff73f7d6ff7bf7d6ff84f7d6ff8cf7d6ff94f7d6ff9cf7d6ffa5f7d6ffadf7d6ffb5f7d6ffbdf7d6ffc5f7d6ffcef7d6ffd6f7d6ffdef7d6ffe6f7d6ffeff7d6fff7f7d6fffff7d6ff00ffd6ff08ffd6ff10ffd6ff19ffd6ff21ffd6ff29ffd6ff31ffd6ff3affd6ff42ffd6ff4affd6ff52ffd6ff5affd6ff63ffd6ff6bffd6ff73ffd6ff7bffd6ff84ffd6ff8cffd6ff94ffd6ff9cffd6ffa5ffd6ffadffd6ffb5ffd6ffbdffd6ffc5ffd6ffceffd6ffd6ffd6ffdeffd6ffe6ffd6ffefffd6fff7ffd6ffffffd6ff0000deff0800deff1000deff1900deff2100deff2900deff3100deff3a00deff4200deff4a00deff5200deff5a00deff6300deff6b00deff7300deff7b00deff8400deff8c00deff9400deff9c00deffa500deffad00deffb500deffbd00deffc500deffce00deffd600deffde00deffe600deffef00defff700deffff00deff0008deff0808deff1008deff1908deff2108deff2908deff3108deff3a08deff4208deff4a08deff5208deff5a08deff6308deff6b08deff7308deff7b08deff8408deff8c08deff9408deff9c08deffa508deffad08deffb508deffbd08deffc508deffce08deffd608deffde08deffe608deffef08defff708deffff08deff0010deff0810deff1010deff1910deff2110deff2910deff3110deff3a10deff4210deff4a10deff5210deff5a10deff6310deff6b10deff7310deff7b10deff8410deff8c10deff9410deff9c10deffa510deffad10deffb510deffbd10deffc510deffce10deffd610deffde10deffe610deffef10defff710deffff10deff0019deff0819deff1019deff1919deff2119deff2919deff3119deff3a19deff4219deff4a19deff5219deff5a19deff6319deff6b19deff7319deff7b19deff8419deff8c19deff9419deff9c19deffa519deffad19deffb519deffbd19deffc519deffce19deffd619deffde19deffe619deffef19defff719deffff19deff0021deff0821deff1021deff1921deff2121deff2921deff3121deff3a21deff4221deff4a21deff5221deff5a21deff6321deff6b21deff7321deff7b21deff8421deff8c21deff9421deff9c21deffa521deffad21deffb521deffbd21deffc521deffce21deffd621deffde21deffe621deffef21defff721deffff21deff0029deff0829deff1029deff1929deff2129deff2929deff3129deff3a29deff4229deff4a29deff5229deff5a29deff6329deff6b29deff7329deff7b29deff8429deff8c29deff9429deff9c29deffa529deffad29deffb529deffbd29deffc529deffce29deffd629deffde29deffe629deffef29defff729deffff29deff0031deff0831deff1031deff1931deff2131deff2931deff3131deff3a31deff4231deff4a31deff5231deff5a31deff6331deff6b31deff7331deff7b31deff8431deff8c31deff9431deff9c31deffa531deffad31deffb531deffbd31deffc531deffce31deffd631deffde31deffe631deffef31defff731deffff31deff003adeff083adeff103adeff193adeff213adeff293adeff313adeff3a3adeff423adeff4a3adeff523adeff5a3adeff633adeff6b3adeff733adeff7b3adeff843adeff8c3adeff943adeff9c3adeffa53adeffad3adeffb53adeffbd3adeffc53adeffce3adeffd63adeffde3adeffe63adeffef3adefff73adeffff3adeff0042deff0842deff1042deff1942deff2142deff2942deff3142deff3a42deff4242deff4a42deff5242deff5a42deff6342deff6b42deff7342deff7b42deff8442deff8c42deff9442deff9c42deffa542deffad42deffb542deffbd42deffc542deffce42deffd642deffde42deffe642deffef42defff742deffff42deff004adeff084adeff104adeff194adeff214adeff294adeff314adeff3a4adeff424adeff4a4adeff524adeff5a4adeff634adeff6b4adeff734adeff7b4adeff844adeff8c4adeff944adeff9c4adeffa54adeffad4adeffb54adeffbd4adeffc54adeffce4adeffd64adeffde4adeffe64adeffef4adefff74adeffff4adeff0052deff0852deff1052deff1952deff2152deff2952deff3152deff3a52deff4252deff4a52deff5252deff5a52deff6352deff6b52deff7352deff7b52deff8452deff8c52deff9452deff9c52deffa552deffad52deffb552deffbd52deffc552deffce52deffd652deffde52deffe652deffef52defff752deffff52deff005adeff085adeff105adeff195adeff215adeff295adeff315adeff3a5adeff425adeff4a5adeff525adeff5a5adeff635adeff6b5adeff735adeff7b5adeff845adeff8c5adeff945adeff9c5adeffa55adeffad5adeffb55adeffbd5adeffc55adeffce5adeffd65adeffde5adeffe65adeffef5adefff75adeffff5adeff0063deff0863deff1063deff1963deff2163deff2963deff3163deff3a63deff4263deff4a63deff5263deff5a63deff6363deff6b63deff7363deff7b63deff8463deff8c63deff9463deff9c63deffa563deffad63deffb563deffbd63deffc563deffce63deffd663deffde63deffe663deffef63defff763deffff63deff006bdeff086bdeff106bdeff196bdeff216bdeff296bdeff316bdeff3a6bdeff426bdeff4a6bdeff526bdeff5a6bdeff636bdeff6b6bdeff736bdeff7b6bdeff846bdeff8c6bdeff946bdeff9c6bdeffa56bdeffad6bdeffb56bdeffbd6bdeffc56bdeffce6bdeffd66bdeffde6bdeffe66bdeffef6bdefff76bdeffff6bdeff0073deff0873deff1073deff1973deff2173deff2973deff3173deff3a73deff4273deff4a73deff5273deff5a73deff6373deff6b73deff7373deff7b73deff8473deff8c73deff9473deff9c73deffa573deffad73deffb573deffbd73deffc573deffce73deffd673deffde73deffe673deffef73defff773deffff73deff007bdeff087bdeff107bdeff197bdeff217bdeff297bdeff317bdeff3a7bdeff427bdeff4a7bdeff527bdeff5a7bdeff637bdeff6b7bdeff737bdeff7b7bdeff847bdeff8c7bdeff947bdeff9c7bdeffa57bdeffad7bdeffb57bdeffbd7bdeffc57bdeffce7bdeffd67bdeffde7bdeffe67bdeffef7bdefff77bdeffff7bdeff0084deff0884deff1084deff1984deff2184deff2984deff3184deff3a84deff4284deff4a84deff5284deff5a84deff6384deff6b84deff7384deff7b84deff8484deff8c84deff9484deff9c84deffa584deffad84deffb584deffbd84deffc584deffce84deffd684deffde84deffe684deffef84defff784deffff84deff008cdeff088cdeff108cdeff198cdeff218cdeff298cdeff318cdeff3a8cdeff428cdeff4a8cdeff528cdeff5a8cdeff638cdeff6b8cdeff738cdeff7b8cdeff848cdeff8c8cdeff948cdeff9c8cdeffa58cdeffad8cdeffb58cdeffbd8cdeffc58cdeffce8cdeffd68cdeffde8cdeffe68cdeffef8cdefff78cdeffff8cdeff0094deff0894deff1094deff1994deff2194deff2994deff3194deff3a94deff4294deff4a94deff5294deff5a94deff6394deff6b94deff7394deff7b94deff8494deff8c94deff9494deff9c94deffa594deffad94deffb594deffbd94deffc594deffce94deffd694deffde94deffe694deffef94defff794deffff94deff009cdeff089cdeff109cdeff199cdeff219cdeff299cdeff319cdeff3a9cdeff429cdeff4a9cdeff529cdeff5a9cdeff639cdeff6b9cdeff739cdeff7b9cdeff849cdeff8c9cdeff949cdeff9c9cdeffa59cdeffad9cdeffb59cdeffbd9cdeffc59cdeffce9cdeffd69cdeffde9cdeffe69cdeffef9cdefff79cdeffff9cdeff00a5deff08a5deff10a5deff19a5deff21a5deff29a5deff31a5deff3aa5deff42a5deff4aa5deff52a5deff5aa5deff63a5deff6ba5deff73a5deff7ba5deff84a5deff8ca5deff94a5deff9ca5deffa5a5deffada5deffb5a5deffbda5deffc5a5deffcea5deffd6a5deffdea5deffe6a5deffefa5defff7a5deffffa5deff00addeff08addeff10addeff19addeff21addeff29addeff31addeff3aaddeff42addeff4aaddeff52addeff5aaddeff63addeff6baddeff73addeff7baddeff84addeff8caddeff94addeff9caddeffa5addeffadaddeffb5addeffbdaddeffc5addeffceaddeffd6addeffdeaddeffe6addeffefaddefff7addeffffaddeff00b5deff08b5deff10b5deff19b5deff21b5deff29b5deff31b5deff3ab5deff42b5deff4ab5deff52b5deff5ab5deff63b5deff6bb5deff73b5deff7bb5deff84b5deff8cb5deff94b5deff9cb5deffa5b5deffadb5deffb5b5deffbdb5deffc5b5deffceb5deffd6b5deffdeb5deffe6b5deffefb5defff7b5deffffb5deff00bddeff08bddeff10bddeff19bddeff21bddeff29bddeff31bddeff3abddeff42bddeff4abddeff52bddeff5abddeff63bddeff6bbddeff73bddeff7bbddeff84bddeff8cbddeff94bddeff9cbddeffa5bddeffadbddeffb5bddeffbdbddeffc5bddeffcebddeffd6bddeffdebddeffe6bddeffefbddefff7bddeffffbddeff00c5deff08c5deff10c5deff19c5deff21c5deff29c5deff31c5deff3ac5deff42c5deff4ac5deff52c5deff5ac5deff63c5deff6bc5deff73c5deff7bc5deff84c5deff8cc5deff94c5deff9cc5deffa5c5deffadc5deffb5c5deffbdc5deffc5c5deffcec5deffd6c5deffdec5deffe6c5deffefc5defff7c5deffffc5deff00cedeff08cedeff10cedeff19cedeff21cedeff29cedeff31cedeff3acedeff42cedeff4acedeff52cedeff5acedeff63cedeff6bcedeff73cedeff7bcedeff84cedeff8ccedeff94cedeff9ccedeffa5cedeffadcedeffb5cedeffbdcedeffc5cedeffcecedeffd6cedeffdecedeffe6cedeffefcedefff7cedeffffcedeff00d6deff08d6deff10d6deff19d6deff21d6deff29d6deff31d6deff3ad6deff42d6deff4ad6deff52d6deff5ad6deff63d6deff6bd6deff73d6deff7bd6deff84d6deff8cd6deff94d6deff9cd6deffa5d6deffadd6deffb5d6deffbdd6deffc5d6deffced6deffd6d6deffded6deffe6d6deffefd6defff7d6deffffd6deff00dedeff08dedeff10dedeff19dedeff21dedeff29dedeff31dedeff3adedeff42dedeff4adedeff52dedeff5adedeff63dedeff6bdedeff73dedeff7bdedeff84dedeff8cdedeff94dedeff9cdedeffa5dedeffaddedeffb5dedeffbddedeffc5dedeffcededeffd6dedeffdededeffe6dedeffefdedefff7dedeffffdedeff00e6deff08e6deff10e6deff19e6deff21e6deff29e6deff31e6deff3ae6deff42e6deff4ae6deff52e6deff5ae6deff63e6deff6be6deff73e6deff7be6deff84e6deff8ce6deff94e6deff9ce6deffa5e6deffade6deffb5e6deffbde6deffc5e6deffcee6deffd6e6deffdee6deffe6e6deffefe6defff7e6deffffe6deff00efdeff08efdeff10efdeff19efdeff21efdeff29efdeff31efdeff3aefdeff42efdeff4aefdeff52efdeff5aefdeff63efdeff6befdeff73efdeff7befdeff84efdeff8cefdeff94efdeff9cefdeffa5efdeffadefdeffb5efdeffbdefdeffc5efdeffceefdeffd6efdeffdeefdeffe6efdeffefefdefff7efdeffffefdeff00f7deff08f7deff10f7deff19f7deff21f7deff29f7deff31f7deff3af7deff42f7deff4af7deff52f7deff5af7deff63f7deff6bf7deff73f7deff7bf7deff84f7deff8cf7deff94f7deff9cf7deffa5f7deffadf7deffb5f7deffbdf7deffc5f7deffcef7deffd6f7deffdef7deffe6f7deffeff7defff7f7defffff7deff00ffdeff08ffdeff10ffdeff19ffdeff21ffdeff29ffdeff31ffdeff3affdeff42ffdeff4affdeff52ffdeff5affdeff63ffdeff6bffdeff73ffdeff7bffdeff84ffdeff8cffdeff94ffdeff9cffdeffa5ffdeffadffdeffb5ffdeffbdffdeffc5ffdeffceffdeffd6ffdeffdeffdeffe6ffdeffefffdefff7ffdeffffffdeff0000e6ff0800e6ff1000e6ff1900e6ff2100e6ff2900e6ff3100e6ff3a00e6ff4200e6ff4a00e6ff5200e6ff5a00e6ff6300e6ff6b00e6ff7300e6ff7b00e6ff8400e6ff8c00e6ff9400e6ff9c00e6ffa500e6ffad00e6ffb500e6ffbd00e6ffc500e6ffce00e6ffd600e6ffde00e6ffe600e6ffef00e6fff700e6ffff00e6ff0008e6ff0808e6ff1008e6ff1908e6ff2108e6ff2908e6ff3108e6ff3a08e6ff4208e6ff4a08e6ff5208e6ff5a08e6ff6308e6ff6b08e6ff7308e6ff7b08e6ff8408e6ff8c08e6ff9408e6ff9c08e6ffa508e6ffad08e6ffb508e6ffbd08e6ffc508e6ffce08e6ffd608e6ffde08e6ffe608e6ffef08e6fff708e6ffff08e6ff0010e6ff0810e6ff1010e6ff1910e6ff2110e6ff2910e6ff3110e6ff3a10e6ff4210e6ff4a10e6ff5210e6ff5a10e6ff6310e6ff6b10e6ff7310e6ff7b10e6ff8410e6ff8c10e6ff9410e6ff9c10e6ffa510e6ffad10e6ffb510e6ffbd10e6ffc510e6ffce10e6ffd610e6ffde10e6ffe610e6ffef10e6fff710e6ffff10e6ff0019e6ff0819e6ff1019e6ff1919e6ff2119e6ff2919e6ff3119e6ff3a19e6ff4219e6ff4a19e6ff5219e6ff5a19e6ff6319e6ff6b19e6ff7319e6ff7b19e6ff8419e6ff8c19e6ff9419e6ff9c19e6ffa519e6ffad19e6ffb519e6ffbd19e6ffc519e6ffce19e6ffd619e6ffde19e6ffe619e6ffef19e6fff719e6ffff19e6ff0021e6ff0821e6ff1021e6ff1921e6ff2121e6ff2921e6ff3121e6ff3a21e6ff4221e6ff4a21e6ff5221e6ff5a21e6ff6321e6ff6b21e6ff7321e6ff7b21e6ff8421e6ff8c21e6ff9421e6ff9c21e6ffa521e6ffad21e6ffb521e6ffbd21e6ffc521e6ffce21e6ffd621e6ffde21e6ffe621e6ffef21e6fff721e6ffff21e6ff0029e6ff0829e6ff1029e6ff1929e6ff2129e6ff2929e6ff3129e6ff3a29e6ff4229e6ff4a29e6ff5229e6ff5a29e6ff6329e6ff6b29e6ff7329e6ff7b29e6ff8429e6ff8c29e6ff9429e6ff9c29e6ffa529e6ffad29e6ffb529e6ffbd29e6ffc529e6ffce29e6ffd629e6ffde29e6ffe629e6ffef29e6fff729e6ffff29e6ff0031e6ff0831e6ff1031e6ff1931e6ff2131e6ff2931e6ff3131e6ff3a31e6ff4231e6ff4a31e6ff5231e6ff5a31e6ff6331e6ff6b31e6ff7331e6ff7b31e6ff8431e6ff8c31e6ff9431e6ff9c31e6ffa531e6ffad31e6ffb531e6ffbd31e6ffc531e6ffce31e6ffd631e6ffde31e6ffe631e6ffef31e6fff731e6ffff31e6ff003ae6ff083ae6ff103ae6ff193ae6ff213ae6ff293ae6ff313ae6ff3a3ae6ff423ae6ff4a3ae6ff523ae6ff5a3ae6ff633ae6ff6b3ae6ff733ae6ff7b3ae6ff843ae6ff8c3ae6ff943ae6ff9c3ae6ffa53ae6ffad3ae6ffb53ae6ffbd3ae6ffc53ae6ffce3ae6ffd63ae6ffde3ae6ffe63ae6ffef3ae6fff73ae6ffff3ae6ff0042e6ff0842e6ff1042e6ff1942e6ff2142e6ff2942e6ff3142e6ff3a42e6ff4242e6ff4a42e6ff5242e6ff5a42e6ff6342e6ff6b42e6ff7342e6ff7b42e6ff8442e6ff8c42e6ff9442e6ff9c42e6ffa542e6ffad42e6ffb542e6ffbd42e6ffc542e6ffce42e6ffd642e6ffde42e6ffe642e6ffef42e6fff742e6ffff42e6ff004ae6ff084ae6ff104ae6ff194ae6ff214ae6ff294ae6ff314ae6ff3a4ae6ff424ae6ff4a4ae6ff524ae6ff5a4ae6ff634ae6ff6b4ae6ff734ae6ff7b4ae6ff844ae6ff8c4ae6ff944ae6ff9c4ae6ffa54ae6ffad4ae6ffb54ae6ffbd4ae6ffc54ae6ffce4ae6ffd64ae6ffde4ae6ffe64ae6ffef4ae6fff74ae6ffff4ae6ff0052e6ff0852e6ff1052e6ff1952e6ff2152e6ff2952e6ff3152e6ff3a52e6ff4252e6ff4a52e6ff5252e6ff5a52e6ff6352e6ff6b52e6ff7352e6ff7b52e6ff8452e6ff8c52e6ff9452e6ff9c52e6ffa552e6ffad52e6ffb552e6ffbd52e6ffc552e6ffce52e6ffd652e6ffde52e6ffe652e6ffef52e6fff752e6ffff52e6ff005ae6ff085ae6ff105ae6ff195ae6ff215ae6ff295ae6ff315ae6ff3a5ae6ff425ae6ff4a5ae6ff525ae6ff5a5ae6ff635ae6ff6b5ae6ff735ae6ff7b5ae6ff845ae6ff8c5ae6ff945ae6ff9c5ae6ffa55ae6ffad5ae6ffb55ae6ffbd5ae6ffc55ae6ffce5ae6ffd65ae6ffde5ae6ffe65ae6ffef5ae6fff75ae6ffff5ae6ff0063e6ff0863e6ff1063e6ff1963e6ff2163e6ff2963e6ff3163e6ff3a63e6ff4263e6ff4a63e6ff5263e6ff5a63e6ff6363e6ff6b63e6ff7363e6ff7b63e6ff8463e6ff8c63e6ff9463e6ff9c63e6ffa563e6ffad63e6ffb563e6ffbd63e6ffc563e6ffce63e6ffd663e6ffde63e6ffe663e6ffef63e6fff763e6ffff63e6ff006be6ff086be6ff106be6ff196be6ff216be6ff296be6ff316be6ff3a6be6ff426be6ff4a6be6ff526be6ff5a6be6ff636be6ff6b6be6ff736be6ff7b6be6ff846be6ff8c6be6ff946be6ff9c6be6ffa56be6ffad6be6ffb56be6ffbd6be6ffc56be6ffce6be6ffd66be6ffde6be6ffe66be6ffef6be6fff76be6ffff6be6ff0073e6ff0873e6ff1073e6ff1973e6ff2173e6ff2973e6ff3173e6ff3a73e6ff4273e6ff4a73e6ff5273e6ff5a73e6ff6373e6ff6b73e6ff7373e6ff7b73e6ff8473e6ff8c73e6ff9473e6ff9c73e6ffa573e6ffad73e6ffb573e6ffbd73e6ffc573e6ffce73e6ffd673e6ffde73e6ffe673e6ffef73e6fff773e6ffff73e6ff007be6ff087be6ff107be6ff197be6ff217be6ff297be6ff317be6ff3a7be6ff427be6ff4a7be6ff527be6ff5a7be6ff637be6ff6b7be6ff737be6ff7b7be6ff847be6ff8c7be6ff947be6ff9c7be6ffa57be6ffad7be6ffb57be6ffbd7be6ffc57be6ffce7be6ffd67be6ffde7be6ffe67be6ffef7be6fff77be6ffff7be6ff0084e6ff0884e6ff1084e6ff1984e6ff2184e6ff2984e6ff3184e6ff3a84e6ff4284e6ff4a84e6ff5284e6ff5a84e6ff6384e6ff6b84e6ff7384e6ff7b84e6ff8484e6ff8c84e6ff9484e6ff9c84e6ffa584e6ffad84e6ffb584e6ffbd84e6ffc584e6ffce84e6ffd684e6ffde84e6ffe684e6ffef84e6fff784e6ffff84e6ff008ce6ff088ce6ff108ce6ff198ce6ff218ce6ff298ce6ff318ce6ff3a8ce6ff428ce6ff4a8ce6ff528ce6ff5a8ce6ff638ce6ff6b8ce6ff738ce6ff7b8ce6ff848ce6ff8c8ce6ff948ce6ff9c8ce6ffa58ce6ffad8ce6ffb58ce6ffbd8ce6ffc58ce6ffce8ce6ffd68ce6ffde8ce6ffe68ce6ffef8ce6fff78ce6ffff8ce6ff0094e6ff0894e6ff1094e6ff1994e6ff2194e6ff2994e6ff3194e6ff3a94e6ff4294e6ff4a94e6ff5294e6ff5a94e6ff6394e6ff6b94e6ff7394e6ff7b94e6ff8494e6ff8c94e6ff9494e6ff9c94e6ffa594e6ffad94e6ffb594e6ffbd94e6ffc594e6ffce94e6ffd694e6ffde94e6ffe694e6ffef94e6fff794e6ffff94e6ff009ce6ff089ce6ff109ce6ff199ce6ff219ce6ff299ce6ff319ce6ff3a9ce6ff429ce6ff4a9ce6ff529ce6ff5a9ce6ff639ce6ff6b9ce6ff739ce6ff7b9ce6ff849ce6ff8c9ce6ff949ce6ff9c9ce6ffa59ce6ffad9ce6ffb59ce6ffbd9ce6ffc59ce6ffce9ce6ffd69ce6ffde9ce6ffe69ce6ffef9ce6fff79ce6ffff9ce6ff00a5e6ff08a5e6ff10a5e6ff19a5e6ff21a5e6ff29a5e6ff31a5e6ff3aa5e6ff42a5e6ff4aa5e6ff52a5e6ff5aa5e6ff63a5e6ff6ba5e6ff73a5e6ff7ba5e6ff84a5e6ff8ca5e6ff94a5e6ff9ca5e6ffa5a5e6ffada5e6ffb5a5e6ffbda5e6ffc5a5e6ffcea5e6ffd6a5e6ffdea5e6ffe6a5e6ffefa5e6fff7a5e6ffffa5e6ff00ade6ff08ade6ff10ade6ff19ade6ff21ade6ff29ade6ff31ade6ff3aade6ff42ade6ff4aade6ff52ade6ff5aade6ff63ade6ff6bade6ff73ade6ff7bade6ff84ade6ff8cade6ff94ade6ff9cade6ffa5ade6ffadade6ffb5ade6ffbdade6ffc5ade6ffceade6ffd6ade6ffdeade6ffe6ade6ffefade6fff7ade6ffffade6ff00b5e6ff08b5e6ff10b5e6ff19b5e6ff21b5e6ff29b5e6ff31b5e6ff3ab5e6ff42b5e6ff4ab5e6ff52b5e6ff5ab5e6ff63b5e6ff6bb5e6ff73b5e6ff7bb5e6ff84b5e6ff8cb5e6ff94b5e6ff9cb5e6ffa5b5e6ffadb5e6ffb5b5e6ffbdb5e6ffc5b5e6ffceb5e6ffd6b5e6ffdeb5e6ffe6b5e6ffefb5e6fff7b5e6ffffb5e6ff00bde6ff08bde6ff10bde6ff19bde6ff21bde6ff29bde6ff31bde6ff3abde6ff42bde6ff4abde6ff52bde6ff5abde6ff63bde6ff6bbde6ff73bde6ff7bbde6ff84bde6ff8cbde6ff94bde6ff9cbde6ffa5bde6ffadbde6ffb5bde6ffbdbde6ffc5bde6ffcebde6ffd6bde6ffdebde6ffe6bde6ffefbde6fff7bde6ffffbde6ff00c5e6ff08c5e6ff10c5e6ff19c5e6ff21c5e6ff29c5e6ff31c5e6ff3ac5e6ff42c5e6ff4ac5e6ff52c5e6ff5ac5e6ff63c5e6ff6bc5e6ff73c5e6ff7bc5e6ff84c5e6ff8cc5e6ff94c5e6ff9cc5e6ffa5c5e6ffadc5e6ffb5c5e6ffbdc5e6ffc5c5e6ffcec5e6ffd6c5e6ffdec5e6ffe6c5e6ffefc5e6fff7c5e6ffffc5e6ff00cee6ff08cee6ff10cee6ff19cee6ff21cee6ff29cee6ff31cee6ff3acee6ff42cee6ff4acee6ff52cee6ff5acee6ff63cee6ff6bcee6ff73cee6ff7bcee6ff84cee6ff8ccee6ff94cee6ff9ccee6ffa5cee6ffadcee6ffb5cee6ffbdcee6ffc5cee6ffcecee6ffd6cee6ffdecee6ffe6cee6ffefcee6fff7cee6ffffcee6ff00d6e6ff08d6e6ff10d6e6ff19d6e6ff21d6e6ff29d6e6ff31d6e6ff3ad6e6ff42d6e6ff4ad6e6ff52d6e6ff5ad6e6ff63d6e6ff6bd6e6ff73d6e6ff7bd6e6ff84d6e6ff8cd6e6ff94d6e6ff9cd6e6ffa5d6e6ffadd6e6ffb5d6e6ffbdd6e6ffc5d6e6ffced6e6ffd6d6e6ffded6e6ffe6d6e6ffefd6e6fff7d6e6ffffd6e6ff00dee6ff08dee6ff10dee6ff19dee6ff21dee6ff29dee6ff31dee6ff3adee6ff42dee6ff4adee6ff52dee6ff5adee6ff63dee6ff6bdee6ff73dee6ff7bdee6ff84dee6ff8cdee6ff94dee6ff9cdee6ffa5dee6ffaddee6ffb5dee6ffbddee6ffc5dee6ffcedee6ffd6dee6ffdedee6ffe6dee6ffefdee6fff7dee6ffffdee6ff00e6e6ff08e6e6ff10e6e6ff19e6e6ff21e6e6ff29e6e6ff31e6e6ff3ae6e6ff42e6e6ff4ae6e6ff52e6e6ff5ae6e6ff63e6e6ff6be6e6ff73e6e6ff7be6e6ff84e6e6ff8ce6e6ff94e6e6ff9ce6e6ffa5e6e6ffade6e6ffb5e6e6ffbde6e6ffc5e6e6ffcee6e6ffd6e6e6ffdee6e6ffe6e6e6ffefe6e6fff7e6e6ffffe6e6ff00efe6ff08efe6ff10efe6ff19efe6ff21efe6ff29efe6ff31efe6ff3aefe6ff42efe6ff4aefe6ff52efe6ff5aefe6ff63efe6ff6befe6ff73efe6ff7befe6ff84efe6ff8cefe6ff94efe6ff9cefe6ffa5efe6ffadefe6ffb5efe6ffbdefe6ffc5efe6ffceefe6ffd6efe6ffdeefe6ffe6efe6ffefefe6fff7efe6ffffefe6ff00f7e6ff08f7e6ff10f7e6ff19f7e6ff21f7e6ff29f7e6ff31f7e6ff3af7e6ff42f7e6ff4af7e6ff52f7e6ff5af7e6ff63f7e6ff6bf7e6ff73f7e6ff7bf7e6ff84f7e6ff8cf7e6ff94f7e6ff9cf7e6ffa5f7e6ffadf7e6ffb5f7e6ffbdf7e6ffc5f7e6ffcef7e6ffd6f7e6ffdef7e6ffe6f7e6ffeff7e6fff7f7e6fffff7e6ff00ffe6ff08ffe6ff10ffe6ff19ffe6ff21ffe6ff29ffe6ff31ffe6ff3affe6ff42ffe6ff4affe6ff52ffe6ff5affe6ff63ffe6ff6bffe6ff73ffe6ff7bffe6ff84ffe6ff8cffe6ff94ffe6ff9cffe6ffa5ffe6ffadffe6ffb5ffe6ffbdffe6ffc5ffe6ffceffe6ffd6ffe6ffdeffe6ffe6ffe6ffefffe6fff7ffe6ffffffe6ff0000efff0800efff1000efff1900efff2100efff2900efff3100efff3a00efff4200efff4a00efff5200efff5a00efff6300efff6b00efff7300efff7b00efff8400efff8c00efff9400efff9c00efffa500efffad00efffb500efffbd00efffc500efffce00efffd600efffde00efffe600efffef00effff700efffff00efff0008efff0808efff1008efff1908efff2108efff2908efff3108efff3a08efff4208efff4a08efff5208efff5a08efff6308efff6b08efff7308efff7b08efff8408efff8c08efff9408efff9c08efffa508efffad08efffb508efffbd08efffc508efffce08efffd608efffde08efffe608efffef08effff708efffff08efff0010efff0810efff1010efff1910efff2110efff2910efff3110efff3a10efff4210efff4a10efff5210efff5a10efff6310efff6b10efff7310efff7b10efff8410efff8c10efff9410efff9c10efffa510efffad10efffb510efffbd10efffc510efffce10efffd610efffde10efffe610efffef10effff710efffff10efff0019efff0819efff1019efff1919efff2119efff2919efff3119efff3a19efff4219efff4a19efff5219efff5a19efff6319efff6b19efff7319efff7b19efff8419efff8c19efff9419efff9c19efffa519efffad19efffb519efffbd19efffc519efffce19efffd619efffde19efffe619efffef19effff719efffff19efff0021efff0821efff1021efff1921efff2121efff2921efff3121efff3a21efff4221efff4a21efff5221efff5a21efff6321efff6b21efff7321efff7b21efff8421efff8c21efff9421efff9c21efffa521efffad21efffb521efffbd21efffc521efffce21efffd621efffde21efffe621efffef21effff721efffff21efff0029efff0829efff1029efff1929efff2129efff2929efff3129efff3a29efff4229efff4a29efff5229efff5a29efff6329efff6b29efff7329efff7b29efff8429efff8c29efff9429efff9c29efffa529efffad29efffb529efffbd29efffc529efffce29efffd629efffde29efffe629efffef29effff729efffff29efff0031efff0831efff1031efff1931efff2131efff2931efff3131efff3a31efff4231efff4a31efff5231efff5a31efff6331efff6b31efff7331efff7b31efff8431efff8c31efff9431efff9c31efffa531efffad31efffb531efffbd31efffc531efffce31efffd631efffde31efffe631efffef31effff731efffff31efff003aefff083aefff103aefff193aefff213aefff293aefff313aefff3a3aefff423aefff4a3aefff523aefff5a3aefff633aefff6b3aefff733aefff7b3aefff843aefff8c3aefff943aefff9c3aefffa53aefffad3aefffb53aefffbd3aefffc53aefffce3aefffd63aefffde3aefffe63aefffef3aeffff73aefffff3aefff0042efff0842efff1042efff1942efff2142efff2942efff3142efff3a42efff4242efff4a42efff5242efff5a42efff6342efff6b42efff7342efff7b42efff8442efff8c42efff9442efff9c42efffa542efffad42efffb542efffbd42efffc542efffce42efffd642efffde42efffe642efffef42effff742efffff42efff004aefff084aefff104aefff194aefff214aefff294aefff314aefff3a4aefff424aefff4a4aefff524aefff5a4aefff634aefff6b4aefff734aefff7b4aefff844aefff8c4aefff944aefff9c4aefffa54aefffad4aefffb54aefffbd4aefffc54aefffce4aefffd64aefffde4aefffe64aefffef4aeffff74aefffff4aefff0052efff0852efff1052efff1952efff2152efff2952efff3152efff3a52efff4252efff4a52efff5252efff5a52efff6352efff6b52efff7352efff7b52efff8452efff8c52efff9452efff9c52efffa552efffad52efffb552efffbd52efffc552efffce52efffd652efffde52efffe652efffef52effff752efffff52efff005aefff085aefff105aefff195aefff215aefff295aefff315aefff3a5aefff425aefff4a5aefff525aefff5a5aefff635aefff6b5aefff735aefff7b5aefff845aefff8c5aefff945aefff9c5aefffa55aefffad5aefffb55aefffbd5aefffc55aefffce5aefffd65aefffde5aefffe65aefffef5aeffff75aefffff5aefff0063efff0863efff1063efff1963efff2163efff2963efff3163efff3a63efff4263efff4a63efff5263efff5a63efff6363efff6b63efff7363efff7b63efff8463efff8c63efff9463efff9c63efffa563efffad63efffb563efffbd63efffc563efffce63efffd663efffde63efffe663efffef63effff763efffff63efff006befff086befff106befff196befff216befff296befff316befff3a6befff426befff4a6befff526befff5a6befff636befff6b6befff736befff7b6befff846befff8c6befff946befff9c6befffa56befffad6befffb56befffbd6befffc56befffce6befffd66befffde6befffe66befffef6beffff76befffff6befff0073efff0873efff1073efff1973efff2173efff2973efff3173efff3a73efff4273efff4a73efff5273efff5a73efff6373efff6b73efff7373efff7b73efff8473efff8c73efff9473efff9c73efffa573efffad73efffb573efffbd73efffc573efffce73efffd673efffde73efffe673efffef73effff773efffff73efff007befff087befff107befff197befff217befff297befff317befff3a7befff427befff4a7befff527befff5a7befff637befff6b7befff737befff7b7befff847befff8c7befff947befff9c7befffa57befffad7befffb57befffbd7befffc57befffce7befffd67befffde7befffe67befffef7beffff77befffff7befff0084efff0884efff1084efff1984efff2184efff2984efff3184efff3a84efff4284efff4a84efff5284efff5a84efff6384efff6b84efff7384efff7b84efff8484efff8c84efff9484efff9c84efffa584efffad84efffb584efffbd84efffc584efffce84efffd684efffde84efffe684efffef84effff784efffff84efff008cefff088cefff108cefff198cefff218cefff298cefff318cefff3a8cefff428cefff4a8cefff528cefff5a8cefff638cefff6b8cefff738cefff7b8cefff848cefff8c8cefff948cefff9c8cefffa58cefffad8cefffb58cefffbd8cefffc58cefffce8cefffd68cefffde8cefffe68cefffef8ceffff78cefffff8cefff0094efff0894efff1094efff1994efff2194efff2994efff3194efff3a94efff4294efff4a94efff5294efff5a94efff6394efff6b94efff7394efff7b94efff8494efff8c94efff9494efff9c94efffa594efffad94efffb594efffbd94efffc594efffce94efffd694efffde94efffe694efffef94effff794efffff94efff009cefff089cefff109cefff199cefff219cefff299cefff319cefff3a9cefff429cefff4a9cefff529cefff5a9cefff639cefff6b9cefff739cefff7b9cefff849cefff8c9cefff949cefff9c9cefffa59cefffad9cefffb59cefffbd9cefffc59cefffce9cefffd69cefffde9cefffe69cefffef9ceffff79cefffff9cefff00a5efff08a5efff10a5efff19a5efff21a5efff29a5efff31a5efff3aa5efff42a5efff4aa5efff52a5efff5aa5efff63a5efff6ba5efff73a5efff7ba5efff84a5efff8ca5efff94a5efff9ca5efffa5a5efffada5efffb5a5efffbda5efffc5a5efffcea5efffd6a5efffdea5efffe6a5efffefa5effff7a5efffffa5efff00adefff08adefff10adefff19adefff21adefff29adefff31adefff3aadefff42adefff4aadefff52adefff5aadefff63adefff6badefff73adefff7badefff84adefff8cadefff94adefff9cadefffa5adefffadadefffb5adefffbdadefffc5adefffceadefffd6adefffdeadefffe6adefffefadeffff7adefffffadefff00b5efff08b5efff10b5efff19b5efff21b5efff29b5efff31b5efff3ab5efff42b5efff4ab5efff52b5efff5ab5efff63b5efff6bb5efff73b5efff7bb5efff84b5efff8cb5efff94b5efff9cb5efffa5b5efffadb5efffb5b5efffbdb5efffc5b5efffceb5efffd6b5efffdeb5efffe6b5efffefb5effff7b5efffffb5efff00bdefff08bdefff10bdefff19bdefff21bdefff29bdefff31bdefff3abdefff42bdefff4abdefff52bdefff5abdefff63bdefff6bbdefff73bdefff7bbdefff84bdefff8cbdefff94bdefff9cbdefffa5bdefffadbdefffb5bdefffbdbdefffc5bdefffcebdefffd6bdefffdebdefffe6bdefffefbdeffff7bdefffffbdefff00c5efff08c5efff10c5efff19c5efff21c5efff29c5efff31c5efff3ac5efff42c5efff4ac5efff52c5efff5ac5efff63c5efff6bc5efff73c5efff7bc5efff84c5efff8cc5efff94c5efff9cc5efffa5c5efffadc5efffb5c5efffbdc5efffc5c5efffcec5efffd6c5efffdec5efffe6c5efffefc5effff7c5efffffc5efff00ceefff08ceefff10ceefff19ceefff21ceefff29ceefff31ceefff3aceefff42ceefff4aceefff52ceefff5aceefff63ceefff6bceefff73ceefff7bceefff84ceefff8cceefff94ceefff9cceefffa5ceefffadceefffb5ceefffbdceefffc5ceefffceceefffd6ceefffdeceefffe6ceefffefceeffff7ceefffffceefff00d6efff08d6efff10d6efff19d6efff21d6efff29d6efff31d6efff3ad6efff42d6efff4ad6efff52d6efff5ad6efff63d6efff6bd6efff73d6efff7bd6efff84d6efff8cd6efff94d6efff9cd6efffa5d6efffadd6efffb5d6efffbdd6efffc5d6efffced6efffd6d6efffded6efffe6d6efffefd6effff7d6efffffd6efff00deefff08deefff10deefff19deefff21deefff29deefff31deefff3adeefff42deefff4adeefff52deefff5adeefff63deefff6bdeefff73deefff7bdeefff84deefff8cdeefff94deefff9cdeefffa5deefffaddeefffb5deefffbddeefffc5deefffcedeefffd6deefffdedeefffe6deefffefdeeffff7deefffffdeefff00e6efff08e6efff10e6efff19e6efff21e6efff29e6efff31e6efff3ae6efff42e6efff4ae6efff52e6efff5ae6efff63e6efff6be6efff73e6efff7be6efff84e6efff8ce6efff94e6efff9ce6efffa5e6efffade6efffb5e6efffbde6efffc5e6efffcee6efffd6e6efffdee6efffe6e6efffefe6effff7e6efffffe6efff00efefff08efefff10efefff19efefff21efefff29efefff31efefff3aefefff42efefff4aefefff52efefff5aefefff63efefff6befefff73efefff7befefff84efefff8cefefff94efefff9cefefffa5efefffadefefffb5efefffbdefefffc5efefffceefefffd6efefffdeefefffe6efefffefefeffff7efefffffefefff00f7efff08f7efff10f7efff19f7efff21f7efff29f7efff31f7efff3af7efff42f7efff4af7efff52f7efff5af7efff63f7efff6bf7efff73f7efff7bf7efff84f7efff8cf7efff94f7efff9cf7efffa5f7efffadf7efffb5f7efffbdf7efffc5f7efffcef7efffd6f7efffdef7efffe6f7efffeff7effff7f7effffff7efff00ffefff08ffefff10ffefff19ffefff21ffefff29ffefff31ffefff3affefff42ffefff4affefff52ffefff5affefff63ffefff6bffefff73ffefff7bffefff84ffefff8cffefff94ffefff9cffefffa5ffefffadffefffb5ffefffbdffefffc5ffefffceffefffd6ffefffdeffefffe6ffefffefffeffff7ffefffffffefff0000f7ff0800f7ff1000f7ff1900f7ff2100f7ff2900f7ff3100f7ff3a00f7ff4200f7ff4a00f7ff5200f7ff5a00f7ff6300f7ff6b00f7ff7300f7ff7b00f7ff8400f7ff8c00f7ff9400f7ff9c00f7ffa500f7ffad00f7ffb500f7ffbd00f7ffc500f7ffce00f7ffd600f7ffde00f7ffe600f7ffef00f7fff700f7ffff00f7ff0008f7ff0808f7ff1008f7ff1908f7ff2108f7ff2908f7ff3108f7ff3a08f7ff4208f7ff4a08f7ff5208f7ff5a08f7ff6308f7ff6b08f7ff7308f7ff7b08f7ff8408f7ff8c08f7ff9408f7ff9c08f7ffa508f7ffad08f7ffb508f7ffbd08f7ffc508f7ffce08f7ffd608f7ffde08f7ffe608f7ffef08f7fff708f7ffff08f7ff0010f7ff0810f7ff1010f7ff1910f7ff2110f7ff2910f7ff3110f7ff3a10f7ff4210f7ff4a10f7ff5210f7ff5a10f7ff6310f7ff6b10f7ff7310f7ff7b10f7ff8410f7ff8c10f7ff9410f7ff9c10f7ffa510f7ffad10f7ffb510f7ffbd10f7ffc510f7ffce10f7ffd610f7ffde10f7ffe610f7ffef10f7fff710f7ffff10f7ff0019f7ff0819f7ff1019f7ff1919f7ff2119f7ff2919f7ff3119f7ff3a19f7ff4219f7ff4a19f7ff5219f7ff5a19f7ff6319f7ff6b19f7ff7319f7ff7b19f7ff8419f7ff8c19f7ff9419f7ff9c19f7ffa519f7ffad19f7ffb519f7ffbd19f7ffc519f7ffce19f7ffd619f7ffde19f7ffe619f7ffef19f7fff719f7ffff19f7ff0021f7ff0821f7ff1021f7ff1921f7ff2121f7ff2921f7ff3121f7ff3a21f7ff4221f7ff4a21f7ff5221f7ff5a21f7ff6321f7ff6b21f7ff7321f7ff7b21f7ff8421f7ff8c21f7ff9421f7ff9c21f7ffa521f7ffad21f7ffb521f7ffbd21f7ffc521f7ffce21f7ffd621f7ffde21f7ffe621f7ffef21f7fff721f7ffff21f7ff0029f7ff0829f7ff1029f7ff1929f7ff2129f7ff2929f7ff3129f7ff3a29f7ff4229f7ff4a29f7ff5229f7ff5a29f7ff6329f7ff6b29f7ff7329f7ff7b29f7ff8429f7ff8c29f7ff9429f7ff9c29f7ffa529f7ffad29f7ffb529f7ffbd29f7ffc529f7ffce29f7ffd629f7ffde29f7ffe629f7ffef29f7fff729f7ffff29f7ff0031f7ff0831f7ff1031f7ff1931f7ff2131f7ff2931f7ff3131f7ff3a31f7ff4231f7ff4a31f7ff5231f7ff5a31f7ff6331f7ff6b31f7ff7331f7ff7b31f7ff8431f7ff8c31f7ff9431f7ff9c31f7ffa531f7ffad31f7ffb531f7ffbd31f7ffc531f7ffce31f7ffd631f7ffde31f7ffe631f7ffef31f7fff731f7ffff31f7ff003af7ff083af7ff103af7ff193af7ff213af7ff293af7ff313af7ff3a3af7ff423af7ff4a3af7ff523af7ff5a3af7ff633af7ff6b3af7ff733af7ff7b3af7ff843af7ff8c3af7ff943af7ff9c3af7ffa53af7ffad3af7ffb53af7ffbd3af7ffc53af7ffce3af7ffd63af7ffde3af7ffe63af7ffef3af7fff73af7ffff3af7ff0042f7ff0842f7ff1042f7ff1942f7ff2142f7ff2942f7ff3142f7ff3a42f7ff4242f7ff4a42f7ff5242f7ff5a42f7ff6342f7ff6b42f7ff7342f7ff7b42f7ff8442f7ff8c42f7ff9442f7ff9c42f7ffa542f7ffad42f7ffb542f7ffbd42f7ffc542f7ffce42f7ffd642f7ffde42f7ffe642f7ffef42f7fff742f7ffff42f7ff004af7ff084af7ff104af7ff194af7ff214af7ff294af7ff314af7ff3a4af7ff424af7ff4a4af7ff524af7ff5a4af7ff634af7ff6b4af7ff734af7ff7b4af7ff844af7ff8c4af7ff944af7ff9c4af7ffa54af7ffad4af7ffb54af7ffbd4af7ffc54af7ffce4af7ffd64af7ffde4af7ffe64af7ffef4af7fff74af7ffff4af7ff0052f7ff0852f7ff1052f7ff1952f7ff2152f7ff2952f7ff3152f7ff3a52f7ff4252f7ff4a52f7ff5252f7ff5a52f7ff6352f7ff6b52f7ff7352f7ff7b52f7ff8452f7ff8c52f7ff9452f7ff9c52f7ffa552f7ffad52f7ffb552f7ffbd52f7ffc552f7ffce52f7ffd652f7ffde52f7ffe652f7ffef52f7fff752f7ffff52f7ff005af7ff085af7ff105af7ff195af7ff215af7ff295af7ff315af7ff3a5af7ff425af7ff4a5af7ff525af7ff5a5af7ff635af7ff6b5af7ff735af7ff7b5af7ff845af7ff8c5af7ff945af7ff9c5af7ffa55af7ffad5af7ffb55af7ffbd5af7ffc55af7ffce5af7ffd65af7ffde5af7ffe65af7ffef5af7fff75af7ffff5af7ff0063f7ff0863f7ff1063f7ff1963f7ff2163f7ff2963f7ff3163f7ff3a63f7ff4263f7ff4a63f7ff5263f7ff5a63f7ff6363f7ff6b63f7ff7363f7ff7b63f7ff8463f7ff8c63f7ff9463f7ff9c63f7ffa563f7ffad63f7ffb563f7ffbd63f7ffc563f7ffce63f7ffd663f7ffde63f7ffe663f7ffef63f7fff763f7ffff63f7ff006bf7ff086bf7ff106bf7ff196bf7ff216bf7ff296bf7ff316bf7ff3a6bf7ff426bf7ff4a6bf7ff526bf7ff5a6bf7ff636bf7ff6b6bf7ff736bf7ff7b6bf7ff846bf7ff8c6bf7ff946bf7ff9c6bf7ffa56bf7ffad6bf7ffb56bf7ffbd6bf7ffc56bf7ffce6bf7ffd66bf7ffde6bf7ffe66bf7ffef6bf7fff76bf7ffff6bf7ff0073f7ff0873f7ff1073f7ff1973f7ff2173f7ff2973f7ff3173f7ff3a73f7ff4273f7ff4a73f7ff5273f7ff5a73f7ff6373f7ff6b73f7ff7373f7ff7b73f7ff8473f7ff8c73f7ff9473f7ff9c73f7ffa573f7ffad73f7ffb573f7ffbd73f7ffc573f7ffce73f7ffd673f7ffde73f7ffe673f7ffef73f7fff773f7ffff73f7ff007bf7ff087bf7ff107bf7ff197bf7ff217bf7ff297bf7ff317bf7ff3a7bf7ff427bf7ff4a7bf7ff527bf7ff5a7bf7ff637bf7ff6b7bf7ff737bf7ff7b7bf7ff847bf7ff8c7bf7ff947bf7ff9c7bf7ffa57bf7ffad7bf7ffb57bf7ffbd7bf7ffc57bf7ffce7bf7ffd67bf7ffde7bf7ffe67bf7ffef7bf7fff77bf7ffff7bf7ff0084f7ff0884f7ff1084f7ff1984f7ff2184f7ff2984f7ff3184f7ff3a84f7ff4284f7ff4a84f7ff5284f7ff5a84f7ff6384f7ff6b84f7ff7384f7ff7b84f7ff8484f7ff8c84f7ff9484f7ff9c84f7ffa584f7ffad84f7ffb584f7ffbd84f7ffc584f7ffce84f7ffd684f7ffde84f7ffe684f7ffef84f7fff784f7ffff84f7ff008cf7ff088cf7ff108cf7ff198cf7ff218cf7ff298cf7ff318cf7ff3a8cf7ff428cf7ff4a8cf7ff528cf7ff5a8cf7ff638cf7ff6b8cf7ff738cf7ff7b8cf7ff848cf7ff8c8cf7ff948cf7ff9c8cf7ffa58cf7ffad8cf7ffb58cf7ffbd8cf7ffc58cf7ffce8cf7ffd68cf7ffde8cf7ffe68cf7ffef8cf7fff78cf7ffff8cf7ff0094f7ff0894f7ff1094f7ff1994f7ff2194f7ff2994f7ff3194f7ff3a94f7ff4294f7ff4a94f7ff5294f7ff5a94f7ff6394f7ff6b94f7ff7394f7ff7b94f7ff8494f7ff8c94f7ff9494f7ff9c94f7ffa594f7ffad94f7ffb594f7ffbd94f7ffc594f7ffce94f7ffd694f7ffde94f7ffe694f7ffef94f7fff794f7ffff94f7ff009cf7ff089cf7ff109cf7ff199cf7ff219cf7ff299cf7ff319cf7ff3a9cf7ff429cf7ff4a9cf7ff529cf7ff5a9cf7ff639cf7ff6b9cf7ff739cf7ff7b9cf7ff849cf7ff8c9cf7ff949cf7ff9c9cf7ffa59cf7ffad9cf7ffb59cf7ffbd9cf7ffc59cf7ffce9cf7ffd69cf7ffde9cf7ffe69cf7ffef9cf7fff79cf7ffff9cf7ff00a5f7ff08a5f7ff10a5f7ff19a5f7ff21a5f7ff29a5f7ff31a5f7ff3aa5f7ff42a5f7ff4aa5f7ff52a5f7ff5aa5f7ff63a5f7ff6ba5f7ff73a5f7ff7ba5f7ff84a5f7ff8ca5f7ff94a5f7ff9ca5f7ffa5a5f7ffada5f7ffb5a5f7ffbda5f7ffc5a5f7ffcea5f7ffd6a5f7ffdea5f7ffe6a5f7ffefa5f7fff7a5f7ffffa5f7ff00adf7ff08adf7ff10adf7ff19adf7ff21adf7ff29adf7ff31adf7ff3aadf7ff42adf7ff4aadf7ff52adf7ff5aadf7ff63adf7ff6badf7ff73adf7ff7badf7ff84adf7ff8cadf7ff94adf7ff9cadf7ffa5adf7ffadadf7ffb5adf7ffbdadf7ffc5adf7ffceadf7ffd6adf7ffdeadf7ffe6adf7ffefadf7fff7adf7ffffadf7ff00b5f7ff08b5f7ff10b5f7ff19b5f7ff21b5f7ff29b5f7ff31b5f7ff3ab5f7ff42b5f7ff4ab5f7ff52b5f7ff5ab5f7ff63b5f7ff6bb5f7ff73b5f7ff7bb5f7ff84b5f7ff8cb5f7ff94b5f7ff9cb5f7ffa5b5f7ffadb5f7ffb5b5f7ffbdb5f7ffc5b5f7ffceb5f7ffd6b5f7ffdeb5f7ffe6b5f7ffefb5f7fff7b5f7ffffb5f7ff00bdf7ff08bdf7ff10bdf7ff19bdf7ff21bdf7ff29bdf7ff31bdf7ff3abdf7ff42bdf7ff4abdf7ff52bdf7ff5abdf7ff63bdf7ff6bbdf7ff73bdf7ff7bbdf7ff84bdf7ff8cbdf7ff94bdf7ff9cbdf7ffa5bdf7ffadbdf7ffb5bdf7ffbdbdf7ffc5bdf7ffcebdf7ffd6bdf7ffdebdf7ffe6bdf7ffefbdf7fff7bdf7ffffbdf7ff00c5f7ff08c5f7ff10c5f7ff19c5f7ff21c5f7ff29c5f7ff31c5f7ff3ac5f7ff42c5f7ff4ac5f7ff52c5f7ff5ac5f7ff63c5f7ff6bc5f7ff73c5f7ff7bc5f7ff84c5f7ff8cc5f7ff94c5f7ff9cc5f7ffa5c5f7ffadc5f7ffb5c5f7ffbdc5f7ffc5c5f7ffcec5f7ffd6c5f7ffdec5f7ffe6c5f7ffefc5f7fff7c5f7ffffc5f7ff00cef7ff08cef7ff10cef7ff19cef7ff21cef7ff29cef7ff31cef7ff3acef7ff42cef7ff4acef7ff52cef7ff5acef7ff63cef7ff6bcef7ff73cef7ff7bcef7ff84cef7ff8ccef7ff94cef7ff9ccef7ffa5cef7ffadcef7ffb5cef7ffbdcef7ffc5cef7ffcecef7ffd6cef7ffdecef7ffe6cef7ffefcef7fff7cef7ffffcef7ff00d6f7ff08d6f7ff10d6f7ff19d6f7ff21d6f7ff29d6f7ff31d6f7ff3ad6f7ff42d6f7ff4ad6f7ff52d6f7ff5ad6f7ff63d6f7ff6bd6f7ff73d6f7ff7bd6f7ff84d6f7ff8cd6f7ff94d6f7ff9cd6f7ffa5d6f7ffadd6f7ffb5d6f7ffbdd6f7ffc5d6f7ffced6f7ffd6d6f7ffded6f7ffe6d6f7ffefd6f7fff7d6f7ffffd6f7ff00def7ff08def7ff10def7ff19def7ff21def7ff29def7ff31def7ff3adef7ff42def7ff4adef7ff52def7ff5adef7ff63def7ff6bdef7ff73def7ff7bdef7ff84def7ff8cdef7ff94def7ff9cdef7ffa5def7ffaddef7ffb5def7ffbddef7ffc5def7ffcedef7ffd6def7ffdedef7ffe6def7ffefdef7fff7def7ffffdef7ff00e6f7ff08e6f7ff10e6f7ff19e6f7ff21e6f7ff29e6f7ff31e6f7ff3ae6f7ff42e6f7ff4ae6f7ff52e6f7ff5ae6f7ff63e6f7ff6be6f7ff73e6f7ff7be6f7ff84e6f7ff8ce6f7ff94e6f7ff9ce6f7ffa5e6f7ffade6f7ffb5e6f7ffbde6f7ffc5e6f7ffcee6f7ffd6e6f7ffdee6f7ffe6e6f7ffefe6f7fff7e6f7ffffe6f7ff00eff7ff08eff7ff10eff7ff19eff7ff21eff7ff29eff7ff31eff7ff3aeff7ff42eff7ff4aeff7ff52eff7ff5aeff7ff63eff7ff6beff7ff73eff7ff7beff7ff84eff7ff8ceff7ff94eff7ff9ceff7ffa5eff7ffadeff7ffb5eff7ffbdeff7ffc5eff7ffceeff7ffd6eff7ffdeeff7ffe6eff7ffefeff7fff7eff7ffffeff7ff00f7f7ff08f7f7ff10f7f7ff19f7f7ff21f7f7ff29f7f7ff31f7f7ff3af7f7ff42f7f7ff4af7f7ff52f7f7ff5af7f7ff63f7f7ff6bf7f7ff73f7f7ff7bf7f7ff84f7f7ff8cf7f7ff94f7f7ff9cf7f7ffa5f7f7ffadf7f7ffb5f7f7ffbdf7f7ffc5f7f7ffcef7f7ffd6f7f7ffdef7f7ffe6f7f7ffeff7f7fff7f7f7fffff7f7ff00fff7ff08fff7ff10fff7ff19fff7ff21fff7ff29fff7ff31fff7ff3afff7ff42fff7ff4afff7ff52fff7ff5afff7ff63fff7ff6bfff7ff73fff7ff7bfff7ff84fff7ff8cfff7ff94fff7ff9cfff7ffa5fff7ffadfff7ffb5fff7ffbdfff7ffc5fff7ffcefff7ffd6fff7ffdefff7ffe6fff7ffeffff7fff7fff7fffffff7ff0000ffff0800ffff1000ffff1900ffff2100ffff2900ffff3100ffff3a00ffff4200ffff4a00ffff5200ffff5a00ffff6300ffff6b00ffff7300ffff7b00ffff8400ffff8c00ffff9400ffff9c00ffffa500ffffad00ffffb500ffffbd00ffffc500ffffce00ffffd600ffffde00ffffe600ffffef00fffff700ffffff00ffff0008ffff0808ffff1008ffff1908ffff2108ffff2908ffff3108ffff3a08ffff4208ffff4a08ffff5208ffff5a08ffff6308ffff6b08ffff7308ffff7b08ffff8408ffff8c08ffff9408ffff9c08ffffa508ffffad08ffffb508ffffbd08ffffc508ffffce08ffffd608ffffde08ffffe608ffffef08fffff708ffffff08ffff0010ffff0810ffff1010ffff1910ffff2110ffff2910ffff3110ffff3a10ffff4210ffff4a10ffff5210ffff5a10ffff6310ffff6b10ffff7310ffff7b10ffff8410ffff8c10ffff9410ffff9c10ffffa510ffffad10ffffb510ffffbd10ffffc510ffffce10ffffd610ffffde10ffffe610ffffef10fffff710ffffff10ffff0019ffff0819ffff1019ffff1919ffff2119ffff2919ffff3119ffff3a19ffff4219ffff4a19ffff5219ffff5a19ffff6319ffff6b19ffff7319ffff7b19ffff8419ffff8c19ffff9419ffff9c19ffffa519ffffad19ffffb519ffffbd19ffffc519ffffce19ffffd619ffffde19ffffe619ffffef19fffff719ffffff19ffff0021ffff0821ffff1021ffff1921ffff2121ffff2921ffff3121ffff3a21ffff4221ffff4a21ffff5221ffff5a21ffff6321ffff6b21ffff7321ffff7b21ffff8421ffff8c21ffff9421ffff9c21ffffa521ffffad21ffffb521ffffbd21ffffc521ffffce21ffffd621ffffde21ffffe621ffffef21fffff721ffffff21ffff0029ffff0829ffff1029ffff1929ffff2129ffff2929ffff3129ffff3a29ffff4229ffff4a29ffff5229ffff5a29ffff6329ffff6b29ffff7329ffff7b29ffff8429ffff8c29ffff9429ffff9c29ffffa529ffffad29ffffb529ffffbd29ffffc529ffffce29ffffd629ffffde29ffffe629ffffef29fffff729ffffff29ffff0031ffff0831ffff1031ffff1931ffff2131ffff2931ffff3131ffff3a31ffff4231ffff4a31ffff5231ffff5a31ffff6331ffff6b31ffff7331ffff7b31ffff8431ffff8c31ffff9431ffff9c31ffffa531ffffad31ffffb531ffffbd31ffffc531ffffce31ffffd631ffffde31ffffe631ffffef31fffff731ffffff31ffff003affff083affff103affff193affff213affff293affff313affff3a3affff423affff4a3affff523affff5a3affff633affff6b3affff733affff7b3affff843affff8c3affff943affff9c3affffa53affffad3affffb53affffbd3affffc53affffce3affffd63affffde3affffe63affffef3afffff73affffff3affff0042ffff0842ffff1042ffff1942ffff2142ffff2942ffff3142ffff3a42ffff4242ffff4a42ffff5242ffff5a42ffff6342ffff6b42ffff7342ffff7b42ffff8442ffff8c42ffff9442ffff9c42ffffa542ffffad42ffffb542ffffbd42ffffc542ffffce42ffffd642ffffde42ffffe642ffffef42fffff742ffffff42ffff004affff084affff104affff194affff214affff294affff314affff3a4affff424affff4a4affff524affff5a4affff634affff6b4affff734affff7b4affff844affff8c4affff944affff9c4affffa54affffad4affffb54affffbd4affffc54affffce4affffd64affffde4affffe64affffef4afffff74affffff4affff0052ffff0852ffff1052ffff1952ffff2152ffff2952ffff3152ffff3a52ffff4252ffff4a52ffff5252ffff5a52ffff6352ffff6b52ffff7352ffff7b52ffff8452ffff8c52ffff9452ffff9c52ffffa552ffffad52ffffb552ffffbd52ffffc552ffffce52ffffd652ffffde52ffffe652ffffef52fffff752ffffff52ffff005affff085affff105affff195affff215affff295affff315affff3a5affff425affff4a5affff525affff5a5affff635affff6b5affff735affff7b5affff845affff8c5affff945affff9c5affffa55affffad5affffb55affffbd5affffc55affffce5affffd65affffde5affffe65affffef5afffff75affffff5affff0063ffff0863ffff1063ffff1963ffff2163ffff2963ffff3163ffff3a63ffff4263ffff4a63ffff5263ffff5a63ffff6363ffff6b63ffff7363ffff7b63ffff8463ffff8c63ffff9463ffff9c63ffffa563ffffad63ffffb563ffffbd63ffffc563ffffce63ffffd663ffffde63ffffe663ffffef63fffff763ffffff63ffff006bffff086bffff106bffff196bffff216bffff296bffff316bffff3a6bffff426bffff4a6bffff526bffff5a6bffff636bffff6b6bffff736bffff7b6bffff846bffff8c6bffff946bffff9c6bffffa56bffffad6bffffb56bffffbd6bffffc56bffffce6bffffd66bffffde6bffffe66bffffef6bfffff76bffffff6bffff0073ffff0873ffff1073ffff1973ffff2173ffff2973ffff3173ffff3a73ffff4273ffff4a73ffff5273ffff5a73ffff6373ffff6b73ffff7373ffff7b73ffff8473ffff8c73ffff9473ffff9c73ffffa573ffffad73ffffb573ffffbd73ffffc573ffffce73ffffd673ffffde73ffffe673ffffef73fffff773ffffff73ffff007bffff087bffff107bffff197bffff217bffff297bffff317bffff3a7bffff427bffff4a7bffff527bffff5a7bffff637bffff6b7bffff737bffff7b7bffff847bffff8c7bffff947bffff9c7bffffa57bffffad7bffffb57bffffbd7bffffc57bffffce7bffffd67bffffde7bffffe67bffffef7bfffff77bffffff7bffff0084ffff0884ffff1084ffff1984ffff2184ffff2984ffff3184ffff3a84ffff4284ffff4a84ffff5284ffff5a84ffff6384ffff6b84ffff7384ffff7b84ffff8484ffff8c84ffff9484ffff9c84ffffa584ffffad84ffffb584ffffbd84ffffc584ffffce84ffffd684ffffde84ffffe684ffffef84fffff784ffffff84ffff008cffff088cffff108cffff198cffff218cffff298cffff318cffff3a8cffff428cffff4a8cffff528cffff5a8cffff638cffff6b8cffff738cffff7b8cffff848cffff8c8cffff948cffff9c8cffffa58cffffad8cffffb58cffffbd8cffffc58cffffce8cffffd68cffffde8cffffe68cffffef8cfffff78cffffff8cffff0094ffff0894ffff1094ffff1994ffff2194ffff2994ffff3194ffff3a94ffff4294ffff4a94ffff5294ffff5a94ffff6394ffff6b94ffff7394ffff7b94ffff8494ffff8c94ffff9494ffff9c94ffffa594ffffad94ffffb594ffffbd94ffffc594ffffce94ffffd694ffffde94ffffe694ffffef94fffff794ffffff94ffff009cffff089cffff109cffff199cffff219cffff299cffff319cffff3a9cffff429cffff4a9cffff529cffff5a9cffff639cffff6b9cffff739cffff7b9cffff849cffff8c9cffff949cffff9c9cffffa59cffffad9cffffb59cffffbd9cffffc59cffffce9cffffd69cffffde9cffffe69cffffef9cfffff79cffffff9cffff00a5ffff08a5ffff10a5ffff19a5ffff21a5ffff29a5ffff31a5ffff3aa5ffff42a5ffff4aa5ffff52a5ffff5aa5ffff63a5ffff6ba5ffff73a5ffff7ba5ffff84a5ffff8ca5ffff94a5ffff9ca5ffffa5a5ffffada5ffffb5a5ffffbda5ffffc5a5ffffcea5ffffd6a5ffffdea5ffffe6a5ffffefa5fffff7a5ffffffa5ffff00adffff08adffff10adffff19adffff21adffff29adffff31adffff3aadffff42adffff4aadffff52adffff5aadffff63adffff6badffff73adffff7badffff84adffff8cadffff94adffff9cadffffa5adffffadadffffb5adffffbdadffffc5adffffceadffffd6adffffdeadffffe6adffffefadfffff7adffffffadffff00b5ffff08b5ffff10b5ffff19b5ffff21b5ffff29b5ffff31b5ffff3ab5ffff42b5ffff4ab5ffff52b5ffff5ab5ffff63b5ffff6bb5ffff73b5ffff7bb5ffff84b5ffff8cb5ffff94b5ffff9cb5ffffa5b5ffffadb5ffffb5b5ffffbdb5ffffc5b5ffffceb5ffffd6b5ffffdeb5ffffe6b5ffffefb5fffff7b5ffffffb5ffff00bdffff08bdffff10bdffff19bdffff21bdffff29bdffff31bdffff3abdffff42bdffff4abdffff52bdffff5abdffff63bdffff6bbdffff73bdffff7bbdffff84bdffff8cbdffff94bdffff9cbdffffa5bdffffadbdffffb5bdffffbdbdffffc5bdffffcebdffffd6bdffffdebdffffe6bdffffefbdfffff7bdffffffbdffff00c5ffff08c5ffff10c5ffff19c5ffff21c5ffff29c5ffff31c5ffff3ac5ffff42c5ffff4ac5ffff52c5ffff5ac5ffff63c5ffff6bc5ffff73c5ffff7bc5ffff84c5ffff8cc5ffff94c5ffff9cc5ffffa5c5ffffadc5ffffb5c5ffffbdc5ffffc5c5ffffcec5ffffd6c5ffffdec5ffffe6c5ffffefc5fffff7c5ffffffc5ffff00ceffff08ceffff10ceffff19ceffff21ceffff29ceffff31ceffff3aceffff42ceffff4aceffff52ceffff5aceffff63ceffff6bceffff73ceffff7bceffff84ceffff8cceffff94ceffff9cceffffa5ceffffadceffffb5ceffffbdceffffc5ceffffceceffffd6ceffffdeceffffe6ceffffefcefffff7ceffffffceffff00d6ffff08d6ffff10d6ffff19d6ffff21d6ffff29d6ffff31d6ffff3ad6ffff42d6ffff4ad6ffff52d6ffff5ad6ffff63d6ffff6bd6ffff73d6ffff7bd6ffff84d6ffff8cd6ffff94d6ffff9cd6ffffa5d6ffffadd6ffffb5d6ffffbdd6ffffc5d6ffffced6ffffd6d6ffffded6ffffe6d6ffffefd6fffff7d6ffffffd6ffff00deffff08deffff10deffff19deffff21deffff29deffff31deffff3adeffff42deffff4adeffff52deffff5adeffff63deffff6bdeffff73deffff7bdeffff84deffff8cdeffff94deffff9cdeffffa5deffffaddeffffb5deffffbddeffffc5deffffcedeffffd6deffffdedeffffe6deffffefdefffff7deffffffdeffff00e6ffff08e6ffff10e6ffff19e6ffff21e6ffff29e6ffff31e6ffff3ae6ffff42e6ffff4ae6ffff52e6ffff5ae6ffff63e6ffff6be6ffff73e6ffff7be6ffff84e6ffff8ce6ffff94e6ffff9ce6ffffa5e6ffffade6ffffb5e6ffffbde6ffffc5e6ffffcee6ffffd6e6ffffdee6ffffe6e6ffffefe6fffff7e6ffffffe6ffff00efffff08efffff10efffff19efffff21efffff29efffff31efffff3aefffff42efffff4aefffff52efffff5aefffff63efffff6befffff73efffff7befffff84efffff8cefffff94efffff9cefffffa5efffffadefffffb5efffffbdefffffc5efffffceefffffd6efffffdeefffffe6efffffefeffffff7efffffffefffff00f7ffff08f7ffff10f7ffff19f7ffff21f7ffff29f7ffff31f7ffff3af7ffff42f7ffff4af7ffff52f7ffff5af7ffff63f7ffff6bf7ffff73f7ffff7bf7ffff84f7ffff8cf7ffff94f7ffff9cf7ffffa5f7ffffadf7ffffb5f7ffffbdf7ffffc5f7ffffcef7ffffd6f7ffffdef7ffffe6f7ffffeff7fffff7f7fffffff7ffff00ffffff08ffffff10ffffff19ffffff21ffffff29ffffff31ffffff3affffff42ffffff4affffff52ffffff5affffff63ffffff6bffffff73ffffff7bffffff84ffffff8cffffff94ffffff9cffffffa5ffffffadffffffb5ffffffbdffffffc5ffffffceffffffd6ffffffdeffffffe6ffffffeffffffff7ffffffffffffff + m_StreamData: + offset: 0 + size: 0 + path: diff --git a/Assets/Materials/ColorCube.asset.meta b/Assets/Materials/ColorCube.asset.meta new file mode 100644 index 0000000..bf10a6e --- /dev/null +++ b/Assets/Materials/ColorCube.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e4613d701b1dc7e4c8776ad2241aa99b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/ColorCube.mat b/Assets/Materials/ColorCube.mat new file mode 100644 index 0000000..67fd0f5 --- /dev/null +++ b/Assets/Materials/ColorCube.mat @@ -0,0 +1,79 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ColorCube + m_Shader: {fileID: 4800000, guid: 13a9fdd410e1b5541b00a1bcc6e8ab63, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 11700000, guid: e4613d701b1dc7e4c8776ad2241aa99b, type: 2} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _Alpha: 0.02 + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _StepSize: 0.01 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Materials/ColorCube.mat.meta b/Assets/Materials/ColorCube.mat.meta new file mode 100644 index 0000000..e220374 --- /dev/null +++ b/Assets/Materials/ColorCube.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c3de9a0e70a4a1d47a89c83a47c292d1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Cursor.mat b/Assets/Materials/Cursor.mat new file mode 100644 index 0000000..4f1a9df --- /dev/null +++ b/Assets/Materials/Cursor.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Cursor + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHAPREMULTIPLY_ON + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 10 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 3 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 0 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 0.5019608} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Materials/Cursor.mat.meta b/Assets/Materials/Cursor.mat.meta new file mode 100644 index 0000000..8e42376 --- /dev/null +++ b/Assets/Materials/Cursor.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bc96986534497c74fa9005a553555117 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Oriel.mat b/Assets/Materials/Oriel.mat new file mode 100644 index 0000000..0cdc987 --- /dev/null +++ b/Assets/Materials/Oriel.mat @@ -0,0 +1,79 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Oriel + m_Shader: {fileID: 4800000, guid: bb988dd04b43f964cb32c8b2e78e0366, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _Dark: {r: 0.4528302, g: 0.4528302, b: 0.4528302, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _Mid: {r: 0.5943396, g: 0.5943396, b: 0.5943396, a: 1} diff --git a/Assets/Materials/Oriel.mat.meta b/Assets/Materials/Oriel.mat.meta new file mode 100644 index 0000000..1b5d97a --- /dev/null +++ b/Assets/Materials/Oriel.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cb32a15bb95b4e742934a8a6189de671 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Quad.mat b/Assets/Materials/Quad.mat new file mode 100644 index 0000000..dc5cb81 --- /dev/null +++ b/Assets/Materials/Quad.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Quad + m_Shader: {fileID: 4800000, guid: e50524a6b644bd943847667b781b8111, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Materials/Quad.mat.meta b/Assets/Materials/Quad.mat.meta new file mode 100644 index 0000000..48ad238 --- /dev/null +++ b/Assets/Materials/Quad.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cac4176fae540bb4babebf99ead4d488 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Select.mat b/Assets/Materials/Select.mat new file mode 100644 index 0000000..d76031c --- /dev/null +++ b/Assets/Materials/Select.mat @@ -0,0 +1,96 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Select + m_Shader: {fileID: 210, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHAPREMULTIPLY_ON + m_LightmapFlags: 0 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: + - ALWAYS + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BlendOp: 0 + - _BumpScale: 1 + - _CameraFadingEnabled: 0 + - _CameraFarFadeDistance: 2 + - _CameraNearFadeDistance: 1 + - _Cull: 0 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DistortionBlend: 0.5 + - _DistortionEnabled: 0 + - _DistortionStrength: 1 + - _DistortionStrengthScaled: 0 + - _DstBlend: 10 + - _EmissionEnabled: 0 + - _FlipbookMode: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _LightingEnabled: 1 + - _Metallic: 0 + - _Mode: 3 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SoftParticlesEnabled: 0 + - _SoftParticlesFarFadeDistance: 1 + - _SoftParticlesNearFadeDistance: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 0 + m_Colors: + - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 0.49019608} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} diff --git a/Assets/Materials/Select.mat.meta b/Assets/Materials/Select.mat.meta new file mode 100644 index 0000000..f1746c9 --- /dev/null +++ b/Assets/Materials/Select.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6e36f9266828f5e468e68993117d2d6d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Shaders.meta b/Assets/Materials/Shaders.meta new file mode 100644 index 0000000..b8124ff --- /dev/null +++ b/Assets/Materials/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7b426b474635d774abdcaa20026e2064 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Shaders/ColorCube.shader b/Assets/Materials/Shaders/ColorCube.shader new file mode 100644 index 0000000..e854251 --- /dev/null +++ b/Assets/Materials/Shaders/ColorCube.shader @@ -0,0 +1,97 @@ +Shader "Custom/ColorCube" +{ + Properties + { + _MainTex ("Texture", 3D) = "white" {} + _Alpha ("Alpha", float) = 0.02 + _StepSize ("Step Size", float) = 0.01 + } + SubShader + { + Tags { "Queue" = "Transparent" "RenderType" = "Transparent" } + Blend One OneMinusSrcAlpha + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + // Maximum amount of raymarching samples + #define MAX_STEP_COUNT 128 + + // Allowed floating point inaccuracy + #define EPSILON 0.00001f + + struct appdata + { + float4 vertex : POSITION; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + float3 objectVertex : TEXCOORD0; + float3 vectorToSurface : TEXCOORD1; + }; + + sampler3D _MainTex; + float4 _MainTex_ST; + float _Alpha; + float _StepSize; + + v2f vert (appdata v) + { + v2f o; + + // Vertex in object space this will be the starting point of raymarching + o.objectVertex = v.vertex; + + // Calculate vector from camera to vertex in world space + float3 worldVertex = mul(unity_ObjectToWorld, v.vertex).xyz; + o.vectorToSurface = worldVertex - _WorldSpaceCameraPos; + + o.vertex = UnityObjectToClipPos(v.vertex); + return o; + } + + float4 BlendUnder(float4 color, float4 newColor) + { + color.rgb += (1.0 - color.a) * newColor.a * newColor.rgb; + color.a += (1.0 - color.a) * newColor.a; + return color; + } + + fixed4 frag(v2f i) : SV_Target + { + // Start raymarching at the front surface of the object + float3 rayOrigin = i.objectVertex; + + // Use vector from camera to object surface to get ray direction + float3 rayDirection = mul(unity_WorldToObject, float4(normalize(i.vectorToSurface), 1)); + + float4 color = float4(0, 0, 0, 0); + float3 samplePosition = rayOrigin; + + // Raymarch through object space + for (int i = 0; i < MAX_STEP_COUNT; i++) + { + // Accumulate color only within unit cube bounds + if(max(abs(samplePosition.x), max(abs(samplePosition.y), abs(samplePosition.z))) < 0.5f + EPSILON) + { + float4 sampledColor = tex3D(_MainTex, samplePosition + float3(0.5f, 0.5f, 0.5f)); + sampledColor.a *= _Alpha; + color = BlendUnder(color, sampledColor); + samplePosition += rayDirection * _StepSize; + } + } + + return color; + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Materials/Shaders/ColorCube.shader.meta b/Assets/Materials/Shaders/ColorCube.shader.meta new file mode 100644 index 0000000..f9df56f --- /dev/null +++ b/Assets/Materials/Shaders/ColorCube.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 13a9fdd410e1b5541b00a1bcc6e8ab63 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Shaders/CustomUnlit.shader b/Assets/Materials/Shaders/CustomUnlit.shader new file mode 100644 index 0000000..464f9fe --- /dev/null +++ b/Assets/Materials/Shaders/CustomUnlit.shader @@ -0,0 +1,48 @@ +Shader "Custom/Unlit" +{ + SubShader + { + Pass + { + CGPROGRAM + + #pragma vertex VertexProgram + #pragma fragment FragmentProgram + + // #include "UnityCG.cginc" + #include "UnityStandardBRDF.cginc" + + struct VertexData + { + fixed4 position : POSITION; + // fixed3 normal : NORMAL; + fixed4 color : COLOR; + }; + + struct Interpolators + { + fixed4 position : SV_POSITION; + // fixed3 normal : TEXCOORD1; + fixed4 color : COLOR0; + // fixed attenuation : TEXCOORD2; + }; + + Interpolators VertexProgram (VertexData v) + { + Interpolators i; + i.position = UnityObjectToClipPos(v.position); + // i.normal = UnityObjectToWorldNormal(v.normal); + i.color = v.color; + + return i; + } + + fixed4 FragmentProgram (Interpolators i) : SV_TARGET + { + return i.color; + } + + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Materials/Shaders/CustomUnlit.shader.meta b/Assets/Materials/Shaders/CustomUnlit.shader.meta new file mode 100644 index 0000000..fc01f87 --- /dev/null +++ b/Assets/Materials/Shaders/CustomUnlit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c0294c7bee6048c469d78ac99dfc2b8c +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Shaders/Quad.shader b/Assets/Materials/Shaders/Quad.shader new file mode 100644 index 0000000..9d5208e --- /dev/null +++ b/Assets/Materials/Shaders/Quad.shader @@ -0,0 +1,62 @@ +Shader "Custom/Quad" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + } + SubShader + { + Cull Off + + Pass + { + CGPROGRAM + + #pragma vertex VertexProgram + #pragma fragment FragmentProgram + + // #include "UnityCG.cginc" + #include "UnityStandardBRDF.cginc" + + + struct VertexData + { + fixed4 position : POSITION; + // fixed3 normal : NORMAL; + fixed4 color : COLOR; + float2 uv : TEXCOORD0; + }; + + struct Interpolators + { + fixed4 position : SV_POSITION; + // fixed3 normal : TEXCOORD1; + fixed4 color : COLOR0; + float2 uv : TEXCOORD0; + // fixed attenuation : TEXCOORD2; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + + Interpolators VertexProgram (VertexData v) + { + Interpolators i; + i.position = UnityObjectToClipPos(v.position); + // i.normal = UnityObjectToWorldNormal(v.normal); + i.uv = TRANSFORM_TEX(v.uv, _MainTex); + i.color = v.color; + + return i; + } + + fixed4 FragmentProgram (Interpolators i) : SV_TARGET + { + fixed4 col = tex2D(_MainTex, i.uv); + return i.color * col; + } + + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Materials/Shaders/Quad.shader.meta b/Assets/Materials/Shaders/Quad.shader.meta new file mode 100644 index 0000000..989824b --- /dev/null +++ b/Assets/Materials/Shaders/Quad.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e50524a6b644bd943847667b781b8111 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Shaders/Vector.shader b/Assets/Materials/Shaders/Vector.shader new file mode 100644 index 0000000..3916228 --- /dev/null +++ b/Assets/Materials/Shaders/Vector.shader @@ -0,0 +1,56 @@ +Shader "Custom/Vector" +{ + Properties + { + _Color ("Color", Color) = (1, 1, 1, 1) + } + + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_instancing + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f + { + float4 vertex : SV_POSITION; + UNITY_VERTEX_INPUT_INSTANCE_ID // necessary only if you want to access instanced properties in fragment Shader. + }; + + UNITY_INSTANCING_BUFFER_START(Props) + UNITY_DEFINE_INSTANCED_PROP(float4, _Color) + UNITY_INSTANCING_BUFFER_END(Props) + + v2f vert(appdata v) + { + v2f o; + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); // necessary only if you want to access instanced properties in the fragment Shader. + + o.vertex = UnityObjectToClipPos(v.vertex); + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); // necessary only if any instanced properties are going to be accessed in the fragment Shader. + return UNITY_ACCESS_INSTANCED_PROP(Props, _Color); + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Materials/Shaders/Vector.shader.meta b/Assets/Materials/Shaders/Vector.shader.meta new file mode 100644 index 0000000..bf2d596 --- /dev/null +++ b/Assets/Materials/Shaders/Vector.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: cef7c032a6d36e54eb4fe2df853dfca4 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Shaders/VertexLit.shader b/Assets/Materials/Shaders/VertexLit.shader new file mode 100644 index 0000000..1ef7399 --- /dev/null +++ b/Assets/Materials/Shaders/VertexLit.shader @@ -0,0 +1,55 @@ +Shader "Custom/VertexLit" +{ + Properties + { + _Dark ("Dark", Color) = (0, 0, 0, 1) + _Mid ("Mid", Color) = (1, 1, 1, 1) + } + SubShader + { + Tags { "RenderType"="Opaque" } + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + float3 normal : TEXCOORD; + fixed4 color : COLOR; + }; + + fixed4 _Dark; + fixed4 _Mid; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.normal = UnityObjectToWorldNormal(v.normal); + float t = clamp(dot(normalize(float3(0.3, 0.6, -0.2)), o.normal), 0, 1); + o.color = lerp(_Dark, _Mid, t); + + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + return i.color; + } + ENDCG + } + } +} diff --git a/Assets/Materials/Shaders/VertexLit.shader.meta b/Assets/Materials/Shaders/VertexLit.shader.meta new file mode 100644 index 0000000..d3bc962 --- /dev/null +++ b/Assets/Materials/Shaders/VertexLit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bb988dd04b43f964cb32c8b2e78e0366 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Unlit.mat b/Assets/Materials/Unlit.mat new file mode 100644 index 0000000..14cf1c1 --- /dev/null +++ b/Assets/Materials/Unlit.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Unlit + m_Shader: {fileID: 4800000, guid: c0294c7bee6048c469d78ac99dfc2b8c, type: 3} + m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Materials/Unlit.mat.meta b/Assets/Materials/Unlit.mat.meta new file mode 100644 index 0000000..0c8abd2 --- /dev/null +++ b/Assets/Materials/Unlit.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 16bc6a8dc30e9184aae9597dfb7e7a2f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Vector.mat b/Assets/Materials/Vector.mat new file mode 100644 index 0000000..4c7bef0 --- /dev/null +++ b/Assets/Materials/Vector.mat @@ -0,0 +1,96 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Vector + m_Shader: {fileID: 4800000, guid: cef7c032a6d36e54eb4fe2df853dfca4, type: 3} + m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF + m_LightmapFlags: 4 + m_EnableInstancingVariants: 1 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BlendOp: 0 + - _BumpScale: 1 + - _CameraFadingEnabled: 0 + - _CameraFarFadeDistance: 2 + - _CameraNearFadeDistance: 1 + - _ColorMode: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DistortionBlend: 0.5 + - _DistortionEnabled: 0 + - _DistortionStrength: 1 + - _DistortionStrengthScaled: 0 + - _DstBlend: 0 + - _EmissionEnabled: 0 + - _FlipbookMode: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 0 + - _LightingEnabled: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SoftParticlesEnabled: 0 + - _SoftParticlesFarFadeDistance: 1 + - _SoftParticlesNearFadeDistance: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _ColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} diff --git a/Assets/Materials/Vector.mat.meta b/Assets/Materials/Vector.mat.meta new file mode 100644 index 0000000..08a3115 --- /dev/null +++ b/Assets/Materials/Vector.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2ed3922fd675db6428789df9f6b481aa +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/VertexLit.mat b/Assets/Materials/VertexLit.mat new file mode 100644 index 0000000..4055c15 --- /dev/null +++ b/Assets/Materials/VertexLit.mat @@ -0,0 +1,79 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: VertexLit + m_Shader: {fileID: 4800000, guid: bb988dd04b43f964cb32c8b2e78e0366, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _Dark: {r: 0.14150941, g: 0.14150941, b: 0.14150941, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _Mid: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/Materials/VertexLit.mat.meta b/Assets/Materials/VertexLit.mat.meta new file mode 100644 index 0000000..9340bde --- /dev/null +++ b/Assets/Materials/VertexLit.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 262bfa3f5d11ba44db0c4a3f69e6808a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes.meta b/Assets/NaughtyAttributes.meta new file mode 100644 index 0000000..6137936 --- /dev/null +++ b/Assets/NaughtyAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 76e4ad5699597584aaf09c861e76e25b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation.meta b/Assets/NaughtyAttributes/Documentation.meta new file mode 100644 index 0000000..df80bdc --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 8dde3911cdcacad4cbe3192d388a5218 +folderAsset: yes +timeCreated: 1508669465 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/BlankSpace_Code.PNG b/Assets/NaughtyAttributes/Documentation/BlankSpace_Code.PNG new file mode 100644 index 0000000..dc6b1b2 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/BlankSpace_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/BlankSpace_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/BlankSpace_Code.PNG.meta new file mode 100644 index 0000000..9e74b46 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/BlankSpace_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 022c178ec9e442345958ad25512a17f4 +timeCreated: 1508669477 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/BlankSpace_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/BlankSpace_Inspector.PNG new file mode 100644 index 0000000..bf7450f Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/BlankSpace_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/BlankSpace_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/BlankSpace_Inspector.PNG.meta new file mode 100644 index 0000000..972a91f --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/BlankSpace_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 17ab0384d85cb744595133fcff8efb9d +timeCreated: 1508669477 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/BoxGroup_Code.PNG b/Assets/NaughtyAttributes/Documentation/BoxGroup_Code.PNG new file mode 100644 index 0000000..33f3d86 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/BoxGroup_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/BoxGroup_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/BoxGroup_Code.PNG.meta new file mode 100644 index 0000000..7f1d43a --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/BoxGroup_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b962d99ba1e86044ea453878b9fd1ad6 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/BoxGroup_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/BoxGroup_Inspector.PNG new file mode 100644 index 0000000..624d4f7 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/BoxGroup_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/BoxGroup_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/BoxGroup_Inspector.PNG.meta new file mode 100644 index 0000000..bee4dee --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/BoxGroup_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 9b966e4d3fd75654cbfe73a12abb0b40 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Button_Code.PNG b/Assets/NaughtyAttributes/Documentation/Button_Code.PNG new file mode 100644 index 0000000..8b4d1b0 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Button_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Button_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/Button_Code.PNG.meta new file mode 100644 index 0000000..80a655c --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Button_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 76b0b7c29f8441540a1cf986b45f6a7c +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Button_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/Button_Inspector.PNG new file mode 100644 index 0000000..08ee979 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Button_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Button_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/Button_Inspector.PNG.meta new file mode 100644 index 0000000..c7f2391 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Button_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 794a606ccada1c449a6f12143f5d8ef6 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Dropdown_Code.PNG b/Assets/NaughtyAttributes/Documentation/Dropdown_Code.PNG new file mode 100644 index 0000000..fdbad05 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Dropdown_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Dropdown_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/Dropdown_Code.PNG.meta new file mode 100644 index 0000000..39c74fc --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Dropdown_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a8c6bf35d7527a44e93ce41d925b07f0 +timeCreated: 1508767592 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Dropdown_Inspector.gif b/Assets/NaughtyAttributes/Documentation/Dropdown_Inspector.gif new file mode 100644 index 0000000..ffa5252 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Dropdown_Inspector.gif differ diff --git a/Assets/NaughtyAttributes/Documentation/Dropdown_Inspector.gif.meta b/Assets/NaughtyAttributes/Documentation/Dropdown_Inspector.gif.meta new file mode 100644 index 0000000..9986230 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Dropdown_Inspector.gif.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: c1db80a2110426d4f90e8c42467ca2c6 +timeCreated: 1508767592 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/EnableIf_Code.PNG b/Assets/NaughtyAttributes/Documentation/EnableIf_Code.PNG new file mode 100644 index 0000000..b253129 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/EnableIf_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/EnableIf_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/EnableIf_Code.PNG.meta new file mode 100644 index 0000000..37e31d6 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/EnableIf_Code.PNG.meta @@ -0,0 +1,84 @@ +fileFormatVersion: 2 +guid: 020173797840d4f49905844cc0a64fcd +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 5 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/EnableIf_Code2.PNG b/Assets/NaughtyAttributes/Documentation/EnableIf_Code2.PNG new file mode 100644 index 0000000..c09608f Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/EnableIf_Code2.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/EnableIf_Code2.PNG.meta b/Assets/NaughtyAttributes/Documentation/EnableIf_Code2.PNG.meta new file mode 100644 index 0000000..5618697 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/EnableIf_Code2.PNG.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 1846cf0f022944444af375235e7e33c7 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 7 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/EnableIf_Inspector.gif b/Assets/NaughtyAttributes/Documentation/EnableIf_Inspector.gif new file mode 100644 index 0000000..3855dec Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/EnableIf_Inspector.gif differ diff --git a/Assets/NaughtyAttributes/Documentation/EnableIf_Inspector.gif.meta b/Assets/NaughtyAttributes/Documentation/EnableIf_Inspector.gif.meta new file mode 100644 index 0000000..1ad5e46 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/EnableIf_Inspector.gif.meta @@ -0,0 +1,84 @@ +fileFormatVersion: 2 +guid: 55dace8f2296cf94ab88a1838ed4d7fe +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 5 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/InfoBox_Code.PNG b/Assets/NaughtyAttributes/Documentation/InfoBox_Code.PNG new file mode 100644 index 0000000..83103bd Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/InfoBox_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/InfoBox_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/InfoBox_Code.PNG.meta new file mode 100644 index 0000000..0a73839 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/InfoBox_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 93610132c9d0ac5469afc61d66817c99 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/InfoBox_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/InfoBox_Inspector.PNG new file mode 100644 index 0000000..369b6b0 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/InfoBox_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/InfoBox_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/InfoBox_Inspector.PNG.meta new file mode 100644 index 0000000..44fd1b8 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/InfoBox_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: edcea8333d68ae945ad1c760ae2d1562 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Label_Code.PNG b/Assets/NaughtyAttributes/Documentation/Label_Code.PNG new file mode 100644 index 0000000..f151f5c Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Label_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Label_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/Label_Code.PNG.meta new file mode 100644 index 0000000..ec4c0c1 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Label_Code.PNG.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: a9db3a118bcc6d14fb3b4722d33bd2b0 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Label_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/Label_Inspector.PNG new file mode 100644 index 0000000..7f8e1dd Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Label_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Label_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/Label_Inspector.PNG.meta new file mode 100644 index 0000000..c1bde08 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Label_Inspector.PNG.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 5d09d80a59968c4428c728d09f02f7fa +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Code.PNG b/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Code.PNG new file mode 100644 index 0000000..f514c2e Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Code.PNG.meta new file mode 100644 index 0000000..f270607 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 20085933a153a464f8a4db07e9001f42 +timeCreated: 1508669477 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Inspector.PNG new file mode 100644 index 0000000..6086b40 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Inspector.PNG.meta new file mode 100644 index 0000000..100a052 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/MinMaxSlider_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: ca85e66652051634e815f4f8368f98d9 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Code.PNG b/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Code.PNG new file mode 100644 index 0000000..0f3fd47 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Code.PNG.meta new file mode 100644 index 0000000..65031fa --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 50afb956ae7768b4b89d7b5ef321367f +timeCreated: 1508669477 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Inspector.gif b/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Inspector.gif new file mode 100644 index 0000000..185c9cc Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Inspector.gif differ diff --git a/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Inspector.gif.meta b/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Inspector.gif.meta new file mode 100644 index 0000000..46bb517 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/MinValueMaxValue_Inspector.gif.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 549658017be426742a56b94a5958b6f6 +timeCreated: 1508669477 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/OnValueChanged_Code.PNG b/Assets/NaughtyAttributes/Documentation/OnValueChanged_Code.PNG new file mode 100644 index 0000000..969f29f Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/OnValueChanged_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/OnValueChanged_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/OnValueChanged_Code.PNG.meta new file mode 100644 index 0000000..f75ae0f --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/OnValueChanged_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1d9a471100e0c9748a60242500085501 +timeCreated: 1508669477 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ProgressBar_Code.png b/Assets/NaughtyAttributes/Documentation/ProgressBar_Code.png new file mode 100644 index 0000000..bbc547b Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ProgressBar_Code.png differ diff --git a/Assets/NaughtyAttributes/Documentation/ProgressBar_Code.png.meta b/Assets/NaughtyAttributes/Documentation/ProgressBar_Code.png.meta new file mode 100644 index 0000000..3281499 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ProgressBar_Code.png.meta @@ -0,0 +1,77 @@ +fileFormatVersion: 2 +guid: 5817ff65803edc24ca258286e6d2fd33 +timeCreated: 1518636277 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ProgressBar_Inspector.gif b/Assets/NaughtyAttributes/Documentation/ProgressBar_Inspector.gif new file mode 100644 index 0000000..7aada24 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ProgressBar_Inspector.gif differ diff --git a/Assets/NaughtyAttributes/Documentation/ProgressBar_Inspector.gif.meta b/Assets/NaughtyAttributes/Documentation/ProgressBar_Inspector.gif.meta new file mode 100644 index 0000000..b106c8b --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ProgressBar_Inspector.gif.meta @@ -0,0 +1,77 @@ +fileFormatVersion: 2 +guid: 631c492cc54906542851734be1231fab +timeCreated: 1518636277 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ReadOnly_Code.PNG b/Assets/NaughtyAttributes/Documentation/ReadOnly_Code.PNG new file mode 100644 index 0000000..603149b Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ReadOnly_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ReadOnly_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/ReadOnly_Code.PNG.meta new file mode 100644 index 0000000..7772c2c --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ReadOnly_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 869278751dbd45549a12050d9fea7425 +timeCreated: 1508862811 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ReadOnly_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/ReadOnly_Inspector.PNG new file mode 100644 index 0000000..aaad6ae Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ReadOnly_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ReadOnly_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/ReadOnly_Inspector.PNG.meta new file mode 100644 index 0000000..27e94d7 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ReadOnly_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 867cf9de018b6fd46a306be250cd7196 +timeCreated: 1508862811 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ReorderableList_Code.PNG b/Assets/NaughtyAttributes/Documentation/ReorderableList_Code.PNG new file mode 100644 index 0000000..23de97e Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ReorderableList_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ReorderableList_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/ReorderableList_Code.PNG.meta new file mode 100644 index 0000000..4a0ae92 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ReorderableList_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d62a3181965d92a42981ed3d66adf987 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ReorderableList_Inspector.gif b/Assets/NaughtyAttributes/Documentation/ReorderableList_Inspector.gif new file mode 100644 index 0000000..bdf80f3 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ReorderableList_Inspector.gif differ diff --git a/Assets/NaughtyAttributes/Documentation/ReorderableList_Inspector.gif.meta b/Assets/NaughtyAttributes/Documentation/ReorderableList_Inspector.gif.meta new file mode 100644 index 0000000..37579df --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ReorderableList_Inspector.gif.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a82acdae22e140148b602d98ff67b7b6 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Required_Code.PNG b/Assets/NaughtyAttributes/Documentation/Required_Code.PNG new file mode 100644 index 0000000..ac086f4 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Required_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Required_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/Required_Code.PNG.meta new file mode 100644 index 0000000..ab0153c --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Required_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: eec3cb64c7158614781457f102d28654 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Required_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/Required_Inspector.PNG new file mode 100644 index 0000000..97e28b8 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Required_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Required_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/Required_Inspector.PNG.meta new file mode 100644 index 0000000..2f3243e --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Required_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: c496c0d39ae55ec4db47a54c72510db1 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Code.PNG b/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Code.PNG new file mode 100644 index 0000000..115558e Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Code.PNG.meta new file mode 100644 index 0000000..14c38fe --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 7a7b2846b5f13794db2650ade442c8bb +timeCreated: 1508833884 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Inspector.gif b/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Inspector.gif new file mode 100644 index 0000000..414efa7 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Inspector.gif differ diff --git a/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Inspector.gif.meta b/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Inspector.gif.meta new file mode 100644 index 0000000..2913c61 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ResizableTextArea_Inspector.gif.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 4d411d3022fdb9a4894b786023ff55c3 +timeCreated: 1508833884 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Section_Code.PNG b/Assets/NaughtyAttributes/Documentation/Section_Code.PNG new file mode 100644 index 0000000..93d1a9e Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Section_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Section_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/Section_Code.PNG.meta new file mode 100644 index 0000000..6af2cda --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Section_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: baeaf9f9d9ca90b4d8418fd8179195dd +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Section_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/Section_Inspector.PNG new file mode 100644 index 0000000..4fab082 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Section_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Section_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/Section_Inspector.PNG.meta new file mode 100644 index 0000000..93dea50 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Section_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 0cdac3f93cb6b764284bcfad3302eb59 +timeCreated: 1508669477 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Code.PNG b/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Code.PNG new file mode 100644 index 0000000..85ff839 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Code.PNG.meta new file mode 100644 index 0000000..fe4e240 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: bb1c59dc18499aa4d87ea7c35f80101b +timeCreated: 1509093800 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Inspector.PNG new file mode 100644 index 0000000..ebf989a Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Inspector.PNG.meta new file mode 100644 index 0000000..00b5dda --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ShowAssetPreview_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 9fef8c6f9ed6f5b48b3f90e657bd71d5 +timeCreated: 1509093800 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ShowIf_Code.PNG b/Assets/NaughtyAttributes/Documentation/ShowIf_Code.PNG new file mode 100644 index 0000000..b7d7135 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ShowIf_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ShowIf_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/ShowIf_Code.PNG.meta new file mode 100644 index 0000000..a88ee55 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ShowIf_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8e647f629215ab5479f1f2e9e4e10f89 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ShowIf_Code2.PNG b/Assets/NaughtyAttributes/Documentation/ShowIf_Code2.PNG new file mode 100644 index 0000000..6d936d8 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ShowIf_Code2.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ShowIf_Code2.PNG.meta b/Assets/NaughtyAttributes/Documentation/ShowIf_Code2.PNG.meta new file mode 100644 index 0000000..f852e29 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ShowIf_Code2.PNG.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 1308689303de57648b40ba65250316e1 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 7 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ShowIf_Inspector.gif b/Assets/NaughtyAttributes/Documentation/ShowIf_Inspector.gif new file mode 100644 index 0000000..0f032ca Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ShowIf_Inspector.gif differ diff --git a/Assets/NaughtyAttributes/Documentation/ShowIf_Inspector.gif.meta b/Assets/NaughtyAttributes/Documentation/ShowIf_Inspector.gif.meta new file mode 100644 index 0000000..f9e8a8b --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ShowIf_Inspector.gif.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 64454bc61e4706d4792d7f2d289ba722 +timeCreated: 1508669477 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Code.PNG b/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Code.PNG new file mode 100644 index 0000000..e721b91 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Code.PNG.meta new file mode 100644 index 0000000..26bcbd7 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 910bb6ff194fd964b952f93e9c3768cd +timeCreated: 1510927252 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Inspector.PNG new file mode 100644 index 0000000..8969c64 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Inspector.PNG.meta new file mode 100644 index 0000000..c7ffb83 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ShowNativeProperty_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: cdd1d4dbda8666943acca44fba1b3772 +timeCreated: 1510927311 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Code.PNG b/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Code.PNG new file mode 100644 index 0000000..4bac8d6 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Code.PNG.meta new file mode 100644 index 0000000..232434b --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: c38bd18425e6caf4c96de9e9dc75d44a +timeCreated: 1508840999 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Inspector.PNG new file mode 100644 index 0000000..a1f3795 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Inspector.PNG.meta new file mode 100644 index 0000000..54c469a --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ShowNonSerializedField_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: fa565d87ea4765f43ab14b962d78d1d3 +timeCreated: 1508840999 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Slider_Code.PNG b/Assets/NaughtyAttributes/Documentation/Slider_Code.PNG new file mode 100644 index 0000000..336bdf3 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Slider_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Slider_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/Slider_Code.PNG.meta new file mode 100644 index 0000000..909445c --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Slider_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: c2e8583b447997d4894f6882accea083 +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Slider_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/Slider_Inspector.PNG new file mode 100644 index 0000000..e745e41 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Slider_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Slider_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/Slider_Inspector.PNG.meta new file mode 100644 index 0000000..36d1aca --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Slider_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 53adc0cfbf605284a9df9e29f962da09 +timeCreated: 1508669477 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Tag_Code.PNG b/Assets/NaughtyAttributes/Documentation/Tag_Code.PNG new file mode 100644 index 0000000..d9dd013 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Tag_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Tag_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/Tag_Code.PNG.meta new file mode 100644 index 0000000..4a3e2fd --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Tag_Code.PNG.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: ba7e393195dbdc14ea10a898f571b05b +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/Tag_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/Tag_Inspector.PNG new file mode 100644 index 0000000..a5e616a Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/Tag_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/Tag_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/Tag_Inspector.PNG.meta new file mode 100644 index 0000000..d15f534 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/Tag_Inspector.PNG.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 743d1d7bb35066144812aae759d48d8a +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ValidateInput_Code.PNG b/Assets/NaughtyAttributes/Documentation/ValidateInput_Code.PNG new file mode 100644 index 0000000..9ff2ea7 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ValidateInput_Code.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ValidateInput_Code.PNG.meta b/Assets/NaughtyAttributes/Documentation/ValidateInput_Code.PNG.meta new file mode 100644 index 0000000..1524e0a --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ValidateInput_Code.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: ea806f31fb59c894e84a667948d116fc +timeCreated: 1508669478 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Documentation/ValidateInput_Inspector.PNG b/Assets/NaughtyAttributes/Documentation/ValidateInput_Inspector.PNG new file mode 100644 index 0000000..084d203 Binary files /dev/null and b/Assets/NaughtyAttributes/Documentation/ValidateInput_Inspector.PNG differ diff --git a/Assets/NaughtyAttributes/Documentation/ValidateInput_Inspector.PNG.meta b/Assets/NaughtyAttributes/Documentation/ValidateInput_Inspector.PNG.meta new file mode 100644 index 0000000..28ea083 --- /dev/null +++ b/Assets/NaughtyAttributes/Documentation/ValidateInput_Inspector.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 147278501eff2104aa2bdb9c911b580f +timeCreated: 1508669477 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/README.html b/Assets/NaughtyAttributes/README.html new file mode 100644 index 0000000..4a8f30a --- /dev/null +++ b/Assets/NaughtyAttributes/README.html @@ -0,0 +1,1355 @@ + + + + + README.md - Grip + + + + + + +
+
+ + + +
+
+
+
+ +

+ + README.md +

+ +
+

+NaughtyAttributes

+

NaughtyAttributes is an extension for the Unity Inspector.

+

It expands the range of attributes that Unity provides so that you can create powerful inspectors without the need of custom editors or property drawers. It also provides attributes that can be applied to non-serialized fields or functions.

+

It is implemented by replacing the default Unity Inspector. This means that if you have any custom editors, NaughtyAttributes will not work with them. All of your custom editors and property drawers are not affected in any way.

+

+System Requirements

+

Unity 2017.1.0 or later versions. Feel free to try older version. Don't forget to include the NaughtyAttributes namespace.

+

+Drawer Attributes

+

Provide special draw options to serialized fields. +A field can have only one DrawerAttribute. If a field has more than one, only the bottom one will be used.

+

+Slider

+

The same as Unity's Range attribute. +There is no difference between the two, you can use whatever you like, I just wanted to support a custom slider attribute.

+

code

+

inspector

+

+MinMaxSlider

+

A double slider. The min value is saved to the X property, and the max value is saved to the Y property of a Vector2 field.

+

code

+

inspector

+

+ReorderableList

+

Provides array type fields with an interface for easy reordering of elements.

+

code

+

inspector

+

+Button

+

A method can be marked as a button. A button appears in the inspector and executes the method if clicked. +Works both with instance and static methods.

+

code

+

inspector

+

+Dropdown

+

Provides an interface for dropdown value selection.

+

code

+

inspector

+

+ResizableTextArea

+

A resizable text area where you can see the whole text. +Unlike Unity's Multiline and TextArea attributes where you can see only 3 rows of a given text, and in order to see it or modify it you have to manually scroll down to the desired row.

+

code

+

inspector

+

+ShowNonSerializedField

+

Shows non-serialized fields in the inspector. +All non-serialized fields are displayed at the bottom of the inspector before the method buttons. +Keep in mind that if you change a non-static non-serialized field in the code - the value in the inspector will be updated after you press Play in the editor. +There is no such issue with static non-serialized fields because their values are updated at compile time. +It supports only certain types (bool, int, long, float, double, string, Vector2, Vector3, Vector4, Color, Bounds, Rect, UnityEngine.Object).

+

code

+

inspector

+

+ShowNativeProperty

+

Shows native C# properties in the inspector. +All native properties are displayed at the bottom of the inspector after the non-serialized fields and before the method buttons. +It supports only certain types (bool, int, long, float, double, string, Vector2, Vector3, Vector4, Color, Bounds, Rect, UnityEngine.Object).

+

code

+

inspector

+

+ReadOnly

+

Makes a field read only.

+

code

+

inspector

+

+EnableIf / DisableIf

+

code

+

inspector

+

You can have more than one condition.

+

code

+

+ShowAssetPreview

+

Shows the texture preview of a given asset (Sprite, Prefab...)

+

code

+

inspector

+

+ProgressBar

+

code

+

inspector

+

+Label

+

Override default field label

+

code

+

inspector

+

+Tag

+

Enable Tag selection with string field

+

code

+

inspector

+

+DrawCondition Attributes

+

Can be used to specify when a given serialized field is visible, and when not. A field can have only one DrawConditionAttribute.

+

+ShowIf / HideIf

+

code

+

inspector

+

You can have more than one condition.

+

code

+

+Group Attributes

+

Serialized fields can be grouped in different groups. +A field can have only one GroupAttribute. If a field has more than one, only the bottom one will be used.

+

+BoxGroup

+

Surrounds grouped fields with a box.

+

code

+

inspector

+

+Validator Attributes

+

Used for validating the fields. A field can have infinite number of validator attributes.

+

+MinValue / MaxValue

+

Clamps integer and float fields.

+

code

+

inspector

+

+Required

+

Used to remind the developer that a given reference type field is required.

+

code

+

inspector

+

+ValidateInput

+

The most powerful ValidatorAttribute.

+

code

+

inspector

+

+Meta Attributes

+

Give the fields meta data. A field can have infinite number of meta attributes.

+

+InfoBox

+

Used for providing additional information.

+

code

+

inspector

+

+OnValueChanged

+

Detects a value change and executes a callback. +Keep in mind that the event is detected only when the value is changed from the inspector. +If you want a runtime event, you should probably use an event/delegate and subscribe to it.

+

code

+

+How to create your own attributes

+

Lets say you want to implement your own [ReadOnly] attribute.

+

First you have to create a ReadOnlyAttribute class

+
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
+public class ReadOnlyAttribute : DrawerAttribute
+{
+}
+
+

Then you need to create a drawer for that attribute

+
[PropertyDrawer(typeof(ReadOnlyAttribute))]
+public class ReadOnlyPropertyDrawer : PropertyDrawer
+{
+	public override void DrawProperty(SerializedProperty property)
+	{
+		GUI.enabled = false;
+		EditorGUILayout.PropertyField(property, true);
+		GUI.enabled = true;
+	}
+}
+
+

Last, in order for the editor to recognize the drawer for this attribute, you have to press the Tools/NaughtyAttributes/Update Attributes Database menu item in the editor.

+

+License

+

MIT License

+

Copyright (c) 2017 Denis Rizov

+

Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:

+

The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

+ +
+
+
+
+
+ + + +
+
 
+
+ + \ No newline at end of file diff --git a/Assets/NaughtyAttributes/README.html.meta b/Assets/NaughtyAttributes/README.html.meta new file mode 100644 index 0000000..42c42d4 --- /dev/null +++ b/Assets/NaughtyAttributes/README.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f1c5c604e6d27cc4d86e81f45c704e11 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts.meta b/Assets/NaughtyAttributes/Scripts.meta new file mode 100644 index 0000000..238d7e9 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 66686847ee1fa044bb15dfe473666178 +folderAsset: yes +timeCreated: 1507995546 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core.meta b/Assets/NaughtyAttributes/Scripts/Core.meta new file mode 100644 index 0000000..a055450 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 1f67e408a6d0adf4ab29d095ccd8b116 +folderAsset: yes +timeCreated: 1507998942 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ConditionOperator.cs b/Assets/NaughtyAttributes/Scripts/Core/ConditionOperator.cs new file mode 100644 index 0000000..2474f6d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ConditionOperator.cs @@ -0,0 +1,10 @@ +using System; + +namespace NaughtyAttributes +{ + public enum ConditionOperator + { + And, + Or + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/ConditionOperator.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/ConditionOperator.cs.meta new file mode 100644 index 0000000..21b1100 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ConditionOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8da69fd2354ea264bb1c54362ee02938 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes.meta new file mode 100644 index 0000000..1b422d7 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 0d8ad70d0e1e04248b1f5c5d5fb358f4 +folderAsset: yes +timeCreated: 1508414568 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/DrawConditionAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/DrawConditionAttribute.cs new file mode 100644 index 0000000..30b684f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/DrawConditionAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + public class DrawConditionAttribute : NaughtyAttribute + { + + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/DrawConditionAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/DrawConditionAttribute.cs.meta new file mode 100644 index 0000000..6d27b22 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/DrawConditionAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 8fd9817e8bf3e054ab8e73b47bdce8c7 +timeCreated: 1508414568 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/HideIfAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/HideIfAttribute.cs new file mode 100644 index 0000000..b739135 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/HideIfAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class HideIfAttribute : ShowIfAttribute + { + public HideIfAttribute(string condition) + : base(condition) + { + Reversed = true; + } + + public HideIfAttribute(ConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Reversed = true; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/HideIfAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/HideIfAttribute.cs.meta new file mode 100644 index 0000000..363b863 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/HideIfAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: aafc3a255165311419b7070198e7ffaf +timeCreated: 1508414568 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/ShowIfAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/ShowIfAttribute.cs new file mode 100644 index 0000000..46059f3 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/ShowIfAttribute.cs @@ -0,0 +1,24 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ShowIfAttribute : DrawConditionAttribute + { + public string[] Conditions { get; private set; } + public ConditionOperator ConditionOperator { get; private set; } + public bool Reversed { get; protected set; } + + public ShowIfAttribute(string condition) + { + ConditionOperator = ConditionOperator.And; + Conditions = new string[1] { condition }; + } + + public ShowIfAttribute(ConditionOperator conditionOperator, params string[] conditions) + { + ConditionOperator = conditionOperator; + Conditions = conditions; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/ShowIfAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/ShowIfAttribute.cs.meta new file mode 100644 index 0000000..cff1299 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawConditionAttributes/ShowIfAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 6a9e9448e6e70094297d49ec9c82c6e1 +timeCreated: 1508414568 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes.meta new file mode 100644 index 0000000..756c714 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: c76425e719cd4424d868674bcfb233f2 +folderAsset: yes +timeCreated: 1508151410 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ButtonAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ButtonAttribute.cs new file mode 100644 index 0000000..9e89ef6 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ButtonAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class ButtonAttribute : DrawerAttribute + { + public string Text { get; private set; } + + public ButtonAttribute(string text = null) + { + this.Text = text; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ButtonAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ButtonAttribute.cs.meta new file mode 100644 index 0000000..3f00112 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ButtonAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: d61d9be90aa48764096a2bea37c9bd60 +timeCreated: 1508591778 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DisableIfAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DisableIfAttribute.cs new file mode 100644 index 0000000..d9db224 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DisableIfAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class DisableIfAttribute : EnableIfAttribute + { + public DisableIfAttribute(string condition) + : base(condition) + { + Reversed = true; + } + + public DisableIfAttribute(ConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Reversed = true; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DisableIfAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DisableIfAttribute.cs.meta new file mode 100644 index 0000000..7315069 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DisableIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dac53a514fd03bb48b3fae8d3d23bf78 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs new file mode 100644 index 0000000..b3a3a67 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public abstract class DrawerAttribute : NaughtyAttribute + { + } +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs.meta new file mode 100644 index 0000000..2043b25 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 57360d74732bf2749b2f8d5e0a0ea6f5 +timeCreated: 1508151410 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs new file mode 100644 index 0000000..0a433f4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class DropdownAttribute : DrawerAttribute + { + public string ValuesFieldName { get; private set; } + + public DropdownAttribute(string valuesFieldName) + { + this.ValuesFieldName = valuesFieldName; + } + } + + public interface IDropdownList : IEnumerable> + { + } + + public class DropdownList : IDropdownList + { + private List> values; + + public DropdownList() + { + this.values = new List>(); + } + + public void Add(string displayName, T value) + { + this.values.Add(new KeyValuePair(displayName, value)); + } + + public IEnumerator> GetEnumerator() + { + return this.values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this.GetEnumerator(); + } + + public static explicit operator DropdownList(DropdownList target) + { + DropdownList result = new DropdownList(); + foreach (var kvp in target) + { + result.Add(kvp.Key, kvp.Value); + } + + return result; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs.meta new file mode 100644 index 0000000..a402b5a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: cd3b8c98b0803554e9152991fe806c62 +timeCreated: 1508752474 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnableIfAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnableIfAttribute.cs new file mode 100644 index 0000000..d5f12d4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnableIfAttribute.cs @@ -0,0 +1,24 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class EnableIfAttribute : DrawerAttribute + { + public string[] Conditions { get; private set; } + public ConditionOperator ConditionOperator { get; private set; } + public bool Reversed { get; protected set; } + + public EnableIfAttribute(string condition) + { + ConditionOperator = ConditionOperator.And; + Conditions = new string[1] { condition }; + } + + public EnableIfAttribute(ConditionOperator conditionOperator, params string[] conditions) + { + ConditionOperator = conditionOperator; + Conditions = conditions; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnableIfAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnableIfAttribute.cs.meta new file mode 100644 index 0000000..b2e4973 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnableIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3ef98b2c0ffe1b4c91fbec23d77898e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/LabelAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/LabelAttribute.cs new file mode 100644 index 0000000..d8a99d1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/LabelAttribute.cs @@ -0,0 +1,18 @@ +using System; + +namespace NaughtyAttributes +{ + /// + /// Override default label + /// + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class LabelAttribute : DrawerAttribute + { + public string Label { get; private set; } + + public LabelAttribute(string label) + { + this.Label = label; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/LabelAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/LabelAttribute.cs.meta new file mode 100644 index 0000000..152c686 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/LabelAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e58df0ada05db63488ddd96c571d7bc1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs new file mode 100644 index 0000000..aa429de --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MinMaxSliderAttribute : DrawerAttribute + { + public float MinValue { get; private set; } + public float MaxValue { get; private set; } + + public MinMaxSliderAttribute(float minValue, float maxValue) + { + this.MinValue = minValue; + this.MaxValue = maxValue; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta new file mode 100644 index 0000000..8dd63f3 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 61d133a2d203a77419f35652a7f3fae0 +timeCreated: 1508427131 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs new file mode 100644 index 0000000..0649477 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs @@ -0,0 +1,32 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ProgressBarAttribute : DrawerAttribute + { + public string Name { get; private set; } + public float MaxValue { get; private set; } + public ProgressBarColor Color { get; private set; } + + public ProgressBarAttribute(string name = "", float maxValue = 100, ProgressBarColor color = ProgressBarColor.Blue) + { + Name = name; + MaxValue = maxValue; + Color = color; + } + } + + public enum ProgressBarColor + { + Red, + Pink, + Orange, + Yellow, + Green, + Blue, + Indigo, + Violet, + White + } +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs.meta new file mode 100644 index 0000000..65bfa95 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 8d8eb74e78cba7b43b3025525c5084b9 +timeCreated: 1518435237 +licenseType: Pro +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs new file mode 100644 index 0000000..d29794a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ReadOnlyAttribute : DrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs.meta new file mode 100644 index 0000000..54b0ced --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 4fa676ebc6d589c44817272871db148b +timeCreated: 1508862052 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReorderableListAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReorderableListAttribute.cs new file mode 100644 index 0000000..ff1a701 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReorderableListAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ReorderableListAttribute : DrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReorderableListAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReorderableListAttribute.cs.meta new file mode 100644 index 0000000..59e4c99 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReorderableListAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: ff85489452472c241987e5ba4c5e512a +timeCreated: 1508402303 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs new file mode 100644 index 0000000..e84e664 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ResizableTextAreaAttribute : DrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta new file mode 100644 index 0000000..43e40fd --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 1793ea6e464ee6448930ecf133ed6a1d +timeCreated: 1508583166 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs new file mode 100644 index 0000000..6b35444 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ShowAssetPreviewAttribute : DrawerAttribute + { + public int Width { get; private set; } + public int Height { get; private set; } + + public ShowAssetPreviewAttribute(int width = 64, int height = 64) + { + this.Width = width; + this.Height = height; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta new file mode 100644 index 0000000..bcdeb2c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 313b856a920a987418d6437a8e20a59f +timeCreated: 1509089502 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNativePropertyAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNativePropertyAttribute.cs new file mode 100644 index 0000000..bb8a7c7 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNativePropertyAttribute.cs @@ -0,0 +1,11 @@ +using System; +using UnityEngine; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] + public class ShowNativePropertyAttribute : DrawerAttribute + { + + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNativePropertyAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNativePropertyAttribute.cs.meta new file mode 100644 index 0000000..29f619d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNativePropertyAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: acc7d7e8ec9e47a4aaf4167698ae076f +timeCreated: 1510926376 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNonSerializedFieldAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNonSerializedFieldAttribute.cs new file mode 100644 index 0000000..8f311ef --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNonSerializedFieldAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ShowNonSerializedFieldAttribute : DrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNonSerializedFieldAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNonSerializedFieldAttribute.cs.meta new file mode 100644 index 0000000..d21b234 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowNonSerializedFieldAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: a176aad85de73b34ba3ecd4f7baa367b +timeCreated: 1508835721 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SliderAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SliderAttribute.cs new file mode 100644 index 0000000..ece2b58 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SliderAttribute.cs @@ -0,0 +1,23 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class SliderAttribute : DrawerAttribute + { + public float MinValue { get; private set; } + public float MaxValue { get; private set; } + + public SliderAttribute(float minValue, float maxValue) + { + this.MinValue = minValue; + this.MaxValue = maxValue; + } + + public SliderAttribute(int minValue, int maxValue) + { + this.MaxValue = minValue; + this.MaxValue = maxValue; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SliderAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SliderAttribute.cs.meta new file mode 100644 index 0000000..b121855 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SliderAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: f75eef8142877c345ba9b95046dd3bf6 +timeCreated: 1508422518 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs new file mode 100644 index 0000000..f7829c6 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs @@ -0,0 +1,12 @@ +using System; + +namespace NaughtyAttributes +{ + /// + /// Make tags appear as tag popup fields + /// + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class TagAttribute : DrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs.meta new file mode 100644 index 0000000..475b869 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ad140cd5debdba44aa6db74894a5e913 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes.meta b/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes.meta new file mode 100644 index 0000000..4455f01 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 86ca4f90dd05bc448959ecd8f44097a7 +folderAsset: yes +timeCreated: 1508330803 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/BoxGroupAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/BoxGroupAttribute.cs new file mode 100644 index 0000000..a6f3b49 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/BoxGroupAttribute.cs @@ -0,0 +1,13 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class BoxGroupAttribute : GroupAttribute + { + public BoxGroupAttribute(string name = "") + : base(name) + { + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/BoxGroupAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/BoxGroupAttribute.cs.meta new file mode 100644 index 0000000..fcdb278 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/BoxGroupAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 88c5a8d79f9e72a43a4cfa67fd08fdd6 +timeCreated: 1508326108 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/GroupAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/GroupAttribute.cs new file mode 100644 index 0000000..a317fe2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/GroupAttribute.cs @@ -0,0 +1,14 @@ +using System; + +namespace NaughtyAttributes +{ + public abstract class GroupAttribute : NaughtyAttribute + { + public string Name { get; private set; } + + public GroupAttribute(string name) + { + this.Name = name; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/GroupAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/GroupAttribute.cs.meta new file mode 100644 index 0000000..db3cc39 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/GroupAttributes/GroupAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: beb48511ef6091e4ba054ad1b618933c +timeCreated: 1508326108 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes.meta new file mode 100644 index 0000000..f2ed90e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 51ee806b39c5fb343ae7d268404d8c67 +folderAsset: yes +timeCreated: 1508497398 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/InfoBoxAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/InfoBoxAttribute.cs new file mode 100644 index 0000000..d09c616 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/InfoBoxAttribute.cs @@ -0,0 +1,31 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true, Inherited = true)] + public class InfoBoxAttribute : MetaAttribute + { + public string Text { get; private set; } + public InfoBoxType Type { get; private set; } + public string VisibleIf { get; private set; } + + public InfoBoxAttribute(string text, InfoBoxType type = InfoBoxType.Normal, string visibleIf = null) + { + this.Text = text; + this.Type = type; + this.VisibleIf = visibleIf; + } + + public InfoBoxAttribute(string text, string visibleIf) + : this(text, InfoBoxType.Normal, visibleIf) + { + } + } + + public enum InfoBoxType + { + Normal, + Warning, + Error + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/InfoBoxAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/InfoBoxAttribute.cs.meta new file mode 100644 index 0000000..19cb564 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/InfoBoxAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 42c6184c84ab19d4382b06f9017f136d +timeCreated: 1508607449 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs new file mode 100644 index 0000000..ef2a451 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + public abstract class MetaAttribute : NaughtyAttribute + { + public int Order { get; set; } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs.meta new file mode 100644 index 0000000..5f5e5d7 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: fcd6d339bcd667044a48d41a78a7830c +timeCreated: 1508497398 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs new file mode 100644 index 0000000..ab826b8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true, Inherited = true)] + public class OnValueChangedAttribute : MetaAttribute + { + public string CallbackName { get; private set; } + + public OnValueChangedAttribute(string callbackName) + { + this.CallbackName = callbackName; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs.meta new file mode 100644 index 0000000..1452234 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: a144cdc17b6e4cf4f86692ae1dc7e4d7 +timeCreated: 1508610277 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttribute.cs new file mode 100644 index 0000000..6251af9 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + // The base class for all naughty attributes + public class NaughtyAttribute : Attribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttribute.cs.meta new file mode 100644 index 0000000..fdf1ddf --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 1accb89cb44c4a342a1857e5e3d13abb +timeCreated: 1508052914 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef new file mode 100644 index 0000000..b585d0b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef @@ -0,0 +1,12 @@ +{ + "name": "NaughtyAttributes.Core", + "references": [], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef.meta b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef.meta new file mode 100644 index 0000000..731749c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 776d03a35f1b52c4a9aed9f56d7b4229 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes.meta new file mode 100644 index 0000000..9bee434 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 8a655727c2e629a438ad94f60080b9ea +folderAsset: yes +timeCreated: 1508151410 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs new file mode 100644 index 0000000..4c54127 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MaxValueAttribute : ValidatorAttribute + { + public float MaxValue { get; private set; } + + public MaxValueAttribute(float maxValue) + { + this.MaxValue = maxValue; + } + + public MaxValueAttribute(int maxValue) + { + this.MaxValue = maxValue; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs.meta new file mode 100644 index 0000000..4ba3b5a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: e018059e7fe12fd42a3a1bba0dbbf9c5 +timeCreated: 1508047804 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs new file mode 100644 index 0000000..627e747 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MinValueAttribute : ValidatorAttribute + { + public float MinValue { get; private set; } + + public MinValueAttribute(float minValue) + { + this.MinValue = minValue; + } + + public MinValueAttribute(int minValue) + { + this.MinValue = minValue; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs.meta new file mode 100644 index 0000000..19450e8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 337be62eb8c929f4ab8b3d495a712a56 +timeCreated: 1508048805 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs new file mode 100644 index 0000000..903f658 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class RequiredAttribute : ValidatorAttribute + { + public string Message { get; private set; } + + public RequiredAttribute(string message = null) + { + this.Message = message; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs.meta new file mode 100644 index 0000000..068d000 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 0b70ebd0fbd89c648981f08469806779 +timeCreated: 1508655546 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs new file mode 100644 index 0000000..d024816 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ValidateInputAttribute : ValidatorAttribute + { + public string CallbackName { get; private set; } + public string Message { get; private set; } + + public ValidateInputAttribute(string callbackName, string message = null) + { + this.CallbackName = callbackName; + this.Message = message; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta new file mode 100644 index 0000000..ed365d1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: f13ea28cf56e89f4cb335e28c9ab5d9a +timeCreated: 1508657795 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs new file mode 100644 index 0000000..38222eb --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public abstract class ValidatorAttribute : NaughtyAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs.meta new file mode 100644 index 0000000..668f7e1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 5fac74a9575c45342be1e6dda45610ad +timeCreated: 1508151410 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor.meta b/Assets/NaughtyAttributes/Scripts/Editor.meta new file mode 100644 index 0000000..8110aa8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b76068e69df25a94ab378b0b6829c4f0 +folderAsset: yes +timeCreated: 1507995613 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes.meta b/Assets/NaughtyAttributes/Scripts/Editor/Attributes.meta new file mode 100644 index 0000000..3f8ebe7 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: bfd420e5bf6a25049b8fcea8b2f48c94 +folderAsset: yes +timeCreated: 1508153828 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/BaseAttribute.cs b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/BaseAttribute.cs new file mode 100644 index 0000000..b3fef44 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/BaseAttribute.cs @@ -0,0 +1,23 @@ +using System; + +namespace NaughtyAttributes.Editor +{ + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] + public abstract class BaseAttribute : Attribute, IAttribute + { + private Type targetAttributeType; + + public BaseAttribute(Type targetAttributeType) + { + this.targetAttributeType = targetAttributeType; + } + + public Type TargetAttributeType + { + get + { + return this.targetAttributeType; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/BaseAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/BaseAttribute.cs.meta new file mode 100644 index 0000000..d12b1ae --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/BaseAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: dd861c512b7cd804fa5f01b4d0e9f5bc +timeCreated: 1508424822 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/FieldDrawerAttribute.cs b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/FieldDrawerAttribute.cs new file mode 100644 index 0000000..e2de8b0 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/FieldDrawerAttribute.cs @@ -0,0 +1,11 @@ +using System; + +namespace NaughtyAttributes.Editor +{ + public class FieldDrawerAttribute : BaseAttribute + { + public FieldDrawerAttribute(Type targetAttributeType) : base(targetAttributeType) + { + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/FieldDrawerAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/FieldDrawerAttribute.cs.meta new file mode 100644 index 0000000..456e222 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/FieldDrawerAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: ad0dbf00ca9ec1e4290145dc40bda96f +timeCreated: 1508835980 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/IAttribute.cs b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/IAttribute.cs new file mode 100644 index 0000000..5d24b68 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/IAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes.Editor +{ + public interface IAttribute + { + Type TargetAttributeType { get; } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/IAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/IAttribute.cs.meta new file mode 100644 index 0000000..4b3a9d9 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/IAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: eec883c51d802eb49be41f384e227dad +timeCreated: 1508424822 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/MethodDrawerAttribute.cs b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/MethodDrawerAttribute.cs new file mode 100644 index 0000000..ad78d4b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/MethodDrawerAttribute.cs @@ -0,0 +1,11 @@ +using System; + +namespace NaughtyAttributes.Editor +{ + public class MethodDrawerAttribute : BaseAttribute + { + public MethodDrawerAttribute(Type targetAttributeType) : base(targetAttributeType) + { + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/MethodDrawerAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/MethodDrawerAttribute.cs.meta new file mode 100644 index 0000000..7b6acd3 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/MethodDrawerAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: b89ac4d9b78686548baa09fb0b103850 +timeCreated: 1508592495 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/NativePropertyDrawerAttribute.cs b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/NativePropertyDrawerAttribute.cs new file mode 100644 index 0000000..d60e141 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/NativePropertyDrawerAttribute.cs @@ -0,0 +1,11 @@ +using System; + +namespace NaughtyAttributes.Editor +{ + public class NativePropertyDrawerAttribute : BaseAttribute + { + public NativePropertyDrawerAttribute(Type targetAttributeType) : base(targetAttributeType) + { + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/NativePropertyDrawerAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/NativePropertyDrawerAttribute.cs.meta new file mode 100644 index 0000000..9a726e7 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/NativePropertyDrawerAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 7c30e23a060c0614b876d7f14e0ee649 +timeCreated: 1510924166 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawConditionAttribute.cs b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawConditionAttribute.cs new file mode 100644 index 0000000..c8fa6e9 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawConditionAttribute.cs @@ -0,0 +1,11 @@ +using System; + +namespace NaughtyAttributes.Editor +{ + public class PropertyDrawConditionAttribute : BaseAttribute + { + public PropertyDrawConditionAttribute(Type targetAttributeType) : base(targetAttributeType) + { + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawConditionAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawConditionAttribute.cs.meta new file mode 100644 index 0000000..663b290 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawConditionAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: d7962631135870e4fa748e6f81cd64d4 +timeCreated: 1508414568 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawerAttribute.cs b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawerAttribute.cs new file mode 100644 index 0000000..cce3c96 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawerAttribute.cs @@ -0,0 +1,11 @@ +using System; + +namespace NaughtyAttributes.Editor +{ + public class PropertyDrawerAttribute : BaseAttribute + { + public PropertyDrawerAttribute(Type targetAttributeType) : base(targetAttributeType) + { + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawerAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawerAttribute.cs.meta new file mode 100644 index 0000000..3b4803b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyDrawerAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 77bb6824c4e9e054db05347dd8465f24 +timeCreated: 1508153828 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyGrouperAttribute.cs b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyGrouperAttribute.cs new file mode 100644 index 0000000..5574cc5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyGrouperAttribute.cs @@ -0,0 +1,11 @@ +using System; + +namespace NaughtyAttributes.Editor +{ + public class PropertyGrouperAttribute : BaseAttribute + { + public PropertyGrouperAttribute(Type targetAttributeType) : base(targetAttributeType) + { + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyGrouperAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyGrouperAttribute.cs.meta new file mode 100644 index 0000000..757cf05 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyGrouperAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 9d1b7efb592ab4a4796c70edaad2be75 +timeCreated: 1508332897 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyMetaAttribute.cs b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyMetaAttribute.cs new file mode 100644 index 0000000..0d2e09c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyMetaAttribute.cs @@ -0,0 +1,11 @@ +using System; + +namespace NaughtyAttributes.Editor +{ + public class PropertyMetaAttribute : BaseAttribute + { + public PropertyMetaAttribute(Type targetAttributeType) : base(targetAttributeType) + { + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyMetaAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyMetaAttribute.cs.meta new file mode 100644 index 0000000..2537218 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyMetaAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: b46e1700b41c60141b19b0a7ed25a383 +timeCreated: 1508497398 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyValidatorAttribute.cs b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyValidatorAttribute.cs new file mode 100644 index 0000000..375bd33 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyValidatorAttribute.cs @@ -0,0 +1,11 @@ +using System; + +namespace NaughtyAttributes.Editor +{ + public class PropertyValidatorAttribute : BaseAttribute + { + public PropertyValidatorAttribute(Type targetAttributeType) : base(targetAttributeType) + { + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyValidatorAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyValidatorAttribute.cs.meta new file mode 100644 index 0000000..1e3fbfe --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Attributes/PropertyValidatorAttribute.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 38c34a83bfd0a07468f20ae50c36737f +timeCreated: 1508153828 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration.meta new file mode 100644 index 0000000..4d91c4b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3876cb6aacfb99f46803d5e50eacdf2c +folderAsset: yes +timeCreated: 1508230862 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/CodeGenerator.cs b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/CodeGenerator.cs new file mode 100644 index 0000000..bafbf0b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/CodeGenerator.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public class CodeGenerator : UnityEditor.Editor + { + private static readonly string GENERATED_CODE_TARGET_FOLDER = + (Application.dataPath.Replace("Assets", string.Empty) + AssetDatabase.GUIDToAssetPath(AssetDatabase.FindAssets("CodeGenerator")[0])) + .Replace("CodeGenerator.cs", string.Empty) + .Replace("/", "\\"); + + private static readonly string CLASS_NAME_PLACEHOLDER = "__classname__"; + private static readonly string ENTRIES_PLACEHOLDER = "__entries__"; + private static readonly string META_ENTRY_FORMAT = "metasByAttributeType[typeof({0})] = new {1}();" + Environment.NewLine; + private static readonly string DRAWER_ENTRY_FORMAT = "drawersByAttributeType[typeof({0})] = new {1}();" + Environment.NewLine; + private static readonly string GROUPER_ENTRY_FORMAT = "groupersByAttributeType[typeof({0})] = new {1}();" + Environment.NewLine; + private static readonly string VALIDATOR_ENTRY_FORMAT = "validatorsByAttributeType[typeof({0})] = new {1}();" + Environment.NewLine; + private static readonly string DRAW_CONDITION_ENTRY_FORMAT = "drawConditionsByAttributeType[typeof({0})] = new {1}();" + Environment.NewLine; + + //[UnityEditor.Callbacks.DidReloadScripts] + [MenuItem("Tools/NaughtyAttributes/Update Attributes Database")] + private static void GenerateCode() + { + GenerateScript("PropertyMetaDatabase", "PropertyMetaDatabaseTemplate", META_ENTRY_FORMAT); + GenerateScript("PropertyDrawerDatabase", "PropertyDrawerDatabaseTemplate", DRAWER_ENTRY_FORMAT); + GenerateScript("PropertyGrouperDatabase", "PropertyGrouperDatabaseTemplate", GROUPER_ENTRY_FORMAT); + GenerateScript("PropertyValidatorDatabase", "PropertyValidatorDatabaseTemplate", VALIDATOR_ENTRY_FORMAT); + GenerateScript("PropertyDrawConditionDatabase", "PropertyDrawConditionDatabaseTemplate", DRAW_CONDITION_ENTRY_FORMAT); + + GenerateScript("FieldDrawerDatabase", "FieldDrawerDatabaseTemplate", DRAWER_ENTRY_FORMAT); + GenerateScript("MethodDrawerDatabase", "MethodDrawerDatabaseTemplate", DRAWER_ENTRY_FORMAT); + GenerateScript("NativePropertyDrawerDatabase", "NativePropertyDrawerDbTemplate", DRAWER_ENTRY_FORMAT); + + AssetDatabase.Refresh(); + } + + private static void GenerateScript(string scriptName, string templateName, string entryFormat) + where TAttribute : IAttribute + { + string[] templateAssets = AssetDatabase.FindAssets(templateName); + if (templateAssets.Length == 0) + { + return; + } + + string templateGUID = templateAssets[0]; + string templateRelativePath = AssetDatabase.GUIDToAssetPath(templateGUID); + string templateFormat = (AssetDatabase.LoadAssetAtPath(templateRelativePath, typeof(TextAsset)) as TextAsset).ToString(); + //string templateFullPath = (Application.dataPath.Replace("Assets", string.Empty) + templateRelativePath).Replace("/", "\\"); + //string templateFormat = IOUtility.ReadFromFile(templateFullPath); + + StringBuilder entriesBuilder = new StringBuilder(); + List subTypes = GetAllSubTypes(typeof(TClass)); + + foreach (var subType in subTypes) + { + IAttribute[] attributes = (IAttribute[])subType.GetCustomAttributes(typeof(TAttribute), true); + if (attributes.Length > 0) + { + entriesBuilder.AppendFormat(entryFormat, attributes[0].TargetAttributeType.Name, subType.Name); + } + } + + string scriptContent = templateFormat + .Replace(CLASS_NAME_PLACEHOLDER, scriptName) + .Replace(ENTRIES_PLACEHOLDER, entriesBuilder.ToString()); + + scriptContent = Regex.Replace(scriptContent, @"\r\n|\n\r|\r|\n", Environment.NewLine); // Normalize line endings + + string scriptPath = GENERATED_CODE_TARGET_FOLDER + scriptName + ".cs"; + + IOUtility.WriteToFile(scriptPath, scriptContent); + } + + private static List GetAllSubTypes(Type baseClass) + { + var result = new List(); + Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); + + foreach (var assemly in assemblies) + { + Type[] types = assemly.GetTypes(); + foreach (var type in types) + { + if (type.IsSubclassOf(baseClass)) + { + result.Add(type); + } + } + } + + return result; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/CodeGenerator.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/CodeGenerator.cs.meta new file mode 100644 index 0000000..2bbd870 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/CodeGenerator.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 990da0e1629b14049842bf2ac82cbff0 +timeCreated: 1508230160 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/FieldDrawerDatabase.cs b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/FieldDrawerDatabase.cs new file mode 100644 index 0000000..a1e4692 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/FieldDrawerDatabase.cs @@ -0,0 +1,33 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class FieldDrawerDatabase + { + private static Dictionary drawersByAttributeType; + + static FieldDrawerDatabase() + { + drawersByAttributeType = new Dictionary(); + drawersByAttributeType[typeof(ShowNonSerializedFieldAttribute)] = new ShowNonSerializedFieldFieldDrawer(); + + } + + public static FieldDrawer GetDrawerForAttribute(Type attributeType) + { + FieldDrawer drawer; + if (drawersByAttributeType.TryGetValue(attributeType, out drawer)) + { + return drawer; + } + else + { + return null; + } + } + } +} + diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/FieldDrawerDatabase.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/FieldDrawerDatabase.cs.meta new file mode 100644 index 0000000..52c69e9 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/FieldDrawerDatabase.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: b2406e32d0ab1214ab4959f1cdc8a609 +timeCreated: 1508836346 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/MethodDrawerDatabase.cs b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/MethodDrawerDatabase.cs new file mode 100644 index 0000000..832fb60 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/MethodDrawerDatabase.cs @@ -0,0 +1,33 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class MethodDrawerDatabase + { + private static Dictionary drawersByAttributeType; + + static MethodDrawerDatabase() + { + drawersByAttributeType = new Dictionary(); + drawersByAttributeType[typeof(ButtonAttribute)] = new ButtonMethodDrawer(); + + } + + public static MethodDrawer GetDrawerForAttribute(Type attributeType) + { + MethodDrawer drawer; + if (drawersByAttributeType.TryGetValue(attributeType, out drawer)) + { + return drawer; + } + else + { + return null; + } + } + } +} + diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/MethodDrawerDatabase.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/MethodDrawerDatabase.cs.meta new file mode 100644 index 0000000..82b0f85 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/MethodDrawerDatabase.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 40b81aa63ff76d34ea67277db99a6a25 +timeCreated: 1508592498 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/NativePropertyDrawerDatabase.cs b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/NativePropertyDrawerDatabase.cs new file mode 100644 index 0000000..2844f95 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/NativePropertyDrawerDatabase.cs @@ -0,0 +1,33 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class NativePropertyDrawerDatabase + { + private static Dictionary drawersByAttributeType; + + static NativePropertyDrawerDatabase() + { + drawersByAttributeType = new Dictionary(); + drawersByAttributeType[typeof(ShowNativePropertyAttribute)] = new ShowNativePropertyNativePropertyDrawer(); + + } + + public static NativePropertyDrawer GetDrawerForAttribute(Type attributeType) + { + NativePropertyDrawer drawer; + if (drawersByAttributeType.TryGetValue(attributeType, out drawer)) + { + return drawer; + } + else + { + return null; + } + } + } +} + diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/NativePropertyDrawerDatabase.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/NativePropertyDrawerDatabase.cs.meta new file mode 100644 index 0000000..b86e8d3 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/NativePropertyDrawerDatabase.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 9fd2f82e21266a94ea967208610dda1e +timeCreated: 1510925645 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawConditionDatabase.cs b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawConditionDatabase.cs new file mode 100644 index 0000000..2bf40b8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawConditionDatabase.cs @@ -0,0 +1,34 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class PropertyDrawConditionDatabase + { + private static Dictionary drawConditionsByAttributeType; + + static PropertyDrawConditionDatabase() + { + drawConditionsByAttributeType = new Dictionary(); + drawConditionsByAttributeType[typeof(HideIfAttribute)] = new HideIfPropertyDrawCondition(); +drawConditionsByAttributeType[typeof(ShowIfAttribute)] = new ShowIfPropertyDrawCondition(); + + } + + public static PropertyDrawCondition GetDrawConditionForAttribute(Type attributeType) + { + PropertyDrawCondition drawCondition; + if (drawConditionsByAttributeType.TryGetValue(attributeType, out drawCondition)) + { + return drawCondition; + } + else + { + return null; + } + } + } +} + diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawConditionDatabase.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawConditionDatabase.cs.meta new file mode 100644 index 0000000..e4b5bff --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawConditionDatabase.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 0b96dc9fe878bfc49865d28d601a7468 +timeCreated: 1508414568 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawerDatabase.cs b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawerDatabase.cs new file mode 100644 index 0000000..ff6c213 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawerDatabase.cs @@ -0,0 +1,52 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class PropertyDrawerDatabase + { + private static Dictionary drawersByAttributeType; + + static PropertyDrawerDatabase() + { + drawersByAttributeType = new Dictionary(); + drawersByAttributeType[typeof(DisableIfAttribute)] = new DisableIfPropertyDrawer(); +drawersByAttributeType[typeof(DropdownAttribute)] = new DropdownPropertyDrawer(); +drawersByAttributeType[typeof(EnableIfAttribute)] = new EnableIfPropertyDrawer(); +drawersByAttributeType[typeof(LabelAttribute)] = new LabelPropertyDrawer(); +drawersByAttributeType[typeof(MinMaxSliderAttribute)] = new MinMaxSliderPropertyDrawer(); +drawersByAttributeType[typeof(ProgressBarAttribute)] = new ProgressBarPropertyDrawer(); +drawersByAttributeType[typeof(ReadOnlyAttribute)] = new ReadOnlyPropertyDrawer(); +drawersByAttributeType[typeof(ReorderableListAttribute)] = new ReorderableListPropertyDrawer(); +drawersByAttributeType[typeof(ResizableTextAreaAttribute)] = new ResizableTextAreaPropertyDrawer(); +drawersByAttributeType[typeof(ShowAssetPreviewAttribute)] = new ShowAssetPreviewPropertyDrawer(); +drawersByAttributeType[typeof(SliderAttribute)] = new SliderPropertyDrawer(); +drawersByAttributeType[typeof(TagAttribute)] = new TagPropertyDrawer(); + + } + + public static PropertyDrawer GetDrawerForAttribute(Type attributeType) + { + PropertyDrawer drawer; + if (drawersByAttributeType.TryGetValue(attributeType, out drawer)) + { + return drawer; + } + else + { + return null; + } + } + + public static void ClearCache() + { + foreach (var kvp in drawersByAttributeType) + { + kvp.Value.ClearCache(); + } + } + } +} + diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawerDatabase.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawerDatabase.cs.meta new file mode 100644 index 0000000..36c43db --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyDrawerDatabase.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 57bb89ab38f8da84db719a3fad7934d2 +timeCreated: 1508241644 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyGrouperDatabase.cs b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyGrouperDatabase.cs new file mode 100644 index 0000000..d2d067e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyGrouperDatabase.cs @@ -0,0 +1,33 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class PropertyGrouperDatabase + { + private static Dictionary groupersByAttributeType; + + static PropertyGrouperDatabase() + { + groupersByAttributeType = new Dictionary(); + groupersByAttributeType[typeof(BoxGroupAttribute)] = new BoxGroupPropertyGrouper(); + + } + + public static PropertyGrouper GetGrouperForAttribute(Type attributeType) + { + PropertyGrouper grouper; + if (groupersByAttributeType.TryGetValue(attributeType, out grouper)) + { + return grouper; + } + else + { + return null; + } + } + } +} + diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyGrouperDatabase.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyGrouperDatabase.cs.meta new file mode 100644 index 0000000..bc0f34b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyGrouperDatabase.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 0e5fed99fdc5f794291677a80073b4ba +timeCreated: 1508333008 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyMetaDatabase.cs b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyMetaDatabase.cs new file mode 100644 index 0000000..45dfc00 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyMetaDatabase.cs @@ -0,0 +1,34 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class PropertyMetaDatabase + { + private static Dictionary metasByAttributeType; + + static PropertyMetaDatabase() + { + metasByAttributeType = new Dictionary(); + metasByAttributeType[typeof(InfoBoxAttribute)] = new InfoBoxPropertyMeta(); +metasByAttributeType[typeof(OnValueChangedAttribute)] = new OnValueChangedPropertyMeta(); + + } + + public static PropertyMeta GetMetaForAttribute(Type attributeType) + { + PropertyMeta meta; + if (metasByAttributeType.TryGetValue(attributeType, out meta)) + { + return meta; + } + else + { + return null; + } + } + } +} + diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyMetaDatabase.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyMetaDatabase.cs.meta new file mode 100644 index 0000000..6a60430 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyMetaDatabase.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 57233c5ec1975024aa0723241b2f8210 +timeCreated: 1508497398 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyValidatorDatabase.cs b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyValidatorDatabase.cs new file mode 100644 index 0000000..c74ca91 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyValidatorDatabase.cs @@ -0,0 +1,36 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class PropertyValidatorDatabase + { + private static Dictionary validatorsByAttributeType; + + static PropertyValidatorDatabase() + { + validatorsByAttributeType = new Dictionary(); + validatorsByAttributeType[typeof(MaxValueAttribute)] = new MaxValuePropertyValidator(); +validatorsByAttributeType[typeof(MinValueAttribute)] = new MinValuePropertyValidator(); +validatorsByAttributeType[typeof(RequiredAttribute)] = new RequiredPropertyValidator(); +validatorsByAttributeType[typeof(ValidateInputAttribute)] = new ValidateInputPropertyValidator(); + + } + + public static PropertyValidator GetValidatorForAttribute(Type attributeType) + { + PropertyValidator validator; + if (validatorsByAttributeType.TryGetValue(attributeType, out validator)) + { + return validator; + } + else + { + return null; + } + } + } +} + diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyValidatorDatabase.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyValidatorDatabase.cs.meta new file mode 100644 index 0000000..6d882da --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/PropertyValidatorDatabase.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 24e9da8a6b324374a9f655d3a867b284 +timeCreated: 1508241122 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates.meta new file mode 100644 index 0000000..5d830f1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7b15ea6695a69d74ab656006617d8d21 +folderAsset: yes +timeCreated: 1508230862 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/FieldDrawerDatabaseTemplate.txt b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/FieldDrawerDatabaseTemplate.txt new file mode 100644 index 0000000..926a6d7 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/FieldDrawerDatabaseTemplate.txt @@ -0,0 +1,31 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class __classname__ + { + private static Dictionary drawersByAttributeType; + + static __classname__() + { + drawersByAttributeType = new Dictionary(); + __entries__ + } + + public static FieldDrawer GetDrawerForAttribute(Type attributeType) + { + FieldDrawer drawer; + if (drawersByAttributeType.TryGetValue(attributeType, out drawer)) + { + return drawer; + } + else + { + return null; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/FieldDrawerDatabaseTemplate.txt.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/FieldDrawerDatabaseTemplate.txt.meta new file mode 100644 index 0000000..43e8f76 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/FieldDrawerDatabaseTemplate.txt.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 943b4c41373856243996247275be2cd8 +timeCreated: 1508836344 +licenseType: Free +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/MethodDrawerDatabaseTemplate.txt b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/MethodDrawerDatabaseTemplate.txt new file mode 100644 index 0000000..d6efd8a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/MethodDrawerDatabaseTemplate.txt @@ -0,0 +1,31 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class __classname__ + { + private static Dictionary drawersByAttributeType; + + static __classname__() + { + drawersByAttributeType = new Dictionary(); + __entries__ + } + + public static MethodDrawer GetDrawerForAttribute(Type attributeType) + { + MethodDrawer drawer; + if (drawersByAttributeType.TryGetValue(attributeType, out drawer)) + { + return drawer; + } + else + { + return null; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/MethodDrawerDatabaseTemplate.txt.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/MethodDrawerDatabaseTemplate.txt.meta new file mode 100644 index 0000000..4531345 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/MethodDrawerDatabaseTemplate.txt.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 52d15465eb3439f4a9b95963a21d19b7 +timeCreated: 1508592495 +licenseType: Free +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/NativePropertyDrawerDbTemplate.txt b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/NativePropertyDrawerDbTemplate.txt new file mode 100644 index 0000000..fe9cca1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/NativePropertyDrawerDbTemplate.txt @@ -0,0 +1,31 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class __classname__ + { + private static Dictionary drawersByAttributeType; + + static __classname__() + { + drawersByAttributeType = new Dictionary(); + __entries__ + } + + public static NativePropertyDrawer GetDrawerForAttribute(Type attributeType) + { + NativePropertyDrawer drawer; + if (drawersByAttributeType.TryGetValue(attributeType, out drawer)) + { + return drawer; + } + else + { + return null; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/NativePropertyDrawerDbTemplate.txt.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/NativePropertyDrawerDbTemplate.txt.meta new file mode 100644 index 0000000..4c16e8c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/NativePropertyDrawerDbTemplate.txt.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b82f5f6bf1fd4314c93624a8bc8835fd +timeCreated: 1510924467 +licenseType: Free +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawConditionDatabaseTemplate.txt b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawConditionDatabaseTemplate.txt new file mode 100644 index 0000000..adc064a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawConditionDatabaseTemplate.txt @@ -0,0 +1,31 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class __classname__ + { + private static Dictionary drawConditionsByAttributeType; + + static __classname__() + { + drawConditionsByAttributeType = new Dictionary(); + __entries__ + } + + public static PropertyDrawCondition GetDrawConditionForAttribute(Type attributeType) + { + PropertyDrawCondition drawCondition; + if (drawConditionsByAttributeType.TryGetValue(attributeType, out drawCondition)) + { + return drawCondition; + } + else + { + return null; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawConditionDatabaseTemplate.txt.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawConditionDatabaseTemplate.txt.meta new file mode 100644 index 0000000..1d19d37 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawConditionDatabaseTemplate.txt.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b36f5858330c2d140a697f19ba6cc36b +timeCreated: 1508414568 +licenseType: Free +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawerDatabaseTemplate.txt b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawerDatabaseTemplate.txt new file mode 100644 index 0000000..338dde4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawerDatabaseTemplate.txt @@ -0,0 +1,39 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class __classname__ + { + private static Dictionary drawersByAttributeType; + + static __classname__() + { + drawersByAttributeType = new Dictionary(); + __entries__ + } + + public static PropertyDrawer GetDrawerForAttribute(Type attributeType) + { + PropertyDrawer drawer; + if (drawersByAttributeType.TryGetValue(attributeType, out drawer)) + { + return drawer; + } + else + { + return null; + } + } + + public static void ClearCache() + { + foreach (var kvp in drawersByAttributeType) + { + kvp.Value.ClearCache(); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawerDatabaseTemplate.txt.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawerDatabaseTemplate.txt.meta new file mode 100644 index 0000000..26014c9 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyDrawerDatabaseTemplate.txt.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 136a96a904b577244b08be5d5542a77d +timeCreated: 1508241102 +licenseType: Free +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyGrouperDatabaseTemplate.txt b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyGrouperDatabaseTemplate.txt new file mode 100644 index 0000000..5065a45 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyGrouperDatabaseTemplate.txt @@ -0,0 +1,31 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class __classname__ + { + private static Dictionary groupersByAttributeType; + + static __classname__() + { + groupersByAttributeType = new Dictionary(); + __entries__ + } + + public static PropertyGrouper GetGrouperForAttribute(Type attributeType) + { + PropertyGrouper grouper; + if (groupersByAttributeType.TryGetValue(attributeType, out grouper)) + { + return grouper; + } + else + { + return null; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyGrouperDatabaseTemplate.txt.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyGrouperDatabaseTemplate.txt.meta new file mode 100644 index 0000000..1167151 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyGrouperDatabaseTemplate.txt.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7fcc5bff99ecd4843b766f23cd585b55 +timeCreated: 1508332899 +licenseType: Free +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyMetaDatabaseTemplate.txt b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyMetaDatabaseTemplate.txt new file mode 100644 index 0000000..d88bea4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyMetaDatabaseTemplate.txt @@ -0,0 +1,31 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class __classname__ + { + private static Dictionary metasByAttributeType; + + static __classname__() + { + metasByAttributeType = new Dictionary(); + __entries__ + } + + public static PropertyMeta GetMetaForAttribute(Type attributeType) + { + PropertyMeta meta; + if (metasByAttributeType.TryGetValue(attributeType, out meta)) + { + return meta; + } + else + { + return null; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyMetaDatabaseTemplate.txt.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyMetaDatabaseTemplate.txt.meta new file mode 100644 index 0000000..849d247 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyMetaDatabaseTemplate.txt.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fde25cf95f45b50469fcf4ee1e38993c +timeCreated: 1508497401 +licenseType: Free +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyValidatorDatabaseTemplate.txt b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyValidatorDatabaseTemplate.txt new file mode 100644 index 0000000..2a63494 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyValidatorDatabaseTemplate.txt @@ -0,0 +1,31 @@ +// This class is auto generated + +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class __classname__ + { + private static Dictionary validatorsByAttributeType; + + static __classname__() + { + validatorsByAttributeType = new Dictionary(); + __entries__ + } + + public static PropertyValidator GetValidatorForAttribute(Type attributeType) + { + PropertyValidator validator; + if (validatorsByAttributeType.TryGetValue(attributeType, out validator)) + { + return validator; + } + else + { + return null; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyValidatorDatabaseTemplate.txt.meta b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyValidatorDatabaseTemplate.txt.meta new file mode 100644 index 0000000..c0c96d4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/CodeGeneration/Templates/PropertyValidatorDatabaseTemplate.txt.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a21c3d37c1492da4386198388150024c +timeCreated: 1508230862 +licenseType: Free +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Editors.meta b/Assets/NaughtyAttributes/Scripts/Editor/Editors.meta new file mode 100644 index 0000000..2c445db --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Editors.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4db73d2276d0e8144a206c5c2cd350de +folderAsset: yes +timeCreated: 1508055750 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Editors/InspectorEditor.cs b/Assets/NaughtyAttributes/Scripts/Editor/Editors/InspectorEditor.cs new file mode 100644 index 0000000..da91482 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Editors/InspectorEditor.cs @@ -0,0 +1,329 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CanEditMultipleObjects] + [CustomEditor(typeof(UnityEngine.Object), true)] + public class InspectorEditor : UnityEditor.Editor + { + private SerializedProperty script; + + private IEnumerable fields; + private HashSet groupedFields; + private Dictionary> groupedFieldsByGroupName; + private IEnumerable nonSerializedFields; + private IEnumerable nativeProperties; + private IEnumerable methods; + + private Dictionary serializedPropertiesByFieldName; + + private bool useDefaultInspector; + + private void OnEnable() + { + this.script = this.serializedObject.FindProperty("m_Script"); + + // Cache serialized fields + this.fields = ReflectionUtility.GetAllFields(this.target, f => this.serializedObject.FindProperty(f.Name) != null); + + // If there are no NaughtyAttributes use default inspector + if (this.fields.All(f => f.GetCustomAttributes(typeof(NaughtyAttribute), true).Length == 0)) + { + this.useDefaultInspector = true; + } + else + { + this.useDefaultInspector = false; + + // Cache grouped fields + this.groupedFields = new HashSet(this.fields.Where(f => f.GetCustomAttributes(typeof(GroupAttribute), true).Length > 0)); + + // Cache grouped fields by group name + this.groupedFieldsByGroupName = new Dictionary>(); + foreach (var groupedField in this.groupedFields) + { + string groupName = (groupedField.GetCustomAttributes(typeof(GroupAttribute), true)[0] as GroupAttribute).Name; + + if (this.groupedFieldsByGroupName.ContainsKey(groupName)) + { + this.groupedFieldsByGroupName[groupName].Add(groupedField); + } + else + { + this.groupedFieldsByGroupName[groupName] = new List() + { + groupedField + }; + } + } + + // Cache serialized properties by field name + this.serializedPropertiesByFieldName = new Dictionary(); + foreach (var field in this.fields) + { + this.serializedPropertiesByFieldName[field.Name] = this.serializedObject.FindProperty(field.Name); + } + } + + // Cache non-serialized fields + this.nonSerializedFields = ReflectionUtility.GetAllFields( + this.target, f => f.GetCustomAttributes(typeof(DrawerAttribute), true).Length > 0 && this.serializedObject.FindProperty(f.Name) == null); + + // Cache the native properties + this.nativeProperties = ReflectionUtility.GetAllProperties( + this.target, p => p.GetCustomAttributes(typeof(DrawerAttribute), true).Length > 0); + + // Cache methods with DrawerAttribute + this.methods = ReflectionUtility.GetAllMethods( + this.target, m => m.GetCustomAttributes(typeof(DrawerAttribute), true).Length > 0); + } + + private void OnDisable() + { + PropertyDrawerDatabase.ClearCache(); + } + + public override void OnInspectorGUI() + { + if (this.useDefaultInspector) + { + this.DrawDefaultInspector(); + } + else + { + this.serializedObject.Update(); + + if (this.script != null) + { + GUI.enabled = false; + EditorGUILayout.PropertyField(this.script); + GUI.enabled = true; + } + + // Draw fields + HashSet drawnGroups = new HashSet(); + foreach (var field in this.fields) + { + if (this.groupedFields.Contains(field)) + { + // Draw grouped fields + string groupName = (field.GetCustomAttributes(typeof(GroupAttribute), true)[0] as GroupAttribute).Name; + if (!drawnGroups.Contains(groupName)) + { + drawnGroups.Add(groupName); + + PropertyGrouper grouper = this.GetPropertyGrouperForField(field); + if (grouper != null) + { + grouper.BeginGroup(groupName); + + this.ValidateAndDrawFields(this.groupedFieldsByGroupName[groupName]); + + grouper.EndGroup(); + } + else + { + this.ValidateAndDrawFields(this.groupedFieldsByGroupName[groupName]); + } + } + } + else + { + // Draw non-grouped field + this.ValidateAndDrawField(field); + } + } + + this.serializedObject.ApplyModifiedProperties(); + } + + // Draw non-serialized fields + foreach (var field in this.nonSerializedFields) + { + DrawerAttribute drawerAttribute = (DrawerAttribute)field.GetCustomAttributes(typeof(DrawerAttribute), true)[0]; + FieldDrawer drawer = FieldDrawerDatabase.GetDrawerForAttribute(drawerAttribute.GetType()); + if (drawer != null) + { + drawer.DrawField(this.target, field); + } + } + + // Draw native properties + foreach (var property in this.nativeProperties) + { + DrawerAttribute drawerAttribute = (DrawerAttribute)property.GetCustomAttributes(typeof(DrawerAttribute), true)[0]; + NativePropertyDrawer drawer = NativePropertyDrawerDatabase.GetDrawerForAttribute(drawerAttribute.GetType()); + if (drawer != null) + { + drawer.DrawNativeProperty(this.target, property); + } + } + + // Draw methods + foreach (var method in this.methods) + { + DrawerAttribute drawerAttribute = (DrawerAttribute)method.GetCustomAttributes(typeof(DrawerAttribute), true)[0]; + MethodDrawer methodDrawer = MethodDrawerDatabase.GetDrawerForAttribute(drawerAttribute.GetType()); + if (methodDrawer != null) + { + methodDrawer.DrawMethod(this.target, method); + } + } + } + + private void ValidateAndDrawFields(IEnumerable fields) + { + foreach (var field in fields) + { + this.ValidateAndDrawField(field); + } + } + + private void ValidateAndDrawField(FieldInfo field) + { + if (!ShouldDrawField(field)) + { + return; + } + + this.ValidateField(field); + this.ApplyFieldMeta(field); + this.DrawField(field); + } + + private void ValidateField(FieldInfo field) + { + ValidatorAttribute[] validatorAttributes = (ValidatorAttribute[])field.GetCustomAttributes(typeof(ValidatorAttribute), true); + + foreach (var attribute in validatorAttributes) + { + PropertyValidator validator = PropertyValidatorDatabase.GetValidatorForAttribute(attribute.GetType()); + if (validator != null) + { + validator.ValidateProperty(this.serializedPropertiesByFieldName[field.Name]); + } + } + } + + private bool ShouldDrawField(FieldInfo field) + { + // Check if the field has draw conditions + PropertyDrawCondition drawCondition = this.GetPropertyDrawConditionForField(field); + if (drawCondition != null) + { + bool canDrawProperty = drawCondition.CanDrawProperty(this.serializedPropertiesByFieldName[field.Name]); + if (!canDrawProperty) + { + return false; + } + } + + // Check if the field has HideInInspectorAttribute + HideInInspector[] hideInInspectorAttributes = (HideInInspector[])field.GetCustomAttributes(typeof(HideInInspector), true); + if (hideInInspectorAttributes.Length > 0) + { + return false; + } + + return true; + } + + private void DrawField(FieldInfo field) + { + EditorGUI.BeginChangeCheck(); + PropertyDrawer drawer = this.GetPropertyDrawerForField(field); + if (drawer != null) + { + drawer.DrawProperty(this.serializedPropertiesByFieldName[field.Name]); + } + else + { + EditorDrawUtility.DrawPropertyField(this.serializedPropertiesByFieldName[field.Name]); + } + + if (EditorGUI.EndChangeCheck()) + { + OnValueChangedAttribute[] onValueChangedAttributes = (OnValueChangedAttribute[])field.GetCustomAttributes(typeof(OnValueChangedAttribute), true); + foreach (var onValueChangedAttribute in onValueChangedAttributes) + { + PropertyMeta meta = PropertyMetaDatabase.GetMetaForAttribute(onValueChangedAttribute.GetType()); + if (meta != null) + { + meta.ApplyPropertyMeta(this.serializedPropertiesByFieldName[field.Name], onValueChangedAttribute); + } + } + } + } + + private void ApplyFieldMeta(FieldInfo field) + { + // Apply custom meta attributes + MetaAttribute[] metaAttributes = field + .GetCustomAttributes(typeof(MetaAttribute), true) + .Where(attr => attr.GetType() != typeof(OnValueChangedAttribute)) + .Select(obj => obj as MetaAttribute) + .ToArray(); + + Array.Sort(metaAttributes, (x, y) => + { + return x.Order - y.Order; + }); + + foreach (var metaAttribute in metaAttributes) + { + PropertyMeta meta = PropertyMetaDatabase.GetMetaForAttribute(metaAttribute.GetType()); + if (meta != null) + { + meta.ApplyPropertyMeta(this.serializedPropertiesByFieldName[field.Name], metaAttribute); + } + } + } + + private PropertyDrawer GetPropertyDrawerForField(FieldInfo field) + { + DrawerAttribute[] drawerAttributes = (DrawerAttribute[])field.GetCustomAttributes(typeof(DrawerAttribute), true); + if (drawerAttributes.Length > 0) + { + PropertyDrawer drawer = PropertyDrawerDatabase.GetDrawerForAttribute(drawerAttributes[0].GetType()); + return drawer; + } + else + { + return null; + } + } + + private PropertyGrouper GetPropertyGrouperForField(FieldInfo field) + { + GroupAttribute[] groupAttributes = (GroupAttribute[])field.GetCustomAttributes(typeof(GroupAttribute), true); + if (groupAttributes.Length > 0) + { + PropertyGrouper grouper = PropertyGrouperDatabase.GetGrouperForAttribute(groupAttributes[0].GetType()); + return grouper; + } + else + { + return null; + } + } + + private PropertyDrawCondition GetPropertyDrawConditionForField(FieldInfo field) + { + DrawConditionAttribute[] drawConditionAttributes = (DrawConditionAttribute[])field.GetCustomAttributes(typeof(DrawConditionAttribute), true); + if (drawConditionAttributes.Length > 0) + { + PropertyDrawCondition drawCondition = PropertyDrawConditionDatabase.GetDrawConditionForAttribute(drawConditionAttributes[0].GetType()); + return drawCondition; + } + else + { + return null; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Editors/InspectorEditor.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Editors/InspectorEditor.cs.meta new file mode 100644 index 0000000..b623552 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Editors/InspectorEditor.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 9e82d6d6926a6c74688e2787b37630d1 +timeCreated: 1508055750 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers.meta b/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers.meta new file mode 100644 index 0000000..ed81436 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 79b05858e72c1b0498eca7954843c802 +folderAsset: yes +timeCreated: 1508835721 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/FieldDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/FieldDrawer.cs new file mode 100644 index 0000000..805a064 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/FieldDrawer.cs @@ -0,0 +1,9 @@ +using System.Reflection; + +namespace NaughtyAttributes.Editor +{ + public abstract class FieldDrawer + { + public abstract void DrawField(UnityEngine.Object target, FieldInfo field); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/FieldDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/FieldDrawer.cs.meta new file mode 100644 index 0000000..789d479 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/FieldDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 8949267118f232a4fbebd777de8ed6fe +timeCreated: 1508835721 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/ShowNonSerializedFieldFieldDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/ShowNonSerializedFieldFieldDrawer.cs new file mode 100644 index 0000000..efc3a39 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/ShowNonSerializedFieldFieldDrawer.cs @@ -0,0 +1,25 @@ +using System.Reflection; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [FieldDrawer(typeof(ShowNonSerializedFieldAttribute))] + public class ShowNonSerializedFieldFieldDrawer : FieldDrawer + { + public override void DrawField(UnityEngine.Object target, FieldInfo field) + { + object value = field.GetValue(target); + + if (value == null) + { + string warning = string.Format("{0} doesn't support {1} types", typeof(ShowNonSerializedFieldFieldDrawer).Name, "Reference"); + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: target); + } + else if (!EditorDrawUtility.DrawLayoutField(value, field.Name)) + { + string warning = string.Format("{0} doesn't support {1} types", typeof(ShowNonSerializedFieldFieldDrawer).Name, field.FieldType.Name); + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: target); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/ShowNonSerializedFieldFieldDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/ShowNonSerializedFieldFieldDrawer.cs.meta new file mode 100644 index 0000000..fa3410c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/FieldDrawers/ShowNonSerializedFieldFieldDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 8449d5c2158e97d479caaec24c61baec +timeCreated: 1508835721 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers.meta b/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers.meta new file mode 100644 index 0000000..7e351e2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f95312994b1f8c746a402669cb1655eb +folderAsset: yes +timeCreated: 1508592494 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/ButtonMethodDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/ButtonMethodDrawer.cs new file mode 100644 index 0000000..a6e1f7b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/ButtonMethodDrawer.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [MethodDrawer(typeof(ButtonAttribute))] + public class ButtonMethodDrawer : MethodDrawer + { + public override void DrawMethod(UnityEngine.Object target, MethodInfo methodInfo) + { + if (methodInfo.GetParameters().Length == 0) + { + ButtonAttribute buttonAttribute = (ButtonAttribute)methodInfo.GetCustomAttributes(typeof(ButtonAttribute), true)[0]; + string buttonText = string.IsNullOrEmpty(buttonAttribute.Text) ? methodInfo.Name : buttonAttribute.Text; + + if (GUILayout.Button(buttonText)) + { + methodInfo.Invoke(target, null); + } + } + else + { + string warning = typeof(ButtonAttribute).Name + " works only on methods with no parameters"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: target); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/ButtonMethodDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/ButtonMethodDrawer.cs.meta new file mode 100644 index 0000000..cff17a7 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/ButtonMethodDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: ad01ec1a22422c6409f913d60ce39d61 +timeCreated: 1508592494 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/MethodDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/MethodDrawer.cs new file mode 100644 index 0000000..687688d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/MethodDrawer.cs @@ -0,0 +1,9 @@ +using System.Reflection; + +namespace NaughtyAttributes.Editor +{ + public abstract class MethodDrawer + { + public abstract void DrawMethod(UnityEngine.Object target, MethodInfo methodInfo); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/MethodDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/MethodDrawer.cs.meta new file mode 100644 index 0000000..22137e5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/MethodDrawers/MethodDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: a65a1addcdd323249b590f7a06110869 +timeCreated: 1508592494 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers.meta b/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers.meta new file mode 100644 index 0000000..665bbfc --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ae67cc6bfa799f147968e9b0371a21fc +folderAsset: yes +timeCreated: 1510924467 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/NativePropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/NativePropertyDrawer.cs new file mode 100644 index 0000000..0fb0e6b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/NativePropertyDrawer.cs @@ -0,0 +1,9 @@ +using System.Reflection; + +namespace NaughtyAttributes.Editor +{ + public abstract class NativePropertyDrawer + { + public abstract void DrawNativeProperty(UnityEngine.Object target, PropertyInfo property); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/NativePropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/NativePropertyDrawer.cs.meta new file mode 100644 index 0000000..897323c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/NativePropertyDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 715c5ada29663a245b0b35937c892377 +timeCreated: 1510924467 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/ShowNativePropertyNativePropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/ShowNativePropertyNativePropertyDrawer.cs new file mode 100644 index 0000000..326247e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/ShowNativePropertyNativePropertyDrawer.cs @@ -0,0 +1,25 @@ +using System.Reflection; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [NativePropertyDrawer(typeof(ShowNativePropertyAttribute))] + public class ShowNativePropertyNativePropertyDrawer : NativePropertyDrawer + { + public override void DrawNativeProperty(UnityEngine.Object target, PropertyInfo property) + { + object value = property.GetValue(target, null); + + if (value == null) + { + string warning = string.Format("{0} doesn't support {1} types", typeof(ShowNativePropertyNativePropertyDrawer).Name, "Reference"); + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: target); + } + else if (!EditorDrawUtility.DrawLayoutField(value, property.Name)) + { + string warning = string.Format("{0} doesn't support {1} types", typeof(ShowNativePropertyNativePropertyDrawer).Name, property.PropertyType.Name); + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: target); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/ShowNativePropertyNativePropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/ShowNativePropertyNativePropertyDrawer.cs.meta new file mode 100644 index 0000000..9b1f424 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/NativePropertyDrawers/ShowNativePropertyNativePropertyDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 518b0fde2a9d15d498bc17fd1d7062c7 +timeCreated: 1510926376 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef new file mode 100644 index 0000000..e1aafc2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef @@ -0,0 +1,16 @@ +{ + "name": "NaughtyAttributes.Editor", + "references": [ + "NaughtyAttributes.Core" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef.meta b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef.meta new file mode 100644 index 0000000..70dc9f2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f88fb04354076c646a4107a491394033 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions.meta new file mode 100644 index 0000000..6742dcd --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 0ed2b7d432f0ad644b1f0752cf65aa9c +folderAsset: yes +timeCreated: 1508414568 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/HideIfPropertyDrawCondition.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/HideIfPropertyDrawCondition.cs new file mode 100644 index 0000000..84276db --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/HideIfPropertyDrawCondition.cs @@ -0,0 +1,9 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawCondition(typeof(HideIfAttribute))] + public class HideIfPropertyDrawCondition : ShowIfPropertyDrawCondition + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/HideIfPropertyDrawCondition.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/HideIfPropertyDrawCondition.cs.meta new file mode 100644 index 0000000..2b7cd1d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/HideIfPropertyDrawCondition.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: f7e60d80f0231654ab13cfb1178e6eb8 +timeCreated: 1508414568 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/PropertyDrawCondition.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/PropertyDrawCondition.cs new file mode 100644 index 0000000..2ea9f7a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/PropertyDrawCondition.cs @@ -0,0 +1,9 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public abstract class PropertyDrawCondition + { + public abstract bool CanDrawProperty(SerializedProperty property); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/PropertyDrawCondition.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/PropertyDrawCondition.cs.meta new file mode 100644 index 0000000..f326b5d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/PropertyDrawCondition.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: ce2d1d9afa04cae43a18bd01ec9447eb +timeCreated: 1508414568 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/ShowIfPropertyDrawCondition.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/ShowIfPropertyDrawCondition.cs new file mode 100644 index 0000000..3cd1a97 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/ShowIfPropertyDrawCondition.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawCondition(typeof(ShowIfAttribute))] + public class ShowIfPropertyDrawCondition : PropertyDrawCondition + { + public override bool CanDrawProperty(SerializedProperty property) + { + ShowIfAttribute showIfAttribute = PropertyUtility.GetAttribute(property); + UnityEngine.Object target = PropertyUtility.GetTargetObject(property); + + List conditionValues = new List(); + foreach (var condition in showIfAttribute.Conditions) + { + FieldInfo conditionField = ReflectionUtility.GetField(target, condition); + if (conditionField != null && + conditionField.FieldType == typeof(bool)) + { + conditionValues.Add((bool)conditionField.GetValue(target)); + } + + MethodInfo conditionMethod = ReflectionUtility.GetMethod(target, condition); + if (conditionMethod != null && + conditionMethod.ReturnType == typeof(bool) && + conditionMethod.GetParameters().Length == 0) + { + conditionValues.Add((bool)conditionMethod.Invoke(target, null)); + } + } + + if (conditionValues.Count > 0) + { + bool draw; + if (showIfAttribute.ConditionOperator == ConditionOperator.And) + { + draw = true; + foreach (var value in conditionValues) + { + draw = draw && value; + } + } + else + { + draw = false; + foreach (var value in conditionValues) + { + draw = draw || value; + } + } + + if (showIfAttribute.Reversed) + { + draw = !draw; + } + + return draw; + } + else + { + string warning = showIfAttribute.GetType().Name + " needs a valid boolean condition field or method name to work"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: target); + + return true; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/ShowIfPropertyDrawCondition.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/ShowIfPropertyDrawCondition.cs.meta new file mode 100644 index 0000000..2e7a555 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawConditions/ShowIfPropertyDrawCondition.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: fce0c8241476ad94cbbcdd6faae90700 +timeCreated: 1508414568 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers.meta new file mode 100644 index 0000000..7f3a245 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4327d74fca5deaa4c83c483fe468d274 +folderAsset: yes +timeCreated: 1508051576 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DisableIfPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DisableIfPropertyDrawer.cs new file mode 100644 index 0000000..ed27b41 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DisableIfPropertyDrawer.cs @@ -0,0 +1,9 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawer(typeof(DisableIfAttribute))] + public class DisableIfPropertyDrawer : EnableIfPropertyDrawer + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DisableIfPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DisableIfPropertyDrawer.cs.meta new file mode 100644 index 0000000..579b0a4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DisableIfPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6093965e939dcd24687aed40741be04b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs new file mode 100644 index 0000000..f7ac834 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs @@ -0,0 +1,130 @@ +using UnityEngine; +using UnityEditor; +using System.Reflection; +using System.Collections; +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawer(typeof(DropdownAttribute))] + public class DropdownPropertyDrawer : PropertyDrawer + { + public override void DrawProperty(SerializedProperty property) + { + EditorDrawUtility.DrawHeader(property); + + DropdownAttribute dropdownAttribute = PropertyUtility.GetAttribute(property); + UnityEngine.Object target = PropertyUtility.GetTargetObject(property); + + FieldInfo fieldInfo = ReflectionUtility.GetField(target, property.name); + FieldInfo valuesFieldInfo = ReflectionUtility.GetField(target, dropdownAttribute.ValuesFieldName); + + if (valuesFieldInfo == null) + { + this.DrawWarningBox(string.Format("{0} cannot find a values field with name \"{1}\"", dropdownAttribute.GetType().Name, dropdownAttribute.ValuesFieldName)); + EditorGUILayout.PropertyField(property, true); + } + else if (valuesFieldInfo.GetValue(target) is IList && + fieldInfo.FieldType == this.GetElementType(valuesFieldInfo)) + { + // Selected value + object selectedValue = fieldInfo.GetValue(target); + + // Values and display options + IList valuesList = (IList)valuesFieldInfo.GetValue(target); + object[] values = new object[valuesList.Count]; + string[] displayOptions = new string[valuesList.Count]; + + for (int i = 0; i < values.Length; i++) + { + object value = valuesList[i]; + values[i] = value; + displayOptions[i] = value.ToString(); + } + + // Selected value index + int selectedValueIndex = Array.IndexOf(values, selectedValue); + if (selectedValueIndex < 0) + { + selectedValueIndex = 0; + } + + // Draw the dropdown + this.DrawDropdown(target, fieldInfo, property.displayName, selectedValueIndex, values, displayOptions); + } + else if (valuesFieldInfo.GetValue(target) is IDropdownList) + { + // Current value + object selectedValue = fieldInfo.GetValue(target); + + // Current value index, values and display options + IDropdownList dropdown = (IDropdownList)valuesFieldInfo.GetValue(target); + IEnumerator> dropdownEnumerator = dropdown.GetEnumerator(); + + int index = -1; + int selectedValueIndex = -1; + List values = new List(); + List displayOptions = new List(); + + while (dropdownEnumerator.MoveNext()) + { + index++; + + KeyValuePair current = dropdownEnumerator.Current; + if (current.Value.Equals(selectedValue)) + { + selectedValueIndex = index; + } + + values.Add(current.Value); + displayOptions.Add(current.Key); + } + + if (selectedValueIndex < 0) + { + selectedValueIndex = 0; + } + + // Draw the dropdown + this.DrawDropdown(target, fieldInfo, property.displayName, selectedValueIndex, values.ToArray(), displayOptions.ToArray()); + } + else + { + this.DrawWarningBox(typeof(DropdownAttribute).Name + " works only when the type of the field is equal to the element type of the array"); + EditorGUILayout.PropertyField(property, true); + } + } + + private Type GetElementType(FieldInfo listFieldInfo) + { + if (listFieldInfo.FieldType.IsGenericType) + { + return listFieldInfo.FieldType.GetGenericArguments()[0]; + } + else + { + return listFieldInfo.FieldType.GetElementType(); + } + } + + private void DrawDropdown(UnityEngine.Object target, FieldInfo fieldInfo, string label, int selectedValueIndex, object[] values, string[] displayOptions) + { + EditorGUI.BeginChangeCheck(); + + int newIndex = EditorGUILayout.Popup(label, selectedValueIndex, displayOptions); + + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Dropdown"); + fieldInfo.SetValue(target, values[newIndex]); + } + } + + private void DrawWarningBox(string message) + { + EditorGUILayout.HelpBox(message, MessageType.Warning); + Debug.LogWarning(message); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta new file mode 100644 index 0000000..eb68163 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 19d935f1205a5804c80c51c3ad95a271 +timeCreated: 1508753698 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnableIfPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnableIfPropertyDrawer.cs new file mode 100644 index 0000000..dfb8060 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnableIfPropertyDrawer.cs @@ -0,0 +1,71 @@ +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawer(typeof(EnableIfAttribute))] + public class EnableIfPropertyDrawer : PropertyDrawer + { + public override void DrawProperty(SerializedProperty property) + { + EnableIfAttribute enableIfAttribute = PropertyUtility.GetAttribute(property); + UnityEngine.Object target = PropertyUtility.GetTargetObject(property); + + List conditionValues = new List(); + foreach (var condition in enableIfAttribute.Conditions) + { + FieldInfo conditionField = ReflectionUtility.GetField(target, condition); + if (conditionField != null && + conditionField.FieldType == typeof(bool)) + { + conditionValues.Add((bool)conditionField.GetValue(target)); + } + + MethodInfo conditionMethod = ReflectionUtility.GetMethod(target, condition); + if (conditionMethod != null && + conditionMethod.ReturnType == typeof(bool) && + conditionMethod.GetParameters().Length == 0) + { + conditionValues.Add((bool)conditionMethod.Invoke(target, null)); + } + } + + if (conditionValues.Count > 0) + { + bool enabled; + if (enableIfAttribute.ConditionOperator == ConditionOperator.And) + { + enabled = true; + foreach (var value in conditionValues) + { + enabled = enabled && value; + } + } + else + { + enabled = false; + foreach (var value in conditionValues) + { + enabled = enabled || value; + } + } + + if (enableIfAttribute.Reversed) + { + enabled = !enabled; + } + + GUI.enabled = enabled; + EditorDrawUtility.DrawPropertyField(property); + GUI.enabled = true; + } + else + { + string warning = enableIfAttribute.GetType().Name + " needs a valid boolean condition field or method name to work"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: target); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnableIfPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnableIfPropertyDrawer.cs.meta new file mode 100644 index 0000000..9b1abe6 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnableIfPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 36d4c9f730abf4945814f7e205003836 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LabelPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LabelPropertyDrawer.cs new file mode 100644 index 0000000..301b48f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LabelPropertyDrawer.cs @@ -0,0 +1,16 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawer(typeof(LabelAttribute))] + public class LabelPropertyDrawer : PropertyDrawer + { + public override void DrawProperty(SerializedProperty property) + { + var labelAttribute = PropertyUtility.GetAttribute(property); + var guiContent = new GUIContent(labelAttribute.Label); + EditorGUILayout.PropertyField(property, guiContent, true); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LabelPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LabelPropertyDrawer.cs.meta new file mode 100644 index 0000000..bfd5f26 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LabelPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: efcf74639df2db34c8302355c0d29454 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs new file mode 100644 index 0000000..f902046 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs @@ -0,0 +1,76 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawer(typeof(MinMaxSliderAttribute))] + public class MinMaxSliderPropertyDrawer : PropertyDrawer + { + public override void DrawProperty(SerializedProperty property) + { + EditorDrawUtility.DrawHeader(property); + + MinMaxSliderAttribute minMaxSliderAttribute = PropertyUtility.GetAttribute(property); + + if (property.propertyType == SerializedPropertyType.Vector2) + { + Rect controlRect = EditorGUILayout.GetControlRect(); + float labelWidth = EditorGUIUtility.labelWidth; + float floatFieldWidth = EditorGUIUtility.fieldWidth; + float sliderWidth = controlRect.width - labelWidth - 2f * floatFieldWidth; + float sliderPadding = 5f; + + Rect labelRect = new Rect( + controlRect.x, + controlRect.y, + labelWidth, + controlRect.height); + + Rect sliderRect = new Rect( + controlRect.x + labelWidth + floatFieldWidth + sliderPadding, + controlRect.y, + sliderWidth - 2f * sliderPadding, + controlRect.height); + + Rect minFloatFieldRect = new Rect( + controlRect.x + labelWidth, + controlRect.y, + floatFieldWidth, + controlRect.height); + + Rect maxFloatFieldRect = new Rect( + controlRect.x + labelWidth + floatFieldWidth + sliderWidth, + controlRect.y, + floatFieldWidth, + controlRect.height); + + // Draw the label + EditorGUI.LabelField(labelRect, property.displayName); + + // Draw the slider + EditorGUI.BeginChangeCheck(); + + Vector2 sliderValue = property.vector2Value; + EditorGUI.MinMaxSlider(sliderRect, ref sliderValue.x, ref sliderValue.y, minMaxSliderAttribute.MinValue, minMaxSliderAttribute.MaxValue); + + sliderValue.x = EditorGUI.FloatField(minFloatFieldRect, sliderValue.x); + sliderValue.x = Mathf.Clamp(sliderValue.x, minMaxSliderAttribute.MinValue, Mathf.Min(minMaxSliderAttribute.MaxValue, sliderValue.y)); + + sliderValue.y = EditorGUI.FloatField(maxFloatFieldRect, sliderValue.y); + sliderValue.y = Mathf.Clamp(sliderValue.y, Mathf.Max(minMaxSliderAttribute.MinValue, sliderValue.x), minMaxSliderAttribute.MaxValue); + + if (EditorGUI.EndChangeCheck()) + { + property.vector2Value = sliderValue; + } + } + else + { + string warning = minMaxSliderAttribute.GetType().Name + " can be used only on Vector2 fields"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: PropertyUtility.GetTargetObject(property)); + + EditorDrawUtility.DrawPropertyField(property); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta new file mode 100644 index 0000000..ca0af07 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 27011af81554b5b4489b155f09275475 +timeCreated: 1508427131 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs new file mode 100644 index 0000000..582f2b1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs @@ -0,0 +1,96 @@ +using UnityEngine; +using UnityEditor; +using System; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawer(typeof(ProgressBarAttribute))] + public class ProgressBarPropertyDrawer : PropertyDrawer + { + public override void DrawProperty(SerializedProperty property) + { + EditorDrawUtility.DrawHeader(property); + + if (property.propertyType != SerializedPropertyType.Float && property.propertyType != SerializedPropertyType.Integer) + { + EditorGUILayout.HelpBox("Field " + property.name + " is not a number", MessageType.Warning); + return; + } + + var value = property.propertyType == SerializedPropertyType.Integer ? property.intValue : property.floatValue; + var valueFormatted = property.propertyType == SerializedPropertyType.Integer ? value.ToString() : String.Format("{0:0.00}", value); + + ProgressBarAttribute progressBarAttribute = PropertyUtility.GetAttribute(property); + var position = EditorGUILayout.GetControlRect(); + var maxValue = progressBarAttribute.MaxValue; + float lineHight = EditorGUIUtility.singleLineHeight; + float padding = EditorGUIUtility.standardVerticalSpacing; + var barPosition = new Rect(position.position.x, position.position.y, position.size.x, lineHight); + + var fillPercentage = value / maxValue; + var barLabel = (!string.IsNullOrEmpty(progressBarAttribute.Name) ? "[" + progressBarAttribute.Name + "] " : "") + valueFormatted + "/" + maxValue; + + var color = GetColor(progressBarAttribute.Color); + var color2 = Color.white; + DrawBar(barPosition, Mathf.Clamp01(fillPercentage), barLabel, color, color2); + } + + private void DrawBar(Rect position, float fillPercent, string label, Color barColor, Color labelColor) + { + if (Event.current.type != EventType.Repaint) + { + return; + } + + Color savedColor = GUI.color; + + var fillRect = new Rect(position.x, position.y, position.width * fillPercent, position.height); + + EditorGUI.DrawRect(position, new Color(0.13f, 0.13f, 0.13f)); + EditorGUI.DrawRect(fillRect, barColor); + + // set alignment and cache the default + var align = GUI.skin.label.alignment; + GUI.skin.label.alignment = TextAnchor.UpperCenter; + + // set the color and cache the default + var c = GUI.contentColor; + GUI.contentColor = labelColor; + + // calculate the position + var labelRect = new Rect(position.x, position.y - 2, position.width, position.height); + + // draw~ + EditorGUI.DropShadowLabel(labelRect, label); + + // reset color and alignment + GUI.contentColor = c; + GUI.skin.label.alignment = align; + } + + private Color GetColor(ProgressBarColor color) + { + switch (color) + { + case ProgressBarColor.Red: + return new Color32(255, 0, 63, 255); + case ProgressBarColor.Pink: + return new Color32(255, 152, 203, 255); + case ProgressBarColor.Orange: + return new Color32(255, 128, 0, 255); + case ProgressBarColor.Yellow: + return new Color32(255, 211, 0, 255); + case ProgressBarColor.Green: + return new Color32(102, 255, 0, 255); + case ProgressBarColor.Blue: + return new Color32(0, 135, 189, 255); + case ProgressBarColor.Indigo: + return new Color32(75, 0, 130, 255); + case ProgressBarColor.Violet: + return new Color32(127, 0, 255, 255); + default: + return Color.white; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta new file mode 100644 index 0000000..c7403f8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 47ba764aac86a4d488c8acd0af8f0d23 +timeCreated: 1518435237 +licenseType: Pro +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawer.cs new file mode 100644 index 0000000..762c30e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawer.cs @@ -0,0 +1,14 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public abstract class PropertyDrawer + { + public abstract void DrawProperty(SerializedProperty property); + + public virtual void ClearCache() + { + + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawer.cs.meta new file mode 100644 index 0000000..276a963 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: fd2df67a49fb7bd4d8e3914c5a2cf4a8 +timeCreated: 1508051576 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs new file mode 100644 index 0000000..a255642 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs @@ -0,0 +1,16 @@ +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawer(typeof(ReadOnlyAttribute))] + public class ReadOnlyPropertyDrawer : PropertyDrawer + { + public override void DrawProperty(SerializedProperty property) + { + GUI.enabled = false; + EditorDrawUtility.DrawPropertyField(property); + GUI.enabled = true; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs.meta new file mode 100644 index 0000000..aa80c05 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: a392efb1d44b30744bb7bf76e479cfab +timeCreated: 1508862451 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReorderableListPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReorderableListPropertyDrawer.cs new file mode 100644 index 0000000..ae2d212 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReorderableListPropertyDrawer.cs @@ -0,0 +1,70 @@ +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawer(typeof(ReorderableListAttribute))] + public class ReorderableListPropertyDrawer : PropertyDrawer + { + private Dictionary reorderableListsByPropertyName = new Dictionary(); + + string GetPropertyKeyName(SerializedProperty property) + { + return property.serializedObject.targetObject.GetInstanceID() + "/" + property.name; + } + + public override void DrawProperty(SerializedProperty property) + { + EditorDrawUtility.DrawHeader(property); + + if (property.isArray) + { + var key = GetPropertyKeyName(property); + + if (!this.reorderableListsByPropertyName.ContainsKey(key)) + { + ReorderableList reorderableList = new ReorderableList(property.serializedObject, property, true, true, true, true) + { + drawHeaderCallback = (Rect rect) => + { + EditorGUI.LabelField(rect, string.Format("{0}: {1}", property.displayName, property.arraySize), EditorStyles.label); + }, + + drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + var element = property.GetArrayElementAtIndex(index); + rect.y += 1.0f; + rect.x += 10.0f; + rect.width -= 10.0f; + + EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, 0.0f), element, true); + }, + + elementHeightCallback = (int index) => + { + return EditorGUI.GetPropertyHeight(property.GetArrayElementAtIndex(index)) + 4.0f; + } + }; + + this.reorderableListsByPropertyName[key] = reorderableList; + } + + this.reorderableListsByPropertyName[key].DoLayoutList(); + } + else + { + string warning = typeof(ReorderableListAttribute).Name + " can be used only on arrays or lists"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: PropertyUtility.GetTargetObject(property)); + + EditorDrawUtility.DrawPropertyField(property); + } + } + + public override void ClearCache() + { + this.reorderableListsByPropertyName.Clear(); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReorderableListPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReorderableListPropertyDrawer.cs.meta new file mode 100644 index 0000000..c06f619 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReorderableListPropertyDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 6d5a6c66de03d1d4882f0c83b0e5f8f2 +timeCreated: 1508402303 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs new file mode 100644 index 0000000..e2fd1d8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs @@ -0,0 +1,35 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawer(typeof(ResizableTextAreaAttribute))] + public class ResizableTextAreaPropertyDrawer : PropertyDrawer + { + public override void DrawProperty(SerializedProperty property) + { + EditorDrawUtility.DrawHeader(property); + + if (property.propertyType == SerializedPropertyType.String) + { + EditorGUILayout.LabelField(property.displayName); + + EditorGUI.BeginChangeCheck(); + + string textAreaValue = EditorGUILayout.TextArea(property.stringValue, GUILayout.MinHeight(EditorGUIUtility.singleLineHeight * 3f)); + + if (EditorGUI.EndChangeCheck()) + { + property.stringValue = textAreaValue; + } + } + else + { + string warning = PropertyUtility.GetAttribute(property).GetType().Name + " can only be used on string fields"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: PropertyUtility.GetTargetObject(property)); + + EditorDrawUtility.DrawPropertyField(property); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta new file mode 100644 index 0000000..898f9d2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 57848d4e847a8d445a53095abdbbb274 +timeCreated: 1508583167 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs new file mode 100644 index 0000000..f2e42b7 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs @@ -0,0 +1,40 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawer(typeof(ShowAssetPreviewAttribute))] + public class ShowAssetPreviewPropertyDrawer : PropertyDrawer + { + public override void DrawProperty(SerializedProperty property) + { + EditorDrawUtility.DrawPropertyField(property); + + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + if (property.objectReferenceValue != null) + { + Texture2D previewTexture = AssetPreview.GetAssetPreview(property.objectReferenceValue); + if (previewTexture != null) + { + ShowAssetPreviewAttribute showAssetPreviewAttribute = PropertyUtility.GetAttribute(property); + int width = Mathf.Clamp(showAssetPreviewAttribute.Width, 0, previewTexture.width); + int height = Mathf.Clamp(showAssetPreviewAttribute.Height, 0, previewTexture.height); + + GUILayout.Label(previewTexture, GUILayout.MaxWidth(width), GUILayout.MaxHeight(height)); + } + else + { + string warning = property.name + " doesn't have an asset preview"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: PropertyUtility.GetTargetObject(property)); + } + } + } + else + { + string warning = property.name + " doesn't have an asset preview"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: PropertyUtility.GetTargetObject(property)); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta new file mode 100644 index 0000000..4c4b7c0 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 6c461f4d7edd955419e5e6ce2c874599 +timeCreated: 1509089502 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SliderPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SliderPropertyDrawer.cs new file mode 100644 index 0000000..49280f0 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SliderPropertyDrawer.cs @@ -0,0 +1,31 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyDrawer(typeof(SliderAttribute))] + public class SliderPropertyDrawer : PropertyDrawer + { + public override void DrawProperty(SerializedProperty property) + { + EditorDrawUtility.DrawHeader(property); + + SliderAttribute sliderAttribute = PropertyUtility.GetAttribute(property); + + if (property.propertyType == SerializedPropertyType.Integer) + { + EditorGUILayout.IntSlider(property, (int)sliderAttribute.MinValue, (int)sliderAttribute.MaxValue); + } + else if (property.propertyType == SerializedPropertyType.Float) + { + EditorGUILayout.Slider(property, sliderAttribute.MinValue, sliderAttribute.MaxValue); + } + else + { + string warning = sliderAttribute.GetType().Name + " can be used only on int or float fields"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: PropertyUtility.GetTargetObject(property)); + + EditorDrawUtility.DrawPropertyField(property); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SliderPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SliderPropertyDrawer.cs.meta new file mode 100644 index 0000000..5aae3b0 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SliderPropertyDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: ae129a284d179ae41b8ab20f506e5d99 +timeCreated: 1508422518 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs new file mode 100644 index 0000000..462a1f1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs @@ -0,0 +1,56 @@ +using UnityEditor; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + // Original by Dylan Engelman + // http://jupiterlighthousestudio.com/custom-inspectors-unity/ + // Altered by Brecht Lecluyse http://www.brechtos.com + // and Sichen Liu https://sichenn.github.io + [PropertyDrawer(typeof(TagAttribute))] + public class TagPropertyDrawer : PropertyDrawer + { + public override void DrawProperty(SerializedProperty property) + { + if (property.propertyType == SerializedPropertyType.String) + { + // generate the taglist + custom tags + List tagList = new List(); + tagList.Add("(None)"); + tagList.Add("Untagged"); + tagList.AddRange(UnityEditorInternal.InternalEditorUtility.tags); + + string propertyString = property.stringValue; + int index = 0; + // check if there is an entry that matches the entry and get the index + // we skip index 0 as that is a special custom case + for (int i = 1; i < tagList.Count; i++) + { + if (tagList[i] == propertyString) + { + index = i; + break; + } + } + + // Draw the popup box with the current selected index + index = EditorGUILayout.Popup(property.displayName, index, tagList.ToArray()); + + // Adjust the actual string value of the property based on the selection + if (index > 0) + { + property.stringValue = tagList[index]; + } + else + { + property.stringValue = string.Empty; + } + } + else + { + EditorGUILayout.HelpBox(property.type + " is not supported by TagAttribute\n" + + "Use string instead", MessageType.Warning); + } + } + } +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta new file mode 100644 index 0000000..7a841a8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f915ac324502a0e48990bfe775312665 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers.meta new file mode 100644 index 0000000..d850feb --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 35fed6de66b90ad418e2ca247a303b9b +folderAsset: yes +timeCreated: 1508331735 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/BoxGroupPropertyGrouper.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/BoxGroupPropertyGrouper.cs new file mode 100644 index 0000000..e84eaf3 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/BoxGroupPropertyGrouper.cs @@ -0,0 +1,24 @@ +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [PropertyGrouper(typeof(BoxGroupAttribute))] + public class BoxGroupPropertyGrouper : PropertyGrouper + { + public override void BeginGroup(string label) + { + EditorGUILayout.BeginVertical(GUI.skin.box); + + if (!string.IsNullOrEmpty(label)) + { + EditorGUILayout.LabelField(label, EditorStyles.boldLabel); + } + } + + public override void EndGroup() + { + EditorGUILayout.EndVertical(); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/BoxGroupPropertyGrouper.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/BoxGroupPropertyGrouper.cs.meta new file mode 100644 index 0000000..b11e43f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/BoxGroupPropertyGrouper.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 657c1fb836d709c4b964d04f07ddd047 +timeCreated: 1508332897 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/PropertyGrouper.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/PropertyGrouper.cs new file mode 100644 index 0000000..2e4492a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/PropertyGrouper.cs @@ -0,0 +1,11 @@ +using System; + +namespace NaughtyAttributes.Editor +{ + public abstract class PropertyGrouper + { + public abstract void BeginGroup(string label); + + public abstract void EndGroup(); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/PropertyGrouper.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/PropertyGrouper.cs.meta new file mode 100644 index 0000000..1e2a88a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyGroupers/PropertyGrouper.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 207d6d654fe48184c97a1c946d0ad8a4 +timeCreated: 1508331735 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas.meta new file mode 100644 index 0000000..58792a1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 254c9f391295da84fb392b742e7fceae +folderAsset: yes +timeCreated: 1508497398 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/InfoBoxPropertyMeta.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/InfoBoxPropertyMeta.cs new file mode 100644 index 0000000..9d43e5c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/InfoBoxPropertyMeta.cs @@ -0,0 +1,68 @@ +using System.Reflection; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyMeta(typeof(InfoBoxAttribute))] + public class InfoBoxPropertyMeta : PropertyMeta + { + public override void ApplyPropertyMeta(SerializedProperty property, MetaAttribute metaAttribute) + { + InfoBoxAttribute infoBoxAttribute = (InfoBoxAttribute)metaAttribute; + UnityEngine.Object target = PropertyUtility.GetTargetObject(property); + + if (!string.IsNullOrEmpty(infoBoxAttribute.VisibleIf)) + { + FieldInfo conditionField = ReflectionUtility.GetField(target, infoBoxAttribute.VisibleIf); + if (conditionField != null && + conditionField.FieldType == typeof(bool)) + { + if ((bool)conditionField.GetValue(target)) + { + this.DrawInfoBox(infoBoxAttribute.Text, infoBoxAttribute.Type); + } + + return; + } + + MethodInfo conditionMethod = ReflectionUtility.GetMethod(target, infoBoxAttribute.VisibleIf); + if (conditionMethod != null && + conditionMethod.ReturnType == typeof(bool) && + conditionMethod.GetParameters().Length == 0) + { + if ((bool)conditionMethod.Invoke(target, null)) + { + this.DrawInfoBox(infoBoxAttribute.Text, infoBoxAttribute.Type); + } + + return; + } + + string warning = infoBoxAttribute.GetType().Name + " needs a valid boolean condition field or method name to work"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: PropertyUtility.GetTargetObject(property)); + } + else + { + this.DrawInfoBox(infoBoxAttribute.Text, infoBoxAttribute.Type); + } + } + + private void DrawInfoBox(string infoText, InfoBoxType infoBoxType) + { + switch (infoBoxType) + { + case InfoBoxType.Normal: + EditorGUILayout.HelpBox(infoText, MessageType.Info); + break; + + case InfoBoxType.Warning: + EditorGUILayout.HelpBox(infoText, MessageType.Warning); + break; + + case InfoBoxType.Error: + EditorGUILayout.HelpBox(infoText, MessageType.Error); + break; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/InfoBoxPropertyMeta.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/InfoBoxPropertyMeta.cs.meta new file mode 100644 index 0000000..bb4c001 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/InfoBoxPropertyMeta.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 998d996265069854eae8d1241df0c8aa +timeCreated: 1508607449 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/OnValueChangedPropertyMeta.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/OnValueChangedPropertyMeta.cs new file mode 100644 index 0000000..75303ce --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/OnValueChangedPropertyMeta.cs @@ -0,0 +1,31 @@ +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [PropertyMeta(typeof(OnValueChangedAttribute))] + public class OnValueChangedPropertyMeta : PropertyMeta + { + public override void ApplyPropertyMeta(SerializedProperty property, MetaAttribute metaAttribute) + { + OnValueChangedAttribute onValueChangedAttribute = (OnValueChangedAttribute)metaAttribute; + UnityEngine.Object target = PropertyUtility.GetTargetObject(property); + + MethodInfo callbackMethod = ReflectionUtility.GetMethod(target, onValueChangedAttribute.CallbackName); + if (callbackMethod != null && + callbackMethod.ReturnType == typeof(void) && + callbackMethod.GetParameters().Length == 0) + { + property.serializedObject.ApplyModifiedProperties(); // We must apply modifications so that the callback can be invoked with up-to-date data + + callbackMethod.Invoke(target, null); + } + else + { + string warning = onValueChangedAttribute.GetType().Name + " can invoke only action methods - with void return type and no parameters"; + Debug.LogWarning(warning, target); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/OnValueChangedPropertyMeta.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/OnValueChangedPropertyMeta.cs.meta new file mode 100644 index 0000000..4c29909 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/OnValueChangedPropertyMeta.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: a55050bf047356c49b1598f431d277e9 +timeCreated: 1508612140 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/PropertyMeta.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/PropertyMeta.cs new file mode 100644 index 0000000..3d9b499 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/PropertyMeta.cs @@ -0,0 +1,9 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public abstract class PropertyMeta + { + public abstract void ApplyPropertyMeta(SerializedProperty property, MetaAttribute metaAttribute); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/PropertyMeta.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/PropertyMeta.cs.meta new file mode 100644 index 0000000..831ab49 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyMetas/PropertyMeta.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 87cd72b1f8ad36840a07e1128f77ec5b +timeCreated: 1508497398 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators.meta new file mode 100644 index 0000000..6713dc9 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: efd539f7816167541ba63e633f2a9a7c +folderAsset: yes +timeCreated: 1508153828 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs new file mode 100644 index 0000000..454313f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs @@ -0,0 +1,33 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyValidator(typeof(MaxValueAttribute))] + public class MaxValuePropertyValidator : PropertyValidator + { + public override void ValidateProperty(SerializedProperty property) + { + MaxValueAttribute maxValueAttribute = PropertyUtility.GetAttribute(property); + + if (property.propertyType == SerializedPropertyType.Integer) + { + if (property.intValue > maxValueAttribute.MaxValue) + { + property.intValue = (int)maxValueAttribute.MaxValue; + } + } + else if (property.propertyType == SerializedPropertyType.Float) + { + if (property.floatValue > maxValueAttribute.MaxValue) + { + property.floatValue = maxValueAttribute.MaxValue; + } + } + else + { + string warning = maxValueAttribute.GetType().Name + " can be used only on int or float fields"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: PropertyUtility.GetTargetObject(property)); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta new file mode 100644 index 0000000..a11c91a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 84ddaea11c76b9c4f9a0b56dbab25b4c +timeCreated: 1508153828 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs new file mode 100644 index 0000000..30a80b1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs @@ -0,0 +1,33 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyValidator(typeof(MinValueAttribute))] + public class MinValuePropertyValidator : PropertyValidator + { + public override void ValidateProperty(SerializedProperty property) + { + MinValueAttribute minValueAttribute = PropertyUtility.GetAttribute(property); + + if (property.propertyType == SerializedPropertyType.Integer) + { + if (property.intValue < minValueAttribute.MinValue) + { + property.intValue = (int)minValueAttribute.MinValue; + } + } + else if (property.propertyType == SerializedPropertyType.Float) + { + if (property.floatValue < minValueAttribute.MinValue) + { + property.floatValue = minValueAttribute.MinValue; + } + } + else + { + string warning = minValueAttribute.GetType().Name + " can be used only on int or float fields"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: PropertyUtility.GetTargetObject(property)); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta new file mode 100644 index 0000000..929ac89 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 68add38e187dd154889b1e3b13247621 +timeCreated: 1508153828 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidator.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidator.cs new file mode 100644 index 0000000..c7380ea --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidator.cs @@ -0,0 +1,9 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public abstract class PropertyValidator + { + public abstract void ValidateProperty(SerializedProperty property); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidator.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidator.cs.meta new file mode 100644 index 0000000..56aca33 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidator.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 73502d09058a2e344a1eb20859d29203 +timeCreated: 1508153828 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs new file mode 100644 index 0000000..5f16c6e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs @@ -0,0 +1,32 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyValidator(typeof(RequiredAttribute))] + public class RequiredPropertyValidator : PropertyValidator + { + public override void ValidateProperty(SerializedProperty property) + { + RequiredAttribute requiredAttribute = PropertyUtility.GetAttribute(property); + + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + if (property.objectReferenceValue == null) + { + string errorMessage = property.name + " is required"; + if (!string.IsNullOrEmpty(requiredAttribute.Message)) + { + errorMessage = requiredAttribute.Message; + } + + EditorDrawUtility.DrawHelpBox(errorMessage, MessageType.Error, context: PropertyUtility.GetTargetObject(property)); + } + } + else + { + string warning = requiredAttribute.GetType().Name + " works only on reference types"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: PropertyUtility.GetTargetObject(property)); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta new file mode 100644 index 0000000..239c36c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 0675503782f800d4081737a5e41f9bf5 +timeCreated: 1508655546 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs new file mode 100644 index 0000000..1113ef1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs @@ -0,0 +1,55 @@ +using System; +using System.Reflection; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [PropertyValidator(typeof(ValidateInputAttribute))] + public class ValidateInputPropertyValidator : PropertyValidator + { + public override void ValidateProperty(SerializedProperty property) + { + ValidateInputAttribute validateInputAttribute = PropertyUtility.GetAttribute(property); + UnityEngine.Object target = PropertyUtility.GetTargetObject(property); + + MethodInfo validationCallback = ReflectionUtility.GetMethod(target, validateInputAttribute.CallbackName); + + if (validationCallback != null && + validationCallback.ReturnType == typeof(bool) && + validationCallback.GetParameters().Length == 1) + { + FieldInfo fieldInfo = ReflectionUtility.GetField(target, property.name); + Type fieldType = fieldInfo.FieldType; + Type parameterType = validationCallback.GetParameters()[0].ParameterType; + + if (fieldType == parameterType) + { + if (!(bool)validationCallback.Invoke(target, new object[] { fieldInfo.GetValue(target) })) + { + if (string.IsNullOrEmpty(validateInputAttribute.Message)) + { + EditorDrawUtility.DrawHelpBox(property.name + " is not valid", MessageType.Error, context: target); + } + else + { + EditorDrawUtility.DrawHelpBox(validateInputAttribute.Message, MessageType.Error, context: target); + } + } + } + else + { + string warning = "The field type is not the same as the callback's parameter type"; + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: target); + } + } + else + { + string warning = + validateInputAttribute.GetType().Name + + " needs a callback with boolean return type and a single parameter of the same type as the field"; + + EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: target); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta new file mode 100644 index 0000000..fb4a666 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 9b7357cef1466544aac67a1976ad9a18 +timeCreated: 1508657795 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility.meta b/Assets/NaughtyAttributes/Scripts/Editor/Utility.meta new file mode 100644 index 0000000..ed16edd --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: acb4475c71a3fe947a81ced84ab89c6d +folderAsset: yes +timeCreated: 1508062761 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/EditorDrawUtility.cs b/Assets/NaughtyAttributes/Scripts/Editor/Utility/EditorDrawUtility.cs new file mode 100644 index 0000000..5532461 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/EditorDrawUtility.cs @@ -0,0 +1,123 @@ +using UnityEngine; +using UnityEditor; +using System; + +namespace NaughtyAttributes.Editor +{ + public static class EditorDrawUtility + { + public static void DrawHeader(string header) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField(header, EditorStyles.boldLabel); + } + + public static bool DrawHeader(SerializedProperty property) + { + HeaderAttribute headerAttr = PropertyUtility.GetAttribute(property); + if (headerAttr != null) + { + DrawHeader(headerAttr.header); + return true; + } + + return false; + } + + public static void DrawHelpBox(string message, MessageType type, UnityEngine.Object context = null, bool logToConsole = true) + { + EditorGUILayout.HelpBox(message, type); + + if (logToConsole) + { + switch (type) + { + case MessageType.None: + case MessageType.Info: + Debug.Log(message, context); + break; + case MessageType.Warning: + Debug.LogWarning(message, context); + break; + case MessageType.Error: + Debug.LogError(message, context); + break; + } + } + } + + public static void DrawPropertyField(SerializedProperty property, bool includeChildren = true) + { + EditorGUILayout.PropertyField(property, includeChildren); + } + + public static bool DrawLayoutField(object value, string label) + { + GUI.enabled = false; + + bool isDrawn = true; + Type valueType = value.GetType(); + + if (valueType == typeof(bool)) + { + EditorGUILayout.Toggle(label, (bool)value); + } + else if (valueType == typeof(int)) + { + EditorGUILayout.IntField(label, (int)value); + } + else if (valueType == typeof(long)) + { + EditorGUILayout.LongField(label, (long)value); + } + else if (valueType == typeof(float)) + { + EditorGUILayout.FloatField(label, (float)value); + } + else if (valueType == typeof(double)) + { + EditorGUILayout.DoubleField(label, (double)value); + } + else if (valueType == typeof(string)) + { + EditorGUILayout.TextField(label, (string)value); + } + else if (valueType == typeof(Vector2)) + { + EditorGUILayout.Vector2Field(label, (Vector2)value); + } + else if (valueType == typeof(Vector3)) + { + EditorGUILayout.Vector3Field(label, (Vector3)value); + } + else if (valueType == typeof(Vector4)) + { + EditorGUILayout.Vector4Field(label, (Vector4)value); + } + else if (valueType == typeof(Color)) + { + EditorGUILayout.ColorField(label, (Color)value); + } + else if (valueType == typeof(Bounds)) + { + EditorGUILayout.BoundsField(label, (Bounds)value); + } + else if (valueType == typeof(Rect)) + { + EditorGUILayout.RectField(label, (Rect)value); + } + else if (typeof(UnityEngine.Object).IsAssignableFrom(valueType)) + { + EditorGUILayout.ObjectField(label, (UnityEngine.Object)value, valueType, true); + } + else + { + isDrawn = false; + } + + GUI.enabled = true; + + return isDrawn; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/EditorDrawUtility.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Utility/EditorDrawUtility.cs.meta new file mode 100644 index 0000000..704d3e5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/EditorDrawUtility.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 6ff27ff7705d6064e935bb2159a1b453 +timeCreated: 1510926159 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/IOUtility.cs b/Assets/NaughtyAttributes/Scripts/Editor/Utility/IOUtility.cs new file mode 100644 index 0000000..9872765 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/IOUtility.cs @@ -0,0 +1,49 @@ +using UnityEngine; +using System.IO; + +namespace NaughtyAttributes.Editor +{ + public static class IOUtility + { + public static string GetPersistentDataPath() + { + return Application.persistentDataPath + "/"; + } + + public static void WriteToFile(string filePath, string content) + { + using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write)) + { + using (StreamWriter streamWriter = new StreamWriter(fileStream, System.Text.Encoding.ASCII)) + { + streamWriter.WriteLine(content); + } + } + } + + public static string ReadFromFile(string filePath) + { + using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) + { + using (StreamReader streamReader = new StreamReader(fileStream, System.Text.Encoding.ASCII)) + { + string content = streamReader.ReadToEnd(); + return content; + } + } + } + + public static bool FileExists(string filePath) + { + return File.Exists(filePath); + } + + public static string GetPathRelativeToProjectFolder(string fullPath) + { + int indexOfAssetsWord = fullPath.IndexOf("\\Assets"); + string relativePath = fullPath.Substring(indexOfAssetsWord + 1); + + return relativePath; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/IOUtility.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Utility/IOUtility.cs.meta new file mode 100644 index 0000000..e8ab56a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/IOUtility.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: bf376371b2951274e823154c03f066e2 +timeCreated: 1508232215 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs b/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs new file mode 100644 index 0000000..fa8051c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs @@ -0,0 +1,27 @@ +using UnityEditor; +using System; +using System.Reflection; + +namespace NaughtyAttributes.Editor +{ + public static class PropertyUtility + { + public static T GetAttribute(SerializedProperty property) where T : Attribute + { + T[] attributes = GetAttributes(property); + return attributes.Length > 0 ? attributes[0] : null; + } + + public static T[] GetAttributes(SerializedProperty property) where T : Attribute + { + FieldInfo fieldInfo = ReflectionUtility.GetField(GetTargetObject(property), property.name); + + return (T[])fieldInfo.GetCustomAttributes(typeof(T), true); + } + + public static UnityEngine.Object GetTargetObject(SerializedProperty property) + { + return property.serializedObject.targetObject; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs.meta new file mode 100644 index 0000000..fad8d5b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: e2d50a3c7c8a9754cb3936216494be66 +timeCreated: 1508153828 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs new file mode 100644 index 0000000..f1df8a4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace NaughtyAttributes.Editor +{ + public static class ReflectionUtility + { + public static IEnumerable GetAllFields(object target, Func predicate) + { + List types = new List() + { + target.GetType() + }; + + while (types.Last().BaseType != null) + { + types.Add(types.Last().BaseType); + } + + for (int i = types.Count - 1; i >= 0; i--) + { + IEnumerable fieldInfos = types[i] + .GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(predicate); + + foreach (var fieldInfo in fieldInfos) + { + yield return fieldInfo; + } + } + } + + public static IEnumerable GetAllProperties(object target, Func predicate) + { + List types = new List() + { + target.GetType() + }; + + while (types.Last().BaseType != null) + { + types.Add(types.Last().BaseType); + } + + for (int i = types.Count - 1; i >= 0; i--) + { + IEnumerable propertyInfos = types[i] + .GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(predicate); + + foreach (var propertyInfo in propertyInfos) + { + yield return propertyInfo; + } + } + } + + public static IEnumerable GetAllMethods(object target, Func predicate) + { + IEnumerable methodInfos = target.GetType() + .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public) + .Where(predicate); + + return methodInfos; + } + + public static FieldInfo GetField(object target, string fieldName) + { + return GetAllFields(target, f => f.Name.Equals(fieldName, StringComparison.InvariantCulture)).FirstOrDefault(); + } + + public static PropertyInfo GetProperty(object target, string propertyName) + { + return GetAllProperties(target, p => p.Name.Equals(propertyName, StringComparison.InvariantCulture)).FirstOrDefault(); + } + + public static MethodInfo GetMethod(object target, string methodName) + { + return GetAllMethods(target, m => m.Name.Equals(methodName, StringComparison.InvariantCulture)).FirstOrDefault(); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs.meta new file mode 100644 index 0000000..73b6ea9 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 1d86c581f02a55f458e36bf7e81e3084 +timeCreated: 1520258793 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test.meta b/Assets/NaughtyAttributes/Scripts/Test.meta new file mode 100644 index 0000000..6eca4f6 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ce2bd76b5676a434bb8a84254f67f1dc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/Buttons.cs b/Assets/NaughtyAttributes/Scripts/Test/Buttons.cs new file mode 100644 index 0000000..b53f8c8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Buttons.cs @@ -0,0 +1,17 @@ +using NaughtyAttributes; +using UnityEngine; + +public class Buttons : MonoBehaviour +{ + [Button] + public void MethodOne() + { + Debug.Log("MethodOne()"); + } + + [Button("Button Text")] + private void MethodTwo() + { + Debug.Log("MethodTwo()"); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/Buttons.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/Buttons.cs.meta new file mode 100644 index 0000000..1d7d58f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Buttons.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b592f12a9f69ac3408f6f870762232c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/Dropdowns.cs b/Assets/NaughtyAttributes/Scripts/Test/Dropdowns.cs new file mode 100644 index 0000000..cc35076 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Dropdowns.cs @@ -0,0 +1,28 @@ +using UnityEngine; +using NaughtyAttributes; +using System.Collections.Generic; + +public class Dropdowns : MonoBehaviour +{ + [Dropdown("intValues")] + public int intValue; + + [Dropdown("stringValues")] + public string stringValue; + + [Dropdown("vectorValues")] + public Vector3 vectorValue; + +#pragma warning disable 414 + private int[] intValues = new int[] { 1, 2, 3 }; + + private List stringValues = new List() { "A", "B", "C" }; + + private DropdownList vectorValues = new DropdownList() + { + { "Right", Vector3.right }, + { "Up", Vector3.up }, + { "Forward", Vector3.forward } + }; +#pragma warning restore 414 +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/Dropdowns.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/Dropdowns.cs.meta new file mode 100644 index 0000000..ec7fa24 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Dropdowns.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3855e37cd6b01194e8166573c7c4b37d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/EnableDisableIf.cs b/Assets/NaughtyAttributes/Scripts/Test/EnableDisableIf.cs new file mode 100644 index 0000000..801d1ea --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/EnableDisableIf.cs @@ -0,0 +1,22 @@ +using UnityEngine; +using NaughtyAttributes; + +public class EnableDisableIf : MonoBehaviour +{ + public bool enable1; + public bool enable2; + public bool disable1; + public bool disable2; + + [EnableIf(ConditionOperator.And, "enable1", "enable2")] + public int enableIfAll = 1; + + [EnableIf(ConditionOperator.Or, "enable1", "enable2")] + public int enableIfAny = 2; + + [DisableIf(ConditionOperator.And, "disable1", "disable2")] + public int disableIfAll = 1; + + [DisableIf(ConditionOperator.Or, "disable1", "disable2")] + public int disableIfAny = 2; +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/EnableDisableIf.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/EnableDisableIf.cs.meta new file mode 100644 index 0000000..c22fe7b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/EnableDisableIf.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bed506d8be3a10f45bec4bf2237bec87 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/InfoBoxes.cs b/Assets/NaughtyAttributes/Scripts/Test/InfoBoxes.cs new file mode 100644 index 0000000..272914a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/InfoBoxes.cs @@ -0,0 +1,14 @@ +using UnityEngine; +using NaughtyAttributes; + +public class InfoBoxes : MonoBehaviour +{ + [InfoBox("Normal", InfoBoxType.Normal)] + public int int1; + + [InfoBox("Warning", InfoBoxType.Warning)] + public int int2; + + [InfoBox("Error", InfoBoxType.Error)] + public int int3; +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/InfoBoxes.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/InfoBoxes.cs.meta new file mode 100644 index 0000000..68dc824 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/InfoBoxes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0dcb08e489c17644e9eacaa1ec5fe781 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/Label.cs b/Assets/NaughtyAttributes/Scripts/Test/Label.cs new file mode 100644 index 0000000..ca0aa1c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Label.cs @@ -0,0 +1,28 @@ +using UnityEngine; +using NaughtyAttributes; +using UnityEngine.AI; + +public class Label : MonoBehaviour +{ + [Label("A Short Name")] + public string aMoreSpecificName; + + [Label("RGB")] + public Vector3 vectorXYZ; + + [Label("Agent")] + public NavMeshAgent navMeshAgent; + + [Label("Ints")] + public int[] arrayOfInts; + + [Label("Custom Class")] + public MyClassExample myClass; + + [System.Serializable] + public class MyClassExample + { + public int aInt; + public string aString; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/Label.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/Label.cs.meta new file mode 100644 index 0000000..114af72 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Label.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7488af014527ebf42af5c4fc4d5f4f5b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef b/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef new file mode 100644 index 0000000..910f548 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef @@ -0,0 +1,14 @@ +{ + "name": "NaughtyAttributes.Test", + "references": [ + "NaughtyAttributes.Core" + ], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef.meta b/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef.meta new file mode 100644 index 0000000..c3d49e7 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: df1dea26b8503004d92d621e88aa9421 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/NaughtyComponent.cs b/Assets/NaughtyAttributes/Scripts/Test/NaughtyComponent.cs new file mode 100644 index 0000000..a68b78f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/NaughtyComponent.cs @@ -0,0 +1,8 @@ +using NaughtyAttributes; +using UnityEngine; + +public class NaughtyComponent : MonoBehaviour +{ + [Tag] + public string tagField; +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/NaughtyComponent.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/NaughtyComponent.cs.meta new file mode 100644 index 0000000..5702f19 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/NaughtyComponent.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 9c928ea15ae74a44089beb2e534c1a35 +timeCreated: 1507996629 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/NaughtyScriptableObject.cs b/Assets/NaughtyAttributes/Scripts/Test/NaughtyScriptableObject.cs new file mode 100644 index 0000000..e1f9095 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/NaughtyScriptableObject.cs @@ -0,0 +1,8 @@ +using UnityEngine; +using NaughtyAttributes; +using System.Collections.Generic; + +[CreateAssetMenu(fileName = "NaughtyScriptableObject", menuName = "NaughtyAttributes/NaughtyScriptableObject")] +public class NaughtyScriptableObject : ScriptableObject +{ +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/NaughtyScriptableObject.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/NaughtyScriptableObject.cs.meta new file mode 100644 index 0000000..eb5d253 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/NaughtyScriptableObject.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 753bdb918c6038142acddbd7aae6958f +timeCreated: 1518639587 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/NonSerializedProperties.cs b/Assets/NaughtyAttributes/Scripts/Test/NonSerializedProperties.cs new file mode 100644 index 0000000..9cc5b94 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/NonSerializedProperties.cs @@ -0,0 +1,25 @@ +using NaughtyAttributes; +using UnityEngine; + +public class NonSerializedProperties : MonoBehaviour +{ +#pragma warning disable 414 + [ShowNonSerializedField] + private int myInt = 10; + + [ShowNonSerializedField] + private const float PI = 3.14159f; + + [ShowNonSerializedField] + private static readonly Vector3 CONST_VECTOR = Vector3.one; +#pragma warning restore 414 + + [ShowNativeProperty] + public Transform Transform + { + get + { + return this.transform; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/NonSerializedProperties.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/NonSerializedProperties.cs.meta new file mode 100644 index 0000000..404ff1b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/NonSerializedProperties.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 913d67a695253f744bdc776625b9b948 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/OnValueChanged.cs b/Assets/NaughtyAttributes/Scripts/Test/OnValueChanged.cs new file mode 100644 index 0000000..1fe7261 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/OnValueChanged.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +public class OnValueChanged : MonoBehaviour +{ + [NaughtyAttributes.OnValueChanged("OnValueChangedMethod")] + public int onValueChanged; + + private void OnValueChangedMethod() + { + Debug.Log(this.onValueChanged); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/OnValueChanged.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/OnValueChanged.cs.meta new file mode 100644 index 0000000..bfd1ab2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/OnValueChanged.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff1df679e5b32f64bb106752c63933fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ProgressBar.cs b/Assets/NaughtyAttributes/Scripts/Test/ProgressBar.cs new file mode 100644 index 0000000..93d64bd --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ProgressBar.cs @@ -0,0 +1,7 @@ +using UnityEngine; + +public class ProgressBar : MonoBehaviour +{ + [NaughtyAttributes.ProgressBar("Health", 100, NaughtyAttributes.ProgressBarColor.Orange)] + public float health = 50; +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ProgressBar.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ProgressBar.cs.meta new file mode 100644 index 0000000..db88429 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ProgressBar.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 96ca4c27fc649764b9d1625f1740cb9e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ReadOnly.cs b/Assets/NaughtyAttributes/Scripts/Test/ReadOnly.cs new file mode 100644 index 0000000..13052c9 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ReadOnly.cs @@ -0,0 +1,7 @@ +using UnityEngine; + +public class ReadOnly : MonoBehaviour +{ + [NaughtyAttributes.ReadOnly] + public int readOnlyInt = 5; +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ReadOnly.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ReadOnly.cs.meta new file mode 100644 index 0000000..d65c60c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ReadOnly.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5443d37a05e188846bda9b05b067184e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ReorderableLists.cs b/Assets/NaughtyAttributes/Scripts/Test/ReorderableLists.cs new file mode 100644 index 0000000..fbc93f2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ReorderableLists.cs @@ -0,0 +1,26 @@ +using NaughtyAttributes; +using System.Collections.Generic; +using UnityEngine; + +[System.Serializable] +public struct SomeStruct +{ + public int Int; + public float Float; + public Vector3 Vector; +} + +public class ReorderableLists : MonoBehaviour +{ + [BoxGroup("Reorderable Lists")] + [ReorderableList] + public int[] intArray; + + [BoxGroup("Reorderable Lists")] + [ReorderableList] + public List vectorList; + + [BoxGroup("Reorderable Lists")] + [ReorderableList] + public List structList; +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ReorderableLists.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ReorderableLists.cs.meta new file mode 100644 index 0000000..b993018 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ReorderableLists.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c93fde7cd79390148ac576c3a159a77b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreview.cs b/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreview.cs new file mode 100644 index 0000000..879d99f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreview.cs @@ -0,0 +1,10 @@ +using UnityEngine; + +public class ShowAssetPreview : MonoBehaviour +{ + [NaughtyAttributes.ShowAssetPreview] + public Sprite sprite; + + [NaughtyAttributes.ShowAssetPreview(96, 96)] + public GameObject prefab; +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreview.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreview.cs.meta new file mode 100644 index 0000000..b636853 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreview.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 705c14aa9ecaa274289972381f471367 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowHideIf.cs b/Assets/NaughtyAttributes/Scripts/Test/ShowHideIf.cs new file mode 100644 index 0000000..ba246ef --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowHideIf.cs @@ -0,0 +1,38 @@ +using UnityEngine; +using NaughtyAttributes; + +public class ShowHideIf : MonoBehaviour +{ + public bool show1; + public bool show2; + public bool hide1; + public bool hide2; + + [ShowIf("False")] + public int showIf = 0; + + [ShowIf(ConditionOperator.And, "show1", "show2")] + public int showIfAll = 1; + + [ShowIf(ConditionOperator.Or, "show1", "show2")] + public int showIfAny = 2; + + [HideIf("True")] + public int hideIf = 0; + + [HideIf(ConditionOperator.And, "hide1", "hide2")] + public int hideIfAll = 1; + + [HideIf(ConditionOperator.Or, "hide1", "hide2")] + public int hideIfAny = 2; + + private bool True() + { + return true; + } + + private bool False() + { + return false; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowHideIf.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ShowHideIf.cs.meta new file mode 100644 index 0000000..749d05c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowHideIf.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4fdbfcfbf5b056a4bac491fe21569572 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/Sliders.cs b/Assets/NaughtyAttributes/Scripts/Test/Sliders.cs new file mode 100644 index 0000000..207b0ea --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Sliders.cs @@ -0,0 +1,17 @@ +using NaughtyAttributes; +using UnityEngine; + +public class Sliders : MonoBehaviour +{ + [BoxGroup("Sliders")] + [Slider(0, 10)] + public int intSlider; + + [BoxGroup("Sliders")] + [Slider(0.0f, 10.0f)] + public float floatSlider; + + [BoxGroup("Sliders")] + [MinMaxSlider(0.0f, 100.0f)] + public Vector2 minMaxSlider; +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/Sliders.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/Sliders.cs.meta new file mode 100644 index 0000000..7580a81 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Sliders.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fd67fbde6acdd6a44944f12e507067c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/Tag.cs b/Assets/NaughtyAttributes/Scripts/Test/Tag.cs new file mode 100644 index 0000000..8e048ce --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Tag.cs @@ -0,0 +1,9 @@ +using UnityEngine; +using NaughtyAttributes; + +public class Tag : MonoBehaviour +{ + [Tag] + public string tagField; +} + diff --git a/Assets/NaughtyAttributes/Scripts/Test/Tag.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/Tag.cs.meta new file mode 100644 index 0000000..88ea5af --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Tag.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bcc0d5613b48fb43bd36c9d37e99900 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/Validation.cs b/Assets/NaughtyAttributes/Scripts/Test/Validation.cs new file mode 100644 index 0000000..013f947 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Validation.cs @@ -0,0 +1,22 @@ +using UnityEngine; +using NaughtyAttributes; + +public class Validation : MonoBehaviour +{ + [MinValue(0.0f), MaxValue(1.0f)] + public float minMaxValidated; + + [Required] + public Transform requiredTransform; + + [Required("Must not be null")] + public GameObject requiredGameObject; + + [ValidateInput("IsNotNull", "must not be null")] + public Sprite notNullSprite; + + private bool IsNotNull(Sprite sprite) + { + return sprite != null; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/Validation.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/Validation.cs.meta new file mode 100644 index 0000000..84a1e9d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/Validation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d62ee2e0611a614f8ab3cb1f291b07b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/TestAssets.meta b/Assets/NaughtyAttributes/TestAssets.meta new file mode 100644 index 0000000..931e8f8 --- /dev/null +++ b/Assets/NaughtyAttributes/TestAssets.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 53a462744f22ca549927c5e6ea797362 +folderAsset: yes +timeCreated: 1509089305 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/TestAssets/Cube.prefab b/Assets/NaughtyAttributes/TestAssets/Cube.prefab new file mode 100644 index 0000000..64055f6 --- /dev/null +++ b/Assets/NaughtyAttributes/TestAssets/Cube.prefab @@ -0,0 +1,93 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1981131855061102 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4344736110947706} + - component: {fileID: 33062901823624450} + - component: {fileID: 65233182844289960} + - component: {fileID: 23099360439063292} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4344736110947706 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981131855061102} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33062901823624450 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981131855061102} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!65 &65233182844289960 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981131855061102} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &23099360439063292 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981131855061102} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 diff --git a/Assets/NaughtyAttributes/TestAssets/Cube.prefab.meta b/Assets/NaughtyAttributes/TestAssets/Cube.prefab.meta new file mode 100644 index 0000000..f493507 --- /dev/null +++ b/Assets/NaughtyAttributes/TestAssets/Cube.prefab.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7ec354ef3daae7641b7a3fa5e1fe0c81 +timeCreated: 1509089337 +licenseType: Free +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/TestAssets/NaughtyScriptableObject.asset b/Assets/NaughtyAttributes/TestAssets/NaughtyScriptableObject.asset new file mode 100644 index 0000000..9fb8523 --- /dev/null +++ b/Assets/NaughtyAttributes/TestAssets/NaughtyScriptableObject.asset @@ -0,0 +1,40 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 753bdb918c6038142acddbd7aae6958f, type: 3} + m_Name: NaughtyScriptableObject + m_EditorClassIdentifier: + intSlider: 2 + floatSlider: 0 + minMaxSlider: {x: 0, y: 0} + intArray: + vectorList: [] + intValue: 0 + stringValue: + vectorValue: {x: 0, y: 0, z: 0} + textArea: + readOnlyInt: 5 + enableInt: 1 + enableIf: 0 + disabledIf: 0 + enabledInt: 0 + disabledInt: 0 + showInt: 1 + showIf: 0 + hideIf: 0 + shownInt: 0 + hiddenInt: 0 + sprite: {fileID: 0} + prefab: {fileID: 0} + health: 50 + minMaxValidated: 0 + requiredPrefab: {fileID: 1981131855061102, guid: 7ec354ef3daae7641b7a3fa5e1fe0c81, + type: 2} + onValueChanged: 1 diff --git a/Assets/NaughtyAttributes/TestAssets/NaughtyScriptableObject.asset.meta b/Assets/NaughtyAttributes/TestAssets/NaughtyScriptableObject.asset.meta new file mode 100644 index 0000000..dbcb741 --- /dev/null +++ b/Assets/NaughtyAttributes/TestAssets/NaughtyScriptableObject.asset.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 9cf80899b80517945a2d2390fb48877f +timeCreated: 1518639643 +licenseType: Free +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/TestAssets/icon-github.png b/Assets/NaughtyAttributes/TestAssets/icon-github.png new file mode 100644 index 0000000..228b09a Binary files /dev/null and b/Assets/NaughtyAttributes/TestAssets/icon-github.png differ diff --git a/Assets/NaughtyAttributes/TestAssets/icon-github.png.meta b/Assets/NaughtyAttributes/TestAssets/icon-github.png.meta new file mode 100644 index 0000000..d142770 --- /dev/null +++ b/Assets/NaughtyAttributes/TestAssets/icon-github.png.meta @@ -0,0 +1,128 @@ +fileFormatVersion: 2 +guid: 005888ede18a58e4db8d069cfa3007cb +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/_Scenes.meta b/Assets/NaughtyAttributes/_Scenes.meta new file mode 100644 index 0000000..91002d8 --- /dev/null +++ b/Assets/NaughtyAttributes/_Scenes.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: afb4c815411c28b449e61fbaa1a8bfa3 +folderAsset: yes +timeCreated: 1507995550 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/_Scenes/DemoScene.unity b/Assets/NaughtyAttributes/_Scenes/DemoScene.unity new file mode 100644 index 0000000..6210037 --- /dev/null +++ b/Assets/NaughtyAttributes/_Scenes/DemoScene.unity @@ -0,0 +1,572 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657874, g: 0.49641258, b: 0.5748172, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &1444377589 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1444377591} + - component: {fileID: 1444377590} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1444377590 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1444377589} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1444377591 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1444377589} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1591883662 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1591883666} + - component: {fileID: 1591883665} + - component: {fileID: 1591883664} + - component: {fileID: 1591883663} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1591883663 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1591883662} + m_Enabled: 1 +--- !u!124 &1591883664 +Behaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1591883662} + m_Enabled: 1 +--- !u!20 &1591883665 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1591883662} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1591883666 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1591883662} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2033251972 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2033251974} + - component: {fileID: 2033251973} + - component: {fileID: 2033251987} + - component: {fileID: 2033251986} + - component: {fileID: 2033251985} + - component: {fileID: 2033251984} + - component: {fileID: 2033251983} + - component: {fileID: 2033251982} + - component: {fileID: 2033251981} + - component: {fileID: 2033251980} + - component: {fileID: 2033251979} + - component: {fileID: 2033251978} + - component: {fileID: 2033251977} + - component: {fileID: 2033251976} + - component: {fileID: 2033251975} + - component: {fileID: 2033251989} + - component: {fileID: 2033251988} + m_Layer: 0 + m_Name: TestObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2033251973 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9c928ea15ae74a44089beb2e534c1a35, type: 3} + m_Name: + m_EditorClassIdentifier: + tagField: +--- !u!4 &2033251974 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2033251975 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0dcb08e489c17644e9eacaa1ec5fe781, type: 3} + m_Name: + m_EditorClassIdentifier: + int1: 0 + int2: 0 + int3: 0 +--- !u!114 &2033251976 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9d62ee2e0611a614f8ab3cb1f291b07b, type: 3} + m_Name: + m_EditorClassIdentifier: + minMaxValidated: 0 + requiredTransform: {fileID: 2033251974} + requiredGameObject: {fileID: 2033251972} + notNullSprite: {fileID: 21300000, guid: 005888ede18a58e4db8d069cfa3007cb, type: 3} +--- !u!114 &2033251977 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fd67fbde6acdd6a44944f12e507067c5, type: 3} + m_Name: + m_EditorClassIdentifier: + intSlider: 5 + floatSlider: 5.5 + minMaxSlider: {x: 25, y: 75} +--- !u!114 &2033251978 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 705c14aa9ecaa274289972381f471367, type: 3} + m_Name: + m_EditorClassIdentifier: + sprite: {fileID: 21300000, guid: 005888ede18a58e4db8d069cfa3007cb, type: 3} + prefab: {fileID: 1981131855061102, guid: 7ec354ef3daae7641b7a3fa5e1fe0c81, type: 3} +--- !u!114 &2033251979 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c93fde7cd79390148ac576c3a159a77b, type: 3} + m_Name: + m_EditorClassIdentifier: + intArray: 020000000100000003000000 + vectorList: + - {x: 1, y: 0, z: 0} + - {x: 0, y: 1, z: 0} + - {x: 0, y: 0, z: 1} + structList: + - Int: 3 + Float: 3.5 + Vector: {x: 3, y: 3, z: 3} + - Int: 1 + Float: 1.5 + Vector: {x: 1, y: 1, z: 1} + - Int: 2 + Float: 2.5 + Vector: {x: 2, y: 2, z: 2} +--- !u!114 &2033251980 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5443d37a05e188846bda9b05b067184e, type: 3} + m_Name: + m_EditorClassIdentifier: + readOnlyInt: 5 +--- !u!114 &2033251981 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 96ca4c27fc649764b9d1625f1740cb9e, type: 3} + m_Name: + m_EditorClassIdentifier: + health: 50 +--- !u!114 &2033251982 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ff1df679e5b32f64bb106752c63933fa, type: 3} + m_Name: + m_EditorClassIdentifier: + onValueChanged: 0 +--- !u!114 &2033251983 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 913d67a695253f744bdc776625b9b948, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2033251984 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bed506d8be3a10f45bec4bf2237bec87, type: 3} + m_Name: + m_EditorClassIdentifier: + enable1: 0 + enable2: 0 + disable1: 0 + disable2: 0 + enableIfAll: 1 + enableIfAny: 2 + disableIfAll: 1 + disableIfAny: 2 +--- !u!114 &2033251985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4fdbfcfbf5b056a4bac491fe21569572, type: 3} + m_Name: + m_EditorClassIdentifier: + show1: 0 + show2: 0 + hide1: 0 + hide2: 0 + showIf: 0 + showIfAll: 1 + showIfAny: 2 + hideIf: 0 + hideIfAll: 1 + hideIfAny: 2 +--- !u!114 &2033251986 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3855e37cd6b01194e8166573c7c4b37d, type: 3} + m_Name: + m_EditorClassIdentifier: + intValue: 2 + stringValue: B + vectorValue: {x: 0, y: 1, z: 0} +--- !u!114 &2033251987 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b592f12a9f69ac3408f6f870762232c7, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2033251988 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8bcc0d5613b48fb43bd36c9d37e99900, type: 3} + m_Name: + m_EditorClassIdentifier: + tagField: +--- !u!114 &2033251989 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033251972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7488af014527ebf42af5c4fc4d5f4f5b, type: 3} + m_Name: + m_EditorClassIdentifier: + aMoreSpecificName: + vectorXYZ: {x: 0, y: 0, z: 0} + navMeshAgent: {fileID: 0} + arrayOfInts: 0100000002000000 + myClass: + aInt: 0 + aString: diff --git a/Assets/NaughtyAttributes/_Scenes/DemoScene.unity.meta b/Assets/NaughtyAttributes/_Scenes/DemoScene.unity.meta new file mode 100644 index 0000000..819f1ec --- /dev/null +++ b/Assets/NaughtyAttributes/_Scenes/DemoScene.unity.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 07845a5477be2b149a6f1cb32b5a3a5b +timeCreated: 1507998788 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus.meta b/Assets/Oculus.meta new file mode 100644 index 0000000..53b1eff --- /dev/null +++ b/Assets/Oculus.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 068019728d5362b45a95f54311455d78 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR.meta b/Assets/Oculus/VR.meta new file mode 100644 index 0000000..23d1e15 --- /dev/null +++ b/Assets/Oculus/VR.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2461e3d01b058e14aa25e4c8990c2668 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/AudioClips.meta b/Assets/Oculus/VR/AudioClips.meta new file mode 100644 index 0000000..40eeb8d --- /dev/null +++ b/Assets/Oculus/VR/AudioClips.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 095d7a3dae7d8ea4cb761651027164ce +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/AudioClips/sfx_belt_in.wav b/Assets/Oculus/VR/AudioClips/sfx_belt_in.wav new file mode 100644 index 0000000..6e1229c Binary files /dev/null and b/Assets/Oculus/VR/AudioClips/sfx_belt_in.wav differ diff --git a/Assets/Oculus/VR/AudioClips/sfx_belt_in.wav.meta b/Assets/Oculus/VR/AudioClips/sfx_belt_in.wav.meta new file mode 100644 index 0000000..7549461 --- /dev/null +++ b/Assets/Oculus/VR/AudioClips/sfx_belt_in.wav.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: d716392289ac6764994885f5821f7d7b +AudioImporter: + externalObjects: {} + serializedVersion: 6 + defaultSettings: + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + preloadAudioData: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor.meta b/Assets/Oculus/VR/Editor.meta new file mode 100644 index 0000000..a3b8f7d --- /dev/null +++ b/Assets/Oculus/VR/Editor.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 76c19abd24bec62459b5f0d26fdd9a85 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Oculus/VR/Editor/AndroidManifest.OVRSubmission.xml b/Assets/Oculus/VR/Editor/AndroidManifest.OVRSubmission.xml new file mode 100644 index 0000000..dec8e60 --- /dev/null +++ b/Assets/Oculus/VR/Editor/AndroidManifest.OVRSubmission.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/Assets/Oculus/VR/Editor/AndroidManifest.OVRSubmission.xml.meta b/Assets/Oculus/VR/Editor/AndroidManifest.OVRSubmission.xml.meta new file mode 100644 index 0000000..5d2b9eb --- /dev/null +++ b/Assets/Oculus/VR/Editor/AndroidManifest.OVRSubmission.xml.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7a16cc136accf1f42bdc6f71f94b50ac +timeCreated: 1475710636 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRADBTool.cs b/Assets/Oculus/VR/Editor/OVRADBTool.cs new file mode 100644 index 0000000..de1569b --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRADBTool.cs @@ -0,0 +1,262 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading; +using UnityEngine; + +using Debug = UnityEngine.Debug; + +public class OVRADBTool +{ + public bool isReady; + + public string androidSdkRoot; + public string androidPlatformToolsPath; + public string adbPath; + + public OVRADBTool(string androidSdkRoot) + { + if (!String.IsNullOrEmpty(androidSdkRoot)) + { + this.androidSdkRoot = androidSdkRoot; + } + else + { + this.androidSdkRoot = String.Empty; + } + + if (this.androidSdkRoot.EndsWith("\\") || this.androidSdkRoot.EndsWith("/")) + { + this.androidSdkRoot = this.androidSdkRoot.Remove(this.androidSdkRoot.Length - 1); + } + androidPlatformToolsPath = Path.Combine(this.androidSdkRoot, "platform-tools"); + adbPath = Path.Combine(androidPlatformToolsPath, "adb.exe"); + isReady = File.Exists(adbPath); + } + + public static bool IsAndroidSdkRootValid(string androidSdkRoot) + { + OVRADBTool tool = new OVRADBTool(androidSdkRoot); + return tool.isReady; + } + + public delegate void WaitingProcessToExitCallback(); + + public int StartServer(WaitingProcessToExitCallback waitingProcessToExitCallback) + { + string outputString; + string errorString; + + int exitCode = RunCommand(new string[] { "start-server" }, waitingProcessToExitCallback, out outputString, out errorString); + return exitCode; + } + + public int KillServer(WaitingProcessToExitCallback waitingProcessToExitCallback) + { + string outputString; + string errorString; + + int exitCode = RunCommand(new string[] { "kill-server" }, waitingProcessToExitCallback, out outputString, out errorString); + return exitCode; + } + + public int ForwardPort(int port, WaitingProcessToExitCallback waitingProcessToExitCallback) + { + string outputString; + string errorString; + + string portString = string.Format("tcp:{0}", port); + + int exitCode = RunCommand(new string[] { "forward", portString, portString }, waitingProcessToExitCallback, out outputString, out errorString); + return exitCode; + } + + public int ReleasePort(int port, WaitingProcessToExitCallback waitingProcessToExitCallback) + { + string outputString; + string errorString; + + string portString = string.Format("tcp:{0}", port); + + int exitCode = RunCommand(new string[] { "forward", "--remove", portString }, waitingProcessToExitCallback, out outputString, out errorString); + return exitCode; + } + + public List GetDevices() + { + string outputString; + string errorString; + + RunCommand(new string[] { "devices" }, null, out outputString, out errorString); + string[] devices = outputString.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); + + List deviceList = new List(devices); + deviceList.RemoveAt(0); + + for(int i = 0; i < deviceList.Count; i++) + { + string deviceName = deviceList[i]; + int index = deviceName.IndexOf('\t'); + if (index >= 0) + deviceList[i] = deviceName.Substring(0, index); + else + deviceList[i] = ""; + + } + + return deviceList; + } + + private StringBuilder outputStringBuilder = null; + private StringBuilder errorStringBuilder = null; + + public int RunCommand(string[] arguments, WaitingProcessToExitCallback waitingProcessToExitCallback, out string outputString, out string errorString) + { + int exitCode = -1; + + if (!isReady) + { + Debug.LogWarning("OVRADBTool not ready"); + outputString = string.Empty; + errorString = "OVRADBTool not ready"; + return exitCode; + } + + string args = string.Join(" ", arguments); + + ProcessStartInfo startInfo = new ProcessStartInfo(adbPath, args); + startInfo.WorkingDirectory = androidSdkRoot; + startInfo.CreateNoWindow = true; + startInfo.UseShellExecute = false; + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + startInfo.RedirectStandardOutput = true; + startInfo.RedirectStandardError = true; + + outputStringBuilder = new StringBuilder(""); + errorStringBuilder = new StringBuilder(""); + + Process process = Process.Start(startInfo); + process.OutputDataReceived += new DataReceivedEventHandler(OutputDataReceivedHandler); + process.ErrorDataReceived += new DataReceivedEventHandler(ErrorDataReceivedHandler); + + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + try + { + do + { + if (waitingProcessToExitCallback != null) + { + waitingProcessToExitCallback(); + } + } while (!process.WaitForExit(100)); + + process.WaitForExit(); + } + catch (Exception e) + { + Debug.LogWarningFormat("[OVRADBTool.RunCommand] exception {0}", e.Message); + } + + exitCode = process.ExitCode; + + process.Close(); + + outputString = outputStringBuilder.ToString(); + errorString = errorStringBuilder.ToString(); + + outputStringBuilder = null; + errorStringBuilder = null; + + if (!string.IsNullOrEmpty(errorString)) + { + if (errorString.Contains("Warning")) + { + UnityEngine.Debug.LogWarning("OVRADBTool " + errorString); + } + else + { + UnityEngine.Debug.LogError("OVRADBTool " + errorString); + } + } + + return exitCode; + } + + public Process RunCommandAsync(string[] arguments, DataReceivedEventHandler outputDataRecievedHandler) + { + if (!isReady) + { + Debug.LogWarning("OVRADBTool not ready"); + return null; + } + + string args = string.Join(" ", arguments); + + ProcessStartInfo startInfo = new ProcessStartInfo(adbPath, args); + startInfo.WorkingDirectory = androidSdkRoot; + startInfo.CreateNoWindow = true; + startInfo.UseShellExecute = false; + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + startInfo.RedirectStandardOutput = true; + startInfo.RedirectStandardError = true; + + Process process = Process.Start(startInfo); + if (outputDataRecievedHandler != null) + { + process.OutputDataReceived += new DataReceivedEventHandler(outputDataRecievedHandler); + } + + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + return process; + } + + private void OutputDataReceivedHandler(object sendingProcess, DataReceivedEventArgs args) + { + // Collect the sort command output. + if (!string.IsNullOrEmpty(args.Data)) + { + // Add the text to the collected output. + outputStringBuilder.Append(args.Data); + outputStringBuilder.Append(Environment.NewLine); + } + } + + private void ErrorDataReceivedHandler(object sendingProcess, DataReceivedEventArgs args) + { + // Collect the sort command output. + if (!string.IsNullOrEmpty(args.Data)) + { + // Add the text to the collected output. + errorStringBuilder.Append(args.Data); + errorStringBuilder.Append(Environment.NewLine); + } + } +} diff --git a/Assets/Oculus/VR/Editor/OVRADBTool.cs.meta b/Assets/Oculus/VR/Editor/OVRADBTool.cs.meta new file mode 100644 index 0000000..312e180 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRADBTool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 41c2cab7d83278a4f8f44a44b694770f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRBuild.cs b/Assets/Oculus/VR/Editor/OVRBuild.cs new file mode 100644 index 0000000..10931c0 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRBuild.cs @@ -0,0 +1,593 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using UnityEngine; +using UnityEditor; +using System; +using System.IO; +using System.Diagnostics; +using System.Collections.Generic; +using System.Threading; + +/// +/// Allows Oculus to build apps from the command line. +/// +partial class OculusBuildApp : EditorWindow +{ + static void SetPCTarget() + { + if (EditorUserBuildSettings.activeBuildTarget != BuildTarget.StandaloneWindows) + { + EditorUserBuildSettings.SwitchActiveBuildTarget (BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows); + } + UnityEditorInternal.VR.VREditor.SetVREnabledOnTargetGroup(BuildTargetGroup.Standalone, true); + PlayerSettings.virtualRealitySupported = true; + AssetDatabase.SaveAssets(); + } + + static void SetAndroidTarget() + { + EditorUserBuildSettings.androidBuildSubtarget = MobileTextureSubtarget.ASTC; + EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle; + + if (EditorUserBuildSettings.activeBuildTarget != BuildTarget.Android) + { + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android, BuildTarget.Android); + } + + UnityEditorInternal.VR.VREditor.SetVREnabledOnTargetGroup(BuildTargetGroup.Standalone, true); + PlayerSettings.virtualRealitySupported = true; + AssetDatabase.SaveAssets(); + } + +#if UNITY_EDITOR_WIN && UNITY_2018_3_OR_NEWER && UNITY_ANDROID + // Build setting constants + const string REMOTE_APK_PATH = "/sdcard/Oculus/Temp"; + const float USB_TRANSFER_SPEED_THRES = 25.0f; + const float USB_3_TRANSFER_SPEED = 32.0f; + const int NUM_BUILD_AND_RUN_STEPS = 9; + const int BYTES_TO_MEGABYTES = 1048576; + + // Progress bar variables + static int totalBuildSteps; + static int currentStep; + static string progressMessage; + + // Build setting varaibles + static string gradlePath; + static string jdkPath; + static string androidSdkPath; + static string applicationIdentifier; + static string productName; + static string dataPath; + + static string gradleTempExport; + static string gradleExport; + static bool showCancel; + static bool buildFailed; + + static double totalBuildTime; + + static DirectorySyncer.CancellationTokenSource syncCancelToken; + static Process gradleBuildProcess; + static Thread buildThread; + + static bool? apkOutputSuccessful; + + private void OnGUI() + { + // Fix progress bar window size + minSize = new Vector2(500, 170); + maxSize = new Vector2(500, 170); + + // Show progress bar + Rect progressRect = EditorGUILayout.BeginVertical(); + progressRect.height = 25.0f; + float progress = currentStep / (float)totalBuildSteps; + EditorGUI.ProgressBar(progressRect, progress, progressMessage); + + // Show cancel button only after Unity export has finished. + if (showCancel) + { + GUIContent btnTxt = new GUIContent("Cancel"); + var rt = GUILayoutUtility.GetRect(btnTxt, GUI.skin.button, GUILayout.ExpandWidth(false)); + rt.center = new Vector2(EditorGUIUtility.currentViewWidth / 2, progressRect.height * 2); + if (GUI.Button(rt, btnTxt, GUI.skin.button)) + { + CancelBuild(); + } + } + EditorGUILayout.EndVertical(); + + // Close window if progress has completed or Unity export failed + if (progress >= 1.0f || buildFailed) + { + Close(); + } + } + + void Update() + { + // Force window update if not in focus to ensure progress bar still updates + var window = EditorWindow.focusedWindow; + if (window != null && window.ToString().Contains("OculusBuildApp")) + { + Repaint(); + } + } + + void CancelBuild() + { + SetProgressBarMessage("Canceling . . ."); + + if (syncCancelToken != null) + { + syncCancelToken.Cancel(); + } + + if (apkOutputSuccessful.HasValue && apkOutputSuccessful.Value) + { + buildThread.Abort(); + buildFailed = true; + } + + if (gradleBuildProcess != null && !gradleBuildProcess.HasExited) + { + var cancelThread = new Thread(delegate () + { + CancelGradleBuild(); + }); + cancelThread.Start(); + } + } + + void CancelGradleBuild() + { + Process cancelGradleProcess = new Process(); + string arguments = "-Xmx1024m -classpath \"" + gradlePath + + "\" org.gradle.launcher.GradleMain --stop"; + var processInfo = new System.Diagnostics.ProcessStartInfo + { + WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal, + FileName = jdkPath, + Arguments = arguments, + RedirectStandardInput = true, + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardError = true, + RedirectStandardOutput = true, + }; + + cancelGradleProcess.StartInfo = processInfo; + cancelGradleProcess.EnableRaisingEvents = true; + + cancelGradleProcess.OutputDataReceived += new DataReceivedEventHandler( + (s, e) => + { + if (e != null && e.Data != null && e.Data.Length != 0) + { + UnityEngine.Debug.LogFormat("Gradle: {0}", e.Data); + } + } + ); + + apkOutputSuccessful = false; + + cancelGradleProcess.Start(); + cancelGradleProcess.BeginOutputReadLine(); + cancelGradleProcess.WaitForExit(); + + buildFailed = true; + } + + [MenuItem("Oculus/OVR Build/OVR Build APK And Run %k", false, 20)] + static void StartBuildAndRun() + { + EditorWindow.GetWindow(typeof(OculusBuildApp)); + + showCancel = false; + buildFailed = false; + totalBuildTime = 0; + + InitializeProgressBar(NUM_BUILD_AND_RUN_STEPS); + IncrementProgressBar("Exporting Unity Project . . ."); + + OVRPlugin.SetDeveloperMode(OVRPlugin.Bool.True); + OVRPlugin.AddCustomMetadata("build_type", "ovr_build_and_run"); + + if (!CheckADBDevices()) + { + return; + } + + // Record OVR Build and Run start event + OVRPlugin.SendEvent("ovr_build_and_run_start", "", "ovrbuild"); + + apkOutputSuccessful = null; + syncCancelToken = null; + gradleBuildProcess = null; + + UnityEngine.Debug.Log("OVRBuild: Starting Unity build ..."); + + SetupDirectories(); + + // 1. Get scenes to build in Unity, and export gradle project + List sceneList = GetScenesToBuild(); + DateTime unityExportStart = DateTime.Now; + var buildResult = BuildPipeline.BuildPlayer(sceneList.ToArray(), gradleTempExport, BuildTarget.Android, + BuildOptions.AcceptExternalModificationsToPlayer | + BuildOptions.Development | + BuildOptions.AllowDebugging); + + if (buildResult.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded) + { + double unityExportTime = (DateTime.Now - unityExportStart).TotalSeconds; + OVRPlugin.SendEvent("build_step_unity_export", unityExportTime.ToString(), "ovrbuild"); + totalBuildTime += unityExportTime; + + // Set static variables so build thread has updated data + showCancel = true; + gradlePath = OVRConfig.Instance.GetGradlePath(); + jdkPath = OVRConfig.Instance.GetJDKPath(); + androidSdkPath = OVRConfig.Instance.GetAndroidSDKPath(); + applicationIdentifier = PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android); + productName = Application.productName; + dataPath = Application.dataPath; + + buildThread = new Thread(delegate () + { + OVRBuildRun(); + }); + buildThread.Start(); + return; + } + else if (buildResult.summary.result == UnityEditor.Build.Reporting.BuildResult.Cancelled) + { + UnityEngine.Debug.Log("Build cancelled."); + } + else + { + UnityEngine.Debug.Log("Build failed."); + } + buildFailed = true; + } + + static void OVRBuildRun() + { + // 2. Process gradle project + IncrementProgressBar("Processing gradle project . . ."); + if (ProcessGradleProject()) + { + // 3. Build gradle project + IncrementProgressBar("Starting gradle build . . ."); + if (BuildGradleProject()) + { + OVRPlugin.SendEvent("build_complete", totalBuildTime.ToString(), "ovrbuild"); + // 4. Deploy and run + if (DeployAPK()) + { + return; + } + } + } + buildFailed = true; + } + + private static bool BuildGradleProject() + { + gradleBuildProcess = new Process(); + string arguments = "-Xmx4096m -classpath \"" + gradlePath + + "\" org.gradle.launcher.GradleMain assembleDebug -x validateSigningDebug"; + var gradleProjectPath = Path.Combine(gradleExport, productName); + var processInfo = new System.Diagnostics.ProcessStartInfo + { + WorkingDirectory = gradleProjectPath, + WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal, + FileName = jdkPath, + Arguments = arguments, + RedirectStandardInput = true, + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardError = true, + RedirectStandardOutput = true, + }; + + gradleBuildProcess.StartInfo = processInfo; + gradleBuildProcess.EnableRaisingEvents = true; + + DateTime gradleStartTime = System.DateTime.Now; + DateTime gradleEndTime = System.DateTime.MinValue; + + gradleBuildProcess.Exited += new System.EventHandler( + (s, e) => + { + UnityEngine.Debug.Log("Gradle: Exited"); + } + ); + + gradleBuildProcess.OutputDataReceived += new DataReceivedEventHandler( + (s, e) => + { + if (e != null && e.Data != null && + e.Data.Length != 0 && e.Data.Contains("BUILD")) + { + UnityEngine.Debug.LogFormat("Gradle: {0}", e.Data); + if (e.Data.Contains("SUCCESSFUL")) + { + UnityEngine.Debug.LogFormat("APK Build Completed: {0}", + Path.Combine(Path.Combine(gradleProjectPath, "build\\outputs\\apk\\debug"), productName + "-debug.apk").Replace("/", "\\")); + if (!apkOutputSuccessful.HasValue) + { + apkOutputSuccessful = true; + } + gradleEndTime = System.DateTime.Now; + } + else if (e.Data.Contains("FAILED")) + { + apkOutputSuccessful = false; + } + } + } + ); + + gradleBuildProcess.ErrorDataReceived += new DataReceivedEventHandler( + (s, e) => + { + if (e != null && e.Data != null && + e.Data.Length != 0) + { + UnityEngine.Debug.LogErrorFormat("Gradle: {0}", e.Data); + } + apkOutputSuccessful = false; + } + ); + + gradleBuildProcess.Start(); + gradleBuildProcess.BeginOutputReadLine(); + IncrementProgressBar("Building gradle project . . ."); + + gradleBuildProcess.WaitForExit(); + + // Add a timeout for if gradle unexpectedlly exits or errors out + Stopwatch timeout = new Stopwatch(); + timeout.Start(); + while (apkOutputSuccessful == null) + { + if (timeout.ElapsedMilliseconds > 5000) + { + UnityEngine.Debug.LogError("Gradle has exited unexpectedly."); + apkOutputSuccessful = false; + } + System.Threading.Thread.Sleep(100); + } + + // Record time it takes to build gradle project only if we had a successful build + double gradleTime = (gradleEndTime - gradleStartTime).TotalSeconds; + if (gradleTime > 0) + { + OVRPlugin.SendEvent("build_step_building_gradle_project", gradleTime.ToString(), "ovrbuild"); + totalBuildTime += gradleTime; + } + + return apkOutputSuccessful.HasValue && apkOutputSuccessful.Value; + } + + private static bool ProcessGradleProject() + { + DateTime syncStartTime = System.DateTime.Now; + DateTime syncEndTime = System.DateTime.MinValue; + + try + { + var ps = System.Text.RegularExpressions.Regex.Escape("" + Path.DirectorySeparatorChar); + // ignore files .gradle/** build/** foo/.gradle/** and bar/build/** + var ignorePattern = string.Format("^([^{0}]+{0})?(\\.gradle|build){0}", ps); + + var syncer = new DirectorySyncer(gradleTempExport, + gradleExport, ignorePattern); + + syncCancelToken = new DirectorySyncer.CancellationTokenSource(); + var syncResult = syncer.Synchronize(syncCancelToken.Token); + syncEndTime = System.DateTime.Now; + } + catch (Exception e) + { + UnityEngine.Debug.Log("OVRBuild: Processing gradle project failed with exception: " + + e.Message); + return false; + } + + if (syncCancelToken.IsCancellationRequested) + { + return false; + } + + // Record time it takes to sync gradle projects only if the sync was successful + double syncTime = (syncEndTime - syncStartTime).TotalSeconds; + if (syncTime > 0) + { + OVRPlugin.SendEvent("build_step_sync_gradle_project", syncTime.ToString(), "ovrbuild"); + totalBuildTime += syncTime; + } + + return true; + } + + private static List GetScenesToBuild() + { + var sceneList = new List(); + foreach (var scene in EditorBuildSettings.scenes) + { + // Enumerate scenes in project and check if scene is enabled to build + if (scene.enabled) + { + sceneList.Add(scene.path); + } + } + return sceneList; + } + + public static bool DeployAPK() + { + // Create new instance of ADB Tool + var adbTool = new OVRADBTool(androidSdkPath); + + if (adbTool.isReady) + { + string apkPathLocal; + string gradleExportFolder = Path.Combine(Path.Combine(gradleExport, productName), "build\\outputs\\apk\\debug"); + + // Check to see if gradle output directory exists + gradleExportFolder = gradleExportFolder.Replace("/", "\\"); + if (!Directory.Exists(gradleExportFolder)) + { + UnityEngine.Debug.LogError("Could not find the gradle project at the expected path: " + gradleExportFolder); + return false; + } + + // Search for output APK in gradle output directory + apkPathLocal = Path.Combine(gradleExportFolder, productName + "-debug.apk"); + if (!System.IO.File.Exists(apkPathLocal)) + { + UnityEngine.Debug.LogError(string.Format("Could not find {0} in the gradle project.", productName + "-debug.apk")); + return false; + } + + string output, error; + DateTime timerStart; + + // Ensure that the Oculus temp directory is on the device by making it + IncrementProgressBar("Making Temp directory on device"); + string[] mkdirCommand = { "-d shell", "mkdir -p", REMOTE_APK_PATH }; + if (adbTool.RunCommand(mkdirCommand, null, out output, out error) != 0) return false; + + // Push APK to device, also time how long it takes + timerStart = System.DateTime.Now; + IncrementProgressBar("Pushing APK to device . . ."); + string[] pushCommand = { "-d push", "\"" + apkPathLocal + "\"", REMOTE_APK_PATH }; + if (adbTool.RunCommand(pushCommand, null, out output, out error) != 0) return false; + + // Calculate the transfer speed and determine if user is using USB 2.0 or 3.0 + TimeSpan pushTime = System.DateTime.Now - timerStart; + FileInfo apkInfo = new System.IO.FileInfo(apkPathLocal); + double transferSpeed = (apkInfo.Length / pushTime.TotalSeconds) / BYTES_TO_MEGABYTES; + bool informLog = transferSpeed < USB_TRANSFER_SPEED_THRES; + UnityEngine.Debug.Log("OVRADBTool: Push Success"); + + // Install the APK package on the device + IncrementProgressBar("Installing APK . . ."); + string apkPath = REMOTE_APK_PATH + "/" + productName + "-debug.apk"; + apkPath = apkPath.Replace(" ", "\\ "); + string[] installCommand = { "-d shell", "pm install -r", apkPath }; + + timerStart = System.DateTime.Now; + if (adbTool.RunCommand(installCommand, null, out output, out error) != 0) return false; + TimeSpan installTime = System.DateTime.Now - timerStart; + UnityEngine.Debug.Log("OVRADBTool: Install Success"); + + // Start the application on the device + IncrementProgressBar("Launching application on device . . ."); + string playerActivityName = "\"" + applicationIdentifier + "/" + applicationIdentifier + ".UnityPlayerActivity\""; + string[] appStartCommand = { "-d shell", "am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -S -f 0x10200000 -n", playerActivityName }; + if (adbTool.RunCommand(appStartCommand, null, out output, out error) != 0) return false; + UnityEngine.Debug.Log("OVRADBTool: Application Start Success"); + + // Send back metrics on push and install steps + OVRPlugin.AddCustomMetadata("transfer_speed", transferSpeed.ToString()); + OVRPlugin.SendEvent("build_step_push_apk", pushTime.TotalSeconds.ToString(), "ovrbuild"); + OVRPlugin.SendEvent("build_step_install_apk", installTime.TotalSeconds.ToString(), "ovrbuild"); + + IncrementProgressBar("Success!"); + + // If the user is using a USB 2.0 cable, inform them about improved transfer speeds and estimate time saved + if (informLog) + { + var usb3Time = apkInfo.Length / (USB_3_TRANSFER_SPEED * BYTES_TO_MEGABYTES); + UnityEngine.Debug.Log(string.Format("OVRBuild has detected slow transfer speeds. A USB 3.0 cable is recommended to reduce the time it takes to deploy your project by approximatly {0:0.0} seconds", pushTime.TotalSeconds - usb3Time)); + return true; + } + } + else + { + UnityEngine.Debug.LogError("Could not find the ADB executable in the specified Android SDK directory."); + } + return false; + } + + private static bool CheckADBDevices() + { + // Check if there are any ADB devices connected before starting the build process + var adbTool = new OVRADBTool(OVRConfig.Instance.GetAndroidSDKPath()); + if (adbTool.isReady) + { + List devices = adbTool.GetDevices(); + if (devices.Count == 0) + { + OVRPlugin.SendEvent("no_adb_devices", "", "ovrbuild"); + UnityEngine.Debug.LogError("No ADB devices connected. Cannot perform OVR Build and Run."); + return false; + } + else if(devices.Count > 1) + { + OVRPlugin.SendEvent("multiple_adb_devices", "", "ovrbuild"); + UnityEngine.Debug.LogError("Multiple ADB devices connected. Cannot perform OVR Build and Run."); + return false; + } + } + else + { + OVRPlugin.SendEvent("ovr_adbtool_initialize_failure", "", "ovrbuild"); + UnityEngine.Debug.LogError("OVR ADB Tool failed to initialize. Check the Android SDK path in [Edit -> Preferences -> External Tools]"); + return false; + } + return true; + } + + private static void SetupDirectories() + { + gradleTempExport = Path.Combine(Path.Combine(Application.dataPath, "../Temp"), "OVRGradleTempExport"); + gradleExport = Path.Combine(Path.Combine(Application.dataPath, "../Temp"), "OVRGradleExport"); + if (!Directory.Exists(gradleExport)) + { + Directory.CreateDirectory(gradleExport); + } + } + + private static void InitializeProgressBar(int stepCount) + { + currentStep = 0; + totalBuildSteps = stepCount; + } + + private static void IncrementProgressBar(string message) + { + currentStep++; + progressMessage = message; + UnityEngine.Debug.Log("OVRBuild: " + message); + } + + private static void SetProgressBarMessage(string message) + { + progressMessage = message; + UnityEngine.Debug.Log("OVRBuild: " + message); + } +#endif //UNITY_EDITOR_WIN && UNITY_2018_1_OR_NEWER && UNITY_ANDROID +} diff --git a/Assets/Oculus/VR/Editor/OVRBuild.cs.meta b/Assets/Oculus/VR/Editor/OVRBuild.cs.meta new file mode 100644 index 0000000..346624d --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRBuild.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fef522d0247215a43be6b1a8819bd940 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Editor/OVRBundleManager.cs b/Assets/Oculus/VR/Editor/OVRBundleManager.cs new file mode 100644 index 0000000..30088a8 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRBundleManager.cs @@ -0,0 +1,654 @@ +#if UNITY_EDITOR_WIN +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System; +using System.Linq; + +using UnityEngine; +using UnityEditor; +#if UNITY_2018_1_OR_NEWER +using UnityEditor.Build.Reporting; +#endif + +public class OVRBundleManager +{ + public const string TRANSITION_APK_VERSION_NAME = "OVRTransitionAPKVersion"; + private const int BUNDLE_CHUNK_SIZE = 30; + private const string TRANSITION_SCENE_RELATIVE_PATH = "Scenes/OVRTransitionScene.unity"; + private const string BUNDLE_MANAGER_OUTPUT_PATH = "OVRAssetBundles"; + private const string BUNDLE_MANAGER_MASTER_BUNDLE = "OVRMasterBundle"; + + private const string EXTERNAL_STORAGE_PATH = "/sdcard/Android/data"; + private const string ADB_TOOL_INITIALIZE_ERROR = "Failed to initialize ADB Tool. Please check Android SDK path in Preferences -> External Tools"; + + private static string externalSceneCache; + private static string transitionScenePath; + + private static string projectDefaultAppIdentifier; + private static string projectDefaultVersion; + private static ScriptingImplementation projectScriptImplementation; +#if UNITY_2018_3_OR_NEWER + private static ManagedStrippingLevel projectManagedStrippingLevel; +#else + private static StrippingLevel projectStrippingLevel; +#endif + private static bool projectStripEngineCode; + + public static void BuildDeployTransitionAPK(bool useOptionalTransitionApkPackage) + { + OVRBundleTool.PrintLog("Building and deploying transition APK . . . ", true); + + if (!Directory.Exists(BUNDLE_MANAGER_OUTPUT_PATH)) + { + Directory.CreateDirectory(BUNDLE_MANAGER_OUTPUT_PATH); + } + + PrebuildProjectSettingUpdate(); + + if (String.IsNullOrEmpty(transitionScenePath)) + { + // Get current editor script's directory as base path + string[] res = System.IO.Directory.GetFiles(Application.dataPath, "OVRBundleManager.cs", SearchOption.AllDirectories); + if (res.Length > 1) + { + OVRBundleTool.PrintError("More than one OVRBundleManager editor script has been found, please double check your Oculus SDK import."); + return; + } + else + { + // Append Transition Scene's relative path to base path + var OVREditorScript = Path.GetDirectoryName(res[0]); + transitionScenePath = Path.Combine(OVREditorScript, TRANSITION_SCENE_RELATIVE_PATH); + } + } + + string[] buildScenes = new string[1] { transitionScenePath }; + string apkOutputPath = Path.Combine(BUNDLE_MANAGER_OUTPUT_PATH, "OVRTransition.apk"); + DateTime apkBuildStart = DateTime.Now; + +#if UNITY_2018_1_OR_NEWER + BuildReport report = BuildPipeline.BuildPlayer(buildScenes, apkOutputPath, BuildTarget.Android, + BuildOptions.Development | BuildOptions.AutoRunPlayer); + + if (report.summary.result == BuildResult.Succeeded) + { + OVRBundleTool.PrintSuccess(); + } + else if (report.summary.result == BuildResult.Failed) + { + OVRBundleTool.PrintError(); + } +#else + string error = BuildPipeline.BuildPlayer(buildScenes, apkOutputPath, BuildTarget.Android, + BuildOptions.Development | BuildOptions.AutoRunPlayer); + + if (string.IsNullOrEmpty(error)) + { + OVRBundleTool.PrintSuccess(); + } + else + { + OVRBundleTool.PrintError(); + } +#endif + OVRPlugin.SendEvent("oculus_bundle_tool", "apk_build_time", (DateTime.Now - apkBuildStart).TotalSeconds.ToString()); + PostbuildProjectSettingUpdate(); + } + + private static void PrebuildProjectSettingUpdate() + { + // Modify application identifier for transition APK + projectDefaultAppIdentifier = PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android); + PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, + projectDefaultAppIdentifier + GetTransitionApkOptionalIdentifier()); + + // Set VersionCode as a unique identifier for transition APK + projectDefaultVersion = PlayerSettings.bundleVersion; + PlayerSettings.bundleVersion = TRANSITION_APK_VERSION_NAME; + + // Modify IL2CPP option as it strips script symbols that are necessary for the scenes at runtime + projectScriptImplementation = PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup); + if (projectScriptImplementation != ScriptingImplementation.Mono2x) + { + // Show message in console to make it more clear to developers + OVRBundleTool.PrintLog("Build will use Mono as scripting backend."); + PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup, ScriptingImplementation.Mono2x); + } + + // Avoid stripping managed code that are necessary for the scenes at runtime +#if UNITY_2018_3_OR_NEWER + projectManagedStrippingLevel = PlayerSettings.GetManagedStrippingLevel(BuildTargetGroup.Android); + if (projectManagedStrippingLevel != ManagedStrippingLevel.Disabled) + { + OVRBundleTool.PrintLog("Build will set Managed Stripping Level to Disabled."); + PlayerSettings.SetManagedStrippingLevel(BuildTargetGroup.Android, ManagedStrippingLevel.Disabled); + } +#else + projectStrippingLevel = PlayerSettings.strippingLevel; + if (projectStrippingLevel != StrippingLevel.Disabled) + { + OVRBundleTool.PrintLog("Build will set Stripping Level to Disabled."); + PlayerSettings.strippingLevel = StrippingLevel.Disabled; + } +#endif + + projectStripEngineCode = PlayerSettings.stripEngineCode; + if (projectStripEngineCode) + { + PlayerSettings.stripEngineCode = false; + } + } + + private static void PostbuildProjectSettingUpdate() + { + // Restore application identifier + PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, + projectDefaultAppIdentifier); + + // Restore version setting + PlayerSettings.bundleVersion = projectDefaultVersion; + + // Restore scripting backend option + if (PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup) != projectScriptImplementation) + { + PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup, projectScriptImplementation); + } + + // Restore managed stripping level +#if UNITY_2018_3_OR_NEWER + if (PlayerSettings.GetManagedStrippingLevel(BuildTargetGroup.Android) != projectManagedStrippingLevel) + { + PlayerSettings.SetManagedStrippingLevel(BuildTargetGroup.Android, projectManagedStrippingLevel); + } +#else + if (PlayerSettings.strippingLevel != projectStrippingLevel) + { + PlayerSettings.strippingLevel = projectStrippingLevel; + } +#endif + + if (PlayerSettings.stripEngineCode != projectStripEngineCode) + { + PlayerSettings.stripEngineCode = projectStripEngineCode; + } + } + + // Build and deploy a list of scenes. It's suggested to only build and deploy one active scene that's being modified and + // its dependencies such as scenes that are loaded additively + public static void BuildDeployScenes(List sceneList, bool forceRestart) + { + externalSceneCache = EXTERNAL_STORAGE_PATH + "/" + PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android) + + GetTransitionApkOptionalIdentifier() + "/cache/scenes"; + + BuildSceneBundles(sceneList); + if (DeploySceneBundles(sceneList)) + { + if (forceRestart) + { + LaunchApplication(); + return; + } + OVRBundleTool.PrintSuccess(); + return; + } + } + + // Build assets that are used by scenes from the given list. + // This function will automatically de-duplicated same asset file being referenced in multiple scenes. + // Scene bundles will be created with name pattern: _ + private static void BuildSceneBundles(List sceneList) + { + DateTime totalStart = DateTime.Now; + // Keeps track of dependent assets across scenes + // to ensure each asset is only packaged once in one of the scene bundles. + // uniqueAssetInSceneBundle is a map from "asset unique identifier" to the first scene that references the asset. + // It supports different assets with same file name as "asset unique identifier" contain full qualified asset file path + Dictionary uniqueAssetInSceneBundle = new Dictionary(); + + // List of bundle targets for Unity's build pipeline to package + List assetBundleBuilds = new List(); + // Map that contains "asset type" to list of assets that are of the asset type + Dictionary> extToAssetList = new Dictionary>(); + + // Check if assets in Resources need to be packaged + if (CheckForResources()) + { + var resourceDirectories = Directory.GetDirectories("Assets", "Resources", SearchOption.AllDirectories).ToArray(); + // Fetch a list of all files in resource directory + string[] resourceAssetPaths = AssetDatabase.FindAssets("", resourceDirectories).Select(x => AssetDatabase.GUIDToAssetPath(x)).ToArray(); + ProcessAssets(resourceAssetPaths, "resources", ref uniqueAssetInSceneBundle, ref extToAssetList); + + AssetBundleBuild resourceBundle = new AssetBundleBuild(); + resourceBundle.assetNames = uniqueAssetInSceneBundle.Keys.ToArray(); + resourceBundle.assetBundleName = OVRSceneLoader.resourceBundleName; + assetBundleBuilds.Add(resourceBundle); + } + + // Create scene bundle output directory + string sceneBundleDirectory = Path.Combine(BUNDLE_MANAGER_OUTPUT_PATH, BUNDLE_MANAGER_MASTER_BUNDLE); + if (!Directory.Exists(sceneBundleDirectory)) + { + Directory.CreateDirectory(sceneBundleDirectory); + } + + OVRBundleTool.PrintLog("Building scene bundles . . . "); + DateTime labelingStart = DateTime.Now; + foreach (var scene in sceneList) + { + // Get all the assets that the scene depends on and sort them by type + DateTime getDepStart = DateTime.Now; + string[] assetDependencies = AssetDatabase.GetDependencies(scene.scenePath); + Debug.Log("[OVRBundleManager] - " + scene.sceneName + " - Calculated scene asset dependencies in: " + (DateTime.Now - getDepStart).TotalSeconds); + ProcessAssets(assetDependencies, scene.sceneName, ref uniqueAssetInSceneBundle, ref extToAssetList); + + // Add the scene into it's own bundle + string[] sceneAsset = new string[1] { scene.scenePath }; + AssetBundleBuild sceneBuild = new AssetBundleBuild(); + sceneBuild.assetBundleName = "scene_" + scene.sceneName; + sceneBuild.assetNames = sceneAsset; + assetBundleBuilds.Add(sceneBuild); + } + + // Chunk the asset bundles by number of assets + foreach (string ext in extToAssetList.Keys) + { + int assetCount = extToAssetList[ext].Count; + int numChunks = (assetCount + BUNDLE_CHUNK_SIZE - 1) / BUNDLE_CHUNK_SIZE; + //Debug.Log(ext + " has " + assetCount + " asset(s) that will be split into " + numChunks + " chunk(s)"); + for (int i = 0; i < numChunks; i++) + { + List assetChunkList; + if (i == numChunks - 1) + { + int size = BUNDLE_CHUNK_SIZE - (numChunks * BUNDLE_CHUNK_SIZE - assetCount); + assetChunkList = extToAssetList[ext].GetRange(i * BUNDLE_CHUNK_SIZE, size); + } + else + { + assetChunkList = extToAssetList[ext].GetRange(i * BUNDLE_CHUNK_SIZE, BUNDLE_CHUNK_SIZE); + } + AssetBundleBuild build = new AssetBundleBuild(); + build.assetBundleName = "asset_" + ext + i; + build.assetNames = assetChunkList.ToArray(); + //Debug.Log("Chunk " + i + " has " + assetChunkList.Count + " asset(s)"); + assetBundleBuilds.Add(build); + } + } + + Debug.Log("[OVRBundleManager] - Created chucked scene bundles in: " + (DateTime.Now - labelingStart).TotalSeconds); + + // Build asset bundles + BuildPipeline.BuildAssetBundles(sceneBundleDirectory, assetBundleBuilds.ToArray(), + BuildAssetBundleOptions.UncompressedAssetBundle, BuildTarget.Android); + + double bundleBuildTime = (DateTime.Now - totalStart).TotalSeconds; + Debug.Log("[OVRBundleManager] - Total Time: " + bundleBuildTime); + OVRPlugin.SendEvent("oculus_bundle_tool", "bundle_build_time", bundleBuildTime.ToString()); + } + + private static void ProcessAssets(string[] assetPaths, + string assetParent, + ref Dictionary uniqueAssetInSceneBundle, + ref Dictionary> extToAssetList) + { + foreach (string asset in assetPaths) + { + string ext = Path.GetExtension(asset); + if (!string.IsNullOrEmpty(ext)) + { + ext = ext.Substring(1); + if (!ext.Equals("cs") && !ext.Equals("unity")) + { + // Only process each asset once across all resource and scene bundles + // Each asset is keyed by full path as a unique identifier + if (!uniqueAssetInSceneBundle.ContainsKey(asset)) + { + var assetObject = (UnityEngine.Object)AssetDatabase.LoadAssetAtPath(asset, typeof(UnityEngine.Object)); + if (assetObject == null || (assetObject.hideFlags & HideFlags.DontSaveInBuild) == 0) + { + uniqueAssetInSceneBundle[asset] = assetParent; + + if (assetParent != "resources") + { + if (!extToAssetList.ContainsKey(ext)) + { + extToAssetList[ext] = new List(); + } + extToAssetList[ext].Add(asset); + } + } + } + } + } + } + } + + private static bool DeploySceneBundles(List sceneList) + { + // Create Temp directory on local machine if it does not exist + string tempDirectory = Path.Combine(BUNDLE_MANAGER_OUTPUT_PATH, "Temp"); + if (!Directory.Exists(tempDirectory)) + { + Directory.CreateDirectory(tempDirectory); + } + string absoluteTempPath = Path.Combine(Path.Combine(Application.dataPath, ".."), tempDirectory); + + OVRBundleTool.PrintLog("Deploying scene bundles to device . . . "); + + OVRADBTool adbTool = new OVRADBTool(OVRConfig.Instance.GetAndroidSDKPath()); + if (adbTool.isReady) + { + DateTime transferStart = DateTime.Now; + + OVRBundleTool.UpdateSceneBuildStatus(OVRBundleTool.SceneBundleStatus.TRANSFERRING); + // Transfer all scene bundles that are relavent + if (!TransferSceneBundles(adbTool, absoluteTempPath, externalSceneCache)) + { + return false; + } + OVRBundleTool.UpdateSceneBuildStatus(OVRBundleTool.SceneBundleStatus.DEPLOYED); + + // Create file to tell transition scene APK which scene to load and push it to the device + string sceneLoadDataPath = Path.Combine(tempDirectory, OVRSceneLoader.sceneLoadDataName); + if (File.Exists(sceneLoadDataPath)) + { + File.Delete(sceneLoadDataPath); + } + + StreamWriter writer = new StreamWriter(sceneLoadDataPath, true); + // Write version and scene names + long unixTime = (int)(DateTimeOffset.UtcNow.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds; + writer.WriteLine(unixTime.ToString()); + for (int i = 0; i < sceneList.Count; i++) + { + writer.WriteLine(Path.GetFileNameWithoutExtension(sceneList[i].scenePath)); + } + + writer.Close(); + + string absoluteSceneLoadDataPath = Path.Combine(absoluteTempPath, OVRSceneLoader.sceneLoadDataName); + string[] pushCommand = { "-d push", "\"" + absoluteSceneLoadDataPath + "\"", "\"" + externalSceneCache + "\"" }; + string output, error; + if (adbTool.RunCommand(pushCommand, null, out output, out error) == 0) + { + Debug.Log("[OVRBundleManager] Scene Load Data Pushed to Device."); + OVRPlugin.SendEvent("oculus_bundle_tool", "transfer_bundle_time", (DateTime.Now - transferStart).TotalSeconds.ToString()); + return true; + } + OVRBundleTool.PrintError(string.IsNullOrEmpty(error) ? output : error); + } + else + { + OVRBundleTool.PrintError(ADB_TOOL_INITIALIZE_ERROR); + } + return false; + } + + private static bool TransferSceneBundles(OVRADBTool adbTool, string absoluteTempPath, string externalSceneCache) + { + List bundlesToTransfer = new List(); + List bundlesToDelete = new List(); + string manifestFilePath = externalSceneCache + "/" + BUNDLE_MANAGER_MASTER_BUNDLE; + + string[] pullManifestCommand = { "-d pull", "\"" + manifestFilePath + "\"", "\"" + absoluteTempPath + "\"" }; + + string output, error; + if (adbTool.RunCommand(pullManifestCommand, null, out output, out error) == 0) + { + // An existing manifest file was found on device. Load hashes and upload bundles that have changed hashes. + Debug.Log("[OVRBundleManager] - Scene bundle manifest file found. Decoding changes . . ."); + + // Load hashes from remote manifest + AssetBundle remoteBundle = AssetBundle.LoadFromFile(Path.Combine(absoluteTempPath, BUNDLE_MANAGER_MASTER_BUNDLE)); + if (remoteBundle == null) + { + OVRBundleTool.PrintError("Failed to load remote asset bundle manifest file."); + return false; + } + AssetBundleManifest remoteManifest = remoteBundle.LoadAsset("AssetBundleManifest"); + + Dictionary remoteBundleToHash = new Dictionary(); + if (remoteManifest != null) + { + string[] assetBundles = remoteManifest.GetAllAssetBundles(); + foreach (string bundleName in assetBundles) + { + remoteBundleToHash[bundleName] = remoteManifest.GetAssetBundleHash(bundleName); + } + } + remoteBundle.Unload(true); + + // Load hashes from local manifest + AssetBundle localBundle = AssetBundle.LoadFromFile(BUNDLE_MANAGER_OUTPUT_PATH + "\\" + BUNDLE_MANAGER_MASTER_BUNDLE + + "\\" + BUNDLE_MANAGER_MASTER_BUNDLE); + if (localBundle == null) + { + OVRBundleTool.PrintError("Failed to load local asset bundle manifest file.\n"); + return false; + } + AssetBundleManifest localManifest = localBundle.LoadAsset("AssetBundleManifest"); + + if (localManifest != null) + { + Hash128 zeroHash = new Hash128(0, 0, 0, 0); + + // Build a list of dirty bundles that will have to be transfered + string relativeSceneBundlesPath = Path.Combine(BUNDLE_MANAGER_OUTPUT_PATH, BUNDLE_MANAGER_MASTER_BUNDLE); + bundlesToTransfer.Add(Path.Combine(relativeSceneBundlesPath, BUNDLE_MANAGER_MASTER_BUNDLE)); + string[] assetBundles = localManifest.GetAllAssetBundles(); + foreach (string bundleName in assetBundles) + { + if (!remoteBundleToHash.ContainsKey(bundleName)) + { + bundlesToTransfer.Add(Path.Combine(relativeSceneBundlesPath, bundleName)); + } + else + { + if (remoteBundleToHash[bundleName] != localManifest.GetAssetBundleHash(bundleName)) + { + bundlesToTransfer.Add(Path.Combine(relativeSceneBundlesPath, bundleName)); + } + remoteBundleToHash[bundleName] = zeroHash; + } + } + + OVRBundleTool.PrintLog(bundlesToTransfer.Count + " dirty bundle(s) will be transfered.\n"); + } + } + else + { + if (output.Contains("does not exist")) + { + // Fresh install of asset bundles, transfer all asset bundles + OVRBundleTool.PrintLog("Manifest file not found. Transfering all bundles . . . "); + + string[] mkdirCommand = { "-d shell", "mkdir -p", "\"" + externalSceneCache + "\"" }; + if (adbTool.RunCommand(mkdirCommand, null, out output, out error) == 0) + { + string absoluteSceneBundlePath = Path.Combine(Path.Combine(Application.dataPath, ".."), + Path.Combine(BUNDLE_MANAGER_OUTPUT_PATH, BUNDLE_MANAGER_MASTER_BUNDLE)); + + string[] assetBundlePaths = Directory.GetFiles(absoluteSceneBundlePath); + if (assetBundlePaths.Length != 0) + { + foreach (string path in assetBundlePaths) + { + if (!path.Contains(".manifest")) + { + bundlesToTransfer.Add(path); + } + } + } + else + { + OVRBundleTool.PrintError("Failed to locate scene bundles to transfer."); + return false; + } + } + } + } + + // If any adb error occured during manifest calculation, print it and return false + if (!string.IsNullOrEmpty(error) || output.Contains("error")) + { + OVRBundleTool.PrintError(string.IsNullOrEmpty(error) ? output : error); + return false; + } + + // Transfer bundles to device + DateTime transferStart = DateTime.Now; + foreach (string bundle in bundlesToTransfer) + { + string absoluteBundlePath = Path.Combine(Path.Combine(Application.dataPath, ".."), bundle); + string[] pushBundleCommand = { "-d push", "\"" + absoluteBundlePath + "\"", "\"" + externalSceneCache + "\"" }; + adbTool.RunCommandAsync(pushBundleCommand, null); + } + Debug.Log("[OVRBundleManager] - Transfer took " + (DateTime.Now - transferStart).TotalSeconds + " seconds."); + + // Delete stale bundles on device + if (bundlesToDelete.Count > 0) + { + foreach (string bundle in bundlesToDelete) + { + string bundlePath = externalSceneCache + "/" + bundle; + string[] deleteBundleCommand = { "-d shell", "rm", "\"" + bundlePath + "\"" }; + adbTool.RunCommandAsync(deleteBundleCommand, null); + } + OVRBundleTool.PrintLog("Deleted " + bundlesToDelete.Count + " bundle(s) that were stale"); + } + + return true; + } + + public static bool LaunchApplication() + { + OVRBundleTool.PrintLog("Launching Application . . . "); + + OVRADBTool adbTool = new OVRADBTool(OVRConfig.Instance.GetAndroidSDKPath()); + if (adbTool.isReady) + { + string output, error; + string appPackagename = PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android) + + GetTransitionApkOptionalIdentifier(); + string playerActivityName = "\"" + appPackagename + "/com.unity3d.player.UnityPlayerActivity\""; + string[] appStartCommand = { "-d shell", "am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -S -f 0x10200000 -n", playerActivityName }; + if (adbTool.RunCommand(appStartCommand, null, out output, out error) == 0) + { + OVRBundleTool.PrintSuccess(); + OVRBundleTool.PrintLog("App package " + appPackagename + " is launched."); + return true; + } + + string completeError = "Failed to launch application. Try launching it manually through the device.\n" + (string.IsNullOrEmpty(error) ? output : error); + OVRBundleTool.PrintError(completeError); + } + else + { + OVRBundleTool.PrintError(ADB_TOOL_INITIALIZE_ERROR); + } + return false; + } + + public static bool UninstallAPK() + { + OVRBundleTool.PrintLog("Uninstalling Application . . ."); + + OVRADBTool adbTool = new OVRADBTool(OVRConfig.Instance.GetAndroidSDKPath()); + if (adbTool.isReady) + { + string output, error; + string appPackagename = PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android) + + GetTransitionApkOptionalIdentifier(); + string[] appStartCommand = { "-d shell", "pm uninstall", appPackagename }; + if (adbTool.RunCommand(appStartCommand, null, out output, out error) == 0) + { + OVRBundleTool.PrintSuccess(); + OVRBundleTool.PrintLog("App package " + appPackagename + " is uninstalled."); + return true; + } + + OVRBundleTool.PrintError("Failed to uninstall APK."); + } + else + { + OVRBundleTool.PrintError(ADB_TOOL_INITIALIZE_ERROR); + } + return false; + } + + public static void DeleteRemoteAssetBundles() + { + OVRADBTool adbTool = new OVRADBTool(OVRConfig.Instance.GetAndroidSDKPath()); + if (adbTool.isReady) + { + bool failure = false; + string fileExistsError = "No such file or directory"; + OVRBundleTool.PrintLog("Deleting device bundles . . . "); + string output, error; + string[] deleteBundleCommand = { "-d shell", "rm -r", externalSceneCache }; + if (adbTool.RunCommand(deleteBundleCommand, null, out output, out error) != 0) + { + if (!(output.Contains(fileExistsError) || error.Contains(fileExistsError))) + { + failure = true; + } + } + + if (failure) + { + OVRBundleTool.PrintError(string.IsNullOrEmpty(error) ? output : error); + OVRBundleTool.PrintError("Failed to delete scene bundle cache directory."); + } + else + { + OVRBundleTool.PrintSuccess(); + } + } + else + { + OVRBundleTool.PrintError(ADB_TOOL_INITIALIZE_ERROR); + } + } + + public static void DeleteLocalAssetBundles() + { + try + { + if (Directory.Exists(BUNDLE_MANAGER_OUTPUT_PATH)) + { + OVRBundleTool.PrintLog("Deleting local bundles . . . "); + Directory.Delete(BUNDLE_MANAGER_OUTPUT_PATH, true); + } + } + catch (Exception e) + { + OVRBundleTool.PrintError(e.Message); + } + OVRBundleTool.PrintSuccess(); + } + + private static bool CheckForResources() + { + string[] resourceDirectories = Directory.GetDirectories("Assets", "Resources", SearchOption.AllDirectories); + return resourceDirectories.Length > 0; + } + + private static string GetTransitionApkOptionalIdentifier() + { + string transitionApkOptionalIdentifier; + // Check option value from editor UI + if (OVRBundleTool.GetUseOptionalTransitionApkPackage()) + { + // Append .transition to default app package name to optionally allow both + // full build apk and transition apk to be installed on device + transitionApkOptionalIdentifier = ".transition"; + } + else + { + transitionApkOptionalIdentifier = ""; + } + return transitionApkOptionalIdentifier; + } +} +#endif diff --git a/Assets/Oculus/VR/Editor/OVRBundleManager.cs.meta b/Assets/Oculus/VR/Editor/OVRBundleManager.cs.meta new file mode 100644 index 0000000..67f1e0e --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRBundleManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a46c155525da654c8ef823c069361d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRBundleTool.cs b/Assets/Oculus/VR/Editor/OVRBundleTool.cs new file mode 100644 index 0000000..5b4d1fd --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRBundleTool.cs @@ -0,0 +1,491 @@ +#if UNITY_EDITOR_WIN +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Reflection; +using System.IO; + +using UnityEngine; +using UnityEditor; +public class OVRBundleTool : EditorWindow +{ + private static List buildableScenes; + private static Vector2 debugLogScroll = new Vector2(0, 0); + private static bool invalidBuildableScene; + + private static string toolLog; + private static bool useOptionalTransitionApkPackage; + private static GUIStyle logBoxStyle; + private static Vector2 logBoxSize; + private static float logBoxSpacing = 30.0f; + + private bool forceRestart = false; + private bool showBundleManagement = false; + private bool showOther = false; + + // Needed to ensure that APK checking does happen during editor start up, but will still happen when the window is opened/updated + private static bool panelInitialized = false; + + private enum ApkStatus + { + UNKNOWN, + OK, + NOT_INSTALLED, + DEVICE_NOT_CONNECTED, + }; + + public enum SceneBundleStatus + { + [Description("Unknown")] + UNKNOWN, + [Description("Queued")] + QUEUED, + [Description("Building")] + BUILDING, + [Description("Done")] + DONE, + [Description("Transferring")] + TRANSFERRING, + [Description("Deployed")] + DEPLOYED, + }; + + public class EditorSceneInfo + { + public string scenePath; + public string sceneName; + public SceneBundleStatus buildStatus; + + public EditorSceneInfo(string path, string name) + { + scenePath = path; + sceneName = name; + buildStatus = SceneBundleStatus.UNKNOWN; + } + } + + private static ApkStatus currentApkStatus; + + [MenuItem("Oculus/OVR Build/OVR Scene Quick Preview %l", false, 10)] + static void Init() + { + currentApkStatus = ApkStatus.UNKNOWN; + + EditorWindow.GetWindow(typeof(OVRBundleTool)); + + invalidBuildableScene = false; + InitializePanel(); + + OVRPlugin.SetDeveloperMode(OVRPlugin.Bool.True); + OVRPlugin.SendEvent("oculus_bundle_tool", "show_window"); + } + + public void OnEnable() + { + InitializePanel(); + } + + public static void InitializePanel() + { + panelInitialized = true; + GetScenesFromBuildSettings(); + EditorBuildSettings.sceneListChanged += GetScenesFromBuildSettings; + } + + private void OnGUI() + { + this.titleContent.text = "OVR Scene Quick Preview"; + + if (panelInitialized) + { + CheckForTransitionAPK(); + panelInitialized = false; + } + + if (logBoxStyle == null) + { + logBoxStyle = new GUIStyle(); + logBoxStyle.margin.left = 5; + logBoxStyle.wordWrap = true; + logBoxStyle.normal.textColor = logBoxStyle.focused.textColor = EditorStyles.label.normal.textColor; + logBoxStyle.richText = true; + } + + GUILayout.Space(10.0f); + + GUILayout.Label("Scenes", EditorStyles.boldLabel); + GUIContent buildSettingsBtnTxt = new GUIContent("Open Build Settings"); + if (buildableScenes == null || buildableScenes.Count == 0) + { + string sceneErrorMessage; + if (invalidBuildableScene) + { + sceneErrorMessage = "Invalid scene selection. \nPlease remove OVRTransitionScene in the project's build settings."; + } + else + { + sceneErrorMessage = "No scenes detected. \nTo get started, add scenes in the project's build settings."; + } + GUILayout.Label(sceneErrorMessage); + + var buildSettingBtnRt = GUILayoutUtility.GetRect(buildSettingsBtnTxt, GUI.skin.button, GUILayout.Width(150)); + if (GUI.Button(buildSettingBtnRt, buildSettingsBtnTxt)) + { + OpenBuildSettingsWindow(); + } + } + else + { + foreach (EditorSceneInfo scene in buildableScenes) + { + EditorGUILayout.BeginHorizontal(); + { + EditorGUILayout.LabelField(scene.sceneName, GUILayout.ExpandWidth(true)); + GUILayout.FlexibleSpace(); + + if (scene.buildStatus != SceneBundleStatus.UNKNOWN) + { + string status = GetEnumDescription(scene.buildStatus); + EditorGUILayout.LabelField(status, GUILayout.Width(70)); + } + } + EditorGUILayout.EndHorizontal(); + } + + EditorGUILayout.BeginHorizontal(); + { + GUIContent sceneBtnTxt = new GUIContent("Build and Deploy Scene(s)"); + var sceneBtnRt = GUILayoutUtility.GetRect(sceneBtnTxt, GUI.skin.button, GUILayout.Width(200)); + if (GUI.Button(sceneBtnRt, sceneBtnTxt)) + { + // Check the latest transition apk status + CheckForTransitionAPK(); + // Show a dialog to prompt for building and deploying transition APK + if (currentApkStatus != ApkStatus.OK && + EditorUtility.DisplayDialog("Build and Deploy OVR Transition APK?", + "OVR Transition APK status not ready, it is required to load your scene bundle for quick preview.", + "Yes", + "No")) + { + PrintLog("Building OVR Transition APK"); + OVRBundleManager.BuildDeployTransitionAPK(useOptionalTransitionApkPackage); + CheckForTransitionAPK(); + } + + for (int i = 0; i < buildableScenes.Count; i++) + { + buildableScenes[i].buildStatus = SceneBundleStatus.QUEUED; + } + OVRBundleManager.BuildDeployScenes(buildableScenes, forceRestart); + } + + GUIContent forceRestartLabel = new GUIContent("Force Restart [?]", "Relaunch the application after scene bundles are finished deploying."); + forceRestart = GUILayout.Toggle(forceRestart, forceRestartLabel, GUILayout.ExpandWidth(true)); + } + EditorGUILayout.EndHorizontal(); + } + + GUILayout.Space(10.0f); + GUIContent transitionContent = new GUIContent("Transition APK [?]", "Build and deploy an APK that will transition into the scene you are working on. This enables fast iteration on a specific scene."); + GUILayout.Label(transitionContent, EditorStyles.boldLabel); + + EditorGUILayout.BeginHorizontal(); + { + GUIStyle statusStyle = EditorStyles.label; + statusStyle.richText = true; + GUILayout.Label("Status: ", statusStyle, GUILayout.ExpandWidth(false)); + + string statusMesssage; + switch (currentApkStatus) + { + case ApkStatus.OK: + statusMesssage = "APK installed. Ready to build and deploy scenes."; + break; + case ApkStatus.NOT_INSTALLED: + statusMesssage = "APK not installed. Press build and deploy to install the transition APK."; + break; + case ApkStatus.DEVICE_NOT_CONNECTED: + statusMesssage = "Device not connected via ADB. Please connect device and allow debugging."; + break; + case ApkStatus.UNKNOWN: + default: + statusMesssage = "Failed to get APK status!"; + break; + } + GUILayout.Label(statusMesssage, statusStyle, GUILayout.ExpandWidth(true)); + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + { + GUIContent btnTxt = new GUIContent("Build and Deploy App"); + var rt = GUILayoutUtility.GetRect(btnTxt, GUI.skin.button, GUILayout.Width(200)); + if (GUI.Button(rt, btnTxt)) + { + OVRBundleManager.BuildDeployTransitionAPK(useOptionalTransitionApkPackage); + CheckForTransitionAPK(); + } + } + EditorGUILayout.EndHorizontal(); + + GUILayout.Space(10.0f); + GUILayout.Label("Utilities", EditorStyles.boldLabel); + + showBundleManagement = EditorGUILayout.Foldout(showBundleManagement, "Bundle Management"); + if (showBundleManagement) + { + EditorGUILayout.BeginHorizontal(); + { + GUIContent clearDeviceBundlesTxt = new GUIContent("Delete Device Bundles"); + var clearDeviceBundlesBtnRt = GUILayoutUtility.GetRect(clearDeviceBundlesTxt, GUI.skin.button, GUILayout.ExpandWidth(true)); + if (GUI.Button(clearDeviceBundlesBtnRt, clearDeviceBundlesTxt)) + { + OVRBundleManager.DeleteRemoteAssetBundles(); + } + + GUIContent clearLocalBundlesTxt = new GUIContent("Delete Local Bundles"); + var clearLocalBundlesBtnRt = GUILayoutUtility.GetRect(clearLocalBundlesTxt, GUI.skin.button, GUILayout.ExpandWidth(true)); + if (GUI.Button(clearLocalBundlesBtnRt, clearLocalBundlesTxt)) + { + OVRBundleManager.DeleteLocalAssetBundles(); + } + } + EditorGUILayout.EndHorizontal(); + } + + showOther = EditorGUILayout.Foldout(showOther, "Other"); + if (showOther) + { + EditorGUILayout.BeginHorizontal(); + { + GUIContent useOptionalTransitionPackageLabel = new GUIContent("Use optional APK package name [?]", + "This allows both full build APK and transition APK to be installed on device. However, platform services like Entitlement check may fail."); + + EditorGUILayout.LabelField(useOptionalTransitionPackageLabel, GUILayout.ExpandWidth(false)); + bool newToggleValue = EditorGUILayout.Toggle(useOptionalTransitionApkPackage); + + if (newToggleValue != useOptionalTransitionApkPackage) + { + useOptionalTransitionApkPackage = newToggleValue; + // Update transition APK status after changing package name option + CheckForTransitionAPK(); + } + + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + { + GUIContent launchBtnTxt = new GUIContent("Launch App"); + var launchBtnRt = GUILayoutUtility.GetRect(launchBtnTxt, GUI.skin.button, GUILayout.ExpandWidth(true)); + if (GUI.Button(launchBtnRt, launchBtnTxt)) + { + OVRBundleManager.LaunchApplication(); + } + + var buildSettingBtnRt = GUILayoutUtility.GetRect(buildSettingsBtnTxt, GUI.skin.button, GUILayout.ExpandWidth(true)); + if (GUI.Button(buildSettingBtnRt, buildSettingsBtnTxt)) + { + OpenBuildSettingsWindow(); + } + + GUIContent uninstallTxt = new GUIContent("Uninstall APK"); + var uninstallBtnRt = GUILayoutUtility.GetRect(uninstallTxt, GUI.skin.button, GUILayout.ExpandWidth(true)); + if (GUI.Button(uninstallBtnRt, uninstallTxt)) + { + OVRBundleManager.UninstallAPK(); + CheckForTransitionAPK(); + } + + GUIContent clearLogTxt = new GUIContent("Clear Log"); + var clearLogBtnRt = GUILayoutUtility.GetRect(clearLogTxt, GUI.skin.button, GUILayout.ExpandWidth(true)); + if (GUI.Button(clearLogBtnRt, clearLogTxt)) + { + PrintLog("", true); + } + } + EditorGUILayout.EndHorizontal(); + } + + GUILayout.Space(10.0f); + GUILayout.Label("Log", EditorStyles.boldLabel); + + if (!string.IsNullOrEmpty(toolLog)) + { + debugLogScroll = EditorGUILayout.BeginScrollView(debugLogScroll, GUILayout.ExpandHeight(true)); + EditorGUILayout.SelectableLabel(toolLog, logBoxStyle, GUILayout.Height(logBoxSize.y + logBoxSpacing)); + EditorGUILayout.EndScrollView(); + } + } + + private static void OpenBuildSettingsWindow() + { + EditorWindow.GetWindow(System.Type.GetType("UnityEditor.BuildPlayerWindow,UnityEditor")); + } + + public static void UpdateSceneBuildStatus(SceneBundleStatus status, int index = -1) + { + if (index >= 0 && index < buildableScenes.Count) + { + buildableScenes[index].buildStatus = status; + } + else + { + // Update status for all scenes + for (int i = 0; i < buildableScenes.Count; i++) + { + buildableScenes[i].buildStatus = status; + } + } + } + + private static void GetScenesFromBuildSettings() + { + invalidBuildableScene = false; + buildableScenes = new List(); + for (int i = 0; i < EditorBuildSettings.scenes.Length; i++) + { + EditorBuildSettingsScene scene = EditorBuildSettings.scenes[i]; + if (scene.enabled) + { + if (Path.GetFileNameWithoutExtension(scene.path) != "OVRTransitionScene") + { + EditorSceneInfo sceneInfo = new EditorSceneInfo(scene.path, Path.GetFileNameWithoutExtension(scene.path)); + buildableScenes.Add(sceneInfo); + } + else + { + buildableScenes = null; + invalidBuildableScene = true; + return; + } + } + } + } + + private static void CheckForTransitionAPK() + { + OVRADBTool adbTool = new OVRADBTool(OVRConfig.Instance.GetAndroidSDKPath()); + if (adbTool.isReady) + { + string matchedPackageList, error; + var transitionPackageName = PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android); + if (useOptionalTransitionApkPackage) + { + transitionPackageName += ".transition"; + } + string[] packageCheckCommand = new string[] { "-d shell pm list package", transitionPackageName }; + if (adbTool.RunCommand(packageCheckCommand, null, out matchedPackageList, out error) == 0) + { + if (string.IsNullOrEmpty(matchedPackageList)) + { + currentApkStatus = ApkStatus.NOT_INSTALLED; + } + else + { + // adb "list package" command returns all package names that contains the given query package name + // Need to check if the transition package name is matched exactly + if (matchedPackageList.Contains("package:" + transitionPackageName + "\r\n")) + { + if (useOptionalTransitionApkPackage) + { + // If optional package name is used, it is deterministic that the transition apk is installed + currentApkStatus = ApkStatus.OK; + } + else + { + // get package info to check for TRANSITION_APK_VERSION_NAME + string[] dumpPackageInfoCommand = new string[] { "-d shell dumpsys package", transitionPackageName }; + string packageInfo; + if (adbTool.RunCommand(dumpPackageInfoCommand, null, out packageInfo, out error) == 0 && + !string.IsNullOrEmpty(packageInfo) && + packageInfo.Contains(OVRBundleManager.TRANSITION_APK_VERSION_NAME)) + { + // Matched package name found, and the package info contains TRANSITION_APK_VERSION_NAME + currentApkStatus = ApkStatus.OK; + } + else + { + currentApkStatus = ApkStatus.NOT_INSTALLED; + } + } + } + else + { + // No matached package name returned + currentApkStatus = ApkStatus.NOT_INSTALLED; + } + } + } + else if (error.Contains("no devices found")) + { + currentApkStatus = ApkStatus.DEVICE_NOT_CONNECTED; + } + else + { + currentApkStatus = ApkStatus.UNKNOWN; + } + } + } + + public static void PrintLog(string message, bool clear = false) + { + if (clear) + { + toolLog = message; + } + else + { + toolLog += message + "\n"; + } + + GUIContent logContent = new GUIContent(toolLog); + logBoxSize = logBoxStyle.CalcSize(logContent); + + debugLogScroll.y = logBoxSize.y + logBoxSpacing; + } + + public static void PrintError(string error = "") + { + if(!string.IsNullOrEmpty(error)) + { + toolLog += "Failed!\n" + error + "\n"; + } + else + { + toolLog += "Failed! Check Unity log for more details.\n"; + } + } + + public static void PrintWarning(string warning) + { + toolLog += "Warning!\n" + warning + "\n"; + } + + public static void PrintSuccess() + { + toolLog += "Success!\n"; + } + + public static string GetEnumDescription(Enum eEnum) + { + Type enumType = eEnum.GetType(); + MemberInfo[] memberInfo = enumType.GetMember(eEnum.ToString()); + if (memberInfo != null && memberInfo.Length > 0) + { + var attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); + if (attrs != null && attrs.Length > 0) + { + return ((DescriptionAttribute)attrs[0]).Description; + } + } + return eEnum.ToString(); + } + + public static bool GetUseOptionalTransitionApkPackage() + { + return useOptionalTransitionApkPackage; + } +} +#endif diff --git a/Assets/Oculus/VR/Editor/OVRBundleTool.cs.meta b/Assets/Oculus/VR/Editor/OVRBundleTool.cs.meta new file mode 100644 index 0000000..64885ae --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRBundleTool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0c27664370189a44bae1f4a8aba8b7ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRConfig.cs b/Assets/Oculus/VR/Editor/OVRConfig.cs new file mode 100644 index 0000000..39d1414 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRConfig.cs @@ -0,0 +1,188 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System.IO; +using System; + +#if UNITY_EDITOR +[UnityEditor.InitializeOnLoad] +#endif +public class OVRConfig : ScriptableObject +{ + [SerializeField] + private string androidSDKPath = ""; + + [SerializeField] + private string gradlePath = ""; + + [SerializeField] + private string jdkPath = ""; + + private static OVRConfig instance; + + public static OVRConfig Instance + { + get + { + if (instance == null) + { + instance = Resources.Load("OVRConfig"); + if (instance == null) + { + instance = ScriptableObject.CreateInstance(); + string resourcePath = Path.Combine(UnityEngine.Application.dataPath, "Resources"); + if (!Directory.Exists(resourcePath)) + { + UnityEditor.AssetDatabase.CreateFolder("Assets", "Resources"); + } + + string fullPath = Path.Combine(Path.Combine("Assets", "Resources"), "OVRBuildConfig.asset"); + UnityEditor.AssetDatabase.CreateAsset(instance, fullPath); + } + } + return instance; + } + set + { + instance = value; + } + } + + // Returns the path to the base directory of the Android SDK + public string GetAndroidSDKPath(bool throwError = true) + { +#if UNITY_2019_1_OR_NEWER + // Check for use of embedded path or user defined + bool useEmbedded = EditorPrefs.GetBool("SdkUseEmbedded"); + if (useEmbedded) + { + androidSDKPath = Path.Combine(BuildPipeline.GetPlaybackEngineDirectory(BuildTarget.Android, BuildOptions.None), "SDK"); + } + else +#endif + { + androidSDKPath = EditorPrefs.GetString("AndroidSdkRoot"); + } + + androidSDKPath = androidSDKPath.Replace("/", "\\"); + // Validate sdk path and notify user if path does not exist. + if (!Directory.Exists(androidSDKPath)) + { + androidSDKPath = Environment.GetEnvironmentVariable("ANDROID_SDK_ROOT"); + if (!string.IsNullOrEmpty(androidSDKPath)) + { + return androidSDKPath; + } + + if (throwError) + { + EditorUtility.DisplayDialog("Android SDK not Found", + "Android SDK not found. Please ensure that the path is set correctly in (Edit -> Preferences -> External Tools) or that the Untiy Android module is installed correctly.", + "Ok"); + } + return string.Empty; + } + + EditorUtility.SetDirty(Instance); + return androidSDKPath; + } + + // Returns the path to the gradle-launcher-*.jar + public string GetGradlePath(bool throwError = true) + { + string libPath = ""; +#if UNITY_2019_1_OR_NEWER + // Check for use of embedded path or user defined + bool useEmbedded = EditorPrefs.GetBool("GradleUseEmbedded"); + + if (useEmbedded) + { + libPath = Path.Combine(BuildPipeline.GetPlaybackEngineDirectory(BuildTarget.Android, BuildOptions.None), "Tools\\gradle\\lib"); + } + else + { + libPath = Path.Combine(EditorPrefs.GetString("GradlePath"), "lib"); + } +#else + libPath = Path.Combine(EditorApplication.applicationContentsPath, "PlaybackEngines\\AndroidPlayer\\Tools\\gradle\\lib"); +#endif + + libPath = libPath.Replace("/", "\\"); + if (!string.IsNullOrEmpty(libPath) && Directory.Exists(libPath)) + { + string[] gradleJar = Directory.GetFiles(libPath, "gradle-launcher-*.jar"); + if (gradleJar.Length == 1) + { + gradlePath = gradleJar[0]; + } + } + + // Validate gradle path and notify user if path does not exist. + if (!File.Exists(gradlePath)) + { + if (throwError) + { + EditorUtility.DisplayDialog("Gradle not Found", + "Gradle not found. Please ensure that the path is set correctly in (Edit -> Preferences -> External Tools) or that the Untiy Android module is installed correctly.", + "Ok"); + } + return string.Empty; + } + + EditorUtility.SetDirty(Instance); + return gradlePath; + } + + // Returns path to the Java executable in the JDK + public string GetJDKPath(bool throwError = true) + { +#if UNITY_EDITOR_WIN + // Check for use of embedded path or user defined + bool useEmbedded = EditorPrefs.GetBool("JdkUseEmbedded"); + + string exePath = ""; + if (useEmbedded) + { +#if UNITY_2019_1_OR_NEWER + exePath = Path.Combine(BuildPipeline.GetPlaybackEngineDirectory(BuildTarget.Android, BuildOptions.None), "Tools\\OpenJDK\\Windows\\bin"); +#else + exePath = Path.Combine(EditorApplication.applicationContentsPath, "PlaybackEngines\\AndroidPlayer\\Tools\\OpenJDK\\Windows\\bin"); +#endif + } + else + { + exePath = Path.Combine(EditorPrefs.GetString("JdkPath"), "bin"); + } + + jdkPath = Path.Combine(exePath, "java.exe"); + jdkPath = jdkPath.Replace("/", "\\"); + + // Validate gradle path and notify user if path does not exist. + if (!File.Exists(jdkPath)) + { + // Check the enviornment variable as a backup to see if the JDK is there. + string javaHome = Environment.GetEnvironmentVariable("JAVA_HOME"); + if(!string.IsNullOrEmpty(javaHome)) + { + jdkPath = Path.Combine(javaHome, "bin\\java.exe"); + if(File.Exists(jdkPath)) + { + EditorUtility.SetDirty(Instance); + return jdkPath; + } + } + + if (throwError) + { + EditorUtility.DisplayDialog("JDK not Found", + "JDK not found. Please ensure that the path is set correctly in (Edit -> Preferences -> External Tools) or that the Untiy Android module is installed correctly.", + "Ok"); + } + return string.Empty; + } +#endif + EditorUtility.SetDirty(Instance); + return jdkPath; + } +} diff --git a/Assets/Oculus/VR/Editor/OVRConfig.cs.meta b/Assets/Oculus/VR/Editor/OVRConfig.cs.meta new file mode 100644 index 0000000..c10d1bc --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 20553fac56ec59645857c0732b787431 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRDeviceSelector.cs b/Assets/Oculus/VR/Editor/OVRDeviceSelector.cs new file mode 100644 index 0000000..a9e9ec8 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRDeviceSelector.cs @@ -0,0 +1,46 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +public class OVRDeviceSelector +{ + public static bool isTargetDeviceGearVrOrGo + { + get + { + OVRProjectConfig projectConfig = OVRProjectConfig.GetProjectConfig(); + return projectConfig.targetDeviceTypes.Contains(OVRProjectConfig.DeviceType.GearVrOrGo); + } + } + + public static bool isTargetDeviceQuest + { + get + { + OVRProjectConfig projectConfig = OVRProjectConfig.GetProjectConfig(); + return projectConfig.targetDeviceTypes.Contains(OVRProjectConfig.DeviceType.Quest); + } + } +} diff --git a/Assets/Oculus/VR/Editor/OVRDeviceSelector.cs.meta b/Assets/Oculus/VR/Editor/OVRDeviceSelector.cs.meta new file mode 100644 index 0000000..e0e7b82 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRDeviceSelector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 157dce969e882084080e0a2c39efe398 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRDirectorySyncer.cs b/Assets/Oculus/VR/Editor/OVRDirectorySyncer.cs new file mode 100644 index 0000000..f345b1b --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRDirectorySyncer.cs @@ -0,0 +1,242 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System; + +public class DirectorySyncer +{ + public delegate void SyncResultDelegate(SyncResult syncResult); + + public readonly string Source; + public readonly string Target; + public SyncResultDelegate WillPerformOperations; + private readonly Regex _ignoreExpression; + + // helper classes to simplify transition beyond .NET runtime 3.5 + public abstract class CancellationToken + { + protected abstract bool _IsCancellationRequested(); + + public virtual bool IsCancellationRequested + { + get { return _IsCancellationRequested(); } + } + + public void ThrowIfCancellationRequested() + { + if (IsCancellationRequested) + { + throw new Exception("Operation Cancelled"); + } + } + + public static readonly CancellationToken None = new CancellationTokenNone(); + + private class CancellationTokenNone : CancellationToken + { + protected override bool _IsCancellationRequested() + { + return false; + } + } + } + + public class CancellationTokenSource : CancellationToken + { + private bool _isCancelled; + + protected override bool _IsCancellationRequested() + { + return _isCancelled; + } + + public void Cancel() + { + _isCancelled = true; + } + + public CancellationToken Token + { + get { return this; } + } + } + + private static string EnsureTrailingDirectorySeparator(string path) + { + return path.EndsWith("" + Path.DirectorySeparatorChar) + ? path + : path + Path.DirectorySeparatorChar; + } + + private static string CheckedDirectory(string nameInExceptionText, string directory) + { + directory = Path.GetFullPath(directory); + if (!Directory.Exists(directory)) + { + throw new ArgumentException(string.Format("{0} is not a valid directory for argument ${1}", directory, + nameInExceptionText)); + } + + return EnsureTrailingDirectorySeparator(directory); + } + + public DirectorySyncer(string source, string target, string ignoreRegExPattern = null) + { + Source = CheckedDirectory("source", source); + Target = CheckedDirectory("target", target); + if (Source.StartsWith(Target, StringComparison.OrdinalIgnoreCase) || + Target.StartsWith(Source, StringComparison.OrdinalIgnoreCase)) + { + throw new ArgumentException(string.Format("Paths must not contain each other (source: {0}, target: {1}", + Source, Target)); + } + + ignoreRegExPattern = ignoreRegExPattern ?? "^$"; + _ignoreExpression = new Regex(ignoreRegExPattern, RegexOptions.IgnoreCase); + } + + public class SyncResult + { + public readonly IEnumerable Created; + public readonly IEnumerable Updated; + public readonly IEnumerable Deleted; + + public SyncResult(IEnumerable created, IEnumerable updated, IEnumerable deleted) + { + Created = created; + Updated = updated; + Deleted = deleted; + } + } + + public bool RelativeFilePathIsRelevant(string relativeFilename) + { + return !_ignoreExpression.IsMatch(relativeFilename); + } + + public bool RelativeDirectoryPathIsRelevant(string relativeDirName) + { + // Since our ignore patterns look at file names, they may contain trailing path separators + // In order for paths to match those rules, we add a path separator here + return !_ignoreExpression.IsMatch(EnsureTrailingDirectorySeparator(relativeDirName)); + } + + private HashSet RelevantRelativeFilesBeneathDirectory(string path, CancellationToken cancellationToken) + { + return new HashSet(Directory.GetFiles(path, "*", SearchOption.AllDirectories) + .TakeWhile((s) => !cancellationToken.IsCancellationRequested) + .Select(p => PathHelper.MakeRelativePath(path, p)).Where(RelativeFilePathIsRelevant)); + } + + private HashSet RelevantRelativeDirectoriesBeneathDirectory(string path, + CancellationToken cancellationToken) + { + return new HashSet(Directory.GetDirectories(path, "*", SearchOption.AllDirectories) + .TakeWhile((s) => !cancellationToken.IsCancellationRequested) + .Select(p => PathHelper.MakeRelativePath(path, p)).Where(RelativeDirectoryPathIsRelevant)); + } + + public SyncResult Synchronize() + { + return Synchronize(CancellationToken.None); + } + + private void DeleteOutdatedFilesFromTarget(SyncResult syncResult, CancellationToken cancellationToken) + { + var outdatedFiles = syncResult.Updated.Union(syncResult.Deleted); + foreach (var fileName in outdatedFiles) + { + File.Delete(Path.Combine(Target, fileName)); + cancellationToken.ThrowIfCancellationRequested(); + } + } + + [SuppressMessage("ReSharper", "ParameterTypeCanBeEnumerable.Local")] + private void DeleteOutdatedEmptyDirectoriesFromTarget(HashSet sourceDirs, HashSet targetDirs, + CancellationToken cancellationToken) + { + var deleted = targetDirs.Except(sourceDirs).OrderByDescending(s => s); + + // By sorting in descending order above, we delete leaf-first, + // this is simpler than collapsing the list above (which would also allow us to run these ops in parallel). + // Assumption is that there are few empty folders to delete + foreach (var dir in deleted) + { + Directory.Delete(Path.Combine(Target, dir)); + cancellationToken.ThrowIfCancellationRequested(); + } + } + + [SuppressMessage("ReSharper", "ParameterTypeCanBeEnumerable.Local")] + private void CreateRelevantDirectoriesAtTarget(HashSet sourceDirs, HashSet targetDirs, + CancellationToken cancellationToken) + { + var created = sourceDirs.Except(targetDirs); + foreach (var dir in created) + { + Directory.CreateDirectory(Path.Combine(Target, dir)); + cancellationToken.ThrowIfCancellationRequested(); + } + } + + private void MoveRelevantFilesToTarget(SyncResult syncResult, CancellationToken cancellationToken) + { + // step 3: we move all new files to target + var newFiles = syncResult.Created.Union(syncResult.Updated); + foreach (var fileName in newFiles) + { + var sourceFileName = Path.Combine(Source, fileName); + var destFileName = Path.Combine(Target, fileName); + // target directory exists due to step CreateRelevantDirectoriesAtTarget() + File.Move(sourceFileName, destFileName); + cancellationToken.ThrowIfCancellationRequested(); + } + } + + public SyncResult Synchronize(CancellationToken cancellationToken) + { + var sourceDirs = RelevantRelativeDirectoriesBeneathDirectory(Source, cancellationToken); + var targetDirs = RelevantRelativeDirectoriesBeneathDirectory(Target, cancellationToken); + var sourceFiles = RelevantRelativeFilesBeneathDirectory(Source, cancellationToken); + var targetFiles = RelevantRelativeFilesBeneathDirectory(Target, cancellationToken); + + var created = sourceFiles.Except(targetFiles).OrderBy(s => s).ToList(); + var updated = sourceFiles.Intersect(targetFiles).OrderBy(s => s).ToList(); + var deleted = targetFiles.Except(sourceFiles).OrderBy(s => s).ToList(); + var syncResult = new SyncResult(created, updated, deleted); + + if (WillPerformOperations != null) + { + WillPerformOperations.Invoke(syncResult); + } + + DeleteOutdatedFilesFromTarget(syncResult, cancellationToken); + DeleteOutdatedEmptyDirectoriesFromTarget(sourceDirs, targetDirs, cancellationToken); + CreateRelevantDirectoriesAtTarget(sourceDirs, targetDirs, cancellationToken); + MoveRelevantFilesToTarget(syncResult, cancellationToken); + + return syncResult; + } +} diff --git a/Assets/Oculus/VR/Editor/OVRDirectorySyncer.cs.meta b/Assets/Oculus/VR/Editor/OVRDirectorySyncer.cs.meta new file mode 100644 index 0000000..2878abd --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRDirectorySyncer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 666774827ce57754f9fbd8e008ed0a2a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVREngineConfigurationUpdater.cs b/Assets/Oculus/VR/Editor/OVREngineConfigurationUpdater.cs new file mode 100644 index 0000000..3bedfc4 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVREngineConfigurationUpdater.cs @@ -0,0 +1,335 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +#if USING_XR_MANAGEMENT && USING_XR_SDK_OCULUS +#define USING_XR_SDK +#endif + +using UnityEngine; +using UnityEditor; +using UnityEditor.Callbacks; +using System; +using System.IO; + +[InitializeOnLoad] +class OVREngineConfigurationUpdater +{ + private const string prefName = "OVREngineConfigurationUpdater_Enabled"; + private const string menuItemName = "Oculus/Tools/Use Required Project Settings"; + private const string androidAssetsPath = "Assets/Plugins/Android/assets"; + private const string androidManifestPath = "Assets/Plugins/Android/AndroidManifest.xml"; + static bool setPrefsForUtilities; + + [MenuItem(menuItemName)] + static void ToggleUtilities() + { + setPrefsForUtilities = !setPrefsForUtilities; + Menu.SetChecked(menuItemName, setPrefsForUtilities); + + int newValue = (setPrefsForUtilities) ? 1 : 0; + PlayerPrefs.SetInt(prefName, newValue); + PlayerPrefs.Save(); + + Debug.Log("Using required project settings: " + setPrefsForUtilities); + } + +#if UNITY_2017_3_OR_NEWER + private static readonly string dashSupportEnableConfirmedKey = "Oculus_Utilities_OVREngineConfiguration_DashSupportEnableConfirmed_" + Application.unityVersion + OVRManager.utilitiesVersion; + private static bool dashSupportEnableConfirmed + { + get + { + return PlayerPrefs.GetInt(dashSupportEnableConfirmedKey, 0) == 1; + } + + set + { + PlayerPrefs.SetInt(dashSupportEnableConfirmedKey, value ? 1 : 0); + } + } + + private static void DashSupportWarningPrompt() + { + /// + /// Since Unity 2017.3.0f1 and 2017.3.0f2 have "Dash Support" enabled by default + /// We need prompt developers in case they never test their app with dash + /// + /// + if (Application.unityVersion == "2017.3.0f1" || Application.unityVersion == "2017.3.0f2") + { + if (!dashSupportEnableConfirmed) + { + bool dialogResult = EditorUtility.DisplayDialog("Oculus Dash support", "Your current Unity engine " + Application.unityVersion + + " has Oculus Dash Supporting enabled by default. please make sure to test your app with Dash enabled runtime 1.21 or newer," + + " Otherwise, you can also turn it off under XR Settings -> Oculus", "Understand", "Learn more "); + + if (!dialogResult) + { + Application.OpenURL("https://developer.oculus.com/documentation/unity/latest/concepts/unity-lifecycle/"); + } + + dashSupportEnableConfirmed = true; + } + } + } +#endif + + static OVREngineConfigurationUpdater() + { + EditorApplication.delayCall += OnDelayCall; + EditorApplication.update += OnUpdate; + +#if UNITY_2017_3_OR_NEWER + DashSupportWarningPrompt(); +#endif + } + + static void OnDelayCall() + { + setPrefsForUtilities = PlayerPrefs.GetInt(prefName, 1) != 0; + Menu.SetChecked(menuItemName, setPrefsForUtilities); + + if (!setPrefsForUtilities) + return; + + OVRPlugin.AddCustomMetadata("build_target", EditorUserBuildSettings.activeBuildTarget.ToString()); + EnforceAndroidSettings(); + EnforceInputManagerBindings(); +#if UNITY_ANDROID + EnforceOSIG(); +#endif + } + + static void OnUpdate() + { + if (!setPrefsForUtilities) + return; + + EnforceBundleId(); +#if !USING_XR_SDK + EnforceVRSupport(); +#endif + EnforceInstallLocation(); + } + + static void EnforceAndroidSettings() + { + if (EditorUserBuildSettings.activeBuildTarget != BuildTarget.Android) + return; + + if (PlayerSettings.defaultInterfaceOrientation != UIOrientation.LandscapeLeft) + { + Debug.Log("OVREngineConfigurationUpdater: Setting orientation to Landscape Left"); + // Default screen orientation must be set to landscape left. + PlayerSettings.defaultInterfaceOrientation = UIOrientation.LandscapeLeft; + } + + if (!PlayerSettings.virtualRealitySupported) + { + // NOTE: This value should not affect the main window surface + // when Built-in VR support is enabled. + + // NOTE: On Adreno Lollipop, it is an error to have antiAliasing set on the + // main window surface with front buffer rendering enabled. The view will + // render black. + // On Adreno KitKat, some tiling control modes will cause the view to render + // black. + if (QualitySettings.antiAliasing != 0 && QualitySettings.antiAliasing != 1) + { + Debug.Log("OVREngineConfigurationUpdater: Disabling antiAliasing"); + QualitySettings.antiAliasing = 1; + } + } + + if (QualitySettings.vSyncCount != 0) + { + Debug.Log("OVREngineConfigurationUpdater: Setting vsyncCount to 0"); + // We sync in the TimeWarp, so we don't want unity syncing elsewhere. + QualitySettings.vSyncCount = 0; + } + } + + static void EnforceVRSupport() + { + if (PlayerSettings.virtualRealitySupported) + return; + + var mgrs = GameObject.FindObjectsOfType(); + for (int i = 0; i < mgrs.Length; ++i) + { + if (mgrs [i].isActiveAndEnabled) + { + Debug.Log ("Enabling Unity VR support"); + PlayerSettings.virtualRealitySupported = true; + + bool oculusFound = false; +#if UNITY_2017_2_OR_NEWER + foreach (var device in UnityEngine.XR.XRSettings.supportedDevices) +#else + foreach (var device in UnityEngine.VR.VRSettings.supportedDevices) +#endif + oculusFound |= (device == "Oculus"); + + if (!oculusFound) + Debug.LogError("Please add Oculus to the list of supported devices to use the Utilities."); + + return; + } + } + } + + private static void EnforceBundleId() + { + if (!PlayerSettings.virtualRealitySupported) + return; + + if (PlayerSettings.applicationIdentifier == "" || PlayerSettings.applicationIdentifier == "com.Company.ProductName") + { + string defaultBundleId = "com.oculus.UnitySample"; + Debug.LogWarning("\"" + PlayerSettings.applicationIdentifier + "\" is not a valid bundle identifier. Defaulting to \"" + defaultBundleId + "\"."); + PlayerSettings.applicationIdentifier = defaultBundleId; + } + } + + private static void EnforceInstallLocation() + { + if (PlayerSettings.Android.preferredInstallLocation != AndroidPreferredInstallLocation.Auto) + PlayerSettings.Android.preferredInstallLocation = AndroidPreferredInstallLocation.Auto; + } + + private static void EnforceInputManagerBindings() + { + try + { + BindAxis(new Axis() { name = "Oculus_GearVR_LThumbstickX", axis = 0, }); + BindAxis(new Axis() { name = "Oculus_GearVR_LThumbstickY", axis = 1, invert = true }); + BindAxis(new Axis() { name = "Oculus_GearVR_RThumbstickX", axis = 2, }); + BindAxis(new Axis() { name = "Oculus_GearVR_RThumbstickY", axis = 3, invert = true }); + BindAxis(new Axis() { name = "Oculus_GearVR_DpadX", axis = 4, }); + BindAxis(new Axis() { name = "Oculus_GearVR_DpadY", axis = 5, invert = true }); + BindAxis(new Axis() { name = "Oculus_GearVR_LIndexTrigger", axis = 12, }); + BindAxis(new Axis() { name = "Oculus_GearVR_RIndexTrigger", axis = 11, }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_Button2", positiveButton = "joystick button 0", gravity = 1000f, sensitivity = 1000f, type = 0 }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_Button4", positiveButton = "joystick button 2", gravity = 1000f, sensitivity = 1000f, type = 0 }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_PrimaryThumbstick", positiveButton = "joystick button 8", gravity = 0f, dead = 0f, sensitivity = 0.1f, type = 0 }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_SecondaryThumbstick", positiveButton = "joystick button 9", gravity = 0f, dead = 0f, sensitivity = 0.1f, type = 0 }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_PrimaryIndexTrigger", dead = 0.19f, type = 2, axis = 8, joyNum = 0 }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_SecondaryIndexTrigger", dead = 0.19f, type = 2, axis = 9, joyNum = 0 }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_PrimaryHandTrigger", dead = 0.19f, type = 2, axis = 10, joyNum = 0 }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_SecondaryHandTrigger", dead = 0.19f, type = 2, axis = 11, joyNum = 0 }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_PrimaryThumbstickHorizontal", dead = 0.19f, type = 2, axis = 0, joyNum = 0 }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_PrimaryThumbstickVertical", dead = 0.19f, type = 2, axis = 1, joyNum = 0, invert = true }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_SecondaryThumbstickHorizontal", dead = 0.19f, type = 2, axis = 3, joyNum = 0 }); + BindAxis(new Axis() { name = "Oculus_CrossPlatform_SecondaryThumbstickVertical", dead = 0.19f, type = 2, axis = 4, joyNum = 0, invert = true }); + } + catch + { + Debug.LogError("Failed to apply Oculus GearVR input manager bindings."); + } + } + + private static void EnforceOSIG() + { + // Don't bug the user in play mode. + if (Application.isPlaying) + return; + + // Don't warn if the project may be set up for submission or global signing. + if (File.Exists(androidManifestPath)) + return; + + bool foundPossibleOsig = false; + if (Directory.Exists(androidAssetsPath)) + { + var files = Directory.GetFiles(androidAssetsPath); + for (int i = 0; i < files.Length; ++i) + { + if (!files[i].Contains(".txt")) + { + foundPossibleOsig = true; + break; + } + } + } + + if (!foundPossibleOsig) + Debug.LogWarning("Missing Gear VR OSIG at " + androidAssetsPath + ". Please see https://dashboard.oculus.com/tools/osig-generator"); + } + + private class Axis + { + public string name = String.Empty; + public string descriptiveName = String.Empty; + public string descriptiveNegativeName = String.Empty; + public string negativeButton = String.Empty; + public string positiveButton = String.Empty; + public string altNegativeButton = String.Empty; + public string altPositiveButton = String.Empty; + public float gravity = 0.0f; + public float dead = 0.001f; + public float sensitivity = 1.0f; + public bool snap = false; + public bool invert = false; + public int type = 2; + public int axis = 0; + public int joyNum = 0; + } + + private static void BindAxis(Axis axis) + { + SerializedObject serializedObject = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/InputManager.asset")[0]); + SerializedProperty axesProperty = serializedObject.FindProperty("m_Axes"); + + SerializedProperty axisIter = axesProperty.Copy(); + axisIter.Next(true); + axisIter.Next(true); + while (axisIter.Next(false)) + { + if (axisIter.FindPropertyRelative("m_Name").stringValue == axis.name) + { + // Axis already exists. Don't create binding. + return; + } + } + + axesProperty.arraySize++; + serializedObject.ApplyModifiedProperties(); + + SerializedProperty axisProperty = axesProperty.GetArrayElementAtIndex(axesProperty.arraySize - 1); + axisProperty.FindPropertyRelative("m_Name").stringValue = axis.name; + axisProperty.FindPropertyRelative("descriptiveName").stringValue = axis.descriptiveName; + axisProperty.FindPropertyRelative("descriptiveNegativeName").stringValue = axis.descriptiveNegativeName; + axisProperty.FindPropertyRelative("negativeButton").stringValue = axis.negativeButton; + axisProperty.FindPropertyRelative("positiveButton").stringValue = axis.positiveButton; + axisProperty.FindPropertyRelative("altNegativeButton").stringValue = axis.altNegativeButton; + axisProperty.FindPropertyRelative("altPositiveButton").stringValue = axis.altPositiveButton; + axisProperty.FindPropertyRelative("gravity").floatValue = axis.gravity; + axisProperty.FindPropertyRelative("dead").floatValue = axis.dead; + axisProperty.FindPropertyRelative("sensitivity").floatValue = axis.sensitivity; + axisProperty.FindPropertyRelative("snap").boolValue = axis.snap; + axisProperty.FindPropertyRelative("invert").boolValue = axis.invert; + axisProperty.FindPropertyRelative("type").intValue = axis.type; + axisProperty.FindPropertyRelative("axis").intValue = axis.axis; + axisProperty.FindPropertyRelative("joyNum").intValue = axis.joyNum; + serializedObject.ApplyModifiedProperties(); + } +} + diff --git a/Assets/Oculus/VR/Editor/OVREngineConfigurationUpdater.cs.meta b/Assets/Oculus/VR/Editor/OVREngineConfigurationUpdater.cs.meta new file mode 100644 index 0000000..f0bb0f6 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVREngineConfigurationUpdater.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c86538ded11bfe24c8c79818bb9ea66a +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Editor/OVRExpansionFileGenerator.cs b/Assets/Oculus/VR/Editor/OVRExpansionFileGenerator.cs new file mode 100644 index 0000000..ac3ab0e --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRExpansionFileGenerator.cs @@ -0,0 +1,96 @@ +using System; +using System.IO; +using System.Xml; +using UnityEngine; +using UnityEditor; + +public class BuildAssetBundles : MonoBehaviour +{ + [MenuItem("Oculus/Tools/Build Mobile-Quest Expansion File", false, 100000)] + public static void BuildBundles() + { + // Create expansion file directory and call build asset bundles + string path = Application.dataPath + "/../Asset Bundles/"; + if (!System.IO.Directory.Exists(path)) + { + System.IO.Directory.CreateDirectory(path); + } + BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.Android); + + // Rename asset bundle file to the proper obb string + if (File.Exists(path + "Asset Bundles")) + { + string expansionName = "main." + PlayerSettings.Android.bundleVersionCode + "." + PlayerSettings.applicationIdentifier + ".obb"; + try + { + if (File.Exists(path + expansionName)) + { + File.Delete(path + expansionName); + } + File.Move(path + "Asset Bundles", path + expansionName); + UnityEngine.Debug.Log("OBB expansion file " + expansionName + " has been successfully created at " + path); + + UpdateAndroidManifest(); + } + catch (Exception e) + { + UnityEngine.Debug.LogError(e.Message); + } + } + } + + public static void UpdateAndroidManifest() + { + string manifestFolder = Application.dataPath + "/Plugins/Android"; + try + { + // Load android manfiest file + XmlDocument doc = new XmlDocument(); + doc.Load(manifestFolder + "/AndroidManifest.xml"); + + string androidNamepsaceURI; + XmlElement element = (XmlElement)doc.SelectSingleNode("/manifest"); + if(element == null) + { + UnityEngine.Debug.LogError("Could not find manifest tag in android manifest."); + return; + } + + // Get android namespace URI from the manifest + androidNamepsaceURI = element.GetAttribute("xmlns:android"); + if (!string.IsNullOrEmpty(androidNamepsaceURI)) + { + // Check if the android manifest already has the read external storage permission + XmlNodeList nodeList = doc.SelectNodes("/manifest/application/uses-permission"); + foreach (XmlElement e in nodeList) + { + string attr = e.GetAttribute("name", androidNamepsaceURI); + if (attr == "android.permission.READ_EXTERNAL_STORAGE") + { + UnityEngine.Debug.Log("Android manifest already has the proper permissions."); + return; + } + } + + element = (XmlElement)doc.SelectSingleNode("/manifest/application"); + if (element != null) + { + // Insert read external storage permission + XmlElement newElement = doc.CreateElement("uses-permission"); + newElement.SetAttribute("name", androidNamepsaceURI, "android.permission.READ_EXTERNAL_STORAGE"); + element.AppendChild(newElement); + + doc.Save(manifestFolder + "/AndroidManifest.xml"); + UnityEngine.Debug.Log("Successfully modified android manifest with external storage permission."); + return; + } + } + + UnityEngine.Debug.LogError("Could not find android naemspace URI in android manifest."); + } + catch (Exception e) + { + UnityEngine.Debug.LogError(e.Message); + } + } +} diff --git a/Assets/Oculus/VR/Editor/OVRExpansionFileGenerator.cs.meta b/Assets/Oculus/VR/Editor/OVRExpansionFileGenerator.cs.meta new file mode 100644 index 0000000..cf911d8 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRExpansionFileGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b2a0ba46d78379541a5f56225e034afa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRGradleGeneration.cs b/Assets/Oculus/VR/Editor/OVRGradleGeneration.cs new file mode 100644 index 0000000..dc39ca6 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRGradleGeneration.cs @@ -0,0 +1,530 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +//#define BUILDSESSION +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Xml; +using System.Diagnostics; +using System.Threading; +using UnityEditor; +using UnityEditor.Android; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEditor.Build; +#if UNITY_2018_1_OR_NEWER +using UnityEditor.Build.Reporting; +#endif +using System; + +[InitializeOnLoad] +public class OVRGradleGeneration +#if UNITY_2018_2_OR_NEWER + : IPreprocessBuildWithReport, IPostprocessBuildWithReport, IPostGenerateGradleAndroidProject +{ + public OVRADBTool adbTool; + public Process adbProcess; + + public int callbackOrder { get { return 3; } } + static private System.DateTime buildStartTime; + static private System.Guid buildGuid; + +#if UNITY_ANDROID + private const string prefName = "OVRAutoIncrementVersionCode_Enabled"; + private const string menuItemAutoIncVersion = "Oculus/Tools/Auto Increment Version Code"; + static bool autoIncrementVersion = false; +#endif + + static OVRGradleGeneration() + { + EditorApplication.delayCall += OnDelayCall; + } + + static void OnDelayCall() + { +#if UNITY_ANDROID + autoIncrementVersion = PlayerPrefs.GetInt(prefName, 0) != 0; + Menu.SetChecked(menuItemAutoIncVersion, autoIncrementVersion); +#endif + } + +#if UNITY_ANDROID + [MenuItem(menuItemAutoIncVersion)] + static void ToggleUtilities() + { + autoIncrementVersion = !autoIncrementVersion; + Menu.SetChecked(menuItemAutoIncVersion, autoIncrementVersion); + + int newValue = (autoIncrementVersion) ? 1 : 0; + PlayerPrefs.SetInt(prefName, newValue); + PlayerPrefs.Save(); + + UnityEngine.Debug.Log("Auto Increment Version Code: " + autoIncrementVersion); + } +#endif + + public void OnPreprocessBuild(BuildReport report) + { +#if UNITY_ANDROID + // Generate error when Vulkan is selected as the perferred graphics API, which is not currently supported in Unity XR + if (!PlayerSettings.GetUseDefaultGraphicsAPIs(BuildTarget.Android)) + { + GraphicsDeviceType[] apis = PlayerSettings.GetGraphicsAPIs(BuildTarget.Android); + if (apis.Length >= 1 && apis[0] == GraphicsDeviceType.Vulkan) + { + throw new BuildFailedException("XR is currently not supported when using the Vulkan Graphics API. Please go to PlayerSettings and remove 'Vulkan' from the list of Graphics APIs."); + } + } +#endif + + buildStartTime = System.DateTime.Now; + buildGuid = System.Guid.NewGuid(); + + if (!report.summary.outputPath.Contains("OVRGradleTempExport")) + { + OVRPlugin.SetDeveloperMode(OVRPlugin.Bool.True); + OVRPlugin.AddCustomMetadata("build_type", "standard"); + } + + OVRPlugin.AddCustomMetadata("build_guid", buildGuid.ToString()); + OVRPlugin.AddCustomMetadata("target_platform", report.summary.platform.ToString()); +#if !UNITY_2019_3_OR_NEWER + OVRPlugin.AddCustomMetadata("scripting_runtime_version", UnityEditor.PlayerSettings.scriptingRuntimeVersion.ToString()); +#endif + if (report.summary.platform == UnityEditor.BuildTarget.StandaloneWindows + || report.summary.platform == UnityEditor.BuildTarget.StandaloneWindows64) + { + OVRPlugin.AddCustomMetadata("target_oculus_platform", "rift"); + } +#if BUILDSESSION + StreamWriter writer = new StreamWriter("build_session", false); + UnityEngine.Debug.LogFormat("Build Session: {0}", buildGuid.ToString()); + writer.WriteLine(buildGuid.ToString()); + writer.Close(); +#endif + } + + public void OnPostGenerateGradleAndroidProject(string path) + { + UnityEngine.Debug.Log("OVRGradleGeneration triggered."); + + var targetOculusPlatform = new List(); + if (OVRDeviceSelector.isTargetDeviceGearVrOrGo) + { + targetOculusPlatform.Add("geargo"); + } + if (OVRDeviceSelector.isTargetDeviceQuest) + { + targetOculusPlatform.Add("quest"); + } + OVRPlugin.AddCustomMetadata("target_oculus_platform", String.Join("_", targetOculusPlatform.ToArray())); + UnityEngine.Debug.LogFormat(" GearVR or Go = {0} Quest = {1}", OVRDeviceSelector.isTargetDeviceGearVrOrGo, OVRDeviceSelector.isTargetDeviceQuest); + + bool isQuestOnly = OVRDeviceSelector.isTargetDeviceQuest && !OVRDeviceSelector.isTargetDeviceGearVrOrGo; + + if (isQuestOnly) + { + if (File.Exists(Path.Combine(path, "build.gradle"))) + { + try + { + string gradle = File.ReadAllText(Path.Combine(path, "build.gradle")); + + int v2Signingindex = gradle.IndexOf("v2SigningEnabled false"); + if (v2Signingindex != -1) + { + gradle = gradle.Replace("v2SigningEnabled false", "v2SigningEnabled true"); + System.IO.File.WriteAllText(Path.Combine(path, "build.gradle"), gradle); + } + } + catch (System.Exception e) + { + UnityEngine.Debug.LogWarningFormat("Unable to overwrite build.gradle, error {0}", e.Message); + } + } + else + { + UnityEngine.Debug.LogWarning("Unable to locate build.gradle"); + } + } + + PatchAndroidManifest(path); + } + + public void PatchAndroidManifest(string path) + { + string manifestFolder = Path.Combine(path, "src/main"); + try + { + // Load android manfiest file + XmlDocument doc = new XmlDocument(); + doc.Load(manifestFolder + "/AndroidManifest.xml"); + + string androidNamepsaceURI; + XmlElement element = (XmlElement)doc.SelectSingleNode("/manifest"); + if (element == null) + { + UnityEngine.Debug.LogError("Could not find manifest tag in android manifest."); + return; + } + + // Get android namespace URI from the manifest + androidNamepsaceURI = element.GetAttribute("xmlns:android"); + if (!string.IsNullOrEmpty(androidNamepsaceURI)) + { + // Look for intent filter category and change LAUNCHER to INFO + XmlNodeList nodeList = doc.SelectNodes("/manifest/application/activity/intent-filter/category"); + foreach (XmlElement e in nodeList) + { + string attr = e.GetAttribute("name", androidNamepsaceURI); + if (attr == "android.intent.category.LAUNCHER") + { + e.SetAttribute("name", androidNamepsaceURI, "android.intent.category.INFO"); + } + } + + //If Quest is the target device, add the headtracking manifest tag + if (OVRDeviceSelector.isTargetDeviceQuest) + { + XmlNodeList manifestUsesFeatureNodes = doc.SelectNodes("/manifest/uses-feature"); + bool foundHeadtrackingTag = false; + foreach (XmlElement e in manifestUsesFeatureNodes) + { + string attr = e.GetAttribute("name", androidNamepsaceURI); + if (attr == "android.hardware.vr.headtracking") + foundHeadtrackingTag = true; + } + //If the tag already exists, don't patch with a new one. If it doesn't, we add it. + if (!foundHeadtrackingTag) + { + XmlNode manifestElement = doc.SelectSingleNode("/manifest"); + XmlElement headtrackingTag = doc.CreateElement("uses-feature"); + headtrackingTag.SetAttribute("name", androidNamepsaceURI, "android.hardware.vr.headtracking"); + headtrackingTag.SetAttribute("version", androidNamepsaceURI, "1"); + string tagRequired = OVRDeviceSelector.isTargetDeviceGearVrOrGo ? "false" : "true"; + headtrackingTag.SetAttribute("required", androidNamepsaceURI, tagRequired); + manifestElement.AppendChild(headtrackingTag); + } + } + + // If Quest is the target device, add the handtracking manifest tags if needed + // Mapping of project setting to manifest setting: + // OVRProjectConfig.HandTrackingSupport.ControllersOnly => manifest entry not present + // OVRProjectConfig.HandTrackingSupport.ControllersAndHands => manifest entry present and required=false + // OVRProjectConfig.HandTrackingSupport.HandsOnly => manifest entry present and required=true + if (OVRDeviceSelector.isTargetDeviceQuest) + { + OVRProjectConfig.HandTrackingSupport targetHandTrackingSupport = OVRProjectConfig.GetProjectConfig().handTrackingSupport; + bool handTrackingEntryNeeded = (targetHandTrackingSupport != OVRProjectConfig.HandTrackingSupport.ControllersOnly); + if (handTrackingEntryNeeded) + { + // uses-feature: + XmlNodeList manifestUsesFeatureNodes = doc.SelectNodes("/manifest/uses-feature"); + bool foundHandTrackingFeature = false; + foreach (XmlElement e in manifestUsesFeatureNodes) + { + string attr = e.GetAttribute("name", androidNamepsaceURI); + if (attr == "oculus.software.handtracking") + foundHandTrackingFeature = true; + } + //If the tag already exists, don't patch with a new one. If it doesn't, we add it. + if (!foundHandTrackingFeature) + { + XmlNode manifestElement = doc.SelectSingleNode("/manifest"); + XmlElement handTrackingFeature = doc.CreateElement("uses-feature"); + handTrackingFeature.SetAttribute("name", androidNamepsaceURI, "oculus.software.handtracking"); + string tagRequired = (targetHandTrackingSupport == OVRProjectConfig.HandTrackingSupport.HandsOnly) ? "true" : "false"; + handTrackingFeature.SetAttribute("required", androidNamepsaceURI, tagRequired); + manifestElement.AppendChild(handTrackingFeature); + } + + // uses-permission: + XmlNodeList manifestUsesPermissionNodes = doc.SelectNodes("/manifest/uses-permission"); + bool foundHandTrackingPermission = false; + foreach (XmlElement e in manifestUsesPermissionNodes) + { + string attr = e.GetAttribute("name", androidNamepsaceURI); + if (attr == "oculus.permission.handtracking") + foundHandTrackingPermission = true; + } + //If the tag already exists, don't patch with a new one. If it doesn't, we add it. + if (!foundHandTrackingPermission) + { + XmlNode manifestElement = doc.SelectSingleNode("/manifest"); + XmlElement handTrackingPermission = doc.CreateElement("uses-permission"); + handTrackingPermission.SetAttribute("name", androidNamepsaceURI, "oculus.permission.handtracking"); + manifestElement.AppendChild(handTrackingPermission); + } + } + } + + XmlElement applicationNode = (XmlElement)doc.SelectSingleNode("/manifest/application"); + if(applicationNode != null) + { + // If android label and icon are missing from the xml, add them + if (applicationNode.GetAttribute("android:label") == null) + { + applicationNode.SetAttribute("label", androidNamepsaceURI, "@string/app_name"); + } + if (applicationNode.GetAttribute("android:icon") == null) + { + applicationNode.SetAttribute("icon", androidNamepsaceURI, "@mipmap/app_icon"); + } + + // Check for VR tag, if missing, append it + bool vrTagFound = false; + XmlNodeList appNodeList = applicationNode.ChildNodes; + foreach (XmlElement e in appNodeList) + { + if (e.GetAttribute("android:name") == "com.samsung.android.vr.application.mode") + { + vrTagFound = true; + break; + } + } + + if (!vrTagFound) + { + XmlElement vrTag = doc.CreateElement("meta-data"); + vrTag.SetAttribute("name", androidNamepsaceURI, "com.samsung.android.vr.application.mode"); + vrTag.SetAttribute("value", androidNamepsaceURI, "vr_only"); + applicationNode.AppendChild(vrTag); ; + } + + // Disable allowBackup in manifest and add Android NSC XML file + OVRProjectConfig projectConfig = OVRProjectConfig.GetProjectConfig(); + if (projectConfig != null) + { + if (projectConfig.disableBackups) + { + applicationNode.SetAttribute("allowBackup", androidNamepsaceURI, "false"); + } + + if (projectConfig.enableNSCConfig) + { + applicationNode.SetAttribute("networkSecurityConfig", androidNamepsaceURI, "@xml/network_sec_config"); + + string securityConfigFile = Path.Combine(Application.dataPath, "Oculus/VR/Editor/network_sec_config.xml"); + string xmlDirectory = Path.Combine(path, "src/main/res/xml"); + try + { + if (!Directory.Exists(xmlDirectory)) + { + Directory.CreateDirectory(xmlDirectory); + } + File.Copy(securityConfigFile, Path.Combine(xmlDirectory, "network_sec_config.xml"), true); + } + catch (Exception e) + { + UnityEngine.Debug.LogError(e.Message); + } + } + } + } + doc.Save(manifestFolder + "/AndroidManifest.xml"); + } + } + catch (Exception e) + { + UnityEngine.Debug.LogError(e.Message); + } + } + + public void OnPostprocessBuild(BuildReport report) + { +#if UNITY_ANDROID + if(autoIncrementVersion) + { + if((report.summary.options & BuildOptions.Development) == 0) + { + PlayerSettings.Android.bundleVersionCode++; + UnityEngine.Debug.Log("Incrementing version code to " + PlayerSettings.Android.bundleVersionCode); + } + } + + bool isExporting = true; + foreach (var step in report.steps) + { + if (step.name.Contains("Compile scripts") + || step.name.Contains("Building scenes") + || step.name.Contains("Writing asset files") + || step.name.Contains("Preparing APK resources") + || step.name.Contains("Creating Android manifest") + || step.name.Contains("Processing plugins") + || step.name.Contains("Exporting project") + || step.name.Contains("Building Gradle project")) + { + OVRPlugin.SendEvent("build_step_" + step.name.ToLower().Replace(' ', '_'), + step.duration.TotalSeconds.ToString(), "ovrbuild"); +#if BUILDSESSION + UnityEngine.Debug.LogFormat("build_step_" + step.name.ToLower().Replace(' ', '_') + ": {0}", step.duration.TotalSeconds.ToString()); +#endif + if(step.name.Contains("Building Gradle project")) + { + isExporting = false; + } + } + } + OVRPlugin.AddCustomMetadata("build_step_count", report.steps.Length.ToString()); + if (report.summary.outputPath.Contains("apk")) // Exclude Gradle Project Output + { + var fileInfo = new System.IO.FileInfo(report.summary.outputPath); + OVRPlugin.AddCustomMetadata("build_output_size", fileInfo.Length.ToString()); + } +#endif + if (!report.summary.outputPath.Contains("OVRGradleTempExport")) + { + OVRPlugin.SendEvent("build_complete", (System.DateTime.Now - buildStartTime).TotalSeconds.ToString(), "ovrbuild"); +#if BUILDSESSION + UnityEngine.Debug.LogFormat("build_complete: {0}", (System.DateTime.Now - buildStartTime).TotalSeconds.ToString()); +#endif + } + +#if UNITY_ANDROID + if (!isExporting) + { + // Get the hosts path to Android SDK + if (adbTool == null) + { + adbTool = new OVRADBTool(OVRConfig.Instance.GetAndroidSDKPath(false)); + } + + if (adbTool.isReady) + { + // Check to see if there are any ADB devices connected before continuing. + List devices = adbTool.GetDevices(); + if(devices.Count == 0) + { + return; + } + + // Clear current logs on device + Process adbClearProcess; + adbClearProcess = adbTool.RunCommandAsync(new string[] { "logcat --clear" }, null); + + // Add a timeout if we cannot get a response from adb logcat --clear in time. + Stopwatch timeout = new Stopwatch(); + timeout.Start(); + while (!adbClearProcess.WaitForExit(100)) + { + if (timeout.ElapsedMilliseconds > 2000) + { + adbClearProcess.Kill(); + return; + } + } + + // Check if existing ADB process is still running, kill if needed + if (adbProcess != null && !adbProcess.HasExited) + { + adbProcess.Kill(); + } + + // Begin thread to time upload and install + var thread = new Thread(delegate () + { + TimeDeploy(); + }); + thread.Start(); + } + } +#endif + } + +#if UNITY_ANDROID + public bool WaitForProcess; + public bool TransferStarted; + public DateTime UploadStart; + public DateTime UploadEnd; + public DateTime InstallEnd; + + public void TimeDeploy() + { + if (adbTool != null) + { + TransferStarted = false; + DataReceivedEventHandler outputRecieved = new DataReceivedEventHandler( + (s, e) => + { + if (e.Data != null && e.Data.Length != 0 && !e.Data.Contains("\u001b")) + { + if (e.Data.Contains("free_cache")) + { + // Device recieved install command and is starting upload + UploadStart = System.DateTime.Now; + TransferStarted = true; + } + else if (e.Data.Contains("Running dexopt")) + { + // Upload has finished and Package Manager is starting install + UploadEnd = System.DateTime.Now; + } + else if (e.Data.Contains("dex2oat took")) + { + // Package Manager finished install + InstallEnd = System.DateTime.Now; + WaitForProcess = false; + } + else if (e.Data.Contains("W PackageManager")) + { + // Warning from Package Manager is a failure in the install process + WaitForProcess = false; + } + } + } + ); + + WaitForProcess = true; + adbProcess = adbTool.RunCommandAsync(new string[] { "logcat" }, outputRecieved); + + Stopwatch transferTimeout = new Stopwatch(); + transferTimeout.Start(); + while (adbProcess != null && !adbProcess.WaitForExit(100)) + { + if (!WaitForProcess) + { + adbProcess.Kill(); + float UploadTime = (float)(UploadEnd - UploadStart).TotalMilliseconds / 1000f; + float InstallTime = (float)(InstallEnd - UploadEnd).TotalMilliseconds / 1000f; + + if (UploadTime > 0f) + { + OVRPlugin.SendEvent("deploy_task", UploadTime.ToString(), "ovrbuild"); + } + if (InstallTime > 0f) + { + OVRPlugin.SendEvent("install_task", InstallTime.ToString(), "ovrbuild"); + } + } + + if (!TransferStarted && transferTimeout.ElapsedMilliseconds > 5000) + { + adbProcess.Kill(); + } + } + } + } +#endif +#else +{ +#endif +} diff --git a/Assets/Oculus/VR/Editor/OVRGradleGeneration.cs.meta b/Assets/Oculus/VR/Editor/OVRGradleGeneration.cs.meta new file mode 100644 index 0000000..40adffc --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRGradleGeneration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ee7053149e3a159409d4deeb2f2e687f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRLayerAttributeEditor.cs b/Assets/Oculus/VR/Editor/OVRLayerAttributeEditor.cs new file mode 100644 index 0000000..2596dbd --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRLayerAttributeEditor.cs @@ -0,0 +1,32 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using UnityEditor; +using UnityEngine; + +[CustomPropertyDrawer(typeof(OVRLayerAttribute))] +class LayerAttributeEditor : PropertyDrawer { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + // One line of oxygen free code. + property.intValue = EditorGUI.LayerField(position, label, property.intValue); + } +} diff --git a/Assets/Oculus/VR/Editor/OVRLayerAttributeEditor.cs.meta b/Assets/Oculus/VR/Editor/OVRLayerAttributeEditor.cs.meta new file mode 100644 index 0000000..9bcf78e --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRLayerAttributeEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6c08392d306aac74a88ba571af63c985 +timeCreated: 1499749379 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRLint.cs b/Assets/Oculus/VR/Editor/OVRLint.cs new file mode 100644 index 0000000..60f2b61 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRLint.cs @@ -0,0 +1,930 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +#if UNITY_EDITOR + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using Assets.OVR.Scripts; + +/// +///Scans the project and warns about the following conditions: +///Audio sources > 16 +///Using MSAA levels other than recommended level +///Excessive pixel lights (>1 on Gear VR; >3 on Rift) +///Directional Lightmapping Modes (on Gear; use Non-Directional) +///Preload audio setting on individual audio clips +///Decompressing audio clips on load +///Disabling occlusion mesh +///Android target API level set to 21 or higher +///Unity skybox use (on by default, but if you can't see the skybox switching to Color is much faster on Gear) +///Lights marked as "baked" but that were not included in the last bake (and are therefore realtime). +///Lack of static batching and dynamic batching settings activated. +///Full screen image effects (Gear) +///Warn about large textures that are marked as uncompressed. +///32-bit depth buffer (use 16) +///Use of projectors (Gear; can be used carefully but slow enough to warrant a warning) +///Maybe in the future once quantified: Graphics jobs and IL2CPP on Gear. +///Real-time global illumination +///No texture compression, or non-ASTC texture compression as a global setting (Gear). +///Using deferred rendering +///Excessive texture resolution after LOD bias (>2k on Gear VR; >4k on Rift) +///Not using trilinear or aniso filtering and not generating mipmaps +///Excessive render scale (>1.2) +///Slow physics settings: Sleep Threshold < 0.005, Default Contact Offset < 0.01, Solver Iteration Count > 6 +///Shadows on when approaching the geometry or draw call limits +///Non-static objects with colliders that are missing rigidbodies on themselves or in the parent chain. +///No initialization of GPU/CPU throttling settings, or init to dangerous values (-1 or > 3) (Gear) +///Using inefficient effects: SSAO, motion blur, global fog, parallax mapping, etc. +///Too many Overlay layers +///Use of Standard shader or Standard Specular shader on Gear. More generally, excessive use of multipass shaders (legacy specular, etc). +///Multiple cameras with clears (on Gear, potential for excessive fill cost) +///Excessive shader passes (>2) +///Material pointers that have been instanced in the editor (esp. if we could determine that the instance has no deltas from the original) +///Excessive draw calls (>150 on Gear VR; >2000 on Rift) +///Excessive tris or verts (>100k on Gear VR; >1M on Rift) +///Large textures, lots of prefabs in startup scene (for bootstrap optimization) +///GPU skinning: testing Android-only, as most Rift devs are GPU-bound. +/// +[InitializeOnLoadAttribute] +public class OVRLint : EditorWindow +{ + //TODO: The following require reflection or static analysis. + ///Use of ONSP reflections (Gear) + ///Use of LoadLevelAsync / LoadLevelAdditiveAsync (on Gear, this kills frame rate so dramatically it's probably better to just go to black and load synchronously) + ///Use of Linq in non-editor assemblies (common cause of GCs). Minor: use of foreach. + ///Use of Unity WWW (exceptionally high overhead for large file downloads, but acceptable for tiny gets). + ///Declared but empty Awake/Start/Update/OnCollisionEnter/OnCollisionExit/OnCollisionStay. Also OnCollision* star methods that declare the Collision argument but do not reference it (omitting it short-circuits the collision contact calculation). + + private static List mRecords = new List(); + private static List mRuntimeEditModeRequiredRecords = new List(); +#if !UNITY_2017_2_OR_NEWER + private static bool mWasPlaying = false; +#endif + private Vector2 mScrollPosition; + + [MenuItem("Oculus/Tools/OVR Performance Lint Tool")] + static void Init() + { + // Get existing open window or if none, make a new one: + EditorWindow.GetWindow(typeof(OVRLint)); + OVRPlugin.SendEvent("perf_lint", "activated"); + OVRLint.RunCheck(); +#if !UNITY_2017_2_OR_NEWER + mWasPlaying = EditorApplication.isPlaying; +#endif + } + + OVRLint() + { +#if UNITY_2017_2_OR_NEWER + EditorApplication.playModeStateChanged += HandlePlayModeState; +#else + EditorApplication.playmodeStateChanged += () => + { + // When Unity starts playing, it would also trigger play mode changed event with isPlaying == false + // Fixes should only be applied when it was transitioned from playing mode + if (!EditorApplication.isPlaying && mWasPlaying) + { + ApplyEditModeRequiredFix(); + mWasPlaying = false; + } + else + { + mWasPlaying = true; + } + }; +#endif + } + +#if UNITY_2017_2_OR_NEWER + private static void HandlePlayModeState(PlayModeStateChange state) + { + if (state == PlayModeStateChange.EnteredEditMode) + { + ApplyEditModeRequiredFix(); + } + } +#endif + + private static void ApplyEditModeRequiredFix() + { + // Apply runtime fixes that require edit mode when applying fix + foreach (FixRecord record in mRuntimeEditModeRequiredRecords) + { + record.fixMethod(null, false, 0); + OVRPlugin.SendEvent("perf_lint_apply_fix", record.category); + record.complete = true; + } + mRuntimeEditModeRequiredRecords.Clear(); + } + + void OnGUI() + { + GUILayout.Label("OVR Performance Lint Tool", EditorStyles.boldLabel); + if (GUILayout.Button("Refresh", EditorStyles.toolbarButton, GUILayout.ExpandWidth(false))) + { + RunCheck(); + } + + string lastCategory = ""; + + mScrollPosition = EditorGUILayout.BeginScrollView(mScrollPosition); + + for (int x = 0; x < mRecords.Count; x++) + { + FixRecord record = mRecords[x]; + + if (!record.category.Equals(lastCategory)) // new category + { + lastCategory = record.category; + EditorGUILayout.Separator(); + EditorGUILayout.BeginHorizontal(); + GUILayout.Label(lastCategory, EditorStyles.label, GUILayout.Width(200)); + bool moreThanOne = (x + 1 < mRecords.Count && mRecords[x + 1].category.Equals(lastCategory)); + if (record.buttonNames != null && record.buttonNames.Length > 0) + { + if (moreThanOne) + { + GUILayout.Label("Apply to all:", EditorStyles.label, GUILayout.Width(75)); + for (int y = 0; y < record.buttonNames.Length; y++) + { + if (GUILayout.Button(record.buttonNames[y], EditorStyles.toolbarButton, GUILayout.Width(200))) + { + List recordsToProcess = new List(); + + for (int z = x; z < mRecords.Count; z++) + { + FixRecord thisRecord = mRecords[z]; + bool isLast = false; + if (z + 1 >= mRecords.Count || !mRecords[z + 1].category.Equals(lastCategory)) + { + isLast = true; + } + + if (!thisRecord.complete) + { + recordsToProcess.Add(thisRecord); + } + + if (isLast) + { + break; + } + } + + UnityEngine.Object[] undoObjects = new UnityEngine.Object[recordsToProcess.Count]; + for (int z = 0; z < recordsToProcess.Count; z++) + { + undoObjects[z] = recordsToProcess[z].targetObject; + } + Undo.RecordObjects(undoObjects, record.category + " (Multiple)"); + for (int z = 0; z < recordsToProcess.Count; z++) + { + FixRecord thisRecord = recordsToProcess[z]; + thisRecord.fixMethod(thisRecord.targetObject, (z + 1 == recordsToProcess.Count), y); + OVRPlugin.SendEvent("perf_lint_apply_fix", thisRecord.category); + thisRecord.complete = true; + } + } + } + } + } + EditorGUILayout.EndHorizontal(); + if (moreThanOne || record.targetObject) + { + GUILayout.Label(record.message); + } + } + + EditorGUILayout.BeginHorizontal(); + GUI.enabled = !record.complete; + if (record.targetObject) + { + EditorGUILayout.ObjectField(record.targetObject, record.targetObject.GetType(), true); + } + else + { + GUILayout.Label(record.message); + } + if (record.buttonNames != null) + { + for (int y = 0; y < record.buttonNames.Length; y++) + { + if (GUILayout.Button(record.buttonNames[y], EditorStyles.toolbarButton, GUILayout.Width(200))) + { + if (record.targetObject != null) + { + Undo.RecordObject(record.targetObject, record.category); + } + + if (record.editModeRequired) + { + // Add to the fix record list that requires edit mode + mRuntimeEditModeRequiredRecords.Add(record); + } + else + { + // Apply the fix directly + record.fixMethod(record.targetObject, true, y); + OVRPlugin.SendEvent("perf_lint_apply_fix", record.category); + record.complete = true; + } + + if (mRuntimeEditModeRequiredRecords.Count != 0) + { + // Stop the scene to apply edit mode required records + EditorApplication.ExecuteMenuItem("Edit/Play"); + } + } + } + + } + GUI.enabled = true; + EditorGUILayout.EndHorizontal(); + } + + EditorGUILayout.EndScrollView(); + } + + + public static int RunCheck() + { + mRecords.Clear(); + mRuntimeEditModeRequiredRecords.Clear(); + + CheckStaticCommonIssues(); +#if UNITY_ANDROID + CheckStaticAndroidIssues(); +#endif + + if (EditorApplication.isPlaying) + { + CheckRuntimeCommonIssues(); +#if UNITY_ANDROID + CheckRuntimeAndroidIssues(); +#endif + } + + mRecords.Sort(delegate (FixRecord record1, FixRecord record2) + { + return record1.category.CompareTo(record2.category); + }); + return mRecords.Count; + } + + static void AddFix(string category, string message, FixMethodDelegate method, UnityEngine.Object target, bool editModeRequired, params string[] buttons) + { + OVRPlugin.SendEvent("perf_lint_add_fix", category); + mRecords.Add(new FixRecord(category, message, method, target, editModeRequired, buttons)); + } + + static void CheckStaticCommonIssues() + { + if (OVRManager.IsUnityAlphaOrBetaVersion()) + { + AddFix("General", OVRManager.UnityAlphaOrBetaVersionWarningMessage, null, null, false); + } + + if (QualitySettings.anisotropicFiltering != AnisotropicFiltering.Enable && QualitySettings.anisotropicFiltering != AnisotropicFiltering.ForceEnable) + { + AddFix("Optimize Aniso", "Anisotropic filtering is recommended for optimal image sharpness and GPU performance.", delegate (UnityEngine.Object obj, bool last, int selected) + { + // Ideally this would be multi-option: offer Enable or ForceEnable. + QualitySettings.anisotropicFiltering = AnisotropicFiltering.Enable; + }, null, false, "Fix"); + } + +#if UNITY_ANDROID + int recommendedPixelLightCount = 1; +#else + int recommendedPixelLightCount = 3; +#endif + + if (QualitySettings.pixelLightCount > recommendedPixelLightCount) + { + AddFix("Optimize Pixel Light Count", "For GPU performance set no more than " + recommendedPixelLightCount + " pixel lights in Quality Settings (currently " + QualitySettings.pixelLightCount + ").", delegate (UnityEngine.Object obj, bool last, int selected) + { + QualitySettings.pixelLightCount = recommendedPixelLightCount; + }, null, false, "Fix"); + } + +#if false + // Should we recommend this? Seems to be mutually exclusive w/ dynamic batching. + if (!PlayerSettings.graphicsJobs) + { + AddFix ("Optimize Graphics Jobs", "For CPU performance, please use graphics jobs.", delegate(UnityEngine.Object obj, bool last, int selected) + { + PlayerSettings.graphicsJobs = true; + }, null, false, "Fix"); + } +#endif + +#if UNITY_2017_2_OR_NEWER + if ((!PlayerSettings.MTRendering || !PlayerSettings.GetMobileMTRendering(BuildTargetGroup.Android))) +#else + if ((!PlayerSettings.MTRendering || !PlayerSettings.mobileMTRendering)) +#endif + { + AddFix("Optimize MT Rendering", "For CPU performance, please enable multithreaded rendering.", delegate (UnityEngine.Object obj, bool last, int selected) + { +#if UNITY_2017_2_OR_NEWER + PlayerSettings.SetMobileMTRendering(BuildTargetGroup.Standalone, true); + PlayerSettings.SetMobileMTRendering(BuildTargetGroup.Android, true); +#else + PlayerSettings.MTRendering = PlayerSettings.mobileMTRendering = true; +#endif + }, null, false, "Fix"); + } + +#if UNITY_ANDROID + if (!PlayerSettings.use32BitDisplayBuffer) + { + AddFix("Optimize Display Buffer Format", "We recommend to enable use32BitDisplayBuffer.", delegate (UnityEngine.Object obj, bool last, int selected) + { + PlayerSettings.use32BitDisplayBuffer = true; + }, null, false, "Fix"); + } +#endif + +#if UNITY_2017_3_OR_NEWER && !UNITY_ANDROID + if (!PlayerSettings.VROculus.dashSupport) + { + AddFix("Enable Dash Integration", "We recommend to enable Dash Integration for better user experience.", delegate (UnityEngine.Object obj, bool last, int selected) + { + PlayerSettings.VROculus.dashSupport = true; + }, null, false, "Fix"); + } + + if (!PlayerSettings.VROculus.sharedDepthBuffer) + { + AddFix("Enable Depth Buffer Sharing", "We recommend to enable Depth Buffer Sharing for better user experience on Oculus Dash.", delegate (UnityEngine.Object obj, bool last, int selected) + { + PlayerSettings.VROculus.sharedDepthBuffer = true; + }, null, false, "Fix"); + } +#endif + + BuildTargetGroup target = EditorUserBuildSettings.selectedBuildTargetGroup; + var tier = UnityEngine.Rendering.GraphicsTier.Tier1; + var tierSettings = UnityEditor.Rendering.EditorGraphicsSettings.GetTierSettings(target, tier); + + if ((tierSettings.renderingPath == RenderingPath.DeferredShading || + tierSettings.renderingPath == RenderingPath.DeferredLighting)) + { + AddFix("Optimize Rendering Path", "For CPU performance, please do not use deferred shading.", delegate (UnityEngine.Object obj, bool last, int selected) + { + tierSettings.renderingPath = RenderingPath.Forward; + UnityEditor.Rendering.EditorGraphicsSettings.SetTierSettings(target, tier, tierSettings); + }, null, false, "Use Forward"); + } + + if (PlayerSettings.stereoRenderingPath == StereoRenderingPath.MultiPass) + { + AddFix("Optimize Stereo Rendering", "For CPU performance, please enable single-pass or instanced stereo rendering.", delegate (UnityEngine.Object obj, bool last, int selected) + { + PlayerSettings.stereoRenderingPath = StereoRenderingPath.Instancing; + }, null, false, "Fix"); + } + + if (LightmapSettings.lightmaps.Length > 0 && LightmapSettings.lightmapsMode != LightmapsMode.NonDirectional) + { + AddFix("Optimize Lightmap Directionality", "Switching from directional lightmaps to non-directional lightmaps can save a small amount of GPU time.", delegate (UnityEngine.Object obj, bool last, int selected) + { + LightmapSettings.lightmapsMode = LightmapsMode.NonDirectional; + }, null, false, "Switch to non-directional lightmaps"); + } + + if (Lightmapping.realtimeGI) + { + AddFix("Disable Realtime GI", "Disabling real-time global illumination can improve GPU performance.", delegate (UnityEngine.Object obj, bool last, int selected) + { + Lightmapping.realtimeGI = false; + }, null, false, "Set Lightmapping.realtimeGI = false."); + } + + var lights = GameObject.FindObjectsOfType(); + for (int i = 0; i < lights.Length; ++i) + { +#if UNITY_2017_3_OR_NEWER + if (lights [i].type != LightType.Directional && !lights [i].bakingOutput.isBaked && IsLightBaked(lights[i])) +#else + if (lights[i].type != LightType.Directional && !lights[i].isBaked && IsLightBaked(lights[i])) +#endif + { + AddFix("Unbaked Lights", "The following lights in the scene are marked as Baked, but they don't have up to date lightmap data. Generate the lightmap data, or set it to auto-generate, in Window->Lighting->Settings.", null, lights[i], false, null); + } + + if (lights[i].shadows != LightShadows.None && !IsLightBaked(lights[i])) + { + AddFix("Optimize Shadows", "For CPU performance, consider disabling shadows on realtime lights.", delegate (UnityEngine.Object obj, bool last, int selected) + { + Light thisLight = (Light)obj; + thisLight.shadows = LightShadows.None; + }, lights[i], false, "Set \"Shadow Type\" to \"No Shadows\""); + } + } + + var sources = GameObject.FindObjectsOfType(); + if (sources.Length > 16) + { + List playingAudioSources = new List(); + foreach (var audioSource in sources) + { + if (audioSource.isPlaying) + { + playingAudioSources.Add(audioSource); + } + } + + if (playingAudioSources.Count > 16) + { + // Sort playing audio sources by priority + playingAudioSources.Sort(delegate (AudioSource x, AudioSource y) + { + return x.priority.CompareTo(y.priority); + }); + for (int i = 16; i < playingAudioSources.Count; ++i) + { + AddFix("Optimize Audio Source Count", "For CPU performance, please disable all but the top 16 AudioSources.", delegate (UnityEngine.Object obj, bool last, int selected) + { + AudioSource audioSource = (AudioSource)obj; + audioSource.enabled = false; + }, playingAudioSources[i], false, "Disable"); + } + } + } + + var clips = GameObject.FindObjectsOfType(); + for (int i = 0; i < clips.Length; ++i) + { + if (clips[i].loadType == AudioClipLoadType.DecompressOnLoad) + { + AddFix("Audio Loading", "For fast loading, please don't use decompress on load for audio clips", delegate (UnityEngine.Object obj, bool last, int selected) + { + AudioClip thisClip = (AudioClip)obj; + if (selected == 0) + { + SetAudioLoadType(thisClip, AudioClipLoadType.CompressedInMemory, last); + } + else + { + SetAudioLoadType(thisClip, AudioClipLoadType.Streaming, last); + } + + }, clips[i], false, "Change to Compressed in Memory", "Change to Streaming"); + } + + if (clips[i].preloadAudioData) + { + AddFix("Audio Preload", "For fast loading, please don't preload data for audio clips.", delegate (UnityEngine.Object obj, bool last, int selected) + { + SetAudioPreload(clips[i], false, last); + }, clips[i], false, "Fix"); + } + } + + if (Physics.defaultContactOffset < 0.01f) + { + AddFix("Optimize Contact Offset", "For CPU performance, please don't use default contact offset below 0.01.", delegate (UnityEngine.Object obj, bool last, int selected) + { + Physics.defaultContactOffset = 0.01f; + }, null, false, "Fix"); + } + + if (Physics.sleepThreshold < 0.005f) + { + AddFix("Optimize Sleep Threshold", "For CPU performance, please don't use sleep threshold below 0.005.", delegate (UnityEngine.Object obj, bool last, int selected) + { + Physics.sleepThreshold = 0.005f; + }, null, false, "Fix"); + } + + if (Physics.defaultSolverIterations > 8) + { + AddFix("Optimize Solver Iterations", "For CPU performance, please don't use excessive solver iteration counts.", delegate (UnityEngine.Object obj, bool last, int selected) + { + Physics.defaultSolverIterations = 8; + }, null, false, "Fix"); + } + + var materials = Resources.FindObjectsOfTypeAll(); + for (int i = 0; i < materials.Length; ++i) + { + if (materials[i].shader.name.Contains("Parallax") || materials[i].IsKeywordEnabled("_PARALLAXMAP")) + { + AddFix("Optimize Shading", "For GPU performance, please don't use parallax-mapped materials.", delegate (UnityEngine.Object obj, bool last, int selected) + { + Material thisMaterial = (Material)obj; + if (thisMaterial.IsKeywordEnabled("_PARALLAXMAP")) + { + thisMaterial.DisableKeyword("_PARALLAXMAP"); + } + + if (thisMaterial.shader.name.Contains("Parallax")) + { + var newName = thisMaterial.shader.name.Replace("-ParallaxSpec", "-BumpSpec"); + newName = newName.Replace("-Parallax", "-Bump"); + var newShader = Shader.Find(newName); + if (newShader) + { + thisMaterial.shader = newShader; + } + else + { + Debug.LogWarning("Unable to find a replacement for shader " + materials[i].shader.name); + } + } + }, materials[i], false, "Fix"); + } + } + + var renderers = GameObject.FindObjectsOfType(); + for (int i = 0; i < renderers.Length; ++i) + { + if (renderers[i].sharedMaterial == null) + { + AddFix("Instanced Materials", "Please avoid instanced materials on renderers.", null, renderers[i], false); + } + } + + var overlays = GameObject.FindObjectsOfType(); + if (overlays.Length > 4) + { + AddFix("Optimize VR Layer Count", "For GPU performance, please use 4 or fewer VR layers.", delegate (UnityEngine.Object obj, bool last, int selected) + { + for (int i = 4; i < OVROverlay.instances.Length; ++i) + { + OVROverlay.instances[i].enabled = false; + } + }, null, false, "Fix"); + } + + var splashScreen = PlayerSettings.virtualRealitySplashScreen; + if (splashScreen != null) + { + if (splashScreen.filterMode != FilterMode.Trilinear) + { + AddFix("Optimize VR Splash Filtering", "For visual quality, please use trilinear filtering on your VR splash screen.", delegate (UnityEngine.Object obj, bool last, int EditorSelectedRenderState) + { + var assetPath = AssetDatabase.GetAssetPath(splashScreen); + var importer = (TextureImporter)TextureImporter.GetAtPath(assetPath); + importer.filterMode = FilterMode.Trilinear; + AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ForceUpdate); + }, null, false, "Fix"); + } + + if (splashScreen.mipmapCount <= 1) + { + AddFix("Generate VR Splash Mipmaps", "For visual quality, please use mipmaps with your VR splash screen.", delegate (UnityEngine.Object obj, bool last, int EditorSelectedRenderState) + { + var assetPath = AssetDatabase.GetAssetPath(splashScreen); + var importer = (TextureImporter)TextureImporter.GetAtPath(assetPath); + importer.mipmapEnabled = true; + AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ForceUpdate); + }, null, false, "Fix"); + } + } + } + + static void CheckRuntimeCommonIssues() + { + if (!OVRPlugin.occlusionMesh) + { + AddFix("Occlusion Mesh", "Enabling the occlusion mesh saves substantial GPU resources, generally with no visual impact. Enable unless you have an exceptional use case.", delegate (UnityEngine.Object obj, bool last, int selected) + { + OVRPlugin.occlusionMesh = true; + }, null, false, "Set OVRPlugin.occlusionMesh = true"); + } + + if (OVRManager.instance != null && !OVRManager.instance.useRecommendedMSAALevel) + { + AddFix("Optimize MSAA", "OVRManager can select the optimal antialiasing for the installed hardware at runtime. Recommend enabling this.", delegate (UnityEngine.Object obj, bool last, int selected) + { + var ovrManagers = GameObject.FindObjectsOfType(); + foreach (var ovrManager in ovrManagers) + { + ovrManager.useRecommendedMSAALevel = true; + } + }, null, true, "Stop Play and Fix"); + } + +#if UNITY_2017_2_OR_NEWER + if (UnityEngine.XR.XRSettings.eyeTextureResolutionScale > 1.5) +#else + if (UnityEngine.VR.VRSettings.renderScale > 1.5) +#endif + { + AddFix("Optimize Render Scale", "Render scale above 1.5 is extremely expensive on the GPU, with little if any positive visual benefit.", delegate (UnityEngine.Object obj, bool last, int selected) + { +#if UNITY_2017_2_OR_NEWER + UnityEngine.XR.XRSettings.eyeTextureResolutionScale = 1.5f; +#else + UnityEngine.VR.VRSettings.renderScale = 1.5f; +#endif + }, null, false, "Fix"); + } + } + + static void CheckStaticAndroidIssues() + { + // Check that the minSDKVersion meets requirement, 21 for Gear and Go, 23 for Quest + AndroidSdkVersions recommendedAndroidMinSdkVersion = AndroidSdkVersions.AndroidApiLevel21; + if (OVRDeviceSelector.isTargetDeviceQuest) + { + recommendedAndroidMinSdkVersion = AndroidSdkVersions.AndroidApiLevel23; + } + if ((int)PlayerSettings.Android.minSdkVersion < (int)recommendedAndroidMinSdkVersion) + { + AddFix("Set Min Android API Level", "Please require at least API level " + (int)recommendedAndroidMinSdkVersion, delegate (UnityEngine.Object obj, bool last, int selected) + { + PlayerSettings.Android.minSdkVersion = recommendedAndroidMinSdkVersion; + }, null, false, "Fix"); + } + + // Check that compileSDKVersion meets minimal version 26 as required for Quest's headtracking feature + // Unity Sets compileSDKVersion in Gradle as the value used in targetSdkVersion + AndroidSdkVersions requiredAndroidTargetSdkVersion = AndroidSdkVersions.AndroidApiLevel26; + if (OVRDeviceSelector.isTargetDeviceQuest && + (int)PlayerSettings.Android.targetSdkVersion < (int)requiredAndroidTargetSdkVersion) + { + AddFix("Set Android Target SDK Level", "Oculus Quest apps require at least target API level " + + (int)requiredAndroidTargetSdkVersion, delegate (UnityEngine.Object obj, bool last, int selected) + { + PlayerSettings.Android.targetSdkVersion = requiredAndroidTargetSdkVersion; + }, null, false, "Fix"); + } + + if (!PlayerSettings.gpuSkinning) + { + AddFix("Optimize GPU Skinning", "If you are CPU-bound, consider using GPU skinning.", + delegate (UnityEngine.Object obj, bool last, int selected) + { + PlayerSettings.gpuSkinning = true; + }, null, false, "Fix"); + } + + + if (RenderSettings.skybox) + { + AddFix("Optimize Clearing", "For GPU performance, please don't use Unity's built-in Skybox.", delegate (UnityEngine.Object obj, bool last, int selected) + { + RenderSettings.skybox = null; + }, null, false, "Clear Skybox"); + } + + var materials = Resources.FindObjectsOfTypeAll(); + for (int i = 0; i < materials.Length; ++i) + { + if (materials[i].IsKeywordEnabled("_SPECGLOSSMAP") || materials[i].IsKeywordEnabled("_METALLICGLOSSMAP")) + { + AddFix("Optimize Specular Material", "For GPU performance, please don't use specular shader on materials.", delegate (UnityEngine.Object obj, bool last, int selected) + { + Material thisMaterial = (Material)obj; + thisMaterial.DisableKeyword("_SPECGLOSSMAP"); + thisMaterial.DisableKeyword("_METALLICGLOSSMAP"); + }, materials[i], false, "Fix"); + } + + if (materials[i].passCount > 1) + { + AddFix("Material Passes", "Please use 2 or fewer passes in materials.", null, materials[i], false); + } + } + + ScriptingImplementation backend = PlayerSettings.GetScriptingBackend(UnityEditor.BuildTargetGroup.Android); + if (backend != UnityEditor.ScriptingImplementation.IL2CPP) + { + AddFix("Optimize Scripting Backend", "For CPU performance, please use IL2CPP.", delegate (UnityEngine.Object obj, bool last, int selected) + { + PlayerSettings.SetScriptingBackend(UnityEditor.BuildTargetGroup.Android, UnityEditor.ScriptingImplementation.IL2CPP); + }, null, false, "Fix"); + } + + var monoBehaviours = GameObject.FindObjectsOfType(); + System.Type effectBaseType = System.Type.GetType("UnityStandardAssets.ImageEffects.PostEffectsBase"); + if (effectBaseType != null) + { + for (int i = 0; i < monoBehaviours.Length; ++i) + { + if (monoBehaviours[i].GetType().IsSubclassOf(effectBaseType)) + { + AddFix("Image Effects", "Please don't use image effects.", null, monoBehaviours[i], false); + } + } + } + + var textures = Resources.FindObjectsOfTypeAll(); + + int maxTextureSize = 1024 * (1 << QualitySettings.masterTextureLimit); + maxTextureSize = maxTextureSize * maxTextureSize; + + for (int i = 0; i < textures.Length; ++i) + { + if (textures[i].filterMode == FilterMode.Trilinear && textures[i].mipmapCount == 1) + { + AddFix("Optimize Texture Filtering", "For GPU performance, please generate mipmaps or disable trilinear filtering for textures.", delegate (UnityEngine.Object obj, bool last, int selected) + { + Texture2D thisTexture = (Texture2D)obj; + if (selected == 0) + { + thisTexture.filterMode = FilterMode.Bilinear; + } + else + { + SetTextureUseMips(thisTexture, true, last); + } + }, textures[i], false, "Switch to Bilinear", "Generate Mipmaps"); + } + } + + var projectors = GameObject.FindObjectsOfType(); + if (projectors.Length > 0) + { + AddFix("Optimize Projectors", "For GPU performance, please don't use projectors.", delegate (UnityEngine.Object obj, bool last, int selected) + { + Projector[] thisProjectors = GameObject.FindObjectsOfType(); + for (int i = 0; i < thisProjectors.Length; ++i) + { + thisProjectors[i].enabled = false; + } + }, null, false, "Disable Projectors"); + } + + if (EditorUserBuildSettings.androidBuildSubtarget != MobileTextureSubtarget.ASTC) + { + AddFix("Optimize Texture Compression", "For GPU performance, please use ASTC.", delegate (UnityEngine.Object obj, bool last, int selected) + { + EditorUserBuildSettings.androidBuildSubtarget = MobileTextureSubtarget.ASTC; + }, null, false, "Fix"); + } + + var cameras = GameObject.FindObjectsOfType(); + int clearCount = 0; + for (int i = 0; i < cameras.Length; ++i) + { + if (cameras[i].clearFlags != CameraClearFlags.Nothing && cameras[i].clearFlags != CameraClearFlags.Depth) + ++clearCount; + } + + if (clearCount > 2) + { + AddFix("Camera Clears", "Please use 2 or fewer clears.", null, null, false); + } + + for (int i = 0; i < cameras.Length; ++i) + { + if (cameras[i].forceIntoRenderTexture) + { + AddFix("Optimize Mobile Rendering", "For GPU performance, please don't enable forceIntoRenderTexture on your camera, this might be a flag pollution created by post process stack you used before, \nif your post process had already been turned off, we strongly encourage you to disable forceIntoRenderTexture. If you still want to use post process for some reasons, \nyou can leave this one on, but be warned, enabling this flag will introduce huge GPU performance cost. To view your flag status, please turn on you inspector's debug mode", + delegate (UnityEngine.Object obj, bool last, int selected) + { + Camera thisCamera = (Camera)obj; + thisCamera.forceIntoRenderTexture = false; + }, cameras[i], false, "Disable forceIntoRenderTexture"); + } + } + } + + static void CheckRuntimeAndroidIssues() + { + if (UnityStats.usedTextureMemorySize + UnityStats.vboTotalBytes > 1000000) + { + AddFix("Graphics Memory", "Please use less than 1GB of vertex and texture memory.", null, null, false); + } + + if (OVRManager.cpuLevel < 0 || OVRManager.cpuLevel > 3) + { + AddFix("Optimize CPU level", "For battery life, please use a safe CPU level.", delegate (UnityEngine.Object obj, bool last, int selected) + { + OVRManager.cpuLevel = 2; + }, null, false, "Set to CPU2"); + } + + if (OVRManager.gpuLevel < 0 || OVRManager.gpuLevel > 3) + { + AddFix("Optimize GPU level", "For battery life, please use a safe GPU level.", delegate (UnityEngine.Object obj, bool last, int selected) + { + OVRManager.gpuLevel = 2; + }, null, false, "Set to GPU2"); + } + + if (UnityStats.triangles > 100000 || UnityStats.vertices > 100000) + { + AddFix("Triangles and Verts", "Please use less than 100000 triangles or vertices.", null, null, false); + } + + // Warn for 50 if in non-VR mode? + if (UnityStats.drawCalls > 100) + { + AddFix("Draw Calls", "Please use less than 100 draw calls.", null, null, false); + } + } + + + enum LightmapType { Realtime = 4, Baked = 2, Mixed = 1 }; + + static bool IsLightBaked(Light light) + { + return light.lightmapBakeType == LightmapBakeType.Baked; + } + + static void SetAudioPreload(AudioClip clip, bool preload, bool refreshImmediately) + { + if (clip != null) + { + string assetPath = AssetDatabase.GetAssetPath(clip); + AudioImporter importer = AssetImporter.GetAtPath(assetPath) as AudioImporter; + if (importer != null) + { + if (preload != importer.preloadAudioData) + { + importer.preloadAudioData = preload; + + AssetDatabase.ImportAsset(assetPath); + if (refreshImmediately) + { + AssetDatabase.Refresh(); + } + } + } + } + } + + static void SetAudioLoadType(AudioClip clip, AudioClipLoadType loadType, bool refreshImmediately) + { + if (clip != null) + { + string assetPath = AssetDatabase.GetAssetPath(clip); + AudioImporter importer = AssetImporter.GetAtPath(assetPath) as AudioImporter; + if (importer != null) + { + if (loadType != importer.defaultSampleSettings.loadType) + { + AudioImporterSampleSettings settings = importer.defaultSampleSettings; + settings.loadType = loadType; + importer.defaultSampleSettings = settings; + + AssetDatabase.ImportAsset(assetPath); + if (refreshImmediately) + { + AssetDatabase.Refresh(); + } + } + } + } + } + + public static void SetTextureUseMips(Texture texture, bool useMips, bool refreshImmediately) + { + if (texture != null) + { + string assetPath = AssetDatabase.GetAssetPath(texture); + TextureImporter tImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter; + if (tImporter != null && tImporter.mipmapEnabled != useMips) + { + tImporter.mipmapEnabled = useMips; + + AssetDatabase.ImportAsset(assetPath); + if (refreshImmediately) + { + AssetDatabase.Refresh(); + } + } + } + } + + static T FindComponentInParents(GameObject obj) where T : Component + { + T component = null; + if (obj != null) + { + Transform parent = obj.transform.parent; + if (parent != null) + { + do + { + component = parent.GetComponent(typeof(T)) as T; + parent = parent.parent; + } while (parent != null && component == null); + } + } + return component; + } +} + +#endif diff --git a/Assets/Oculus/VR/Editor/OVRLint.cs.meta b/Assets/Oculus/VR/Editor/OVRLint.cs.meta new file mode 100644 index 0000000..9b3f4a7 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRLint.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f6763ce4cfe57644a593d773ec6e3cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRManifestPreprocessor.cs b/Assets/Oculus/VR/Editor/OVRManifestPreprocessor.cs new file mode 100644 index 0000000..e817f27 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRManifestPreprocessor.cs @@ -0,0 +1,120 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using UnityEngine; +using UnityEditor; +using System.IO; + +public class OVRManifestPreprocessor +{ + [MenuItem("Oculus/Tools/Create store-compatible AndroidManifest.xml", false, 100000)] + public static void GenerateManifestForSubmission() + { + var so = ScriptableObject.CreateInstance(typeof(OVRPluginUpdaterStub)); + var script = MonoScript.FromScriptableObject(so); + string assetPath = AssetDatabase.GetAssetPath(script); + string editorDir = Directory.GetParent(assetPath).FullName; + string srcFile = editorDir + "/AndroidManifest.OVRSubmission.xml"; + + if (!File.Exists(srcFile)) + { + Debug.LogError("Cannot find Android manifest template for submission." + + " Please delete the OVR folder and reimport the Oculus Utilities."); + return; + } + + string manifestFolder = Application.dataPath + "/Plugins/Android"; + + if (!Directory.Exists(manifestFolder)) + Directory.CreateDirectory(manifestFolder); + + string dstFile = manifestFolder + "/AndroidManifest.xml"; + + if (File.Exists(dstFile)) + { + Debug.LogWarning("Cannot create Oculus store-compatible manifest due to conflicting file: \"" + + dstFile + "\". Please remove it and try again."); + return; + } + + string manifestText = File.ReadAllText(srcFile); + int dofTextIndex = manifestText.IndexOf(""); + if (dofTextIndex != -1) + { + if (OVRDeviceSelector.isTargetDeviceQuest) + { + string headTrackingFeatureText = string.Format("", + OVRDeviceSelector.isTargetDeviceGearVrOrGo ? "false" : "true"); + manifestText = manifestText.Insert(dofTextIndex, headTrackingFeatureText); + } + } + else + { + Debug.LogWarning("Manifest error: unable to locate headset DoF mode"); + } + + int handTrackingTextIndex = manifestText.IndexOf(""); + if (handTrackingTextIndex != -1) + { + if (OVRDeviceSelector.isTargetDeviceQuest) + { + OVRProjectConfig.HandTrackingSupport targetHandTrackingSupport = OVRProjectConfig.GetProjectConfig().handTrackingSupport; + bool handTrackingEntryNeeded = (targetHandTrackingSupport != OVRProjectConfig.HandTrackingSupport.ControllersOnly); + bool handTrackingRequired = (targetHandTrackingSupport == OVRProjectConfig.HandTrackingSupport.HandsOnly); + if (handTrackingEntryNeeded) + { + string handTrackingFeatureText = string.Format("", + handTrackingRequired ? "true" : "false"); + string handTrackingPermissionText = string.Format(""); + + manifestText = manifestText.Insert(handTrackingTextIndex, handTrackingPermissionText); + manifestText = manifestText.Insert(handTrackingTextIndex, handTrackingFeatureText); + } + } + } + else + { + Debug.LogWarning("Manifest error: unable to locate headset handtracking mode"); + } + +#if !UNITY_2018_2_OR_NEWER + int iconLabelText = manifestText.IndexOf("android:icon=\"@mipmap/app_icon\""); + if(iconLabelText != -1) + { + manifestText = manifestText.Replace("android:icon=\"@mipmap/app_icon\"", "android:icon=\"@drawable/app_icon\""); + } + else + { + Debug.LogWarning("Manifest error: failed to update icon label for older version of Unity"); + } +#endif + + System.IO.File.WriteAllText(dstFile, manifestText); + AssetDatabase.Refresh(); + } + + [MenuItem("Oculus/Tools/Remove AndroidManifest.xml")] + public static void RemoveAndroidManifest() + { + AssetDatabase.DeleteAsset("Assets/Plugins/Android/AndroidManifest.xml"); + AssetDatabase.Refresh(); + } +} diff --git a/Assets/Oculus/VR/Editor/OVRManifestPreprocessor.cs.meta b/Assets/Oculus/VR/Editor/OVRManifestPreprocessor.cs.meta new file mode 100644 index 0000000..b4f1bff --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRManifestPreprocessor.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: fb6426f323b7f024ebb25886b5182c4c +timeCreated: 1462825988 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: + - renderFrom: {fileID: 168286, guid: a5014611cefbb6b4398b7e4c82203d08, type: 2} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRPlatformTool.cs b/Assets/Oculus/VR/Editor/OVRPlatformTool.cs new file mode 100644 index 0000000..23e6acb --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRPlatformTool.cs @@ -0,0 +1,1265 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text.RegularExpressions; +using System.Threading; +using UnityEditor; +using UnityEngine; +using UnityEngine.Networking; + +namespace Assets.Oculus.VR.Editor +{ + public class OVRPlatformTool : EditorWindow + { + public enum TargetPlatform + { + Rift, + OculusGoGearVR, + Quest, + None, + }; + + const string urlPlatformUtil = + "https://www.oculus.com/download_app/?id=1076686279105243"; + + static private Process ovrPlatUtilProcess; + Vector2 commandMenuScroll; + Vector2 debugLogScroll; + + static public string log; + + private static bool activeProcess = false; + private static bool ranSelfUpdate = false; + private static int retryCount = 0; + private static string appToken; + + private const float buttonPadding = 5.0f; + + private bool showOptionalCommands = false; + private bool show2DCommands = false; + private bool showExpansionFileCommands = false; + private bool showRedistCommands = false; + + private const float INDENT_SPACING = 15f; + private const float SINGLE_LINE_SPACING = 18f; + private const float ASSET_CONFIG_BACKGROUND_PADDING = 10f; + private const float DEFAULT_LABEL_WIDTH = 180f; + private const int MAX_DOWNLOAD_RETRY_COUNT = 2; + + private static GUIStyle boldFoldoutStyle; + + string[] platformOptions = new string[] + { + "Oculus Rift", + "Oculus Go | Gear VR", + "Oculus Quest" + }; + + string[] gamepadOptions = new string[] + { + "Off", + "Twinstick", + "Right D Pad", + "Left D Pad" + }; + + [MenuItem("Oculus/Tools/Oculus Platform Tool")] + static void Init() + { + OVRPlatformTool.log = string.Empty; + // Get existing open window or if none, make a new one: + EditorWindow.GetWindow(typeof(OVRPlatformTool)); + + // Populate initial target platform value based on OVRDeviceSelector +#if UNITY_ANDROID + if (OVRDeviceSelector.isTargetDeviceQuest) + { + OVRPlatformToolSettings.TargetPlatform = TargetPlatform.Quest; + } + else + { + OVRPlatformToolSettings.TargetPlatform = TargetPlatform.OculusGoGearVR; + } +#else + OVRPlatformToolSettings.TargetPlatform = TargetPlatform.Rift; +#endif + EditorUtility.SetDirty(OVRPlatformToolSettings.Instance); + + // Load redist packages by calling list-redists in the CLI + string dataPath = Application.dataPath; + var thread = new Thread(delegate () { + retryCount = 0; + LoadRedistPackages(dataPath); + }); + thread.Start(); + + OVRPlugin.SendEvent("oculus_platform_tool", "show_window"); + } + + void OnGUI() + { + if (boldFoldoutStyle == null) + { + boldFoldoutStyle = new GUIStyle(EditorStyles.foldout); + boldFoldoutStyle.fontStyle = FontStyle.Bold; + } + + EditorGUIUtility.labelWidth = DEFAULT_LABEL_WIDTH; + + GUILayout.Label("OVR Platform Tool", EditorStyles.boldLabel); + this.titleContent.text = "OVR Platform Tool"; + + GUIContent TargetPlatformLabel = new GUIContent("Target Oculus Platform"); + OVRPlatformToolSettings.TargetPlatform = (TargetPlatform)MakePopup(TargetPlatformLabel, (int)OVRPlatformToolSettings.TargetPlatform, platformOptions); + SetOVRProjectConfig(OVRPlatformToolSettings.TargetPlatform); + SetDirtyOnGUIChange(); + + commandMenuScroll = EditorGUILayout.BeginScrollView(commandMenuScroll, GUILayout.Height(Screen.height / 2)); + { + // Add the UI Form + EditorGUI.BeginChangeCheck(); + GUILayout.Space(15.0f); + + // App ID + GUIContent AppIDLabel = new GUIContent("Oculus Application ID [?]: ", + "This AppID will be used when uploading the build."); + OVRPlatformToolSettings.AppID = MakeTextBox(AppIDLabel, OVRPlatformToolSettings.AppID); + + // App Token + GUIContent AppTokenLabel = new GUIContent("Oculus App Token [?]: ", + "You can get your app token from your app's Oculus API Dashboard."); + appToken = MakePasswordBox(AppTokenLabel, appToken); + + // Release Channel + GUIContent ReleaseChannelLabel = new GUIContent("Release Channel [?]: ", + "Specify the releaes channel of the new build, you can reassign to other channels after upload."); + OVRPlatformToolSettings.ReleaseChannel = MakeTextBox(ReleaseChannelLabel, OVRPlatformToolSettings.ReleaseChannel); + + // Releaes Note + GUIContent ReleaseNoteLabel = new GUIContent("Release Note: "); + OVRPlatformToolSettings.ReleaseNote = MakeTextBox(ReleaseNoteLabel, OVRPlatformToolSettings.ReleaseNote); + + // Platform specific fields + if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.Rift) + { + GUIContent BuildDirLabel = new GUIContent("Rift Build Directory [?]: ", + "The full path to the directory containing your Rift build files."); + OVRPlatformToolSettings.RiftBuildDirectory = MakeFileDirectoryField(BuildDirLabel, OVRPlatformToolSettings.RiftBuildDirectory, + "Choose Rifle Build Directory"); + + GUIContent BuildVersionLabel = new GUIContent("Build Version [?]: ", + "The version number shown to users."); + OVRPlatformToolSettings.RiftBuildVersion = MakeTextBox(BuildVersionLabel, OVRPlatformToolSettings.RiftBuildVersion); + + GUIContent LaunchFileLabel = new GUIContent("Launch File Path [?]: ", + "The full path to the executable that launches your app."); + OVRPlatformToolSettings.RiftLaunchFile = MakeFileDirectoryField(LaunchFileLabel, OVRPlatformToolSettings.RiftLaunchFile, + "Choose Launch File", true, "exe"); + } + else + { + GUIContent ApkPathLabel = new GUIContent("Build APK File Path [?]: ", + "The full path to the APK file."); + OVRPlatformToolSettings.ApkBuildPath = MakeFileDirectoryField(ApkPathLabel, OVRPlatformToolSettings.ApkBuildPath, + "Choose APK File", true, "apk"); + + if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.OculusGoGearVR) + { + // Go and Gear VR specific fields + } + else if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.Quest) + { + // Quest specific fields + } + } + + showOptionalCommands = EditorGUILayout.Foldout(showOptionalCommands, "Optional Commands", boldFoldoutStyle); + if (showOptionalCommands) + { + IncrementIndent(); + + if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.Rift) + { + // Launch Parameters + GUIContent LaunchParamLabel = new GUIContent("Launch Parameters [?]: ", + "Specifies any arguments passed to the launcher."); + OVRPlatformToolSettings.RiftLaunchParams = MakeTextBox(LaunchParamLabel, OVRPlatformToolSettings.RiftLaunchParams); + + GUIContent FirewallExceptionLabel = new GUIContent("Firewall Exception [?]: ", + "Specifies if a Windows Firewall exception is required."); + OVRPlatformToolSettings.RiftFirewallException = MakeToggleBox(FirewallExceptionLabel, OVRPlatformToolSettings.RiftFirewallException); + + GUIContent GamepadEmulationLabel = new GUIContent("Gamepad Emulation [?]: ", + "Specifies the type of gamepad emulation used by the Oculus Touch controllers."); + OVRPlatformToolSettings.RiftGamepadEmulation = (OVRPlatformToolSettings.GamepadType)MakePopup(GamepadEmulationLabel, (int)OVRPlatformToolSettings.RiftGamepadEmulation, gamepadOptions); + + show2DCommands = EditorGUILayout.Foldout(show2DCommands, "2D", boldFoldoutStyle); + if (show2DCommands) + { + IncrementIndent(); + + // 2D Launch File + GUIContent LaunchFile2DLabel = new GUIContent("2D Launch File [?]: ", + "The full path to the executable that launches your app in 2D mode."); + OVRPlatformToolSettings.Rift2DLaunchFile = MakeFileDirectoryField(LaunchFile2DLabel, OVRPlatformToolSettings.Rift2DLaunchFile, + "Choose 2D Launch File", true, "exe"); + + // 2D Launch Parameters + GUIContent LaunchParam2DLabel = new GUIContent("2D Launch Parameters [?]: ", + "Specifies any arguments passed to the launcher in 2D mode."); + OVRPlatformToolSettings.Rift2DLaunchParams = MakeTextBox(LaunchParam2DLabel, OVRPlatformToolSettings.Rift2DLaunchParams); + + DecrementIndent(); + } + + showRedistCommands = EditorGUILayout.Foldout(showRedistCommands, "Redistributable Packages", boldFoldoutStyle); + if (showRedistCommands) + { + IncrementIndent(); + + for (int i = 0; i < OVRPlatformToolSettings.RiftRedistPackages.Count; i++) + { + GUIContent RedistPackageLabel = new GUIContent(OVRPlatformToolSettings.RiftRedistPackages[i].name); + OVRPlatformToolSettings.RiftRedistPackages[i].include = MakeToggleBox(RedistPackageLabel, OVRPlatformToolSettings.RiftRedistPackages[i].include); + } + + DecrementIndent(); + } + + showExpansionFileCommands = EditorGUILayout.Foldout(showExpansionFileCommands, "Expansion Files", boldFoldoutStyle); + if (showExpansionFileCommands) + { + IncrementIndent(); + + // Language Pack Directory + GUIContent LanguagePackLabel = new GUIContent("Language Pack Directory [?]: ", + "The full path to the directory containing the language packs"); + OVRPlatformToolSettings.LanguagePackDirectory = MakeFileDirectoryField(LanguagePackLabel, OVRPlatformToolSettings.LanguagePackDirectory, + "Choose Language Pack Directory"); + } + } + else + { + if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.OculusGoGearVR) + { + // Go and Gear VR specific optional fields + } + else if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.Quest) + { + // Quest specific optional fields + } + + showExpansionFileCommands = EditorGUILayout.Foldout(showExpansionFileCommands, "Expansion Files", boldFoldoutStyle); + if (showExpansionFileCommands) + { + IncrementIndent(); + + // OBB File Path + GUIContent ObbPathLabel = new GUIContent("OBB File Path [?]: ", + "The full path to the OBB file."); + OVRPlatformToolSettings.ObbFilePath = MakeFileDirectoryField(ObbPathLabel, OVRPlatformToolSettings.ObbFilePath, + "Choose OBB File", true, "obb"); + } + } + + if (showExpansionFileCommands) + { + // Assets Directory + GUIContent AssetsDirLabel = new GUIContent("Assets Directory [?]: ", + "The full path to the directory with DLCs for this build."); + string assetsDirectory = MakeFileDirectoryField(AssetsDirLabel, OVRPlatformToolSettings.AssetsDirectory, + "Choose Assets Directory"); + + if (assetsDirectory != OVRPlatformToolSettings.AssetsDirectory) + { + OVRPlatformToolSettings.AssetsDirectory = assetsDirectory; + OVRPlatformToolSettings.AssetConfigs.Clear(); + if (!string.IsNullOrEmpty(OVRPlatformToolSettings.AssetsDirectory)) + { + DirectoryInfo dirInfo = new DirectoryInfo(OVRPlatformToolSettings.AssetsDirectory); + FileInfo[] assetFiles = dirInfo.GetFiles(); + foreach (FileInfo f in assetFiles) + { + OVRPlatformToolSettings.AssetConfigs.Add(new AssetConfig(f.Name)); + } + } + EditorUtility.SetDirty(OVRPlatformToolSettings.Instance); + } + + // Display bordered asset configuration list + GUILayout.Space(3f); + Rect rect = GUILayoutUtility.GetRect(0, GetAssetConfigElementHeight() + (ASSET_CONFIG_BACKGROUND_PADDING * 2), + GUILayout.ExpandWidth(true)); + rect.x += (EditorGUI.indentLevel * INDENT_SPACING + 5); + rect.width -= (EditorGUI.indentLevel * INDENT_SPACING + 10); + DrawAssetConfigList(rect); + + DecrementIndent(); + } + + EditorGUI.indentLevel--; + } + + if (EditorGUI.EndChangeCheck()) + { + EditorUtility.SetDirty(OVRPlatformToolSettings.Instance); + } + } + EditorGUILayout.EndScrollView(); + + GUILayout.Space(SINGLE_LINE_SPACING); + + GUILayout.FlexibleSpace(); + + // Run OVR Lint Option + EditorGUIUtility.labelWidth = DEFAULT_LABEL_WIDTH; + GUIContent RunOvrLintLabel = new GUIContent("Run OVR Lint (Recommended) [?]: ", + "Run OVR Lint tool to ensure project is optimized for performance and meets Oculus packaging requirement for publishing."); + OVRPlatformToolSettings.RunOvrLint = MakeToggleBox(RunOvrLintLabel, OVRPlatformToolSettings.RunOvrLint); + + // Add an Upload button + GUI.enabled = !activeProcess; + GUIContent btnTxt = new GUIContent("Upload"); + var rt = GUILayoutUtility.GetRect(btnTxt, GUI.skin.button, GUILayout.ExpandWidth(false)); + var btnYPos = rt.center.y; + rt.center = new Vector2(EditorGUIUtility.currentViewWidth / 2 - rt.width / 2 - buttonPadding, btnYPos); + if (GUI.Button(rt, btnTxt, GUI.skin.button)) + { + OVRPlugin.SendEvent("oculus_platform_tool", "upload"); + OVRPlatformTool.log = string.Empty; + OnUpload(OVRPlatformToolSettings.TargetPlatform); + } + + // Add a cancel button + GUI.enabled = activeProcess; + btnTxt = new GUIContent("Cancel"); + rt = GUILayoutUtility.GetRect(btnTxt, GUI.skin.button, GUILayout.ExpandWidth(false)); + rt.center = new Vector2(EditorGUIUtility.currentViewWidth / 2 + rt.width / 2 + buttonPadding, btnYPos); + if (GUI.Button(rt, btnTxt, GUI.skin.button)) + { + if (EditorUtility.DisplayDialog("Cancel Upload Process", "Are you sure you want to cancel the upload process?", "Yes", "No")) + { + if (ovrPlatUtilProcess != null) + { + ovrPlatUtilProcess.Kill(); + OVRPlatformTool.log += "Upload process was canceled\n"; + } + } + } + + GUI.enabled = true; + GUILayout.FlexibleSpace(); + + GUILayout.Space(SINGLE_LINE_SPACING); + + debugLogScroll = EditorGUILayout.BeginScrollView(debugLogScroll); + GUIStyle logBoxStyle = new GUIStyle(); + logBoxStyle.margin.left = 5; + logBoxStyle.wordWrap = true; + logBoxStyle.normal.textColor = logBoxStyle.focused.textColor = EditorStyles.label.normal.textColor; + EditorGUILayout.SelectableLabel(OVRPlatformTool.log, logBoxStyle, GUILayout.Height(position.height - 30)); + EditorGUILayout.EndScrollView(); + } + + private void SetOVRProjectConfig(TargetPlatform targetPlatform) + { +#if UNITY_ANDROID + + var targetDeviceTypes = new List(); + + if (targetPlatform == TargetPlatform.Quest && !OVRDeviceSelector.isTargetDeviceQuest) + { + targetDeviceTypes.Add(OVRProjectConfig.DeviceType.Quest); + } + else if (targetPlatform == TargetPlatform.OculusGoGearVR && !OVRDeviceSelector.isTargetDeviceGearVrOrGo) + { + targetDeviceTypes.Add(OVRProjectConfig.DeviceType.GearVrOrGo); + } + + if (targetDeviceTypes.Count != 0) + { + OVRProjectConfig projectConfig = OVRProjectConfig.GetProjectConfig(); + projectConfig.targetDeviceTypes = targetDeviceTypes; + OVRProjectConfig.CommitProjectConfig(projectConfig); + } +#endif + } + + private void IncrementIndent() + { + EditorGUI.indentLevel++; + EditorGUIUtility.labelWidth = DEFAULT_LABEL_WIDTH - (EditorGUI.indentLevel * INDENT_SPACING); + } + + private void DecrementIndent() + { + EditorGUI.indentLevel--; + EditorGUIUtility.labelWidth = DEFAULT_LABEL_WIDTH - (EditorGUI.indentLevel * INDENT_SPACING); + } + + private void OnUpload(TargetPlatform targetPlatform) + { + OVRPlatformTool.log = string.Empty; + SetDirtyOnGUIChange(); + var lintCount = 0; + if (OVRPlatformToolSettings.RunOvrLint) + { + lintCount = OVRLint.RunCheck(); + } + if (lintCount != 0) + { + OVRPlatformTool.log += lintCount.ToString() + " lint suggestions are found. \n" + + "Please run Oculus\\Tools\\OVR Performance Lint Tool to review and fix lint errors. \n" + + "You can uncheck Run OVR Lint to bypass lint errors. \n"; + OVRPlugin.SendEvent("oculus_platform_tool_lint", lintCount.ToString()); + } + else + { + // Continue uploading process + ExecuteCommand(targetPlatform); + } + } + + static void ExecuteCommand(TargetPlatform targetPlatform) + { + string dataPath = Application.dataPath; + + // If we already have a copy of the platform util, check if it needs to be updated + if (!ranSelfUpdate && File.Exists(dataPath + "/Oculus/VR/Editor/Tools/ovr-platform-util.exe")) + { + ranSelfUpdate = true; + activeProcess = true; + var updateThread = new Thread(delegate () { + retryCount = 0; + CheckForUpdate(dataPath); + }); + updateThread.Start(); + } + + var thread = new Thread(delegate () { + // Wait for update process to finish before starting upload process + while (activeProcess) + { + Thread.Sleep(100); + } + retryCount = 0; + Command(targetPlatform, dataPath); + }); + thread.Start(); + } + + private static string CheckForPlatformUtil(string dataPath) + { + string toolDataPath = dataPath + "/Oculus/VR/Editor/Tools"; + if (!Directory.Exists(toolDataPath)) + { + Directory.CreateDirectory(toolDataPath); + } + + string platformUtil = toolDataPath + "/ovr-platform-util.exe"; + if (!System.IO.File.Exists(platformUtil)) + { + OVRPlugin.SendEvent("oculus_platform_tool", "provision_util"); + EditorCoroutine downloadCoroutine = EditorCoroutine.Start(ProvisionPlatformUtil(platformUtil)); + while (!downloadCoroutine.GetCompleted()) { } + } + + return platformUtil; + } + + private static void InitializePlatformUtilProcess(string path, string args) + { + ovrPlatUtilProcess = new Process(); + var processInfo = new ProcessStartInfo(path, args); + + processInfo.CreateNoWindow = true; + processInfo.UseShellExecute = false; + processInfo.RedirectStandardError = true; + processInfo.RedirectStandardOutput = true; + + ovrPlatUtilProcess.StartInfo = processInfo; + ovrPlatUtilProcess.EnableRaisingEvents = true; + } + + static void CheckForUpdate(string dataPath) + { + string platformUtilPath = CheckForPlatformUtil(dataPath); + InitializePlatformUtilProcess(platformUtilPath, "self-update"); + + OVRPlatformTool.log += "Checking for update...\n"; + + ovrPlatUtilProcess.Exited += new EventHandler( + (s, e) => + { + if (File.Exists(dataPath + ".ovr-platform-util.exe")) + { + OVRPlatformTool.log += "Cleaning up...\n"; + while (File.Exists(dataPath + ".ovr-platform-util.exe")) { } + OVRPlatformTool.log += "Finished updating platform utility.\n"; + } + activeProcess = false; + } + ); + + ovrPlatUtilProcess.OutputDataReceived += new DataReceivedEventHandler( + (s, e) => + { + if (e.Data != null && e.Data.Length != 0 && !e.Data.Contains("\u001b")) + { + OVRPlatformTool.log += e.Data + "\n"; + } + } + ); + + try + { + ovrPlatUtilProcess.Start(); + ovrPlatUtilProcess.BeginOutputReadLine(); + } + catch + { + if (ThrowPlatformUtilStartupError(platformUtilPath)) + { + CheckForUpdate(dataPath); + } + } + } + + static void LoadRedistPackages(string dataPath) + { + // Check / Download the platform util and call list-redists on it + activeProcess = true; + string platformUtilPath = CheckForPlatformUtil(dataPath); + InitializePlatformUtilProcess(platformUtilPath, "list-redists"); + + OVRPlatformTool.log += "Loading redistributable packages...\n"; + + List redistPacks = new List(); + + ovrPlatUtilProcess.Exited += new EventHandler( + (s, e) => + { + activeProcess = false; + } + ); + + ovrPlatUtilProcess.OutputDataReceived += new DataReceivedEventHandler( + (s, e) => + { + if (e.Data != null && e.Data.Length != 0 && !e.Data.Contains("\u001b") && !e.Data.Contains("ID")) + { + // Get the name / ID pair from the CLI and create a redist package instance + string[] terms = e.Data.Split('|'); + if (terms.Length == 2) + { + RedistPackage redistPack = new RedistPackage(terms[1], terms[0]); + redistPacks.Add(redistPack); + } + } + } + ); + + try + { + ovrPlatUtilProcess.Start(); + ovrPlatUtilProcess.BeginOutputReadLine(); + + ovrPlatUtilProcess.WaitForExit(); + + if (redistPacks.Count != OVRPlatformToolSettings.RiftRedistPackages.Count) + { + OVRPlatformTool.log += "Successfully updated redistributable packages.\n"; + OVRPlatformToolSettings.RiftRedistPackages = redistPacks; + } + else + { + OVRPlatformTool.log += "Redistributable packages up to date.\n"; + } + } + catch + { + if (ThrowPlatformUtilStartupError(platformUtilPath)) + { + LoadRedistPackages(dataPath); + } + } + } + + static void Command(TargetPlatform targetPlatform, string dataPath) + { + string platformUtilPath = CheckForPlatformUtil(dataPath); + + string args; + if (genUploadCommand(targetPlatform, out args)) + { + activeProcess = true; + InitializePlatformUtilProcess(platformUtilPath, args); + + ovrPlatUtilProcess.Exited += new EventHandler( + (s, e) => + { + activeProcess = false; + } + ); + + ovrPlatUtilProcess.OutputDataReceived += new DataReceivedEventHandler( + (s, e) => + { + if (e.Data != null && e.Data.Length != 0 && !e.Data.Contains("\u001b")) + { + OVRPlatformTool.log += e.Data + "\n"; + } + } + ); + ovrPlatUtilProcess.ErrorDataReceived += new DataReceivedEventHandler( + (s, e) => + { + OVRPlatformTool.log += e.Data + "\n"; + } + ); + + try + { + ovrPlatUtilProcess.Start(); + ovrPlatUtilProcess.BeginOutputReadLine(); + ovrPlatUtilProcess.BeginErrorReadLine(); + } + catch + { + if (ThrowPlatformUtilStartupError(platformUtilPath)) + { + Command(targetPlatform, dataPath); + } + } + } + } + + private static bool genUploadCommand(TargetPlatform targetPlatform, out string command) + { + bool success = true; + command = ""; + + switch (targetPlatform) + { + case TargetPlatform.Rift: + command = "upload-rift-build"; + break; + case TargetPlatform.OculusGoGearVR: + command = "upload-mobile-build"; + break; + case TargetPlatform.Quest: + command = "upload-quest-build"; + break; + default: + OVRPlatformTool.log += "ERROR: Invalid target platform selected"; + success = false; + break; + } + + // Add App ID + ValidateTextField(AppIDFieldValidator, OVRPlatformToolSettings.AppID, "App ID", ref success); + command += " --app-id \"" + OVRPlatformToolSettings.AppID + "\""; + + // Add App Token + ValidateTextField(GenericFieldValidator, appToken, "App Token", ref success); + command += " --app-secret \"" + appToken + "\""; + + // Add Platform specific fields + if (targetPlatform == TargetPlatform.Rift) + { + // Add Rift Build Directory + ValidateTextField(DirectoryValidator, OVRPlatformToolSettings.RiftBuildDirectory, "Rift Build Directory", ref success); + command += " --build-dir \"" + OVRPlatformToolSettings.RiftBuildDirectory + "\""; + + // Add Rift Launch File + ValidateTextField(FileValidator, OVRPlatformToolSettings.RiftLaunchFile, "Rift Launch File Path", ref success); + command += " --launch-file \"" + OVRPlatformToolSettings.RiftLaunchFile + "\""; + + // Add Rift Build Version + ValidateTextField(GenericFieldValidator, OVRPlatformToolSettings.RiftBuildVersion, "Build Version", ref success); + command += " --version \"" + OVRPlatformToolSettings.RiftBuildVersion + "\""; + + // Add Rift Launch Parameters + if (!string.IsNullOrEmpty(OVRPlatformToolSettings.RiftLaunchParams)) + { + ValidateTextField(LaunchParameterValidator, OVRPlatformToolSettings.RiftLaunchParams, "Launch Parameters", ref success); + command += " --launch_params \"" + OVRPlatformToolSettings.RiftLaunchParams + "\""; + } + + // Add 2D Launch File + if (!string.IsNullOrEmpty(OVRPlatformToolSettings.Rift2DLaunchFile)) + { + ValidateTextField(FileValidator, OVRPlatformToolSettings.Rift2DLaunchFile, "2D Launch File", ref success); + command += " --launch_file_2d \"" + OVRPlatformToolSettings.Rift2DLaunchFile + "\""; + + if (!string.IsNullOrEmpty(OVRPlatformToolSettings.Rift2DLaunchParams)) + { + ValidateTextField(LaunchParameterValidator, OVRPlatformToolSettings.Rift2DLaunchParams, "2D Launch Parameters", ref success); + command += " --launch_params_2d \"" + OVRPlatformToolSettings.Rift2DLaunchParams + "\""; + } + } + + // Add Firewall Exception + if (OVRPlatformToolSettings.RiftFirewallException) + { + command += " --firewall_exceptions true"; + } + + // Add Redistributable Packages + List redistCommandIds = new List(); + for (int i = 0; i < OVRPlatformToolSettings.RiftRedistPackages.Count; i++) + { + if (OVRPlatformToolSettings.RiftRedistPackages[i].include) + { + redistCommandIds.Add(OVRPlatformToolSettings.RiftRedistPackages[i].id); + } + } + if (redistCommandIds.Count > 0) + { + command += " --redistributables \"" + string.Join(",", redistCommandIds.ToArray()) + "\""; + } + + // Add Gamepad Emulation + if (OVRPlatformToolSettings.RiftGamepadEmulation > OVRPlatformToolSettings.GamepadType.OFF && + OVRPlatformToolSettings.RiftGamepadEmulation <= OVRPlatformToolSettings.GamepadType.LEFT_D_PAD) + { + command += " --gamepad-emulation "; + switch (OVRPlatformToolSettings.RiftGamepadEmulation) + { + case OVRPlatformToolSettings.GamepadType.TWINSTICK: command += "TWINSTICK"; break; + case OVRPlatformToolSettings.GamepadType.RIGHT_D_PAD: command += "RIGHT_D_PAD"; break; + case OVRPlatformToolSettings.GamepadType.LEFT_D_PAD: command += "LEFT_D_PAD"; break; + default: command += "OFF"; break; + } + } + + // Add Rift Language Pack Directory + if (!string.IsNullOrEmpty(OVRPlatformToolSettings.LanguagePackDirectory)) + { + ValidateTextField(DirectoryValidator, OVRPlatformToolSettings.LanguagePackDirectory, "Language Pack Directory", ref success); + command += " --language_packs_dir \"" + OVRPlatformToolSettings.LanguagePackDirectory + "\""; + } + } + else + { + // Add APK Build Path + ValidateTextField(FileValidator, OVRPlatformToolSettings.ApkBuildPath, "APK Build Path", ref success); + command += " --apk \"" + OVRPlatformToolSettings.ApkBuildPath + "\""; + + // Add OBB File Path + if (!string.IsNullOrEmpty(OVRPlatformToolSettings.ObbFilePath)) + { + ValidateTextField(FileValidator, OVRPlatformToolSettings.ObbFilePath, "OBB File Path", ref success); + command += " --obb \"" + OVRPlatformToolSettings.ObbFilePath + "\""; + } + + if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.OculusGoGearVR) + { + // Go and Gear VR specific commands + } + else if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.Quest) + { + // Quest specific commands + } + } + + // Add Assets Directory + if (!string.IsNullOrEmpty(OVRPlatformToolSettings.AssetsDirectory)) + { + ValidateTextField(DirectoryValidator, OVRPlatformToolSettings.AssetsDirectory, "Assets Directory", ref success); + command += " --assets-dir \"" + OVRPlatformToolSettings.AssetsDirectory + "\""; + + // Add Asset Configurations + if (OVRPlatformToolSettings.AssetConfigs.Count > 0) + { + List assetConfigs = new List(); + for (int i = 0; i < OVRPlatformToolSettings.AssetConfigs.Count; i++) + { + List configParameters = new List(); + AssetConfig config = OVRPlatformToolSettings.AssetConfigs[i]; + + if (config.required) + { + configParameters.Add("\\\"required\\\":true"); + } + if (config.type > AssetConfig.AssetType.DEFAULT) + { + string typeCommand = "\\\"type\\\":"; + switch (config.type) + { + case AssetConfig.AssetType.LANGUAGE_PACK: + configParameters.Add(typeCommand + "\\\"LANGUAGE_PACK\\\""); + break; + case AssetConfig.AssetType.STORE: + configParameters.Add(typeCommand + "\\\"STORE\\\""); + break; + default: + configParameters.Add(typeCommand + "\\\"DEFAULT\\\""); + break; + } + } + if (!string.IsNullOrEmpty(config.sku)) + { + configParameters.Add("\\\"sku\\\":\\\"" + config.sku + "\\\""); + } + + if (configParameters.Count > 0) + { + string configString = "\\\"" + config.name + "\\\":{" + string.Join(",", configParameters.ToArray()) + "}"; + assetConfigs.Add(configString); + } + } + + if (assetConfigs.Count > 0) + { + command += " --asset_files_config {" + string.Join(",", assetConfigs.ToArray()) + "}"; + } + } + } + + // Add Release Channel + ValidateTextField(GenericFieldValidator, OVRPlatformToolSettings.ReleaseChannel, "Release Channel", ref success); + command += " --channel \"" + OVRPlatformToolSettings.ReleaseChannel + "\""; + + // Add Notes + if (!string.IsNullOrEmpty(OVRPlatformToolSettings.ReleaseNote)) + { + string sanatizedReleaseNote = OVRPlatformToolSettings.ReleaseNote; + sanatizedReleaseNote = sanatizedReleaseNote.Replace("\"", "\"\""); + command += " --notes \"" + sanatizedReleaseNote + "\""; + } + + return success; + } + + // Private delegate for text field validation functions + private delegate TSuccess FieldValidatorDelegate(TText text, ref TError error); + + // Validate the text using a given field validator function. An error message will be printed if validation fails. Success will ONLY be modified to false if validation fails. + static void ValidateTextField(FieldValidatorDelegate fieldValidator, string fieldText, string fieldName, ref bool success) + { + string error = ""; + if (!fieldValidator(fieldText, ref error)) + { + OVRPlatformTool.log += "ERROR: Please verify that the " + fieldName + " is correct. "; + OVRPlatformTool.log += string.IsNullOrEmpty(error) ? "\n" : error + "\n"; + success = false; + } + } + + // Checks if the text is null or empty + static bool GenericFieldValidator(string fieldText, ref string error) + { + if (string.IsNullOrEmpty(fieldText)) + { + error = "The field is empty."; + return false; + } + return true; + } + + // Checks if the App ID contains only numbers + static bool AppIDFieldValidator(string fieldText, ref string error) + { + if (string.IsNullOrEmpty(fieldText)) + { + error = "The field is empty."; + return false; + } + else if (!Regex.IsMatch(OVRPlatformToolSettings.AppID, "^[0-9]+$")) + { + error = "The field contains invalid characters."; + return false; + } + return true; + } + + // Check that the directory exists + static bool DirectoryValidator(string path, ref string error) + { + if (!Directory.Exists(path)) + { + error = "The directory does not exist."; + return false; + } + return true; + } + + // Check that the file exists + static bool FileValidator(string path, ref string error) + { + if (!File.Exists(path)) + { + error = "The file does not exist."; + return false; + } + return true; + } + + // Check if the launch parameter string contains illegal characters + static bool LaunchParameterValidator(string fieldText, ref string error) + { + if (fieldText.Contains("\"")) + { + error = "The field contains illegal characters."; + return false; + } + return true; + } + + void OnInspectorUpdate() + { + Repaint(); + } + + private static bool ThrowPlatformUtilStartupError(string utilPath) + { + if (retryCount < MAX_DOWNLOAD_RETRY_COUNT) + { + retryCount++; + OVRPlatformTool.log += "There was a problem starting Oculus Platform Util. Restarting provision process...\n"; + File.Delete(utilPath); + return true; + } + else + { + OVRPlatformTool.log += "OVR Platform Tool had a problem with downloading a valid executable after several trys. Please reopen the tool to try again.\n"; + return false; + } + } + + private string MakeTextBox(GUIContent label, string variable) + { + string result = string.Empty; + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(label, GUILayout.ExpandWidth(false)); + result = EditorGUILayout.TextField(variable); + EditorGUILayout.EndHorizontal(); + + return result; + } + + private string MakePasswordBox(GUIContent label, string variable) + { + string result = string.Empty; + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(label, GUILayout.ExpandWidth(false)); + result = EditorGUILayout.PasswordField(variable); + EditorGUILayout.EndHorizontal(); + + return result; + } + + private bool MakeToggleBox(GUIContent label, bool variable) + { + bool result = false; + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(label, GUILayout.ExpandWidth(false)); + result = EditorGUILayout.Toggle(variable); + EditorGUILayout.EndHorizontal(); + + return result; + } + + private int MakePopup(GUIContent label, int variable, string[] options) + { + int result = 0; + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(label, GUILayout.ExpandWidth(false)); + result = EditorGUILayout.Popup(variable, options); + EditorGUILayout.EndHorizontal(); + + return result; + } + + private string MakeFileDirectoryField(GUIContent label, string variable, string title, bool isFile = false, string extension = "") + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(label, GUILayout.ExpandWidth(false)); + + Rect rect = GUILayoutUtility.GetRect(0, SINGLE_LINE_SPACING, GUILayout.ExpandWidth(true)); + EditorGUI.SelectableLabel(rect, variable); + + // Create X button if there is a valid path in the field + string result = variable; + if (!string.IsNullOrEmpty(variable)) + { + Color defaultColor = GUI.backgroundColor; + GUI.backgroundColor = new Color(.9f, 0.5f, 0.5f); + rect = GUILayoutUtility.GetRect(SINGLE_LINE_SPACING, SINGLE_LINE_SPACING, GUILayout.ExpandWidth(false)); + if (GUI.Button(rect, "X")) + { + result = string.Empty; + } + GUI.backgroundColor = defaultColor; + } + + // Create the Choose button to initiate the file explorer + rect = GUILayoutUtility.GetRect(75f, SINGLE_LINE_SPACING, GUILayout.ExpandWidth(false)); + if (GUI.Button(rect, "Choose ...")) + { + string newPath = string.Empty; + string path = string.IsNullOrEmpty(variable) ? Application.dataPath : variable; + if (isFile) + { + newPath = EditorUtility.OpenFilePanel(title, path, extension); + } + else + { + newPath = EditorUtility.OpenFolderPanel(title, path, string.Empty); + } + if (newPath.Length > 0) + { + result = newPath; + } + } + GUILayout.Space(5f); + EditorGUILayout.EndHorizontal(); + + // If the path has changed, deselect the selectable field so that it can update. + if (result != variable) + { + GUIUtility.hotControl = 0; + GUIUtility.keyboardControl = 0; + } + + return result; + } + + private static void SetDirtyOnGUIChange() + { + if (GUI.changed) + { + EditorUtility.SetDirty(OVRPlatformToolSettings.Instance); + GUI.changed = false; + } + } + + private static IEnumerator ProvisionPlatformUtil(string dataPath) + { + UnityEngine.Debug.Log("Started Provisioning Oculus Platform Util"); +#if UNITY_2018_3_OR_NEWER + var webRequest = new UnityWebRequest(urlPlatformUtil, UnityWebRequest.kHttpVerbGET); + string path = dataPath; + webRequest.downloadHandler = new DownloadHandlerFile(path); + // WWW request timeout in seconds + webRequest.timeout = 60; + UnityWebRequestAsyncOperation webOp = webRequest.SendWebRequest(); + while (!webOp.isDone) { } + if (webRequest.isNetworkError || webRequest.isHttpError) + { + var networkErrorMsg = "Failed to provision Oculus Platform Util\n"; + UnityEngine.Debug.LogError(networkErrorMsg); + OVRPlatformTool.log += networkErrorMsg; + } + else + { + OVRPlatformTool.log += "Completed Provisioning Oculus Platform Util\n"; + } + SetDirtyOnGUIChange(); + yield return webOp; +#else + using (WWW www = new WWW(urlPlatformUtil)) + { + float timer = 0; + float timeOut = 60; + yield return www; + while (!www.isDone && timer < timeOut) + { + timer += Time.deltaTime; + if (www.error != null) + { + UnityEngine.Debug.Log("Download error: " + www.error); + break; + } + OVRPlatformTool.log = string.Format("Downloading.. {0:P1}", www.progress); + SetDirtyOnGUIChange(); + yield return new WaitForSeconds(1f); + } + if (www.isDone) + { + System.IO.File.WriteAllBytes(dataPath, www.bytes); + OVRPlatformTool.log = "Completed Provisioning Oculus Platform Util\n"; + SetDirtyOnGUIChange(); + } + } +#endif + } + + private static void DrawAssetConfigList(Rect rect) + { + DrawAssetConfigHeader(rect); + DrawAssetConfigBackground(rect); + DrawAssetConfigElement(rect); + } + + private static void DrawAssetConfigElement(Rect rect) + { + Rect elementRect = new Rect(rect.x, rect.y + SINGLE_LINE_SPACING + ASSET_CONFIG_BACKGROUND_PADDING / 2, + rect.width, SINGLE_LINE_SPACING); + if (OVRPlatformToolSettings.AssetConfigs.Count > 0) + { + for (int i = 0; i < OVRPlatformToolSettings.AssetConfigs.Count; i++) + { + AssetConfig config = OVRPlatformToolSettings.AssetConfigs[i]; + GUIContent fieldLabel; + + config.SetFoldoutState(EditorGUI.Foldout(elementRect, config.GetFoldoutState(), config.name, boldFoldoutStyle)); + if (config.GetFoldoutState()) + { + Rect attributeRect = new Rect(elementRect.x + INDENT_SPACING, elementRect.y + SINGLE_LINE_SPACING, + elementRect.width - INDENT_SPACING - 3f, SINGLE_LINE_SPACING); + // Extra asset config params are disabled for now until CLI supports them +#if !DISABLE_EXTRA_ASSET_CONFIG + fieldLabel = new GUIContent("Required Asset [?]", "Whether or not this asset file is required for the app to run."); + config.required = EditorGUI.Toggle(attributeRect, fieldLabel, config.required); + + attributeRect.y += SINGLE_LINE_SPACING; + fieldLabel = new GUIContent("Asset Type [?]", "The asset file type."); + config.type = (AssetConfig.AssetType)EditorGUI.EnumPopup(attributeRect, fieldLabel, config.type); + + attributeRect.y += SINGLE_LINE_SPACING; +#endif + fieldLabel = new GUIContent("Asset SKU [?]", "The Oculus store SKU for this asset file."); + config.sku = EditorGUI.TextField(attributeRect, fieldLabel, config.sku); + + elementRect.y = attributeRect.y; + } + elementRect.y += SINGLE_LINE_SPACING; + } + } + else + { + EditorGUI.LabelField(elementRect, "No asset files found. Choose a valid assets directory."); + } + } + + private static float GetAssetConfigElementHeight() + { + float totalHeight = 0f; + if (OVRPlatformToolSettings.AssetConfigs.Count > 0) + { + for (int i = 0; i < OVRPlatformToolSettings.AssetConfigs.Count; i++) + { + AssetConfig config = OVRPlatformToolSettings.AssetConfigs[i]; +#if !DISABLE_EXTRA_ASSET_CONFIG + totalHeight += config.GetFoldoutState() ? SINGLE_LINE_SPACING * 4 : SINGLE_LINE_SPACING; +#else + totalHeight += config.GetFoldoutState() ? SINGLE_LINE_SPACING * 2 : SINGLE_LINE_SPACING; +#endif + } + } + else + { + totalHeight += SINGLE_LINE_SPACING; + } + return totalHeight + ASSET_CONFIG_BACKGROUND_PADDING; + } + + private static void DrawAssetConfigHeader(Rect rect) + { + Rect headerRect = new Rect(rect.x, rect.y, rect.width, SINGLE_LINE_SPACING); + EditorGUI.DrawRect(headerRect, EditorGUIUtility.isProSkin ? new Color(0.37f, 0.37f, 0.37f) : new Color(0.55f, 0.55f, 0.55f)); + EditorGUI.LabelField(rect, "Asset File Configuration"); + } + + private static void DrawAssetConfigBackground(Rect rect) + { + Rect backgroundRect = new Rect(rect.x, rect.y + SINGLE_LINE_SPACING, rect.width, GetAssetConfigElementHeight()); + EditorGUI.DrawRect(backgroundRect, EditorGUIUtility.isProSkin ? new Color(0.3f, 0.3f, 0.3f) : new Color(0.63f, 0.63f, 0.63f)); + } + + class GUIHelper + { + public delegate void Worker(); + + static void InOut(Worker begin, Worker body, Worker end) + { + try + { + begin(); + body(); + } + finally + { + end(); + } + } + + public static void HInset(int pixels, Worker worker) + { + InOut( + () => { + GUILayout.BeginHorizontal(); + GUILayout.Space(pixels); + GUILayout.BeginVertical(); + }, + worker, + () => { + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); + } + ); + } + + public delegate T ControlWorker(); + public static T MakeControlWithLabel(GUIContent label, ControlWorker worker) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(label); + + var result = worker(); + + EditorGUILayout.EndHorizontal(); + return result; + } + } + + public class EditorCoroutine + { + public static EditorCoroutine Start(IEnumerator routine) + { + EditorCoroutine coroutine = new EditorCoroutine(routine); + coroutine.Start(); + return coroutine; + } + + readonly IEnumerator routine; + bool completed; + EditorCoroutine(IEnumerator _routine) + { + routine = _routine; + completed = false; + } + + void Start() + { + EditorApplication.update += Update; + } + public void Stop() + { + EditorApplication.update -= Update; + completed = true; + } + + public bool GetCompleted() + { + return completed; + } + + void Update() + { + if (!routine.MoveNext()) + { + Stop(); + } + } + } + } +} diff --git a/Assets/Oculus/VR/Editor/OVRPlatformTool.cs.meta b/Assets/Oculus/VR/Editor/OVRPlatformTool.cs.meta new file mode 100644 index 0000000..d43ff7e --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRPlatformTool.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: f6d58d9d4ff0e8f4ca5f73c5ec106551 +timeCreated: 1536960564 +licenseType: Store +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRPlatformToolSettings.cs b/Assets/Oculus/VR/Editor/OVRPlatformToolSettings.cs new file mode 100644 index 0000000..670d54c --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRPlatformToolSettings.cs @@ -0,0 +1,362 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + + +namespace Assets.Oculus.VR.Editor +{ +#if UNITY_EDITOR + [UnityEditor.InitializeOnLoad] +#endif + public sealed class OVRPlatformToolSettings : ScriptableObject + { + private const string DEFAULT_RELEASE_CHANNEL = "Alpha"; + + public enum GamepadType + { + OFF, + TWINSTICK, + RIGHT_D_PAD, + LEFT_D_PAD, + }; + + public static string AppID + { + get + { + return Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None ? Instance.appIDs[(int)Instance.targetPlatform] : ""; + } + set + { + if (Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None) + { + Instance.appIDs[(int)Instance.targetPlatform] = value; + } + } + } + + public static string ReleaseNote + { + get + { + return Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None ? Instance.releaseNotes[(int)Instance.targetPlatform] : ""; + } + set + { + if (Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None) + { + Instance.releaseNotes[(int)Instance.targetPlatform] = value; + } + } + } + + public static string ReleaseChannel + { + get + { + return Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None ? Instance.releaseChannels[(int)Instance.targetPlatform] : ""; + } + set + { + if (Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None) + { + Instance.releaseChannels[(int)Instance.targetPlatform] = value; + } + } + } + + public static string ApkBuildPath + { + get + { + return Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None ? Instance.apkBuildPaths[(int)Instance.targetPlatform] : ""; + } + set + { + if (Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None) + { + Instance.apkBuildPaths[(int)Instance.targetPlatform] = value; + } + } + } + + public static string ObbFilePath + { + get + { + return Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None ? Instance.obbFilePaths[(int)Instance.targetPlatform] : ""; + } + set + { + if (Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None) + { + Instance.obbFilePaths[(int)Instance.targetPlatform] = value; + } + } + } + + public static string AssetsDirectory + { + get + { + return Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None ? Instance.assetsDirectorys[(int)Instance.targetPlatform] : ""; + } + set + { + if (Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None) + { + Instance.assetsDirectorys[(int)Instance.targetPlatform] = value; + } + } + } + + public static string RiftBuildDirectory + { + get { return Instance.riftBuildDiretory; } + set { Instance.riftBuildDiretory = value; } + } + + public static string RiftBuildVersion + { + get { return Instance.riftBuildVersion; } + set { Instance.riftBuildVersion = value; } + } + + public static string RiftLaunchFile + { + get { return Instance.riftLaunchFile; } + set { Instance.riftLaunchFile = value; } + } + + public static string RiftLaunchParams + { + get { return Instance.riftLaunchParams; } + set { Instance.riftLaunchParams = value; } + } + + public static string Rift2DLaunchFile + { + get { return Instance.rift2DLaunchFile; } + set { Instance.rift2DLaunchFile = value; } + } + + public static string Rift2DLaunchParams + { + get { return Instance.rift2DLaunchParams; } + set { Instance.rift2DLaunchParams = value; } + } + + public static bool RiftFirewallException + { + get { return Instance.riftFirewallException; } + set { Instance.riftFirewallException = value; } + } + + public static GamepadType RiftGamepadEmulation + { + get { return Instance.riftGamepadEmulation; } + set { Instance.riftGamepadEmulation = value; } + } + + public static List RiftRedistPackages + { + get { return Instance.riftRedistPackages; } + set { Instance.riftRedistPackages = value; } + } + + public static string LanguagePackDirectory + { + get { return Instance.languagePackDirectory; } + set { Instance.languagePackDirectory = value; } + } + + public static List AssetConfigs + { + get + { + return Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None ? Instance.assetConfigs[(int)Instance.targetPlatform].configList : new List(); + } + set + { + if (Instance.targetPlatform < OVRPlatformTool.TargetPlatform.None) + { + Instance.assetConfigs[(int)Instance.targetPlatform].configList = value; + } + } + } + + public static OVRPlatformTool.TargetPlatform TargetPlatform + { + get { return Instance.targetPlatform; } + set { Instance.targetPlatform = value; } + } + + public static bool RunOvrLint + { + get { return Instance.runOvrLint; } + set { Instance.runOvrLint = value; } + } + + [SerializeField] + private string[] appIDs = new string[(int)OVRPlatformTool.TargetPlatform.None]; + + [SerializeField] + private string[] releaseNotes = new string[(int)OVRPlatformTool.TargetPlatform.None]; + + [SerializeField] + private string[] releaseChannels = new string[(int)OVRPlatformTool.TargetPlatform.None]; + + [SerializeField] + private string riftBuildDiretory = ""; + + [SerializeField] + private string riftBuildVersion = ""; + + [SerializeField] + private string riftLaunchFile = ""; + + [SerializeField] + private string riftLaunchParams = ""; + + [SerializeField] + private string rift2DLaunchFile = ""; + + [SerializeField] + private string rift2DLaunchParams = ""; + + [SerializeField] + private bool riftFirewallException = false; + + [SerializeField] + private GamepadType riftGamepadEmulation = GamepadType.OFF; + + [SerializeField] + private List riftRedistPackages; + + [SerializeField] + private string languagePackDirectory = ""; + + [SerializeField] + private string[] apkBuildPaths = new string[(int)OVRPlatformTool.TargetPlatform.None]; + + [SerializeField] + private string[] obbFilePaths = new string[(int)OVRPlatformTool.TargetPlatform.None]; + + [SerializeField] + private string[] assetsDirectorys = new string[(int)OVRPlatformTool.TargetPlatform.None]; + + [SerializeField] + private AssetConfigList[] assetConfigs = new AssetConfigList[(int)OVRPlatformTool.TargetPlatform.None]; + + [SerializeField] + private OVRPlatformTool.TargetPlatform targetPlatform = OVRPlatformTool.TargetPlatform.None; + + [SerializeField] + private bool runOvrLint = true; + + private static OVRPlatformToolSettings instance; + public static OVRPlatformToolSettings Instance + { + get + { + if (instance == null) + { + instance = Resources.Load("OVRPlatformToolSettings"); + + if (instance == null) + { + instance = ScriptableObject.CreateInstance(); + + string properPath = System.IO.Path.Combine(UnityEngine.Application.dataPath, "Resources"); + if (!System.IO.Directory.Exists(properPath)) + { + UnityEditor.AssetDatabase.CreateFolder("Assets", "Resources"); + } + + string fullPath = System.IO.Path.Combine( + System.IO.Path.Combine("Assets", "Resources"), + "OVRPlatformToolSettings.asset" + ); + UnityEditor.AssetDatabase.CreateAsset(instance, fullPath); + + // Initialize cross platform default values for the new instance of OVRPlatformToolSettings here + if (instance != null) + { + for (int i = 0; i < (int)OVRPlatformTool.TargetPlatform.None; i++) + { + instance.releaseChannels[i] = DEFAULT_RELEASE_CHANNEL; + instance.assetConfigs[i] = new AssetConfigList(); + } + + instance.riftRedistPackages = new List(); + } + } + } + return instance; + } + set + { + instance = value; + } + } + } + + // Wrapper for asset config list so that it can be serialized properly + [System.Serializable] + public class AssetConfigList + { + public List configList; + + public AssetConfigList() + { + configList = new List(); + } + } + + [System.Serializable] + public class AssetConfig + { + public enum AssetType + { + DEFAULT, + STORE, + LANGUAGE_PACK, + }; + + public string name; + public bool required; + public AssetType type; + public string sku; + + private bool foldout; + + public AssetConfig(string assetName) + { + name = assetName; + } + + public bool GetFoldoutState() + { + return foldout; + } + + public void SetFoldoutState(bool state) + { + foldout = state; + } + } + + [System.Serializable] + public class RedistPackage + { + public bool include = false; + public string name; + public string id; + + public RedistPackage(string pkgName, string pkgId) + { + name = pkgName; + id = pkgId; + } + } +} diff --git a/Assets/Oculus/VR/Editor/OVRPlatformToolSettings.cs.meta b/Assets/Oculus/VR/Editor/OVRPlatformToolSettings.cs.meta new file mode 100644 index 0000000..e44241e --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRPlatformToolSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cd7bb81df5b74b34dadbf531f381a26b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRPluginUpdater.cs b/Assets/Oculus/VR/Editor/OVRPluginUpdater.cs new file mode 100644 index 0000000..c4d2ac6 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRPluginUpdater.cs @@ -0,0 +1,701 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using UnityEngine; +using UnityEditor; +using UnityEditor.Callbacks; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using System.IO; +using System.Diagnostics; + +[InitializeOnLoad] +class OVRPluginUpdater +{ + enum PluginPlatform + { + Android, + AndroidUniversal, + OSXUniversal, + Win, + Win64, + } + class PluginPackage + { + public string RootPath; + public System.Version Version; + public Dictionary Plugins = new Dictionary(); + + public bool IsBundledPluginPackage() + { + return (RootPath == GetBundledPluginRootPath()); + } + + public bool IsEnabled() + { + // TODO: Check each individual platform rather than using the Win64 DLL status for the overall package status. + string path = ""; + if (Plugins.TryGetValue(PluginPlatform.Win64, out path)) + { + return File.Exists(path); + } + + return false; + } + + public bool IsAndroidUniversalEnabled() + { + string path = ""; + if (Plugins.TryGetValue(PluginPlatform.AndroidUniversal, out path)) + { + if (File.Exists(path)) + { + string basePath = GetCurrentProjectPath(); + string relPath = path.Substring(basePath.Length + 1); + + PluginImporter pi = PluginImporter.GetAtPath(relPath) as PluginImporter; + if (pi != null) + { + return pi.GetCompatibleWithPlatform(BuildTarget.Android); + } + } + } + + return false; + } + + public bool IsAndroidUniversalPresent() + { + string path = ""; + if (Plugins.TryGetValue(PluginPlatform.AndroidUniversal, out path)) + { + string disabledPath = path + GetDisabledPluginSuffix(); + + if (File.Exists(path) || File.Exists(disabledPath)) + { + return true; + } + } + + return false; + } + } + + private static bool restartPending = false; + private static bool unityRunningInBatchmode = false; + private static bool unityVersionSupportsAndroidUniversal = false; + private static bool enableAndroidUniversalSupport = true; + + private static System.Version invalidVersion = new System.Version("0.0.0"); + + static OVRPluginUpdater() + { + EditorApplication.delayCall += OnDelayCall; + } + + static void OnDelayCall() + { + if (System.Environment.CommandLine.Contains("-batchmode")) + { + unityRunningInBatchmode = true; + } + + if (enableAndroidUniversalSupport) + { +#if UNITY_2018_3_OR_NEWER + unityVersionSupportsAndroidUniversal = true; +#endif + } + + if (ShouldAttemptPluginUpdate()) + { + AttemptPluginUpdate(true); + } + } + + private static PluginPackage GetPluginPackage(string rootPath) + { + return new PluginPackage() + { + RootPath = rootPath, + Version = GetPluginVersion(rootPath), + Plugins = new Dictionary() + { + { PluginPlatform.Android, rootPath + GetPluginBuildTargetSubPath(PluginPlatform.Android) }, + { PluginPlatform.AndroidUniversal, rootPath + GetPluginBuildTargetSubPath(PluginPlatform.AndroidUniversal) }, + { PluginPlatform.OSXUniversal, rootPath + GetPluginBuildTargetSubPath(PluginPlatform.OSXUniversal) }, + { PluginPlatform.Win, rootPath + GetPluginBuildTargetSubPath(PluginPlatform.Win) }, + { PluginPlatform.Win64, rootPath + GetPluginBuildTargetSubPath(PluginPlatform.Win64) }, + } + }; + } + + private static PluginPackage GetBundledPluginPackage() + { + return GetPluginPackage(GetBundledPluginRootPath()); + } + + private static List GetAllUtilitiesPluginPackages() + { + string pluginRootPath = GetUtilitiesPluginRootPath(); + List packages = new List(); + + if (Directory.Exists(pluginRootPath)) + { + var dirs = Directory.GetDirectories(pluginRootPath); + + foreach(string dir in dirs) + { + packages.Add(GetPluginPackage(dir)); + } + } + + return packages; + } + + private static string GetCurrentProjectPath() + { + return Directory.GetParent(Application.dataPath).FullName; + } + + private static string GetUtilitiesPluginRootPath() + { + return GetUtilitiesRootPath() + @"/Plugins"; + } + + private static string GetUtilitiesRootPath() + { + var so = ScriptableObject.CreateInstance(typeof(OVRPluginUpdaterStub)); + var script = MonoScript.FromScriptableObject(so); + string assetPath = AssetDatabase.GetAssetPath(script); + string editorDir = Directory.GetParent(assetPath).FullName; + string ovrDir = Directory.GetParent(editorDir).FullName; + + return ovrDir; + } + + private static string GetBundledPluginRootPath() + { + string basePath = EditorApplication.applicationContentsPath; + string pluginPath = @"/UnityExtensions/Unity/VR"; + + return basePath + pluginPath; + } + + private static string GetPluginBuildTargetSubPath(PluginPlatform target) + { + string path = string.Empty; + + switch (target) + { + case PluginPlatform.Android: + path = @"/Android/OVRPlugin.aar"; + break; + case PluginPlatform.AndroidUniversal: + path = @"/AndroidUniversal/OVRPlugin.aar"; + break; + case PluginPlatform.OSXUniversal: + path = @"/OSXUniversal/OVRPlugin.bundle"; + break; + case PluginPlatform.Win: + path = @"/Win/OVRPlugin.dll"; + break; + case PluginPlatform.Win64: + path = @"/Win64/OVRPlugin.dll"; + break; + default: + throw new ArgumentException("Attempted GetPluginBuildTargetSubPath() for unsupported BuildTarget: " + target); + } + + return path; + } + + private static string GetDisabledPluginSuffix() + { + return @".disabled"; + } + + private static System.Version GetPluginVersion(string path) + { + System.Version pluginVersion = invalidVersion; + + try + { + pluginVersion = new System.Version(Path.GetFileName(path)); + } + catch + { + pluginVersion = invalidVersion; + } + + if (pluginVersion == invalidVersion) + { + //Unable to determine version from path, fallback to Win64 DLL meta data + path += GetPluginBuildTargetSubPath(PluginPlatform.Win64); + if (!File.Exists(path)) + { + path += GetDisabledPluginSuffix(); + if (!File.Exists(path)) + { + return invalidVersion; + } + } + + FileVersionInfo pluginVersionInfo = FileVersionInfo.GetVersionInfo(path); + if (pluginVersionInfo == null || pluginVersionInfo.ProductVersion == null || pluginVersionInfo.ProductVersion == "") + { + return invalidVersion; + } + + pluginVersion = new System.Version(pluginVersionInfo.ProductVersion); + } + + return pluginVersion; + } + + public static string GetVersionDescription(System.Version version) + { + bool isVersionValid = (version != invalidVersion); + return isVersionValid ? version.ToString() : "(Unknown)"; + } + + private static bool ShouldAttemptPluginUpdate() + { + if (unityRunningInBatchmode) + { + return false; + } + else + { + return !UnitySupportsEnabledAndroidPlugin() || (autoUpdateEnabled && !restartPending && !Application.isPlaying); + } + } + + private static void DisableAllUtilitiesPluginPackages() + { + List allUtilsPluginPkgs = GetAllUtilitiesPluginPackages(); + + foreach(PluginPackage pluginPkg in allUtilsPluginPkgs) + { + foreach(string path in pluginPkg.Plugins.Values) + { + if ((Directory.Exists(path)) || (File.Exists(path))) + { + string basePath = GetCurrentProjectPath(); + string relPath = path.Substring(basePath.Length + 1); + string relDisabledPath = relPath + GetDisabledPluginSuffix(); + + AssetDatabase.MoveAsset(relPath, relDisabledPath); + AssetDatabase.ImportAsset(relDisabledPath, ImportAssetOptions.ForceUpdate); + } + } + } + + AssetDatabase.Refresh(); + AssetDatabase.SaveAssets(); + } + + private static void EnablePluginPackage(PluginPackage pluginPkg) + { + foreach(var kvp in pluginPkg.Plugins) + { + PluginPlatform platform = kvp.Key; + string path = kvp.Value; + + if ((Directory.Exists(path + GetDisabledPluginSuffix())) || (File.Exists(path + GetDisabledPluginSuffix()))) + { + string basePath = GetCurrentProjectPath(); + string relPath = path.Substring(basePath.Length + 1); + string relDisabledPath = relPath + GetDisabledPluginSuffix(); + + AssetDatabase.MoveAsset(relDisabledPath, relPath); + AssetDatabase.ImportAsset(relPath, ImportAssetOptions.ForceUpdate); + + PluginImporter pi = PluginImporter.GetAtPath(relPath) as PluginImporter; + if (pi == null) + { + continue; + } + + // Disable support for all platforms, then conditionally enable desired support below + pi.SetCompatibleWithEditor(false); + pi.SetCompatibleWithAnyPlatform(false); + pi.SetCompatibleWithPlatform(BuildTarget.Android, false); + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows, false); + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows64, false); +#if UNITY_2017_3_OR_NEWER + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSX, false); +#else + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXUniversal, false); + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel, false); + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel64, false); +#endif + + switch (platform) + { + case PluginPlatform.Android: + pi.SetCompatibleWithPlatform(BuildTarget.Android, !unityVersionSupportsAndroidUniversal); + if (!unityVersionSupportsAndroidUniversal) + { + pi.SetPlatformData(BuildTarget.Android, "CPU", "ARMv7"); + } + break; + case PluginPlatform.AndroidUniversal: + pi.SetCompatibleWithPlatform(BuildTarget.Android, unityVersionSupportsAndroidUniversal); + break; + case PluginPlatform.OSXUniversal: +#if UNITY_2017_3_OR_NEWER + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSX, true); +#else + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXUniversal, true); + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel, true); + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel64, true); +#endif + pi.SetCompatibleWithEditor(true); + pi.SetEditorData("CPU", "AnyCPU"); + pi.SetEditorData("OS", "OSX"); + pi.SetPlatformData("Editor", "CPU", "AnyCPU"); + pi.SetPlatformData("Editor", "OS", "OSX"); + break; + case PluginPlatform.Win: + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows, true); + pi.SetCompatibleWithEditor(true); + pi.SetEditorData("CPU", "X86"); + pi.SetEditorData("OS", "Windows"); + pi.SetPlatformData("Editor", "CPU", "X86"); + pi.SetPlatformData("Editor", "OS", "Windows"); + break; + case PluginPlatform.Win64: + pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows64, true); + pi.SetCompatibleWithEditor(true); + pi.SetEditorData("CPU", "X86_64"); + pi.SetEditorData("OS", "Windows"); + pi.SetPlatformData("Editor", "CPU", "X86_64"); + pi.SetPlatformData("Editor", "OS", "Windows"); + break; + default: + throw new ArgumentException("Attempted EnablePluginPackage() for unsupported BuildTarget: " + platform); + } + + AssetDatabase.ImportAsset(relPath, ImportAssetOptions.ForceUpdate); + } + } + + AssetDatabase.Refresh(); + AssetDatabase.SaveAssets(); + } + + private static readonly string autoUpdateEnabledKey = "Oculus_Utilities_OVRPluginUpdater_AutoUpdate_" + OVRManager.utilitiesVersion; + private static bool autoUpdateEnabled + { + get { + return PlayerPrefs.GetInt(autoUpdateEnabledKey, 1) == 1; + } + + set { + PlayerPrefs.SetInt(autoUpdateEnabledKey, value ? 1 : 0); + } + } + + [MenuItem("Oculus/Tools/Disable OVR Utilities Plugin")] + private static void AttemptPluginDisable() + { + PluginPackage bundledPluginPkg = GetBundledPluginPackage(); + List allUtilsPluginPkgs = GetAllUtilitiesPluginPackages(); + + PluginPackage enabledUtilsPluginPkg = null; + + foreach(PluginPackage pluginPkg in allUtilsPluginPkgs) + { + if (pluginPkg.IsEnabled()) + { + if ((enabledUtilsPluginPkg == null) || (pluginPkg.Version > enabledUtilsPluginPkg.Version)) + { + enabledUtilsPluginPkg = pluginPkg; + } + } + } + + if (enabledUtilsPluginPkg == null) + { + if (unityRunningInBatchmode +#if UNITY_2018_3_OR_NEWER + || EditorUtility.DisplayDialog("Disable Oculus Utilities Plugin", + "The OVRPlugin included with Oculus Utilities is already disabled." + + " The OVRPlugin installed through the Package Manager will continue to be used.\n", + "Ok", + "")) +#else + || EditorUtility.DisplayDialog("Disable Oculus Utilities Plugin", + "The OVRPlugin included with Oculus Utilities is already disabled." + + " The OVRPlugin bundled with the Unity Editor will continue to be used.\n\n" + + "Bundled version: " + + GetVersionDescription(bundledPluginPkg.Version), + "Ok", + "")) +#endif + { + return; + } + } + else + { + if (unityRunningInBatchmode +#if UNITY_2018_3_OR_NEWER + || EditorUtility.DisplayDialog("Disable Oculus Utilities Plugin", + "Do you want to disable the OVRPlugin included with Oculus Utilities and revert to the OVRPlugin installed through the Package Manager?\n\n" + + "Current version: " + GetVersionDescription(enabledUtilsPluginPkg.Version), + "Yes", + "No")) +#else + || EditorUtility.DisplayDialog("Disable Oculus Utilities Plugin", + "Do you want to disable the OVRPlugin included with Oculus Utilities and revert to the OVRPlugin bundled with the Unity Editor?\n\n" + + "Current version: " + GetVersionDescription(enabledUtilsPluginPkg.Version) + + "\nBundled version: " + GetVersionDescription(bundledPluginPkg.Version), + "Yes", + "No")) +#endif + { + DisableAllUtilitiesPluginPackages(); + + if (unityRunningInBatchmode +#if UNITY_2018_3_OR_NEWER + || EditorUtility.DisplayDialog("Restart Unity", + "Now you will be using the OVRPlugin installed through Package Manager." + + "\n\nPlease restart the Unity Editor to complete the update process.", + "Restart", + "Not Now")) +#else + || EditorUtility.DisplayDialog("Restart Unity", + "OVRPlugin has been updated to " + + GetVersionDescription(bundledPluginPkg.Version) + + ".\n\nPlease restart the Unity Editor to complete the update process." +#if !UNITY_2017_1_OR_NEWER + + " You may need to manually relaunch Unity if you are using Unity 5.6 and higher." +#endif + , + "Restart", + "Not Now")) +#endif + { + RestartUnityEditor(); + } + } + } + } + + [MenuItem("Oculus/Tools/Update OVR Utilities Plugin")] + private static void RunPluginUpdate() + { + autoUpdateEnabled = true; + AttemptPluginUpdate(false); + } + + // Separate entry point needed since "-executeMethod" does not support parameters or default parameter values + private static void BatchmodePluginUpdate() + { + OnDelayCall(); // manually invoke when running editor in batchmode + AttemptPluginUpdate(false); + } + + private static void AttemptPluginUpdate(bool triggeredByAutoUpdate) + { + OVRPlugin.SendEvent("attempt_plugin_update_auto", triggeredByAutoUpdate.ToString()); + + PluginPackage bundledPluginPkg = GetBundledPluginPackage(); + List allUtilsPluginPkgs = GetAllUtilitiesPluginPackages(); + + PluginPackage enabledUtilsPluginPkg = null; + PluginPackage newestUtilsPluginPkg = null; + + foreach(PluginPackage pluginPkg in allUtilsPluginPkgs) + { + if ((newestUtilsPluginPkg == null) || (pluginPkg.Version > newestUtilsPluginPkg.Version)) + { + newestUtilsPluginPkg = pluginPkg; + } + + if (pluginPkg.IsEnabled()) + { + if ((enabledUtilsPluginPkg == null) || (pluginPkg.Version > enabledUtilsPluginPkg.Version)) + { + enabledUtilsPluginPkg = pluginPkg; + } + } + } + + bool reenableCurrentPluginPkg = false; + PluginPackage targetPluginPkg = null; + + if ((newestUtilsPluginPkg != null) && (newestUtilsPluginPkg.Version > bundledPluginPkg.Version)) + { + if ((enabledUtilsPluginPkg == null) || (enabledUtilsPluginPkg.Version != newestUtilsPluginPkg.Version)) + { + targetPluginPkg = newestUtilsPluginPkg; + } + } + else if ((enabledUtilsPluginPkg != null) && (enabledUtilsPluginPkg.Version < bundledPluginPkg.Version)) + { + targetPluginPkg = bundledPluginPkg; + } + + PluginPackage currentPluginPkg = (enabledUtilsPluginPkg != null) ? enabledUtilsPluginPkg : bundledPluginPkg; + + if ((targetPluginPkg == null) && !UnitySupportsEnabledAndroidPlugin()) + { + // Force reenabling the current package to configure the correct android plugin for this unity version. + reenableCurrentPluginPkg = true; + targetPluginPkg = currentPluginPkg; + } + + if (targetPluginPkg == null) + { + if (!triggeredByAutoUpdate && !unityRunningInBatchmode) + { +#if UNITY_2018_3_OR_NEWER + EditorUtility.DisplayDialog("Update Oculus Utilities Plugin", + "OVRPlugin is already up to date.\n\nCurrent version: " + + GetVersionDescription(currentPluginPkg.Version), + "Ok", + ""); +#else + EditorUtility.DisplayDialog("Update Oculus Utilities Plugin", + "OVRPlugin is already up to date.\n\nCurrent version: " + + GetVersionDescription(currentPluginPkg.Version) + "\nBundled version: " + + GetVersionDescription(bundledPluginPkg.Version), + "Ok", + ""); +#endif + } + + return; // No update necessary. + } + + System.Version targetVersion = targetPluginPkg.Version; + + bool userAcceptsUpdate = false; + + if (unityRunningInBatchmode) + { + userAcceptsUpdate = true; + } + else + { + string dialogBody = "Oculus Utilities has detected that a newer OVRPlugin is available." + + " Using the newest version is recommended. Do you want to enable it?\n\n" + + "Current version: " + + GetVersionDescription(currentPluginPkg.Version) + + "\nAvailable version: " + + targetVersion; + + if (reenableCurrentPluginPkg) + { + dialogBody = "Oculus Utilities has detected a configuration change that requires re-enabling the current OVRPlugin." + + " Do you want to proceed?\n\nCurrent version: " + + GetVersionDescription(currentPluginPkg.Version); + } + + int dialogResult = EditorUtility.DisplayDialogComplex("Update Oculus Utilities Plugin", dialogBody, "Yes", "No, Don't Ask Again", "No"); + + switch (dialogResult) + { + case 0: // "Yes" + userAcceptsUpdate = true; + break; + case 1: // "No, Don't Ask Again" + autoUpdateEnabled = false; + + EditorUtility.DisplayDialog("Oculus Utilities OVRPlugin", + "To manually update in the future, use the following menu option:\n\n" + + "[Oculus -> Tools -> Update OVR Utilities Plugin]", + "Ok", + ""); + return; + case 2: // "No" + return; + } + } + + if (userAcceptsUpdate) + { + DisableAllUtilitiesPluginPackages(); + + if (!targetPluginPkg.IsBundledPluginPackage()) + { + EnablePluginPackage(targetPluginPkg); + } + + if (unityRunningInBatchmode + || EditorUtility.DisplayDialog("Restart Unity", + "OVRPlugin has been updated to " + + GetVersionDescription(targetPluginPkg.Version) + + ".\n\nPlease restart the Unity Editor to complete the update process." +#if !UNITY_2017_1_OR_NEWER + + " You may need to manually relaunch Unity if you are using Unity 5.6 and higher." +#endif + , + "Restart", + "Not Now")) + { + RestartUnityEditor(); + } + } + } + + private static bool UnitySupportsEnabledAndroidPlugin() + { + List allUtilsPluginPkgs = GetAllUtilitiesPluginPackages(); + + foreach(PluginPackage pluginPkg in allUtilsPluginPkgs) + { + if (pluginPkg.IsEnabled()) + { + if (pluginPkg.IsAndroidUniversalEnabled() && !unityVersionSupportsAndroidUniversal) + { + // Android Universal should only be enabled on supported Unity versions since it can prevent app launch. + return false; + } + else if (!pluginPkg.IsAndroidUniversalEnabled() && pluginPkg.IsAndroidUniversalPresent() && unityVersionSupportsAndroidUniversal) + { + // Android Universal is present and should be enabled on supported Unity versions since ARM64 config will fail otherwise. + return false; + } + } + } + + return true; + } + + private static void RestartUnityEditor() + { + if (unityRunningInBatchmode) + { + EditorApplication.Exit(0); + } + else + { + restartPending = true; + EditorApplication.OpenProject(GetCurrentProjectPath()); + } + } +} diff --git a/Assets/Oculus/VR/Editor/OVRPluginUpdater.cs.meta b/Assets/Oculus/VR/Editor/OVRPluginUpdater.cs.meta new file mode 100644 index 0000000..7393298 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRPluginUpdater.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9e64a3a065da39f4caa17a7372962df6 +timeCreated: 1493086775 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRPluginUpdaterStub.cs b/Assets/Oculus/VR/Editor/OVRPluginUpdaterStub.cs new file mode 100644 index 0000000..f29d20f --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRPluginUpdaterStub.cs @@ -0,0 +1,29 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using UnityEngine; +using System.Collections; + +public class OVRPluginUpdaterStub : ScriptableObject +{ + // Stub helper class to locate OVR Utilities Path through Unity Editor API. + // Required to be a standalone class in a separate file or else MonoScript.FromScriptableObject() returns an empty string path. +} diff --git a/Assets/Oculus/VR/Editor/OVRPluginUpdaterStub.cs.meta b/Assets/Oculus/VR/Editor/OVRPluginUpdaterStub.cs.meta new file mode 100644 index 0000000..6c52cb8 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRPluginUpdaterStub.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 791840c2fc67dd3409b79f212fad7dd4 +timeCreated: 1493148044 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRProjectConfig.cs b/Assets/Oculus/VR/Editor/OVRProjectConfig.cs new file mode 100644 index 0000000..4e0f131 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRProjectConfig.cs @@ -0,0 +1,103 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System.IO; +using System; + +[System.Serializable] +public class OVRProjectConfig : ScriptableObject +{ + public enum DeviceType + { + GearVrOrGo = 0, + Quest = 1 + } + + public enum HandTrackingSupport + { + ControllersOnly = 0, + ControllersAndHands = 1, + HandsOnly = 2 + } + + public List targetDeviceTypes; + public HandTrackingSupport handTrackingSupport; + + public bool disableBackups; + public bool enableNSCConfig; + + //public const string OculusProjectConfigAssetPath = "Assets/Oculus/OculusProjectConfig.asset"; + + private static string GetOculusProjectConfigAssetPath() + { + var so = ScriptableObject.CreateInstance(typeof(OVRPluginUpdaterStub)); + var script = MonoScript.FromScriptableObject(so); + string assetPath = AssetDatabase.GetAssetPath(script); + string editorDir = Directory.GetParent(assetPath).FullName; + string ovrDir = Directory.GetParent(editorDir).FullName; + string oculusDir = Directory.GetParent(ovrDir).FullName; + string configAssetPath = Path.GetFullPath(Path.Combine(oculusDir, "OculusProjectConfig.asset")); + Uri configUri = new Uri(configAssetPath); + Uri projectUri = new Uri(Application.dataPath); + Uri relativeUri = projectUri.MakeRelativeUri(configUri); + + return relativeUri.ToString(); + } + + public static OVRProjectConfig GetProjectConfig() + { + OVRProjectConfig projectConfig = null; + string oculusProjectConfigAssetPath = GetOculusProjectConfigAssetPath(); + try + { + projectConfig = AssetDatabase.LoadAssetAtPath(oculusProjectConfigAssetPath, typeof(OVRProjectConfig)) as OVRProjectConfig; + } + catch (System.Exception e) + { + Debug.LogWarningFormat("Unable to load ProjectConfig from {0}, error {1}", oculusProjectConfigAssetPath, e.Message); + } + if (projectConfig == null) + { + projectConfig = ScriptableObject.CreateInstance(); + projectConfig.targetDeviceTypes = new List(); + projectConfig.targetDeviceTypes.Add(DeviceType.Quest); + projectConfig.handTrackingSupport = HandTrackingSupport.ControllersOnly; + projectConfig.disableBackups = true; + projectConfig.enableNSCConfig = true; + AssetDatabase.CreateAsset(projectConfig, oculusProjectConfigAssetPath); + } + return projectConfig; + } + + public static void CommitProjectConfig(OVRProjectConfig projectConfig) + { + string oculusProjectConfigAssetPath = GetOculusProjectConfigAssetPath(); + if (AssetDatabase.GetAssetPath(projectConfig) != oculusProjectConfigAssetPath) + { + Debug.LogWarningFormat("The asset path of ProjectConfig is wrong. Expect {0}, get {1}", oculusProjectConfigAssetPath, AssetDatabase.GetAssetPath(projectConfig)); + } + EditorUtility.SetDirty(projectConfig); + } +} diff --git a/Assets/Oculus/VR/Editor/OVRProjectConfig.cs.meta b/Assets/Oculus/VR/Editor/OVRProjectConfig.cs.meta new file mode 100644 index 0000000..55035de --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRProjectConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 05d394ae2a81edd4cbc3c51917e766e3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRScreenshotWizard.cs b/Assets/Oculus/VR/Editor/OVRScreenshotWizard.cs new file mode 100644 index 0000000..fe57f83 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRScreenshotWizard.cs @@ -0,0 +1,216 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using UnityEngine; +using UnityEditor; +using System.IO; + +/// +/// From the selected transform, takes a cubemap screenshot that can be submitted with the application +/// as a screenshot (or additionally used for reflection shaders). +/// +class OVRScreenshotWizard : ScriptableWizard +{ + public enum TexFormat + { + JPEG, // 512kb at 1k x 1k resolution vs + PNG, // 5.3mb + } + + public enum SaveMode { + SaveCubemapScreenshot, + SaveUnityCubemap, + SaveBoth, + } + + public GameObject renderFrom = null; + public int size = 2048; + public SaveMode saveMode = SaveMode.SaveUnityCubemap; + public string cubeMapFolder = "Assets/Textures/Cubemaps"; + public TexFormat textureFormat = TexFormat.PNG; + + /// + /// Validates the user's input + /// + void OnWizardUpdate() + { + helpString = "Select a game object positioned in the place where\nyou want to render the cubemap screenshot from: "; + isValid = (renderFrom != null); + } + + /// + /// Create the asset path if it is not available. + /// Assuming the newFolderPath is stated with "Assets", which is a requirement. + /// + static bool CreateAssetPath( string newFolderPath ) + { + const int maxFoldersCount = 32; + string currentPath; + string[] pathFolders; + + pathFolders = newFolderPath.Split (new char[]{ '/' }, maxFoldersCount); + + if (!string.Equals ("Assets", pathFolders [0], System.StringComparison.OrdinalIgnoreCase)) + { + Debug.LogError( "Folder path has to be started with \" Assets \" " ); + return false; + } + + currentPath = "Assets"; + for (int i = 1; i < pathFolders.Length; i++) + { + if (!string.IsNullOrEmpty(pathFolders[i])) + { + string newPath = currentPath + "/" + pathFolders[i]; + if (!AssetDatabase.IsValidFolder(newPath)) + AssetDatabase.CreateFolder(currentPath, pathFolders[i]); + currentPath = newPath; + } + } + + Debug.Log( "Created path: " + currentPath ); + return true; + } + + /// + /// Renders the cubemap + /// + void OnWizardCreate() + { + if ( !AssetDatabase.IsValidFolder( cubeMapFolder ) ) + { + if (!CreateAssetPath(cubeMapFolder)) + { + Debug.LogError( "Created path failed: " + cubeMapFolder ); + return; + } + } + + bool existingCamera = true; + bool existingCameraStateSave = true; + Camera camera = renderFrom.GetComponent(); + if (camera == null) + { + camera = renderFrom.AddComponent(); + camera.farClipPlane = 10000f; + existingCamera = false; + } + else + { + existingCameraStateSave = camera.enabled; + camera.enabled = true; + } + // find the last screenshot saved + if (cubeMapFolder[cubeMapFolder.Length-1] != '/') + { + cubeMapFolder += "/"; + } + int idx = 0; + string[] fileNames = Directory.GetFiles(cubeMapFolder); + foreach(string fileName in fileNames) + { + if (!fileName.ToLower().EndsWith(".cubemap")) + { + continue; + } + string temp = fileName.Replace(cubeMapFolder + "vr_screenshot_", string.Empty); + temp = temp.Replace(".cubemap", string.Empty); + int tempIdx = 0; + if (int.TryParse( temp, out tempIdx )) + { + if (tempIdx > idx) + { + idx = tempIdx; + } + } + } + string pathName = string.Format("{0}vr_screenshot_{1}.cubemap", cubeMapFolder, (++idx).ToString("d2")); + Cubemap cubemap = new Cubemap(size, TextureFormat.RGB24, false); + + // render into cubemap + if ((camera != null) && (cubemap != null)) + { + // set up cubemap defaults + OVRCubemapCapture.RenderIntoCubemap(camera, cubemap); + if (existingCamera) + { + camera.enabled = existingCameraStateSave; + } + else + { + DestroyImmediate(camera); + } + // generate a regular texture as well? + if ( ( saveMode == SaveMode.SaveCubemapScreenshot ) || ( saveMode == SaveMode.SaveBoth ) ) + { + GenerateTexture(cubemap, pathName); + } + + if ( ( saveMode == SaveMode.SaveUnityCubemap ) || ( saveMode == SaveMode.SaveBoth ) ) + { + Debug.Log( "Saving: " + pathName ); + // by default the unity cubemap isn't saved + AssetDatabase.CreateAsset( cubemap, pathName ); + // reimport as necessary + AssetDatabase.SaveAssets(); + // select it in the project tree so developers can find it + EditorGUIUtility.PingObject( cubemap ); + Selection.activeObject = cubemap; + } + AssetDatabase.Refresh(); + } + } + + /// + /// Generates a NPOT 6x1 cubemap in the following format PX NX PY NY PZ NZ + /// + void GenerateTexture(Cubemap cubemap, string pathName) + { + // Encode the texture and save it to disk + pathName = pathName.Replace(".cubemap", (textureFormat == TexFormat.PNG) ? ".png" : ".jpg" ).ToLower(); + pathName = pathName.Replace( cubeMapFolder.ToLower(), "" ); + string format = textureFormat.ToString(); + string fullPath = EditorUtility.SaveFilePanel( string.Format( "Save Cubemap Screenshot as {0}", format ), "", pathName, format.ToLower() ); + if ( !string.IsNullOrEmpty( fullPath ) ) + { + Debug.Log( "Saving: " + fullPath ); + OVRCubemapCapture.SaveCubemapCapture(cubemap, fullPath); + } + } + + /// + /// Unity Editor menu option to take a screenshot + /// + [MenuItem("Oculus/Tools/OVR Screenshot Wizard", false, 100000)] + static void TakeOVRScreenshot() + { + OVRScreenshotWizard wizard = ScriptableWizard.DisplayWizard("OVR Screenshot Wizard", "Render Cubemap"); + if (wizard != null) + { + if (Selection.activeGameObject != null) + wizard.renderFrom = Selection.activeGameObject; + else + wizard.renderFrom = Camera.main.gameObject; + + wizard.isValid = (wizard.renderFrom != null); + } + } +} diff --git a/Assets/Oculus/VR/Editor/OVRScreenshotWizard.cs.meta b/Assets/Oculus/VR/Editor/OVRScreenshotWizard.cs.meta new file mode 100644 index 0000000..5baa0f9 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRScreenshotWizard.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: b8b9ee1d7b188284f90d944cd54eb026 +timeCreated: 1462825988 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: + - renderFrom: {fileID: 168286, guid: a5014611cefbb6b4398b7e4c82203d08, type: 2} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/OVRSystemProfilerPanel.cs b/Assets/Oculus/VR/Editor/OVRSystemProfilerPanel.cs new file mode 100644 index 0000000..81a8607 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRSystemProfilerPanel.cs @@ -0,0 +1,691 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK License Version 3.4.1 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.4.1 + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using System.Collections.Generic; +using System; +using System.Reflection; +using UnityEngine; +using UnityEditor; +using System.Text; + +public class OVRSystemProfilerPanel : EditorWindow { + [MenuItem("Oculus/Tools/Oculus Profiler Panel")] + public static void ShowWindow() + { + EditorWindow.GetWindow(typeof(OVRSystemProfilerPanel), false, "Oculus Profiler"); + OVRPlugin.SendEvent("oculus_profiler_panel", "show_window"); + } + + bool showAndroidOptions = false; + OVRNetwork.OVRNetworkTcpClient tcpClient = new OVRNetwork.OVRNetworkTcpClient(); + int remoteListeningPort = OVRSystemPerfMetrics.TcpListeningPort; + + //OVRSystemPerfMetrics.PerfMetrics lastReceivedMetrics; + + const int maxMetricsFrames = 120; + const float metricsHistoryDuration = 1.0f; + + List receivedMetricsList = new List(); + bool pauseReceiveMetrics = false; + bool repaintRequested = false; + + const float labelWidth = 140.0f; + const float panelInnerRightPad = 6.0f; + const float progressBarPad = 5.0f; + const float progressBarHeight = 18.0f; + + string androidSdkRootPath; + OVRADBTool adbTool; + + // The actual window code goes here + void OnGUI() + { + showAndroidOptions = EditorGUILayout.Foldout(showAndroidOptions, "Android Tools"); + + if (showAndroidOptions) + { + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Android SDK root path: ", androidSdkRootPath); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(); + if (GUILayout.Button("Start Server")) + { + if (adbTool == null) + { + adbTool = new OVRADBTool(androidSdkRootPath); + } + if (adbTool.isReady) + { + int exitCode = adbTool.StartServer(null); + EditorUtility.DisplayDialog("ADB StartServer", (exitCode == 0 ? "Success" : "Failure. ExitCode = " + exitCode.ToString()), "Ok"); + } + else + { + EditorUtility.DisplayDialog("Can't locate ADBTool", adbTool.adbPath, "Ok"); + } + } + if (GUILayout.Button("Kill Server")) + { + if (adbTool == null) + { + adbTool = new OVRADBTool(androidSdkRootPath); + } + if (adbTool.isReady) + { + int exitCode = adbTool.KillServer(null); + EditorUtility.DisplayDialog("ADB KillServer", (exitCode == 0 ? "Success" : "Failure. ExitCode = " + exitCode.ToString()), "Ok"); + } + else + { + EditorUtility.DisplayDialog("Can't locate ADBTool", adbTool.adbPath, "Ok"); + } + } + if (GUILayout.Button("Forward Port")) + { + if (adbTool == null) + { + adbTool = new OVRADBTool(androidSdkRootPath); + } + if (adbTool.isReady) + { + int exitCode = adbTool.ForwardPort(remoteListeningPort, null); + EditorUtility.DisplayDialog("ADB ForwardPort", (exitCode == 0 ? "Success" : "Failure. ExitCode = " + exitCode.ToString()), "Ok"); + OVRPlugin.SendEvent("device_metrics_profiler", (exitCode == 0 ? "adb_forward_success" : "adb_forward_failure")); + } + else + { + EditorUtility.DisplayDialog("Can't locate ADBTool", adbTool.adbPath, "Ok"); + } + } + if (GUILayout.Button("Release Port")) + { + if (adbTool == null) + { + adbTool = new OVRADBTool(androidSdkRootPath); + } + if (adbTool.isReady) + { + int exitCode = adbTool.ReleasePort(remoteListeningPort, null); + EditorUtility.DisplayDialog("ADB ReleasePort", (exitCode == 0 ? "Success" : "Failure. ExitCode = " + exitCode.ToString()), "Ok"); + } + else + { + EditorUtility.DisplayDialog("Can't locate ADBTool", adbTool.adbPath, "Ok"); + } + } + GUILayout.EndHorizontal(); + } + + EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); + + GUILayout.BeginHorizontal(); + remoteListeningPort = EditorGUILayout.DelayedIntField("Remote Port", remoteListeningPort); + + if (tcpClient.connectionState == OVRNetwork.OVRNetworkTcpClient.ConnectionState.Disconnected) + { + if (GUILayout.Button("Connect")) + { + ConnectPerfMetricsTcpServer(); + pauseReceiveMetrics = false; + OVRPlugin.SendEvent("device_metrics_profiler", "connect"); + } + } + else + { + if (tcpClient.connectionState == OVRNetwork.OVRNetworkTcpClient.ConnectionState.Connecting) + { + if (GUILayout.Button("Connecting ... Click again to Cancel")) + { + DisconnectPerfMetricsTcpServer(); + OVRPlugin.SendEvent("device_metrics_profiler", "cancel"); + } + } + else + { + if (GUILayout.Button("Disconnect")) + { + DisconnectPerfMetricsTcpServer(); + OVRPlugin.SendEvent("device_metrics_profiler", "disconnect"); + } + + if (GUILayout.Button(pauseReceiveMetrics ? "Continue" : "Pause")) + { + pauseReceiveMetrics = !pauseReceiveMetrics; + } + } + } + GUILayout.EndHorizontal(); + + EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); + + lock (receivedMetricsList) + { + PresentIntProperty("Frame Count", "frameCount"); + PresentIntProperty("Dropped Frame Count", "compositorDroppedFrameCount"); + + float? avgFrameTime = GetAveragePerfValueFloat("deltaFrameTime"); + if (avgFrameTime.HasValue) + { + float fps = 1.0f / avgFrameTime.Value; + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("FPS", GUILayout.Width(labelWidth)); + EditorGUILayout.LabelField(string.Format("{0:F1}", fps)); + EditorGUILayout.EndHorizontal(); + } + + int? deviceCpuClockLevel = GetLatestPerfValueInt("deviceCpuClockLevel"); + int? deviceGpuClockLevel = GetLatestPerfValueInt("deviceGpuClockLevel"); + float? deviceCpuClockFrequencyInMHz = GetLatestPerfValueFloat("deviceCpuClockFrequencyInMHz"); + float? deviceGpuClockFrequencyInMHz = GetLatestPerfValueFloat("deviceGpuClockFrequencyInMHz"); + + if (deviceCpuClockLevel.HasValue || deviceCpuClockFrequencyInMHz.HasValue) + { + string cpuLabel; + string cpuText; + if (deviceCpuClockLevel.HasValue && deviceCpuClockFrequencyInMHz.HasValue) + { + cpuLabel = "CPU Level (Freq)"; + cpuText = string.Format("{0} ({1:F0} MHz)", deviceCpuClockLevel, deviceCpuClockFrequencyInMHz); + } + else if (deviceCpuClockLevel.HasValue) + { + cpuLabel = "CPU Level"; + cpuText = string.Format("{0}", deviceCpuClockLevel); + } + else + { + cpuLabel = "CPU Frequency"; + cpuText = string.Format("{0:F0} MHz", deviceCpuClockFrequencyInMHz); + } + PresentText(cpuLabel, cpuText); + } + + if (deviceGpuClockLevel.HasValue || deviceGpuClockFrequencyInMHz.HasValue) + { + string cpuLabel; + string cpuText; + if (deviceGpuClockLevel.HasValue && deviceGpuClockFrequencyInMHz.HasValue) + { + cpuLabel = "GPU Level (Freq)"; + cpuText = string.Format("{0} ({1:F0} MHz)", deviceGpuClockLevel, deviceGpuClockFrequencyInMHz); + } + else if (deviceGpuClockLevel.HasValue) + { + cpuLabel = "GPU Level"; + cpuText = string.Format("{0}", deviceGpuClockLevel); + } + else + { + cpuLabel = "GPU Frequency"; + cpuText = string.Format("{0:F0} MHz", deviceGpuClockFrequencyInMHz); + } + PresentText(cpuLabel, cpuText); + } + + PresentColumnTitles("Current", "Average", "Peak"); + + PresentFloatTimeInMs("Frame Time", "deltaFrameTime", 0.020f, true, true); + PresentFloatTimeInMs("App CPU Time", "appCpuTime", 0.020f, true, true); + PresentFloatTimeInMs("App GPU Time", "appGpuTime", 0.020f, true, true); + PresentFloatTimeInMs("Compositor CPU Time", "compositorCpuTime", 0.020f, true, true); + PresentFloatTimeInMs("Compositor GPU Time", "compositorGpuTime", 0.020f, true, true); + PresentFloatPercentage("CPU Util (Average)", "systemCpuUtilAveragePercentage", false, false); + PresentFloatPercentage("CPU Util (Worst Core)", "systemCpuUtilWorstPercentage", false, false); + PresentFloatPercentage("GPU Util", "systemGpuUtilPercentage", false, false); + } + } + + void GetMetricsField(string propertyName, out FieldInfo baseFieldInfo, out FieldInfo validalityFieldInfo) + { + baseFieldInfo = typeof(OVRSystemPerfMetrics.PerfMetrics).GetField(propertyName); + validalityFieldInfo = typeof(OVRSystemPerfMetrics.PerfMetrics).GetField(propertyName + "_IsValid"); + } + + bool HasValidPerfMetrics(string propertyName) + { + FieldInfo baseFieldInfo, validalityFieldInfo; + GetMetricsField(propertyName, out baseFieldInfo, out validalityFieldInfo); + + if (baseFieldInfo == null || (validalityFieldInfo != null && validalityFieldInfo.FieldType != typeof(bool))) + { + Debug.LogWarning("[OVRSystemProfilerPanel] Unable to find property " + propertyName); + return false; + } + + if (validalityFieldInfo == null) + { + return true; + } + + for (int i = receivedMetricsList.Count - 1; i >= 0; --i) + { + var metrics = receivedMetricsList[i]; + if (validalityFieldInfo != null && (bool)validalityFieldInfo.GetValue(metrics)) + { + return true; + } + } + + return false; + } + + int? GetLatestPerfValueInt(string propertyName) + { + FieldInfo baseFieldInfo, validalityFieldInfo; + GetMetricsField(propertyName, out baseFieldInfo, out validalityFieldInfo); + + if (baseFieldInfo == null || baseFieldInfo.FieldType != typeof(int) || + (validalityFieldInfo != null && validalityFieldInfo.FieldType != typeof(bool))) + { + Debug.LogWarning("[OVRSystemProfilerPanel] GetLatestPerfValueInt(): Type mismatch"); + return null; + } + + if (receivedMetricsList.Count == 0) + { + return null; + } + + for (int i = receivedMetricsList.Count - 1; i >= 0; --i) + { + var metrics = receivedMetricsList[i]; + if (validalityFieldInfo == null || (validalityFieldInfo != null && (bool)validalityFieldInfo.GetValue(metrics))) + { + return (int)baseFieldInfo.GetValue(metrics); + } + } + + return null; + } + + float? GetLatestPerfValueFloat(string propertyName) + { + FieldInfo baseFieldInfo, validalityFieldInfo; + GetMetricsField(propertyName, out baseFieldInfo, out validalityFieldInfo); + + if (baseFieldInfo == null || baseFieldInfo.FieldType != typeof(float) || + (validalityFieldInfo != null && validalityFieldInfo.FieldType != typeof(bool))) + { + Debug.LogWarning("[OVRSystemProfilerPanel] GetLatestPerfValueFloat(): Type mismatch"); + return null; + } + + if (receivedMetricsList.Count == 0) + { + return null; + } + + for (int i = receivedMetricsList.Count - 1; i >= 0; --i) + { + var metrics = receivedMetricsList[i]; + if (validalityFieldInfo == null || (validalityFieldInfo != null && (bool)validalityFieldInfo.GetValue(metrics))) + { + return (float)baseFieldInfo.GetValue(metrics); + } + } + + return null; + } + + float? GetAveragePerfValueFloat(string propertyName) + { + FieldInfo baseFieldInfo, validalityFieldInfo; + GetMetricsField(propertyName, out baseFieldInfo, out validalityFieldInfo); + + if (baseFieldInfo == null || baseFieldInfo.FieldType != typeof(float) || + (validalityFieldInfo != null && validalityFieldInfo.FieldType != typeof(bool))) + { + Debug.LogWarning("[OVRSystemProfilerPanel] GetAveragePerfValueFloat(): Type mismatch"); + return null; + } + + int count = 0; + float sum = 0; + + OVRSystemPerfMetrics.PerfMetrics lastMetrics = null; + int metricsIndex; + for (metricsIndex = receivedMetricsList.Count - 1; metricsIndex >= 0; --metricsIndex) + { + var metrics = receivedMetricsList[metricsIndex]; + if (validalityFieldInfo != null && !(bool)validalityFieldInfo.GetValue(metrics)) + { + continue; + } + lastMetrics = metrics; + break; + } + + if (lastMetrics == null) + { + return null; + } + + for (; metricsIndex >=0; -- metricsIndex) + { + var metrics = receivedMetricsList[metricsIndex]; + if (metrics.frameTime < lastMetrics.frameTime - metricsHistoryDuration) + { + break; + } + if (validalityFieldInfo != null && !(bool)validalityFieldInfo.GetValue(metrics)) + { + continue; + } + sum += (float)baseFieldInfo.GetValue(metrics); + count++; + } + + if (count == 0) + { + return null; + } + else + { + return sum / count; + } + } + + float? GetMaxPerfValueFloat(string propertyName) + { + FieldInfo baseFieldInfo, validalityFieldInfo; + GetMetricsField(propertyName, out baseFieldInfo, out validalityFieldInfo); + + if (baseFieldInfo == null || baseFieldInfo.FieldType != typeof(float) || + (validalityFieldInfo != null && validalityFieldInfo.FieldType != typeof(bool))) + { + Debug.LogWarning("[OVRSystemProfilerPanel] GetMaxPerfValueFloat(): Type mismatch"); + return null; + } + + OVRSystemPerfMetrics.PerfMetrics lastMetrics = null; + int metricsIndex; + for (metricsIndex = receivedMetricsList.Count - 1; metricsIndex >= 0; --metricsIndex) + { + var metrics = receivedMetricsList[metricsIndex]; + if (validalityFieldInfo != null && !(bool)validalityFieldInfo.GetValue(metrics)) + { + continue; + } + lastMetrics = metrics; + break; + } + + if (lastMetrics == null) + { + return null; + } + + float? result = null; + + for (; metricsIndex >= 0; --metricsIndex) + { + var metrics = receivedMetricsList[metricsIndex]; + if (metrics.frameTime < lastMetrics.frameTime - metricsHistoryDuration) + { + break; + } + if (validalityFieldInfo != null && !(bool)validalityFieldInfo.GetValue(metrics)) + { + continue; + } + else + { + float value = (float)baseFieldInfo.GetValue(metrics); + if (!result.HasValue || result.Value < value) + { + result = value; + } + } + } + + return result; + } + + void PresentFloatPercentage(string label, string propertyName, bool displayAverage, bool displayMaximum) + { + float? lastValue = GetLatestPerfValueFloat(propertyName); + if (!lastValue.HasValue) + { + return; + } + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(label, GUILayout.Width(labelWidth)); + + Rect r = EditorGUILayout.BeginVertical(); + + float barWidth = (r.width - panelInnerRightPad - progressBarPad * 2) / 3.0f; + EditorGUI.ProgressBar(new Rect(r.x, r.y, barWidth, r.height), lastValue.Value, string.Format("{0:F1}%", lastValue.Value * 100.0f)); + + if (displayAverage) + { + float? averageValue = GetAveragePerfValueFloat(propertyName); + if (averageValue.HasValue) + { + EditorGUI.ProgressBar(new Rect(r.x + barWidth + progressBarPad, r.y, barWidth, r.height), averageValue.Value, string.Format("{0:F1}%", averageValue.Value * 100.0f)); + } + } + + if (displayMaximum) + { + float? maxValue = GetMaxPerfValueFloat(propertyName); + if (maxValue.HasValue) + { + EditorGUI.ProgressBar(new Rect(r.x + (barWidth + progressBarPad) * 2, r.y, barWidth, r.height), maxValue.Value, string.Format("{0:F1}%", maxValue.Value * 100.0f)); + } + } + + GUILayout.Space(progressBarHeight); + + EditorGUILayout.EndVertical(); + + EditorGUILayout.EndHorizontal(); + } + + void PresentFloatTimeInMs(string label, string propertyName, float maxScale, bool displayAverage, bool displayMaximum) + { + float? lastValue = GetLatestPerfValueFloat(propertyName); + if (!lastValue.HasValue) + { + return; + } + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(label, GUILayout.Width(labelWidth)); + + Rect r = EditorGUILayout.BeginVertical(); + + float barWidth = (r.width - panelInnerRightPad - progressBarPad * 2) / 3.0f; + EditorGUI.ProgressBar(new Rect(r.x, r.y, barWidth, r.height), lastValue.Value/maxScale, string.Format("{0:F1} ms", lastValue.Value * 1000.0f)); + + if (displayAverage) + { + float? averageValue = GetAveragePerfValueFloat(propertyName); + if (averageValue.HasValue) + { + EditorGUI.ProgressBar(new Rect(r.x + barWidth + progressBarPad, r.y, barWidth, r.height), averageValue.Value / maxScale, string.Format("{0:F1} ms", averageValue.Value * 1000.0f)); + } + } + + if (displayMaximum) + { + float? maxValue = GetMaxPerfValueFloat(propertyName); + if (maxValue.HasValue) + { + EditorGUI.ProgressBar(new Rect(r.x + (barWidth + progressBarPad) * 2, r.y, barWidth, r.height), maxValue.Value / maxScale, string.Format("{0:F1} ms", maxValue.Value * 1000.0f)); + } + } + + GUILayout.Space(progressBarHeight); + + EditorGUILayout.EndVertical(); + + EditorGUILayout.EndHorizontal(); + } + + void PresentIntProperty(string label, string propertyName) + { + int? lastValue = GetLatestPerfValueInt(propertyName); + if (!lastValue.HasValue) + { + return; + } + + PresentText(label, lastValue.Value.ToString()); + } + + void PresentText(string label, string text) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(label, GUILayout.Width(labelWidth)); + EditorGUILayout.LabelField(text); + EditorGUILayout.EndHorizontal(); + } + + void PresentColumnTitles(string title0, string title1, string title2) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(labelWidth)); + + float windowWidth = position.width; + float barWidth = (windowWidth - labelWidth - panelInnerRightPad * 3 ) / 3.0f; + EditorGUILayout.LabelField(title0, GUILayout.Width(barWidth)); + EditorGUILayout.LabelField(title1, GUILayout.Width(barWidth)); + EditorGUILayout.LabelField(title2, GUILayout.Width(barWidth)); + + EditorGUILayout.EndHorizontal(); + } + + // Called as the new window is opened. + private void Awake() + { + InitializeAndroidSdkPath(); + minSize = new Vector2(400, 300); + } + + void InitializeAndroidSdkPath() + { + androidSdkRootPath = OVRConfig.Instance.GetAndroidSDKPath(); + } + + // OnDestroy is called to close the EditorWindow window. + private void OnDestroy() + { + DisconnectPerfMetricsTcpServer(); + } + + // Called multiple times per second on all visible windows. + private void Update() + { + if (tcpClient != null && tcpClient.Connected) + { + tcpClient.Tick(); + } + + if (repaintRequested) + { + Repaint(); + repaintRequested = false; + } + } + + void OnConnectionStateChanged() + { + repaintRequested = true; + + if (tcpClient.connectionState == OVRNetwork.OVRNetworkTcpClient.ConnectionState.Disconnected) + { + tcpClient.connectionStateChangedCallback -= OnConnectionStateChanged; + tcpClient.payloadReceivedCallback -= OnPayloadReceived; + } + } + + void OnPayloadReceived(int payloadType, byte[] buffer, int start, int length) + { + if (payloadType == OVRSystemPerfMetrics.PayloadTypeMetrics) + { + string message = Encoding.UTF8.GetString(buffer, start, length); + OnMessageReceived(message); + } + else + { + Debug.LogWarningFormat("[OVRSystemProfilerPanel] unrecongized payload type {0}", payloadType); + } + } + + void OnMessageReceived(string message) + { + if (pauseReceiveMetrics) + { + return; + } + + var metrics = new OVRSystemPerfMetrics.PerfMetrics(); + if (!metrics.LoadFromJSON(message)) + { + Debug.LogWarning("Cannot analyze metrics: " + message); + return; + } + lock(receivedMetricsList) + { + if (receivedMetricsList.Count >= maxMetricsFrames) + { + receivedMetricsList.RemoveAt(0); + } + receivedMetricsList.Add(metrics); + } + repaintRequested = true; + } + + void ConnectPerfMetricsTcpServer() + { + tcpClient.connectionStateChangedCallback += OnConnectionStateChanged; + tcpClient.payloadReceivedCallback += OnPayloadReceived; + + tcpClient.Connect(remoteListeningPort); + +#if UNITY_2017_1_OR_NEWER + EditorApplication.playModeStateChanged += OnApplicationPlayModeStateChanged; +#endif + } + + void DisconnectPerfMetricsTcpServer() + { +#if UNITY_2017_1_OR_NEWER + EditorApplication.playModeStateChanged -= OnApplicationPlayModeStateChanged; +#endif + + tcpClient.Disconnect(); + } + +#if UNITY_2017_1_OR_NEWER + void OnApplicationPlayModeStateChanged(PlayModeStateChange change) + { + Debug.LogFormat("[OVRSystemPerfMetricsWindow] OnApplicationPlayModeStateChanged {0}", change.ToString()); + if (change == PlayModeStateChange.ExitingPlayMode) + { + tcpClient.Disconnect(); + } + } +#endif + +} diff --git a/Assets/Oculus/VR/Editor/OVRSystemProfilerPanel.cs.meta b/Assets/Oculus/VR/Editor/OVRSystemProfilerPanel.cs.meta new file mode 100644 index 0000000..8be7663 --- /dev/null +++ b/Assets/Oculus/VR/Editor/OVRSystemProfilerPanel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 60f797c78d731a54e9d4a949cfa2f989 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/Oculus.VR.Editor.asmdef b/Assets/Oculus/VR/Editor/Oculus.VR.Editor.asmdef new file mode 100644 index 0000000..7e75121 --- /dev/null +++ b/Assets/Oculus/VR/Editor/Oculus.VR.Editor.asmdef @@ -0,0 +1,24 @@ +{ + "name": "Oculus.VR.Editor", + "references": [ + "Oculus.VR" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "versionDefines": [ + { + "name": "com.unity.xr.management", + "expression": "", + "define": "USING_XR_MANAGEMENT" + }, + { + "name": "com.unity.xr.oculus", + "expression": "", + "define": "USING_XR_SDK_OCULUS" + } + ] +} \ No newline at end of file diff --git a/Assets/Oculus/VR/Editor/Oculus.VR.Editor.asmdef.meta b/Assets/Oculus/VR/Editor/Oculus.VR.Editor.asmdef.meta new file mode 100644 index 0000000..56a1bb0 --- /dev/null +++ b/Assets/Oculus/VR/Editor/Oculus.VR.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d2761a0af0f567748a72629d4bb18a26 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/PathHelper.cs b/Assets/Oculus/VR/Editor/PathHelper.cs new file mode 100644 index 0000000..df75daa --- /dev/null +++ b/Assets/Oculus/VR/Editor/PathHelper.cs @@ -0,0 +1,26 @@ +using System; +using System.IO; + +public static class PathHelper +{ + public static string MakeRelativePath(string fromPath, string toPath) + { + var fromUri = new Uri(Path.GetFullPath(fromPath)); + var toUri = new Uri(Path.GetFullPath(toPath)); + + if (fromUri.Scheme != toUri.Scheme) + { + return toPath; + } + + var relativeUri = fromUri.MakeRelativeUri(toUri); + var relativePath = Uri.UnescapeDataString(relativeUri.ToString()); + + if (toUri.Scheme.Equals("file", StringComparison.InvariantCultureIgnoreCase)) + { + relativePath = relativePath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); + } + + return relativePath; + } +} diff --git a/Assets/Oculus/VR/Editor/PathHelper.cs.meta b/Assets/Oculus/VR/Editor/PathHelper.cs.meta new file mode 100644 index 0000000..f188d20 --- /dev/null +++ b/Assets/Oculus/VR/Editor/PathHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e97d8d54c1d1f16468e12a2079fdd060 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/Scenes.meta b/Assets/Oculus/VR/Editor/Scenes.meta new file mode 100644 index 0000000..fe16021 --- /dev/null +++ b/Assets/Oculus/VR/Editor/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f177e155338d57548977e581b2950d6a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/Scenes/OVRTransitionScene.unity b/Assets/Oculus/VR/Editor/Scenes/OVRTransitionScene.unity new file mode 100644 index 0000000..82bf5e6 --- /dev/null +++ b/Assets/Oculus/VR/Editor/Scenes/OVRTransitionScene.unity @@ -0,0 +1,671 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 2 + m_BakeResolution: 40 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &25651912 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 25651914} + - component: {fileID: 25651913} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &25651913 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 25651912} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &25651914 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 25651912} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1500274086 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1500274089} + - component: {fileID: 1500274088} + - component: {fileID: 1500274087} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1500274087 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500274086} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1500274088 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500274086} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &1500274089 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500274086} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1802766121 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1802766122} + - component: {fileID: 1802766124} + - component: {fileID: 1802766123} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1802766122 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1802766121} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2026874869} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -15} + m_SizeDelta: {x: 290, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1802766123 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1802766121} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: OVR Transition Scene +--- !u!222 &1802766124 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1802766121} +--- !u!1 &1955265764 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1955265765} + - component: {fileID: 1955265767} + - component: {fileID: 1955265766} + m_Layer: 5 + m_Name: Log + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1955265765 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1955265764} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2026874869} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -15} + m_SizeDelta: {x: 290, y: 270} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1955265766 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1955265764} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1955265767 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1955265764} +--- !u!1 &2026874868 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2026874869} + - component: {fileID: 2026874871} + - component: {fileID: 2026874870} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2026874869 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026874868} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1802766122} + - {fileID: 1955265765} + m_Father: {fileID: 2063971652} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2026874870 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026874868} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &2026874871 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026874868} +--- !u!1 &2060762002 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2060762004} + - component: {fileID: 2060762003} + m_Layer: 0 + m_Name: OVRSceneLoader + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2060762003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2060762002} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a6d444f79f5ee4646b26c6d746385e80, type: 3} + m_Name: + m_EditorClassIdentifier: + sceneCheckIntervalSeconds: 1 + mainCanvas: {fileID: 2063971651} + logTextBox: {fileID: 1955265766} +--- !u!4 &2060762004 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2060762002} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2063971652} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2063971648 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2063971652} + - component: {fileID: 2063971651} + - component: {fileID: 2063971650} + - component: {fileID: 2063971649} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2063971649 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2063971648} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &2063971650 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2063971648} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &2063971651 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2063971648} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 2122420806} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &2063971652 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2063971648} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 1} + m_LocalScale: {x: 0.003, y: 0.003, z: 0.003} + m_Children: + - {fileID: 2026874869} + m_Father: {fileID: 2060762004} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 300, y: 300} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2122420804 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2122420807} + - component: {fileID: 2122420806} + - component: {fileID: 2122420805} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &2122420805 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2122420804} + m_Enabled: 1 +--- !u!20 &2122420806 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2122420804} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &2122420807 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2122420804} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Oculus/VR/Editor/Scenes/OVRTransitionScene.unity.meta b/Assets/Oculus/VR/Editor/Scenes/OVRTransitionScene.unity.meta new file mode 100644 index 0000000..fb41b70 --- /dev/null +++ b/Assets/Oculus/VR/Editor/Scenes/OVRTransitionScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d04724945584d684c80c6c509a8ece34 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Editor/network_sec_config.xml b/Assets/Oculus/VR/Editor/network_sec_config.xml new file mode 100644 index 0000000..e8413b0 --- /dev/null +++ b/Assets/Oculus/VR/Editor/network_sec_config.xml @@ -0,0 +1,4 @@ + + + + diff --git a/Assets/Oculus/VR/Editor/network_sec_config.xml.meta b/Assets/Oculus/VR/Editor/network_sec_config.xml.meta new file mode 100644 index 0000000..c35bd28 --- /dev/null +++ b/Assets/Oculus/VR/Editor/network_sec_config.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b69c9b95ff9fc8a44b5e162bbca8fbcc +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/LICENSE.txt b/Assets/Oculus/VR/LICENSE.txt new file mode 100644 index 0000000..9116f35 --- /dev/null +++ b/Assets/Oculus/VR/LICENSE.txt @@ -0,0 +1,576 @@ +OCULUS UTILITIES SOFTWARE DEVELOPMENT KIT LICENSE AGREEMENT + +1. INTRODUCTION This Oculus Utilities Software Development Kit License Agreement +(“License”) forms a legally binding contract between you and Facebook +Technologies, LLC formerly known as Oculus VR, LLC (“Oculus”) and governs your +use of the Oculus Utilities Software Development Kit (“Utilities SDK”). In order +to obtain and use the Utilities SDK, you must first agree to the terms and +conditions of this License. If you agree to the terms and conditions of this +License, you may use the Utilities SDK. If you do not agree to the terms and +conditions of this License, then you may not use the Utilities SDK. PLEASE READ +THIS LICENSE CAREFULLY TO ENSURE THAT YOU UNDERSTAND EACH PROVISION. THIS +LICENSE CONTAINS A MANDATORY INDIVIDUAL ARBITRATION AND CLASS ACTION/JURY TRIAL +WAIVER PROVISION THAT REQUIRES THE USE OF ARBITRATION ON AN INDIVIDUAL BASIS TO +RESOLVE DISPUTES, RATHER THAN JURY TRIALS OR CLASS ACTIONS. BY CLICKING ACCEPT +OR USING, DOWNLOADING OR COPYING THE UTILITIES SDK, YOU SIGNIFY THAT YOU HAVE +READ, UNDERSTOOD AND HEREBY AGREE TO BE BOUND BY THE TERMS AND CONDITIONS OF +THIS LICENSE. + +2. ELIGIBILITY By entering into this License with Oculus, you represent and +warrant that you are not a person with whom Oculus is prohibited from +transacting business under applicable law, nor are you a person who Oculus has +previously denied access to or use of the Utilities SDK. If you will use the +Utilities SDK on behalf of your employer or other company, organization, +educational institution or any governmental agency, instrumentality or +department (your “Entity”), you represent and warrant that you have full legal +authority to bind your Entity to all of the terms and conditions of this +License. If you do not have the requisite authority to so bind your Entity, you +may not accept this License or use the Utilities SDK on behalf of your Entity. + +3. UTILITIES SDK LICENSE + +3.1. License. Subject to the terms and conditions of this License, Oculus hereby +grants to you a limited, worldwide, freely revocable, non-exclusive, +non-transferable, sublicensable, fully paid-up royalty-free license under +Oculus’ copyright rights to: + +(a) store, use, reproduce, and redistribute (subject to the restrictions below) +the software contained in the Utilities SDK (including, but not limited to +OVRPlugin binary files, models, and Utilities Code (as defined below)) solely to +design, develop, test, and run your engines, tools, applications, content, games +and demos (collectively and generally referred to as “Developer Content”) to be +used in connection with any and all compatible software or hardware (including, +without limitation and by way of example, with commercial headsets, mobile +tablets or phones) made available by Oculus or any third parties; + +(b) use, reproduce, modify, distribute, and create derivative works of the +following named folders in the Utilities SDK: Prefabs, Resources, Scenes, +Scripts, and Shader (collectively, “Utilities Code”) to internally design, +develop and test Developer Content, and (ii) incorporate such Utilities Code and +any such modifications, in whole or in part, into your Developer Content +developed through your use of the Utilities SDK; and + +(c) use any documentation made available by Oculus to you in connection with the +Utilities SDK solely in connection with your exercise of the licenses and rights +granted in this License. + +3.2. License Restrictions. You may not use the Utilities SDK for any purpose not +expressly permitted by this License. Without in any way limiting the foregoing +restriction, except as expressly permitted in this License, you agree not to (or +enable any third party to): + +(a) modify or create any derivative works of the Utilities SDK other than the +Utilities Code; + +(b) work around any technical measures in the Utilities SDK, or use the +Utilities SDK (alone or in conjunction with any device, program or service) in +an attempt to circumvent any technical measures employed by or for Oculus or any +third party to control access to, or any rights in, any content, file or other +work; + +(c) decompile, reverse engineer, disassemble, decipher, translate or otherwise +attempt to derive or access any source code of the Utilities SDK or any part of +the Utilities SDK (other than any component of the Utilities SDK that is made +available by Oculus in source code form), or any other software or firmware +provided to you by Oculus (except as and only to the extent the foregoing +restriction is prohibited by applicable law); + +(d) publish, rent, lease, lend, sell, sublicense, distribute, transfer, disclose +or otherwise provide the Utilities SDK; + +(e) remove, obscure or alter any proprietary notices on or in the Utilities SDK +or any Oculus license terms, policies or terms of service or any links to or +notices thereto; + +(f) use the Utilities SDK in connection with the development or transmission of +any malware, viruses, hacks, bots, Trojan horses or other harmful or malicious +code; + +(g) use the Utilities SDK (i) to infringe or violate any rights of Oculus, any +of its affiliates or any third party or (ii) in any way that does not comply +with all applicable laws (including, without limitation, all applicable export, +import, privacy and data security laws); + +(h) use the Utilities SDK in any way that interferes with, disrupts, damages or +accesses in any manner not expressly authorized by Oculus, or accesses for any +purpose not expressly authorized by Oculus, any services, networks, other +properties, data or information of Oculus or any of its affiliates or any third +party; + +(i) use the Utilities SDK in any manner other than to enhance your Developer +Content or the functionality thereof in accordance with Section 3.1; + +(j) develop any Developer Content or other application or software that could +(i) disable, hack or otherwise interfere with any authentication, content +protection, digital signing, digital rights management, security or verification +mechanisms or (ii) disable, override or otherwise interfere with any device, +system or software, including any device, system or software intended to notify +an end user that such end user’s personal information is being collected, +transmitted, stored, maintained, processed or used; + +(k) use the Utilities SDK to (i) defame, abuse, harass, stalk, bully or threaten +any third party or (ii) promote or facilitate any prohibited or illegal +activities; + +(l) enable any functionality in your Developer Content that would generate +excessive traffic over any network or servers of Oculus or any of its affiliates +or any third party that would negatively impact the experience of any user of +any product or service of Oculus or any of its affiliates (or of any third party +made available through any network or service of Oculus or any of its +affiliates), or otherwise interfere with, limit or restrict the operation of any +servers or networks of Oculus or any of its affiliates; + +(m) use or encourage the use of the Utilities SDK for any mission critical, +life-saving or ultra-hazardous activities; or + +(n) use or redistribute the Utilities SDK or any portion or component thereof in +any manner that would cause the Utilities SDK or any portion or component +thereof to become subject to the terms of any open source license. + +3.3. Redistribution and Sublicense Restriction. Subject to the terms and +conditions of this License, your license to redistribute and sublicense the +Utilities SDK (or any portion thereof) is also expressly made subject to the +following conditions: + +(a) You may sublicense and redistribute the Utilities SDK to your end users in +whole for no charge or as part of a for-charge piece of Developer Content; +provided that you may only license, sublicense or redistribute the Utilities +SDK: (a) in its entirety; (b) solely in compiled binary executable form; and (c) +solely as incorporated into your Developer Content; + +(b) You must include with all such redistributed or sublicensed Utilities SDK +code the following copyright notice: “Copyright © Facebook Technologies, LLC and +its affiliates. All rights reserved.”; + +(c) You must give any other recipients of the Utilities SDK a copy of this +License as such recipients, licensees or sublicensees may only use the Utilities +SDK subject to the terms of this License and such recipient's, licensee's or +sublicensee's agreement to and acceptance of this License with Oculus; + +(d) Each sublicense you grant to your end users must be pursuant to a valid and +enforceable license agreement that (i) includes an acknowledgement by such end +user that the Utilities SDK is the proprietary property of Oculus or its +licensors or contributors, (ii) ensures that neither Oculus nor any of its +licensors or contributors has any obligations to such end user with respect to +any the Utilities SDK and (iii) imposes obligations on such end user no less +restrictive than your obligations under this License with respect to the use and +protection of the Utilities SDK; and + +(e) the Utilities SDK includes a "LICENSE" text file (the "License Notice"), and +any Utilities SDK distribution that you distribute must include a copy of this +License with the License Notice. Notwithstanding the foregoing in this Section +3.3, you may grant to end users of your Developer Content a non-exclusive +runtime sublicense to use the Utilities Code and any modifications of any +Utilities Code incorporated into your Developer Content pursuant to and in +accordance with this License: (a) solely in the form in which the Utilities Code +is made available to you by Oculus; and (b) solely as incorporated into your +Developer Content pursuant to and in accordance with this License (“Runtime +Sublicense”). You agree to include a Runtime Sublicense with any of your +Developer Content that incorporates any Utilities Code (or any modifications of +any Utilities Code) that you provide, distribute or make available to any end +user of such Developer Content. Each Runtime Sublicense you grant to an end user +of your Developer Content must be granted pursuant to a valid and enforceable +license agreement that: (i) includes an acknowledgement by such end user that +the Utilities Code (and any modifications of any Utilities Code (other than +modifications of the Utilities Code developed by you during the term of this +License in accordance with Section 3.1 (“Developer Modified Utilities Code”)) is +the proprietary property of Oculus or its licensors or contributors, (ii) +ensures that neither Oculus nor any of its licensors or contributors has any +obligations to such end user with respect to any Utilities Code (or any +modifications of any Utilities Code) and (iii) imposes obligations on such end +user no less restrictive than your obligations under this License with respect +to the use and protection of the Utilities Code. If you incorporate any of the +Utilities Code or Developer Modified Utilities Code into any of your Developer +Content, you must include in or on all copies of such Developer Content a copy +of this License and the following copyright notice (along with any other notices +or license files that appear in or on the Utilities SDK): “Certain portions of +the code are owned by Facebook Technologies, LLC. Copyright © Facebook +Technologies, LLC. All rights reserved”. + +3.4. Developer Content Rules, Restrictions and License. + +(a) You agree that as a condition of this License you will design and distribute +your Developer Content to ensure that your Developer Content and any software +required to use your Developer Content does not, and you will not, alter or +interfere with the normal operation, behavior or functionality of the compatible +hardware or software of Oculus or any third party. Without limiting the +foregoing, in the case of Oculus hardware or software, you will ensure that your +Developer Content and any software required to use your Developer Content does +not alter or interfere with: (i) the behavior of the "Oculus button" and "XBox +button" implemented by the Oculus system software; (ii) any on-screen messages +or information; (iii) the behavior of the proximity sensor in the Oculus +hardware implemented by the Oculus system software; (iv) any Oculus hardware or +software security features; (v) end user's settings; or (vi) the Oculus Flash +Screen Warnings. You also agree not to (i) commit any act, or enable, assist or +instruct any third party to commit any act, intended to interfere with the +normal operation of any compatible hardware or software of Oculus or any third +party or (ii) provide any software to any users or developers that would induce +breach of any Oculus’s or other software or hardware providers’ agreements or +that contains any malware, viruses, hacks, bots, Trojan horses or other harmful +or malicious code. You also agree that your Developer Content will not violate +the Oculus Content Guidelines (available at +https://developer.oculus.com/distribute/latest/concepts/publish-content-guidelines/). + +(b) Oculus may suspend operation of or remove any Developer Content that does +not comply with the restrictions in this License. + +(c) You agree that Oculus may grant its employees and internal contractors the +right to use, perform and display the Developer Content you provide to Oculus +for user research, testing, evaluation and approval purposes, which shall be on +a royalty-free basis. + +4. OCULUS PLATFORM SERVICES + +4.1. Definitions. For the purposes of this Section 4: + +(a) "Application Services" means services provided by Oculus associated with the +Platform, including but not limited to in-app purchasing, multiplayer +matchmaking, friends, leader boards, achievements, rooms, voice over IP and +cloud saves, which list may be changed from time to time in Oculus' sole +discretion. + +(b) "Oculus Platform Framework" means the suite of Oculus platform services, +including but not limited to the Oculus file distribution and update system +(enabling distribution and updates of Developer Content by Oculus, including +through generated activation Keys), entitlement system, and account +authentication, which list may be changed from time to time in Oculus' sole +discretion. + +(c) "Platform" means the Oculus virtual reality platform, including but not +limited to the user experience, user interface, store, and social features, +usable on Oculus approved hardware or any third-party device or operating +system, including but not limited to iOS, Android, Windows, OS X, Linux, and +Windows Mobile. + +(d) "Platform Services" means the Oculus Platform Framework and the Application +Services. + +4.2. Oculus Platform Services. Oculus makes certain Platform Services available +to you to include and enable in your Developer Content. Developer Content that +enables or includes any Platform Service must implement the Oculus Platform +Framework with that Developer Content. Once your Developer Content has been +authorized for use of the Platform Services, you are not required to update your +Developer Content to include new Platform Services Oculus may make available as +part of the Oculus Platform Framework. + +4.3. Key Provision and Redemption. If you request that Oculus generate +activation keys for your Developer Content on the Platform ("Keys") and Oculus +agrees, you hereby grant Oculus (i) the right to generate Keys for you and (ii) +a license to make available, reproduce, distribute, perform, and display the +Developer Content to end users who have submitted a Key to Oculus. Oculus agrees +to authenticate and make Developer Content available to any end user supplying a +valid Key (unless the Developer Content has been removed or withdrawn). + +4.4. Limited Authorization. You hereby grant Oculus the limited authorization +reasonably necessary for Oculus's exercise of its rights and performance of its +obligations under this Section 4. You agree that Oculus may use its contractors +and affiliates for the purposes of exercising its rights and licenses set forth +in this Section 4. + +4.5. Platform Services Requirements. You will not make any use of any API, +software, code or other item or information supplied by Oculus in connection +with the Platform Services other than to enhance the functionality of your +Developer Content. You may not sublicense any software, firmware or other item +or information supplied by Oculus in connection with the Platform Service for +use by a third party, unless expressly authorized by Oculus to do so. + +5. INTELLECTUAL PROPERTY RIGHTS + +5.1. Ownership. + +(a) Oculus. As between you and Oculus, Oculus retains all rights (including all +intellectual property rights), title and interest (subject to the license +granted to you in Section 3.1 during the term of this License) in and to the +Utilities SDK and any derivatives or modifications of the Utilities SDK, +including all source code and object code of any of the foregoing (other than +any Developer Modified Utilities Code). Oculus reserves all rights not expressly +granted to you under this License. + +(b) Developer. For the sake of clarification, when you use the Utilities SDK in +or with Developer Content, you retain all rights to: (i) your Developer Content, +and (ii) Developer Modified Utilities Code; provided however, Oculus retains all +rights to the Utilities SDK (including without limitation, any and all software +contained therein), including those that may be incorporated into your Developer +Content. Except as otherwise provided herein, you have no obligations to share +or license Developer Content (including your source and object code) or any of +your Developer Modified Utilities Code to Oculus or any third parties; + +5.2. Additional Content. Oculus may include additional content in the Utilities +SDK for demonstration, references or other purposes. Such content will be +clearly marked in the Utilities SDK and is subject to any terms and conditions +included with such content. + +5.3. Publicity; Use of Trademarks. This License does not grant you or any +third-party permission to use any of the trade names, trademarks, service marks, +logos or product names of Oculus, except as required for reasonable and +customary use in describing the origin of the Utilities SDK or reproducing the +copyright or other notice required pursuant to Section 3.3. Neither the name of +Oculus nor the name of any contributor, licensor, employee or contractor of +Oculus may be used to endorse or promote any Developer Content or any other +products, content or materials developed using the Utilities SDK without +specific prior written permission of Oculus. + +5.4. Feedback. You may, but are not obligated to, provide Oculus with comments +or other feedback, suggestions or recommended improvements regarding the +Utilities SDK or any other Oculus products or services (collectively, +“Feedback”). You hereby grant Oculus a worldwide, non-exclusive, perpetual, +irrevocable, royalty-free, fully paid-up, transferable, sublicensable (through +multiple tiers of sublicenses) license to use, disclose, reproduce, modify, +create derivatives of, license, distribute, provide and exploit any Feedback for +any purpose whatsoever, without any obligation, limitation or restriction of any +kind. + +6. THIRD PARTY SOFTWARE OR MATERIALS Your use of any third-party software +(including any open source software) or materials included in the Utilities SDK +may be subject to other terms and conditions typically found in separate +third-party license agreements or "READ ME" files included with such third-party +software or materials. To the extent any of such other terms and conditions +conflict with any of the terms and conditions of this License, such other terms +and conditions applicable to such third-party software or materials will control +solely with respect to such third-party software or materials (but to no other +portion or component of the Utilities SDK). + +7. INDEMNIFICATION You agree to defend, indemnify and hold harmless Oculus and +its subsidiaries, agents, contributors, licensors, managers, and other +affiliated companies, and their employees, contractors, agents, officers and +directors, from and against any and all claims, damages, obligations, losses, +liabilities, costs or debt, and expenses (including, without limitation, +reasonable attorneys’ fees and expenses) arising from or relating to (a) your +exercise of any of the licenses or rights granted to you under this License, (b) +your use and access of the Utilities SDK and/or the Platform Services, (c) any +Developer Content, (d) any negligence or misconduct by you or any of your +employees, agents, vendors or contractors, (e) your violation of any third-party +right, including without limitation any right of privacy or intellectual +property rights, (f) your violation of any applicable law, rule or regulation, +or (g) your breach of any provision of this License. + +8. NO WARRANTIES THE UTILITIES SDK, ANY PORTION OR COMPONENT OF THE UTILITIES +SDK (INCLUDING, BY WAY OF EXAMPLE AND WITHOUT LIMITATION, THE OVRPLUGIN BINARY +FILES, MODELS, AND UTILITIES CODE), THE PLATFORM SERVICES AND ALL DOCUMENTATION +OR OTHER INFORMATION OR MATERIALS PROVIDED OR MADE AVAILABLE BY OR FOR OCULUS +ARE PROVIDED "AS IS" AND WITHOUT ANY WARRANTY OF ANY KIND, WHETHER EXPRESS, +IMPLIED, STATUTORY OR OTHERWISE. ALL EXPRESS OR IMPLIED WARRANTIES ARE HEREBY +DISCLAIMED, INCLUDING, WITHOUT LIMITATION: (A) ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, QUIET +ENJOYMENT, QUIET POSSESSION OR TITLE; AND (B) ANY WARRANTIES THAT THE UTILITIES +SDK, ANY PORTION OR COMPONENT OF THE UTILITIES SDK, THE PLATFORM SERVICES OR ANY +DOCUMENTATION OR OTHER INFORMATION OR MATERIALS PROVIDED OR MADE AVAILABLE BY OR +FOR OCULUS (I) WILL MEET ANY OF YOUR REQUIREMENTS (INCLUDING, WITHOUT +LIMITATION, YOUR REQUIREMENTS RELATING TO ANY DESIGN OR PERFORMANCE), (II) WILL +BE UNINTERRUPTED OR ERROR-FREE, (III) ARE FREE OF ANY MALWARE, VIRUSES, HACKS, +BOTS, TROJAN HORSES AND OTHER HARMFUL OR MALICIOUS CODE; AND (D) ARE FUNCTIONAL +ON ANY HARDWARE OR IN ANY ENVIRONMENT. FEDERAL LAW, SOME STATES, PROVINCES AND +OTHER JURISDICTIONS DO NOT ALLOW THE EXCLUSION AND LIMITATIONS OF CERTAIN +IMPLIED WARRANTIES, SO THE ABOVE EXCLUSIONS MAY NOT APPLY TO YOU. THIS LICENSE +GIVES YOU SPECIFIC LEGAL RIGHTS, AND YOU MAY ALSO HAVE OTHER RIGHTS WHICH VARY +FROM STATE TO STATE. THE DISCLAIMERS AND EXCLUSIONS UNDER THIS LICENSE WILL NOT +APPLY TO THE EXTENT PROHIBITED BY APPLICABLE LAW. + +9. LIMITATION OF LIABILITY TO THE FULLEST EXTEST PERMITTED UNDER APPLICABLE LAW, +IN NO EVENT SHALL OCULUS OR ANY OF ITS LICENSORS OR CONTRIBUTORS BE LIABLE TO +YOU OR ANY END USER OR OTHER THIRD PARTY WITH RESPECT TO ANY SUBJECT MATTER OF +THIS LICENSE (INCLUDING, WITHOUT LIMITATION, WITH RESPECT TO ANY OF THE LICENSES +OR OTHER RIGHTS GRANTED BY OCULUS UNDER THIS LICENSE) OR ARISING IN ANY WAY OUT +OF THE UTILITIES SDK OR ANY PORTION OR COMPONENT OF THE UTILITIES SDK +(INCLUDING, BY WAY OF EXAMPLE AND WITHOUT LIMITATION, THE OVRPLUGIN BINARY +FILES, MODELS, AND UTILITIES CODE), THE PLATFORM SERVICES, ALL DOCUMENTATION OR +OTHER INFORMATION OR MATERIALS PROVIDED OR MADE AVAILABLE BY OR FOR OCULUS OR +ANY OF YOUR USE OF THE FOREGOING FOR ANY INDIRECT, INCIDENTAL, SPECIAL, +CONSEQUENTIAL, EXEMPLARY OR PUNITIVE DAMAGES (INCLUDING, WITHOUT LIMITATION: +DAMAGE TO BUSINESS REPTUATION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, PROFITS, BUSINESS OR GOODWILL; LOSS OR CORRUPTION OF DATA; OR BUSINESS +INTERRUPTION), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY (LEGAL, EQUITABLE +OR OTHERWISE), WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (WHETHER +NEGLIGENCE OR OTHERWISE), WHETHER FORESEEABLE OR NOT AND REGARDLESS OF WHETHER +YOU HAVE BEEN OR OCULUS HAS BEEN ADVISED OF THE POSSIBILITY OF ANY SUCH DAMAGE. +YOU ACKNOWLEDGE AND AGREE THAT YOUR REMEDIES UNDER THIS LICENSE ARE LIMITED +SOLELY TO THE RIGHT TO COLLECT MONEY DAMAGES, IF ANY, AND YOU HEREBY WAIVE YOUR +RIGHT TO SEEK INJUNCTIVE OR OTHER EQUITABLE RELIEF. THE CUMULATIVE, AGGREGATE +LIABILITY OF OCULUS AND ITS AFFILIATES, LICENSORS AND CONTRIBUTORS UNDER THIS +LICENSE WILL BE LIMITED TO ONE HUNDRED US DOLLARS (US $100). THE EXISTENCE OF +MULTIPLE CLAIMS OR SUITS UNDER OR RELATED TO THIS LICENSE WILL NOT ENLARGE OR +EXTEND THE FOREGOING MONETARY CAP ON DAMAGES. SOME STATES DO NOT ALLOW THE +EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE +LIMITATIONS OR EXCLUSIONS MAY NOT APPLY TO YOU. THIS LICENSE GIVES YOU SPECIFIC +LEGAL RIGHTS, AND YOU MAY ALSO HAVE OTHER RIGHTS WHICH VARY FROM STATE TO STATE. +THE DISCLAIMERS, EXCLUSIONS, AND LIMITATIONS OF LIABILITY UNDER THIS LICENSE +WILL NOT APPLY TO THE EXTENT PROHIBITED BY APPLICABLE LAW. + +10. LICENSE TERM + +10.1. Term and Termination. The term of this License will commence on the date +on which you click accept or use, download or copy the Utilities SDK or any +portion or component thereof and will continue until terminated as set forth in +this License. This License and all your rights under this License shall +automatically and immediately terminate in the event you breach any provision of +this License (including, without limitation, your failure to provide required +notices as set forth in Section 3.3 or your failure to observe any of the +restrictions set forth in Sections 3.2, 3.3 or 3.4) or for any of the following +reasons: + +(a) Any of the following infringes or violates any intellectual property rights +of any third party or violates any applicable law: (i) your exercise of any of +the licenses or rights granted under this License; and/or (ii) your Developer +Content or any use or exploitation of any such Developer Content; + +(b) Your Developer Content violates applicable law; + +(c) Any health or safety issues associated with your Developer Content; + +(d) Failure to comply with or use properly the Oculus Flash Screen Warnings; + +(e) To the extent applicable, any failure to comply with or properly use the +Oculus help and safety warnings; + +(f) Failure to provide required notices as set forth above; and + +(g) Failure to observe the restrictions in Section 3.2. + +10.2. Effect of Termination; Survival. If this License is terminated for any +reason, (a) all licenses and rights granted under this License will immediately +terminate; (b) you must immediately cease using the Utilities SDK, all portions +and components of the Utilities SDK, all documentation made available by Oculus +to you in connection with the Utilities SDK; and (c) using, distributing, +providing, making available and exploiting any Developer Content that +incorporates any Utilities Code, any modifications of any Utilities Code (other +than any Developer Modified Utilities Code), or any other portion or component +of the Utilities SDK. Notwithstanding any termination of this License, the +following provisions shall survive indefinitely: Sections 1, 2, 3.2, 3.3, 3.4, +4.1, 4.4, 4.5, 5, 6, 7, 8, 9, 10.2, 11, and 12. + +11. GOVERNING LAW; ARBITRATION; CLASS ACTION/JURY TRIAL WAIVER + +11.1. Governing Law; Alternative Dispute Resolution. This License shall be +governed by the laws of the State of California, without giving effect to +conflict of laws provisions or principles thereof. The parties agree that, +except as provided below, all disputes relating to this License shall be +resolved by binding non-appearance-based arbitration before a single neutral +arbitrator in San Mateo, California. The arbitration will be conducted in the +English language by a single arbitrator who is an attorney-at-law with at least +fifteen (15) years’ experience in consumer and technology transactions and who +is also a member of the JAMS roster of arbitrators. If you and Oculus cannot +agree on a mutually acceptable arbitrator within thirty (30) days after the +arbitration is initiated, then JAMS will pick a neutral arbitrator who meets +such qualifications. The arbitration shall be conducted in accordance with the +rules and procedures of JAMS then in effect, and the judgment of the arbitrator +shall be final and capable of entry in any court of competent jurisdiction. The +parties undertake to keep confidential all awards in their arbitration, together +with all materials in the proceedings created for the purpose of the arbitration +and all other documents produced by another party in the proceedings not +otherwise in the public domain, save and to the extent that disclosure may be +required of a party by legal duty, to protect or pursue a legal right or to +enforce or challenge an award in legal proceedings before a court or other +judicial authority. You and Oculus agree the following may be submitted to a +court of competent jurisdiction located within San Francisco, California and +further agree to submit to the personal jurisdiction of the courts located +within San Francisco, California in connection with (a) any entrance of an +arbitrator's judgment or decision, (b) any dispute with respect to the +arbitration process or procedure, (c) Oculus’ exercise of any of its equitable +rights or remedies or (d) any claims regarding the ownership, validity, +enforceability and/or infringement of any intellectual property rights. + +11.2. Class Action/Jury Waiver. WITH RESPECT TO ALL PERSONS AND ENTITIES, +REGARDLESS OF WHETHER THEY HAVE OBTAINED OR USED THE UTILITIES SDK FOR PERSONAL, +COMMERCIAL OR OTHER PURPOSES, ALL CLAIMS MUST BE BROUGHT IN THE PARTIES’ +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS ACTION, COLLECTIVE ACTION, PRIVATE ATTORNEY GENERAL ACTION OR OTHER +REPRESENTATIVE PROCEEDING. THIS WAIVER APPLIES TO CLASS ARBITRATION, AND, UNLESS +WE AGREE OTHERWISE, THE ARBITRATOR MAY NOT CONSOLIDATE MORE THAN ONE PERSON’S +CLAIMS. YOU AGREE THAT, BY ENTERING INTO THIS LICENSE, YOU AND OCULUS ARE EACH +WAIVING THE RIGHT TO A TRIAL BY JURY OR TO PARTICIPATE IN A CLASS ACTION, +COLLECTIVE ACTION, PRIVATE ATTORNEY GENERAL ACTION, OR OTHER REPRESENTATIVE +PROCEEDING OF ANY KIND. + +11.3. License Suspension. If you file a suit or initiate a proceeding with or +before a governmental authority in which you challenge Oculus’ ownership of any +intellectual property rights related to the Utilities SDK or the validity or +enforceability of any such intellectual property rights (a “Claim”), the +licenses granted to you under this License shall automatically and immediately +(upon the filing of such suit or proceeding) be suspended. Such suspension will +continue until all such Claims asserted by you are dismissed, withdrawn or are +finally settled and no longer pending, as applicable, in which case, such +licenses will be automatically reinstated; provided, however, that such +reinstatement will not release you from any liabilities, or remedies therefor, +that arise during the period of such suspension. + +12. OTHER PROVISIONS + +12.1. Changes to the SDK. Oculus may discontinue or change functionality of the +Utilities SDK at any time, and your continued use of the Utilities SDK or use of +any modified or additional Utilities SDL is conditioned upon your adherence to +the terms of this License, as modified by Oculus from time to time in accordance +with Section 12.2. + +12.2. Updates to License. Oculus may revise and update this License at any time +by posting the amended terms and conditions of this License (“Updated License +Terms”) to: https://developer.oculus.com/licenses/. Your continued use of the +Utilities SDK or any portion or component of the Utilities SDK constitutes your +acceptance of the Updated License Terms. If there are Updated License Terms for +any future release of the Utilities SDK, you: (a) agree to comply with all terms +and conditions of such Updated License Terms for such future Utilities SDK +release and (b) acknowledge and agree that such Updated License Terms will apply +to all Developer Content that may be developed using or incorporating such +future Utilities SDK or any portion or component of the Utilities SDK (for +example, without limitation, you cannot avoid complying with the terms and +conditions of such Updated License Terms by developing any Developer Content +using or incorporating any release of the Utilities SDK that precedes such +future Utilities SDK or under any version of this License that precedes such +Updated License Terms). + +12.3. Export Law Compliance. You will comply, and will not cause Oculus to not +comply (by for example, providing Developer Content to Oculus under this +Agreement for which required export clearances have not been obtained), with all +applicable export control laws of the United States and any other applicable +governmental authority, including without limitation, the U.S. Export +Administration Regulations. + +12.4. Confidentiality. You agree that (a) the Utilities SDK and all +documentation or other information or materials provided or made available by or +for Oculus are Oculus’ confidential information and (b) you will not use, +disclose or make available any of such Oculus confidential information to any +third party except as expressly permitted under, and in accordance with, the +terms and conditions of this License. + +12.5. Relationship of the Parties. The parties hereto are independent +contractors. Neither party has any express or implied right or authority to +assume or create any obligations on behalf of the other or to bind such other +party to any contract, agreement or undertaking with any third party. Nothing in +this License shall be construed to create a partnership, joint venture, +employment or agency relationship. + +12.6. Assignment. You may not assign this License or any licenses or rights +granted under this License or delegate any obligations under this License, in +each case, without the advance written consent of Oculus, which may be withheld +in its sole discretion. Any attempted assignment by you without such advance +written consent of Oculus will be null and void. Oculus may assign this License +or any licenses or rights granted under this License or delegate any obligations +under this License in its sole discretion, in each case, without your consent or +any notice to you. This License shall be binding on, inure to the benefit of, +and be enforceable by the parties and their respective heirs, successors and +permitted assigns. + +12.7. Severability. In the event that any provision of this License is held to +be null, void, invalid or unenforceable by a court, other governmental body or +arbitration tribunal, in each case of competent jurisdiction, you and Oculus +agree (a) such provision will be modified to the extent necessary to allow it to +be valid and enforceable to the extent permitted by applicable law, provided +that such modification reflects as nearly as possible the intentions of the +parties when entering into this License and (b) the remaining provisions of this +License shall remain in full force and effect. + +12.8. Headings. The section headings contained in this License are for reference +purposes only and shall not affect in any way the meaning or interpretation of +this License. + +12.9. No Waiver. Failure of either party at any time to exercise or enforce any +legal right or remedy under this License will not be construed as a waiver of +such provisions or in any way affect the validity of this License or any portion +of this License. No waiver of any provision of this License shall be of any +force or effect unless set forth in a writing signed by an authorized +representative of each party. + +12.10. Entire Agreement. This License constitutes the entire agreement between +you and Oculus regarding your use of the Utilities SDK and supersedes and +replaces any prior or contemporaneous agreements, understandings, negotiations +and discussions between you and Oculus regarding your access and use of the +Utilities SDK. diff --git a/Assets/Oculus/VR/LICENSE.txt.meta b/Assets/Oculus/VR/LICENSE.txt.meta new file mode 100644 index 0000000..7041bc0 --- /dev/null +++ b/Assets/Oculus/VR/LICENSE.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ea216613534b07f45adfcdd5ba09cf4e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Materials.meta b/Assets/Oculus/VR/Materials.meta new file mode 100644 index 0000000..8878d97 --- /dev/null +++ b/Assets/Oculus/VR/Materials.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 981b5bce7fc4a2d43a2169710da4b892 +DefaultImporter: + userData: diff --git a/Assets/Oculus/VR/Materials/Arrow.mat b/Assets/Oculus/VR/Materials/Arrow.mat new file mode 100644 index 0000000..4424aeb --- /dev/null +++ b/Assets/Oculus/VR/Materials/Arrow.mat @@ -0,0 +1,64 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Arrow + m_Shader: {fileID: 10101, guid: 0000000000000000e000000000000000, type: 0} + m_ShaderKeywords: [] + m_CustomRenderQueue: -1 + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + data: + first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + data: + first: + name: _Shininess + second: .699999988 + data: + first: + name: _Stencil + second: 0 + data: + first: + name: _StencilReadMask + second: 255 + data: + first: + name: _StencilWriteMask + second: 255 + data: + first: + name: _StencilComp + second: 8 + data: + first: + name: _StencilOp + second: 1 + data: + first: + name: _ColorMask + second: 15 + m_Colors: + data: + first: + name: _Color + second: {r: 1, g: 0, b: 0, a: 1} + data: + first: + name: _Emission + second: {r: 0, g: 0, b: 0, a: 0} + data: + first: + name: _SpecColor + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/Oculus/VR/Materials/Arrow.mat.meta b/Assets/Oculus/VR/Materials/Arrow.mat.meta new file mode 100644 index 0000000..7d75949 --- /dev/null +++ b/Assets/Oculus/VR/Materials/Arrow.mat.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 669025377795b574da66d9bb2472fcab +NativeFormatImporter: + userData: diff --git a/Assets/Oculus/VR/Materials/BasicHandMaterial.mat b/Assets/Oculus/VR/Materials/BasicHandMaterial.mat new file mode 100644 index 0000000..e928554 --- /dev/null +++ b/Assets/Oculus/VR/Materials/BasicHandMaterial.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: BasicHandMaterial + m_Shader: {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: c00bf1ce0c68d5646ad7ea3d26b3486d, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 0.508 + - _Glossiness: 0.389 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Oculus/VR/Materials/BasicHandMaterial.mat.meta b/Assets/Oculus/VR/Materials/BasicHandMaterial.mat.meta new file mode 100644 index 0000000..1b95fd4 --- /dev/null +++ b/Assets/Oculus/VR/Materials/BasicHandMaterial.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5ba7d209f622bb44e87b47ce27ee27b7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Materials/CubeMaterial.mat b/Assets/Oculus/VR/Materials/CubeMaterial.mat new file mode 100644 index 0000000..358deb1 --- /dev/null +++ b/Assets/Oculus/VR/Materials/CubeMaterial.mat @@ -0,0 +1,29 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: CubeMaterial + m_Shader: {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: -1 + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + data: + first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: 020d1a102a7f2a14ebf6cefe7b977303, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: {} + m_Colors: + data: + first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/Oculus/VR/Materials/CubeMaterial.mat.meta b/Assets/Oculus/VR/Materials/CubeMaterial.mat.meta new file mode 100644 index 0000000..bcb9f10 --- /dev/null +++ b/Assets/Oculus/VR/Materials/CubeMaterial.mat.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 62db2d638434d5a488dfb1e789e34b37 +NativeFormatImporter: + userData: diff --git a/Assets/Oculus/VR/Materials/GazePointer.mat b/Assets/Oculus/VR/Materials/GazePointer.mat new file mode 100644 index 0000000..b9a77e7 --- /dev/null +++ b/Assets/Oculus/VR/Materials/GazePointer.mat @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GazePointer + m_Shader: {fileID: 4800000, guid: 38ad33c152e32ee46a9bbbb0e656f7e1, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaTex: + m_Texture: {fileID: 2800000, guid: 8b000a1e9077a124f9ad4e81392fccba, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Illum: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 82026cb669304dc4897d2c11d3753141, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaCutoff: 0 + - _Cutoff: 0.5 + - _EmissionLM: 0 + - _EndRadius: 0.8 + - _Fill: 0.5 + - _InvFade: 1.11 + - _StartRadius: 0.2 + m_Colors: + - _Color: {r: 0, g: 1, b: 0.006896496, a: 1} + - _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5} diff --git a/Assets/Oculus/VR/Materials/GazePointer.mat.meta b/Assets/Oculus/VR/Materials/GazePointer.mat.meta new file mode 100644 index 0000000..13034b6 --- /dev/null +++ b/Assets/Oculus/VR/Materials/GazePointer.mat.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 3fac3b9744290eb4c89b0e4ffd5fe085 +NativeFormatImporter: + userData: diff --git a/Assets/Oculus/VR/Materials/GearVrController.meta b/Assets/Oculus/VR/Materials/GearVrController.meta new file mode 100644 index 0000000..de563fe --- /dev/null +++ b/Assets/Oculus/VR/Materials/GearVrController.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 856d6414a7cf7e94888ee2d5f959efd7 +folderAsset: yes +timeCreated: 1488168366 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_1024.mat b/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_1024.mat new file mode 100644 index 0000000..cba62e4 --- /dev/null +++ b/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_1024.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GearVrControllerMat_1024 + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _NORMALMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: ab629f733cdfcfa4ba04695645307f24, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 8dcaddcb07fa3214989bf16d62f3efbc, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 2800000, guid: 4b12fa22be3f7f143b055ad60e483684, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.4 + - _GlossyReflections: 1 + - _Metallic: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_1024.mat.meta b/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_1024.mat.meta new file mode 100644 index 0000000..20f8cf6 --- /dev/null +++ b/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_1024.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a62abb16d1535b647956d3be68acdd59 +timeCreated: 1488144668 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_128.mat b/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_128.mat new file mode 100644 index 0000000..a77793d --- /dev/null +++ b/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_128.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GearVrControllerMat_128 + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _NORMALMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: cd52447b7b5ad174bb3858eb22a8fe2e, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 2cf74d0adf6b17348bb03c979684482b, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 2800000, guid: 8556f6ca8690f0a47bcc8c5adec768da, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.4 + - _GlossyReflections: 1 + - _Metallic: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_128.mat.meta b/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_128.mat.meta new file mode 100644 index 0000000..f7b5e48 --- /dev/null +++ b/Assets/Oculus/VR/Materials/GearVrController/GearVrControllerMat_128.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f6ccc53b9bcfb114996e76ee88ce6948 +timeCreated: 1488144149 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Materials/PlainMaterial.mat b/Assets/Oculus/VR/Materials/PlainMaterial.mat new file mode 100644 index 0000000..b43379d --- /dev/null +++ b/Assets/Oculus/VR/Materials/PlainMaterial.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PlainMaterial + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Oculus/VR/Materials/PlainMaterial.mat.meta b/Assets/Oculus/VR/Materials/PlainMaterial.mat.meta new file mode 100644 index 0000000..4a960a1 --- /dev/null +++ b/Assets/Oculus/VR/Materials/PlainMaterial.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 26cadeeaa29498d4889f43542f3add58 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Materials/cursor_timer_material.mat b/Assets/Oculus/VR/Materials/cursor_timer_material.mat new file mode 100644 index 0000000..3a700ee --- /dev/null +++ b/Assets/Oculus/VR/Materials/cursor_timer_material.mat @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: cursor_timer_material + m_Shader: {fileID: 4800000, guid: b95caf64e2cc3614892026a94bb2be84, type: 3} + m_ShaderKeywords: [] + m_CustomRenderQueue: -1 + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + data: + first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: 79a33e7a7166c6142ad50f46a9a23d3e, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _ColorRamp + second: + m_Texture: {fileID: 2800000, guid: 8929c8bc5148a624b8c9d6df0ee6f0ca, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + data: + first: + name: _Cutoff + second: 1 + data: + first: + name: _ColorRampOffset + second: 0 + m_Colors: + data: + first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/Oculus/VR/Materials/cursor_timer_material.mat.meta b/Assets/Oculus/VR/Materials/cursor_timer_material.mat.meta new file mode 100644 index 0000000..1726452 --- /dev/null +++ b/Assets/Oculus/VR/Materials/cursor_timer_material.mat.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 9531aa878fd5c4749b288b72024e8d2f +NativeFormatImporter: + userData: diff --git a/Assets/Oculus/VR/Materials/gaze_cursor.mat b/Assets/Oculus/VR/Materials/gaze_cursor.mat new file mode 100644 index 0000000..9f41982 --- /dev/null +++ b/Assets/Oculus/VR/Materials/gaze_cursor.mat @@ -0,0 +1,28 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: gaze_cursor + m_Shader: {fileID: 4800000, guid: 05b53b473302943b58b8e33c93a38dac, type: 3} + m_ShaderKeywords: [] + m_CustomRenderQueue: -1 + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + data: + first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: 077028084dceb584798dade6c58d1978, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: {} + m_Colors: + data: + first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/Oculus/VR/Materials/gaze_cursor.mat.meta b/Assets/Oculus/VR/Materials/gaze_cursor.mat.meta new file mode 100644 index 0000000..07e1266 --- /dev/null +++ b/Assets/Oculus/VR/Materials/gaze_cursor.mat.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 7f31de375e167154aa45929466af30e4 +NativeFormatImporter: + userData: diff --git a/Assets/Oculus/VR/Meshes.meta b/Assets/Oculus/VR/Meshes.meta new file mode 100644 index 0000000..2beb330 --- /dev/null +++ b/Assets/Oculus/VR/Meshes.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: db348133d6680dd459f3e1cb19922746 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Oculus/VR/Meshes/Cone.obj b/Assets/Oculus/VR/Meshes/Cone.obj new file mode 100644 index 0000000..79212db --- /dev/null +++ b/Assets/Oculus/VR/Meshes/Cone.obj @@ -0,0 +1,187 @@ +# Alias OBJ Model File +# Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited +# File units = meters + +mtllib cone.mtl + +g Mesh1 Model + +usemtl FrontColor +v 0.492734 0 0.0849313 +vt -19.399 -3.34375 +vn 0 -1 -0 +v 0.453963 0 0.209566 +vt -17.8725 -8.25064 +v 0.384254 0 0.31992 +vt -15.1281 -12.5953 +v 0.28836 0 0.408471 +vt -11.3528 -16.0815 +v 0.172814 0 0.469186 +vt -6.80371 -18.4719 +v 0.0454916 0 0.497926 +vt -1.79101 -19.6034 +v -0.0849313 0 0.492734 +vt 3.34375 -19.399 +v -0.209566 0 0.453963 +vt 8.25064 -17.8725 +v -0.31992 0 0.384254 +vt 12.5953 -15.1281 +v -0.408471 0 0.28836 +vt 16.0815 -11.3528 +v -0.469186 0 0.172814 +vt 18.4719 -6.80371 +v -0.497926 0 0.0454916 +vt 19.6034 -1.79101 +v -0.492734 0 -0.0849313 +vt 19.399 3.34375 +v -0.453963 0 -0.209566 +vt 17.8725 8.25064 +v -0.384254 0 -0.31992 +vt 15.1281 12.5953 +v -0.28836 0 -0.408471 +vt 11.3528 16.0815 +v -0.172814 0 -0.469186 +vt 6.80371 18.4719 +v -0.0454916 0 -0.497926 +vt 1.79101 19.6034 +v 0.0849313 0 -0.492734 +vt -3.34375 19.399 +v 0.209566 0 -0.453963 +vt -8.25064 17.8725 +v 0.31992 0 -0.384254 +vt -12.5953 15.1281 +v 0.408471 0 -0.28836 +vt -16.0815 11.3528 +v 0.469186 0 -0.172814 +vt -18.4719 6.80371 +v 0.497926 0 -0.0454916 +vt -19.6034 1.79101 +f 1/1/1 2/2/1 3/3/1 4/4/1 5/5/1 6/6/1 7/7/1 8/8/1 9/9/1 10/10/1 11/11/1 12/12/1 13/13/1 14/14/1 15/15/1 16/16/1 17/17/1 18/18/1 19/19/1 20/20/1 21/21/1 22/22/1 23/23/1 24/24/1 + +vt -2.56941 -8.65407 +vn 0.812403 0.446486 0.375036 +vt 2.56941 -8.65407 +vn 0.881787 0.446486 0.151991 +v 0.00100113 1 0.000172563 +vt 0.00522052 35.2704 +v 0.000922359 1 0.000425796 +vt -0.00522052 35.2704 +f 2/25/2 1/26/3 25/27/3 26/28/2 + +vn 0.891079 0.446486 -0.0814109 +v 0.00101168 1 -9.24296e-005 +f 1/25/3 24/26/4 27/27/4 25/28/3 + +vn 0.839646 0.446486 -0.309265 +v 0.000953289 1 -0.000351123 +f 27/28/4 24/25/4 23/26/5 28/27/5 + +vn 0.730992 0.446486 -0.516044 +v 0.000829929 1 -0.000585888 +f 28/28/5 23/25/5 22/26/6 29/27/6 + +vn 0.572522 0.446486 -0.687654 +v 0.000650011 1 -0.000780726 +f 29/28/6 22/25/6 21/26/7 30/27/7 + +vn 0.375036 0.446486 -0.812403 +v 0.000425796 1 -0.000922359 +f 30/28/7 21/25/7 20/26/8 31/27/8 + +vn 0.151991 0.446486 -0.881787 +v 0.000172563 1 -0.00100113 +f 31/28/8 20/25/8 19/26/9 32/27/9 + +vn -0.0814109 0.446486 -0.891079 +v -9.24296e-005 1 -0.00101168 +f 32/28/9 19/25/9 18/26/10 33/27/10 + +vn -0.309265 0.446486 -0.839646 +v -0.000351123 1 -0.000953289 +f 33/28/10 18/25/10 17/26/11 34/27/11 + +vn -0.516044 0.446486 -0.730992 +v -0.000585888 1 -0.000829929 +f 34/28/11 17/25/11 16/26/12 35/27/12 + +vn -0.687654 0.446486 -0.572522 +v -0.000780726 1 -0.000650011 +f 35/28/12 16/25/12 15/26/13 36/27/13 + +vn -0.812403 0.446486 -0.375036 +v -0.000922359 1 -0.000425796 +f 36/28/13 15/25/13 14/26/14 37/27/14 + +vn -0.881787 0.446486 -0.151991 +v -0.00100113 1 -0.000172563 +f 37/28/14 14/25/14 13/26/15 38/27/15 + +vn -0.891079 0.446486 0.0814109 +v -0.00101168 1 9.24296e-005 +f 38/28/15 13/25/15 12/26/16 39/27/16 + +vn -0.839646 0.446486 0.309265 +v -0.000953289 1 0.000351123 +f 12/25/16 11/26/17 40/27/17 39/28/16 + +vn -0.730992 0.446486 0.516044 +v -0.000829929 1 0.000585888 +f 11/25/17 10/26/18 41/27/18 40/28/17 + +vn -0.572522 0.446486 0.687654 +v -0.000650011 1 0.000780726 +f 10/25/18 9/26/19 42/27/19 41/28/18 + +vn -0.375036 0.446486 0.812403 +v -0.000425796 1 0.000922359 +f 9/25/19 8/26/20 43/27/20 42/28/19 + +vn -0.151991 0.446486 0.881787 +v -0.000172563 1 0.00100113 +f 8/25/20 7/26/21 44/27/21 43/28/20 + +vn 0.0814109 0.446486 0.891079 +v 9.24296e-005 1 0.00101168 +f 7/25/21 6/26/22 45/27/22 44/28/21 + +vn 0.309265 0.446486 0.839646 +v 0.000351123 1 0.000953289 +f 6/25/22 5/26/23 46/27/23 45/28/22 + +vn 0.516044 0.446486 0.730992 +v 0.000585888 1 0.000829929 +f 5/25/23 4/26/24 47/27/24 46/28/23 + +vn 0.687654 0.446486 0.572522 +v 0.000780726 1 0.000650011 +f 4/25/24 3/26/25 48/27/25 47/28/24 + +f 3/25/25 2/26/2 26/27/2 48/28/25 + +vt 0.0398301 0.00363896 +vn 0 1 -0 +vt 0.0375311 0.0138237 +vt 0.0326744 0.0230665 +vt 0.025591 0.0307372 +vt 0.0167636 0.0363133 +vt 0.00679382 0.0394147 +vt -0.00363896 0.0398301 +vt -0.0138237 0.0375311 +vt -0.0230665 0.0326744 +vt -0.0307372 0.025591 +vt -0.0363133 0.0167636 +vt -0.0394147 0.00679382 +vt -0.0398301 -0.00363896 +vt -0.0375311 -0.0138237 +vt -0.0326744 -0.0230665 +vt -0.025591 -0.0307372 +vt -0.0167636 -0.0363133 +vt -0.00679382 -0.0394147 +vt 0.00363896 -0.0398301 +vt 0.0138237 -0.0375311 +vt 0.0230665 -0.0326744 +vt 0.0307372 -0.025591 +vt 0.0363133 -0.0167636 +vt 0.0394147 -0.00679382 +f 27/29/26 28/30/26 29/31/26 30/32/26 31/33/26 32/34/26 33/35/26 34/36/26 35/37/26 36/38/26 37/39/26 38/40/26 39/41/26 40/42/26 41/43/26 42/44/26 43/45/26 44/46/26 45/47/26 46/48/26 47/49/26 48/50/26 26/51/26 25/52/26 + diff --git a/Assets/Oculus/VR/Meshes/Cone.obj.meta b/Assets/Oculus/VR/Meshes/Cone.obj.meta new file mode 100644 index 0000000..f33c298 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/Cone.obj.meta @@ -0,0 +1,67 @@ +fileFormatVersion: 2 +guid: c28fa8d61f81fb742b1180a6d4516625 +ModelImporter: + serializedVersion: 16 + fileIDToRecycleName: + 100000: //RootNode + 100002: Mesh1_Model + 400000: //RootNode + 400002: Mesh1_Model + 2300000: Mesh1_Model + 3300000: Mesh1_Model + 4300000: Mesh1_Model + 9500000: //RootNode + materials: + importMaterials: 0 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + optimizeGameObjects: 0 + motionNodeName: + animationCompression: 1 + animationRotationError: .5 + animationPositionError: .5 + animationScaleError: .5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + tangentSpace: + normalSmoothAngle: 90 + splitTangentsAcrossUV: 0 + normalImportMode: 0 + tangentImportMode: 1 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: [] + skeleton: [] + armTwist: .5 + foreArmTwist: .5 + upperLegTwist: .5 + legTwist: .5 + armStretch: .0500000007 + legStretch: .0500000007 + feetSpacing: 0 + rootMotionBoneName: + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 2 + additionalBone: 0 + userData: diff --git a/Assets/Oculus/VR/Meshes/GearVrController.meta b/Assets/Oculus/VR/Meshes/GearVrController.meta new file mode 100644 index 0000000..bed8e01 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/GearVrController.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1f5d118b13c965a40a0cd4e358205ac3 +folderAsset: yes +timeCreated: 1486168258 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/GearVrController/GearVrController.fbx b/Assets/Oculus/VR/Meshes/GearVrController/GearVrController.fbx new file mode 100644 index 0000000..7ff85fc Binary files /dev/null and b/Assets/Oculus/VR/Meshes/GearVrController/GearVrController.fbx differ diff --git a/Assets/Oculus/VR/Meshes/GearVrController/GearVrController.fbx.meta b/Assets/Oculus/VR/Meshes/GearVrController/GearVrController.fbx.meta new file mode 100644 index 0000000..ec2fa85 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/GearVrController/GearVrController.fbx.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 84c37137326e7b943a87be7ae2a7ea19 +timeCreated: 1488144149 +licenseType: Store +ModelImporter: + serializedVersion: 19 + fileIDToRecycleName: + 100000: back_button_PLY + 100002: center_button_PLY + 100004: chassis_PLY + 100006: disc_button_PLY + 100008: home_button_PLY + 100010: //RootNode + 100012: text_PLY + 100014: trigger_PLY + 400000: back_button_PLY + 400002: center_button_PLY + 400004: chassis_PLY + 400006: disc_button_PLY + 400008: home_button_PLY + 400010: //RootNode + 400012: text_PLY + 400014: trigger_PLY + 2300000: back_button_PLY + 2300002: center_button_PLY + 2300004: chassis_PLY + 2300006: disc_button_PLY + 2300008: home_button_PLY + 2300010: text_PLY + 2300012: trigger_PLY + 3300000: back_button_PLY + 3300002: center_button_PLY + 3300004: chassis_PLY + 3300006: disc_button_PLY + 3300008: home_button_PLY + 3300010: text_PLY + 3300012: trigger_PLY + 4300000: text_PLY + 4300002: center_button_PLY + 4300004: trigger_PLY + 4300006: home_button_PLY + 4300008: back_button_PLY + 4300010: disc_button_PLY + 4300012: chassis_PLY + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 0 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/GearVrController/Materials.meta b/Assets/Oculus/VR/Meshes/GearVrController/Materials.meta new file mode 100644 index 0000000..81f9405 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/GearVrController/Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1f3bd5b7b89f2bc43b851174a56851f3 +folderAsset: yes +timeCreated: 1488174699 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/GearVrController/Materials/malibuController_color_1024.mat b/Assets/Oculus/VR/Meshes/GearVrController/Materials/malibuController_color_1024.mat new file mode 100644 index 0000000..cf14de5 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/GearVrController/Materials/malibuController_color_1024.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: malibuController_color_1024 + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Oculus/VR/Meshes/GearVrController/Materials/malibuController_color_1024.mat.meta b/Assets/Oculus/VR/Meshes/GearVrController/Materials/malibuController_color_1024.mat.meta new file mode 100644 index 0000000..7d99824 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/GearVrController/Materials/malibuController_color_1024.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 54fb84af388c3734b9a4cae0b38e2c68 +timeCreated: 1488174699 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusGoController.meta b/Assets/Oculus/VR/Meshes/OculusGoController.meta new file mode 100644 index 0000000..75d9f99 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusGoController.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2f5a65d8d712ba9458f8b931e7db3113 +folderAsset: yes +timeCreated: 1513040713 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusGoController/Materials.meta b/Assets/Oculus/VR/Meshes/OculusGoController/Materials.meta new file mode 100644 index 0000000..1ef6760 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusGoController/Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8be9af30e3bae8c47a188358ead030df +folderAsset: yes +timeCreated: 1513040723 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusGoController/Materials/OculusGoControllerMat.mat b/Assets/Oculus/VR/Meshes/OculusGoController/Materials/OculusGoControllerMat.mat new file mode 100644 index 0000000..ebdba0f --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusGoController/Materials/OculusGoControllerMat.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: OculusGoControllerMat + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 6fd132ea4bdd3ec4298a583f001ed5ab, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 0.75 + - _Glossiness: 0.492 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 1 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Oculus/VR/Meshes/OculusGoController/Materials/OculusGoControllerMat.mat.meta b/Assets/Oculus/VR/Meshes/OculusGoController/Materials/OculusGoControllerMat.mat.meta new file mode 100644 index 0000000..2c45967 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusGoController/Materials/OculusGoControllerMat.mat.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6c0b208d35ece4a459821be19df69561 +timeCreated: 1513127267 +licenseType: Store +NativeFormatImporter: + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusGoController/OculusGoController.fbx b/Assets/Oculus/VR/Meshes/OculusGoController/OculusGoController.fbx new file mode 100644 index 0000000..b9f7028 Binary files /dev/null and b/Assets/Oculus/VR/Meshes/OculusGoController/OculusGoController.fbx differ diff --git a/Assets/Oculus/VR/Meshes/OculusGoController/OculusGoController.fbx.meta b/Assets/Oculus/VR/Meshes/OculusGoController/OculusGoController.fbx.meta new file mode 100644 index 0000000..abebb4d --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusGoController/OculusGoController.fbx.meta @@ -0,0 +1,82 @@ +fileFormatVersion: 2 +guid: e0f1914fdbfd3764faeff5474c0cbe1e +timeCreated: 1513040723 +licenseType: Store +ModelImporter: + serializedVersion: 19 + fileIDToRecycleName: + 100000: //RootNode + 400000: //RootNode + 2300000: //RootNode + 3300000: //RootNode + 4300000: Mesh + materials: + importMaterials: 0 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 0 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + importAnimation: 0 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + rootMotionBoneRotation: {x: 0, y: 0, z: 0, w: 1} + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS.meta b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS.meta new file mode 100644 index 0000000..4fc3388 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2fd2b8bc5b4516243b0b24003c6e439d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/Materials.meta b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/Materials.meta new file mode 100644 index 0000000..1f7febb --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e2780dbfd762e7241a81199a8839ea4a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/Materials/OculusTouchForQuestAndRiftS_Material.mat b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/Materials/OculusTouchForQuestAndRiftS_Material.mat new file mode 100644 index 0000000..c951e78 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/Materials/OculusTouchForQuestAndRiftS_Material.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: OculusTouchForQuestAndRiftS_Material + m_Shader: {fileID: 10703, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: a53d1d4e8207acf45b310f189c342b70, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.21960786, g: 0.21960786, b: 0.21960786, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/Materials/OculusTouchForQuestAndRiftS_Material.mat.meta b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/Materials/OculusTouchForQuestAndRiftS_Material.mat.meta new file mode 100644 index 0000000..7fa6be0 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/Materials/OculusTouchForQuestAndRiftS_Material.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 01ac879f6ce09924e9c26663f798beaf +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Left.fbx b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Left.fbx new file mode 100644 index 0000000..04a438e Binary files /dev/null and b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Left.fbx differ diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Left.fbx.meta b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Left.fbx.meta new file mode 100644 index 0000000..af1e509 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Left.fbx.meta @@ -0,0 +1,97 @@ +fileFormatVersion: 2 +guid: 32fbc8bcebb64584da5868aeeb086cda +ModelImporter: + serializedVersion: 22 + fileIDToRecycleName: + 100000: //RootNode + 400000: //RootNode + 2100000: controllerMTL + 2300000: //RootNode + 3300000: //RootNode + 4300000: l_controller_ply + 9500000: //RootNode + externalObjects: + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: controllerMTL + second: {fileID: 2100000, guid: 01ac879f6ce09924e9c26663f798beaf, type: 2} + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + rootMotionBoneRotation: {x: 0, y: 0, z: 0, w: 1} + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 2 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Right.fbx b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Right.fbx new file mode 100644 index 0000000..7a63b79 Binary files /dev/null and b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Right.fbx differ diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Right.fbx.meta b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Right.fbx.meta new file mode 100644 index 0000000..4cc0e44 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForQuestAndRiftS/OculusTouchForQuestAndRiftS_Right.fbx.meta @@ -0,0 +1,97 @@ +fileFormatVersion: 2 +guid: 37ba10a26a648144fa2390c8adfb2c8a +ModelImporter: + serializedVersion: 22 + fileIDToRecycleName: + 100000: //RootNode + 400000: //RootNode + 2100000: controllerMTL + 2300000: //RootNode + 3300000: //RootNode + 4300000: r_controller_ply + 9500000: //RootNode + externalObjects: + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: controllerMTL + second: {fileID: 2100000, guid: 01ac879f6ce09924e9c26663f798beaf, type: 2} + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + rootMotionBoneRotation: {x: 0, y: 0, z: 0, w: 1} + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 2 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForRift.meta b/Assets/Oculus/VR/Meshes/OculusTouchForRift.meta new file mode 100644 index 0000000..92e2a42 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForRift.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 686f83a16d0d4354fbc6dddda5497e03 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForRift/Materials.meta b/Assets/Oculus/VR/Meshes/OculusTouchForRift/Materials.meta new file mode 100644 index 0000000..a864d19 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForRift/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9e0f89e382c8ee54d8bf35a63977eefe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForRift/Materials/OculusTouchForRift_Material.mat b/Assets/Oculus/VR/Meshes/OculusTouchForRift/Materials/OculusTouchForRift_Material.mat new file mode 100644 index 0000000..6a6a6ec --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForRift/Materials/OculusTouchForRift_Material.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: OculusTouchForRift_Material + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 063f7a502a7e06e428090710e8286b2b, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForRift/Materials/OculusTouchForRift_Material.mat.meta b/Assets/Oculus/VR/Meshes/OculusTouchForRift/Materials/OculusTouchForRift_Material.mat.meta new file mode 100644 index 0000000..c7d0c99 --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForRift/Materials/OculusTouchForRift_Material.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eacafe280fdfa6a44845c135057ae6a5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForRift/left_touch_controller_model_skel.fbx b/Assets/Oculus/VR/Meshes/OculusTouchForRift/left_touch_controller_model_skel.fbx new file mode 100644 index 0000000..9510e10 Binary files /dev/null and b/Assets/Oculus/VR/Meshes/OculusTouchForRift/left_touch_controller_model_skel.fbx differ diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForRift/left_touch_controller_model_skel.fbx.meta b/Assets/Oculus/VR/Meshes/OculusTouchForRift/left_touch_controller_model_skel.fbx.meta new file mode 100644 index 0000000..3dc3e4e --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForRift/left_touch_controller_model_skel.fbx.meta @@ -0,0 +1,152 @@ +fileFormatVersion: 2 +guid: 45137ecb2b0f9ba45b80adefb16de509 +ModelImporter: + serializedVersion: 22 + fileIDToRecycleName: + 100000: lctrl:b_button01 + 100002: lctrl:b_button02 + 100004: lctrl:b_button03 + 100006: lctrl:b_hold + 100008: lctrl:b_stick + 100010: lctrl:b_stick_IGNORE + 100012: lctrl:b_trigger + 100014: lctrl:controller_body_PLY + 100016: lctrl:geometry_null + 100018: lctrl:left_touch_controller_world + 100020: lctrl:main_trigger_PLY + 100022: lctrl:o_button_decal_PLY + 100024: lctrl:o_button_PLY + 100026: lctrl:ring_PLY + 100028: lctrl:side_trigger_PLY + 100030: lctrl:surface_PLY + 100032: lctrl:thumbstick_ball_PLY + 100034: lctrl:x_button_PLY + 100036: lctrl:y_button_PLY + 100038: //RootNode + 400000: lctrl:b_button01 + 400002: lctrl:b_button02 + 400004: lctrl:b_button03 + 400006: lctrl:b_hold + 400008: lctrl:b_stick + 400010: lctrl:b_stick_IGNORE + 400012: lctrl:b_trigger + 400014: lctrl:controller_body_PLY + 400016: lctrl:geometry_null + 400018: lctrl:left_touch_controller_world + 400020: lctrl:main_trigger_PLY + 400022: lctrl:o_button_decal_PLY + 400024: lctrl:o_button_PLY + 400026: lctrl:ring_PLY + 400028: lctrl:side_trigger_PLY + 400030: lctrl:surface_PLY + 400032: lctrl:thumbstick_ball_PLY + 400034: lctrl:x_button_PLY + 400036: lctrl:y_button_PLY + 400038: //RootNode + 2100000: l_controller_mat + 4300000: lctrl:o_button_decal_PLY + 4300002: lctrl:surface_PLY + 4300004: lctrl:x_button_PLY + 4300006: lctrl:y_button_PLY + 4300008: lctrl:ring_PLY + 4300010: lctrl:controller_body_PLY + 4300012: lctrl:main_trigger_PLY + 4300014: lctrl:o_button_PLY + 4300016: lctrl:thumbstick_ball_PLY + 4300018: lctrl:side_trigger_PLY + 9500000: //RootNode + 13700000: lctrl:controller_body_PLY + 13700002: lctrl:main_trigger_PLY + 13700004: lctrl:o_button_decal_PLY + 13700006: lctrl:o_button_PLY + 13700008: lctrl:ring_PLY + 13700010: lctrl:side_trigger_PLY + 13700012: lctrl:surface_PLY + 13700014: lctrl:thumbstick_ball_PLY + 13700016: lctrl:x_button_PLY + 13700018: lctrl:y_button_PLY + externalObjects: + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: l_controller_mat + second: {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + rootMotionBoneRotation: {x: 0, y: 0, z: 0, w: 1} + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 2 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForRift/right_touch_controller_model_skel.fbx b/Assets/Oculus/VR/Meshes/OculusTouchForRift/right_touch_controller_model_skel.fbx new file mode 100644 index 0000000..06702f0 Binary files /dev/null and b/Assets/Oculus/VR/Meshes/OculusTouchForRift/right_touch_controller_model_skel.fbx differ diff --git a/Assets/Oculus/VR/Meshes/OculusTouchForRift/right_touch_controller_model_skel.fbx.meta b/Assets/Oculus/VR/Meshes/OculusTouchForRift/right_touch_controller_model_skel.fbx.meta new file mode 100644 index 0000000..62e424a --- /dev/null +++ b/Assets/Oculus/VR/Meshes/OculusTouchForRift/right_touch_controller_model_skel.fbx.meta @@ -0,0 +1,152 @@ +fileFormatVersion: 2 +guid: eb8e07cd3e0ce494f81482c6835d2b10 +ModelImporter: + serializedVersion: 22 + fileIDToRecycleName: + 100000: rctrl:a_button_PLY + 100002: rctrl:b_button01 + 100004: rctrl:b_button02 + 100006: rctrl:b_button03 + 100008: rctrl:b_button_PLY + 100010: rctrl:b_hold + 100012: rctrl:b_stick + 100014: rctrl:b_stick_IGNORE + 100016: rctrl:b_trigger + 100018: rctrl:controller_body_PLY + 100020: rctrl:geometry_null + 100022: rctrl:main_trigger_PLY + 100024: rctrl:o_button_decal_PLY + 100026: rctrl:o_button_PLY + 100028: rctrl:right_touch_controller_world + 100030: rctrl:ring_PLY + 100032: rctrl:side_trigger_PLY + 100034: rctrl:surface_PLY + 100036: rctrl:thumbstick_ball_PLY + 100038: //RootNode + 400000: rctrl:a_button_PLY + 400002: rctrl:b_button01 + 400004: rctrl:b_button02 + 400006: rctrl:b_button03 + 400008: rctrl:b_button_PLY + 400010: rctrl:b_hold + 400012: rctrl:b_stick + 400014: rctrl:b_stick_IGNORE + 400016: rctrl:b_trigger + 400018: rctrl:controller_body_PLY + 400020: rctrl:geometry_null + 400022: rctrl:main_trigger_PLY + 400024: rctrl:o_button_decal_PLY + 400026: rctrl:o_button_PLY + 400028: rctrl:right_touch_controller_world + 400030: rctrl:ring_PLY + 400032: rctrl:side_trigger_PLY + 400034: rctrl:surface_PLY + 400036: rctrl:thumbstick_ball_PLY + 400038: //RootNode + 2100000: r_controller_mat + 4300000: rctrl:o_button_decal_PLY + 4300002: rctrl:surface_PLY + 4300004: rctrl:ring_PLY + 4300006: rctrl:controller_body_PLY + 4300008: rctrl:main_trigger_PLY + 4300010: rctrl:o_button_PLY + 4300012: rctrl:thumbstick_ball_PLY + 4300014: rctrl:side_trigger_PLY + 4300016: rctrl:b_button_PLY + 4300018: rctrl:a_button_PLY + 9500000: //RootNode + 13700000: rctrl:a_button_PLY + 13700002: rctrl:b_button_PLY + 13700004: rctrl:controller_body_PLY + 13700006: rctrl:main_trigger_PLY + 13700008: rctrl:o_button_decal_PLY + 13700010: rctrl:o_button_PLY + 13700012: rctrl:ring_PLY + 13700014: rctrl:side_trigger_PLY + 13700016: rctrl:surface_PLY + 13700018: rctrl:thumbstick_ball_PLY + externalObjects: + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: r_controller_mat + second: {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + rootMotionBoneRotation: {x: 0, y: 0, z: 0, w: 1} + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 2 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/NOTICE.txt b/Assets/Oculus/VR/NOTICE.txt new file mode 100644 index 0000000..85b04f3 --- /dev/null +++ b/Assets/Oculus/VR/NOTICE.txt @@ -0,0 +1,65 @@ +The following sets forth attribution notices for third party software that may be contained in portions of the Oculus Utilities SDK + +OPENVR +SimpleJSON + +-------------------------------------------------------------------------------- + +Notices for file(s): +ThirdParty/openvr_api.cs + +Copyright (c) 2015, Valve Corporation +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors +may be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +Notices for file(s): +ThirdParty/SimpleJSON.cs +ThirdParty/SimpleJSONUnity.cs + +The MIT License (MIT) + +Copyright (c) 2012-2017 Markus Göbel (Bunny83) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Assets/Oculus/VR/NOTICE.txt.meta b/Assets/Oculus/VR/NOTICE.txt.meta new file mode 100644 index 0000000..8ad2548 --- /dev/null +++ b/Assets/Oculus/VR/NOTICE.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1d3ffd26004693948809cf896824b17e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Oculus.VR.asmdef b/Assets/Oculus/VR/Oculus.VR.asmdef new file mode 100644 index 0000000..42b981e --- /dev/null +++ b/Assets/Oculus/VR/Oculus.VR.asmdef @@ -0,0 +1,20 @@ +{ + "name": "Oculus.VR", + "references": [], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "versionDefines": [ + { + "name": "com.unity.xr.management", + "expression": "", + "define": "USING_XR_MANAGEMENT" + }, + { + "name": "com.unity.xr.oculus", + "expression": "", + "define": "USING_XR_SDK_OCULUS" + } + ] +} \ No newline at end of file diff --git a/Assets/Oculus/VR/Oculus.VR.asmdef.meta b/Assets/Oculus/VR/Oculus.VR.asmdef.meta new file mode 100644 index 0000000..65849bb --- /dev/null +++ b/Assets/Oculus/VR/Oculus.VR.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f64c9ebcd7899c3448a08dc9f9ddbe30 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins.meta b/Assets/Oculus/VR/Plugins.meta new file mode 100644 index 0000000..2a29f5c --- /dev/null +++ b/Assets/Oculus/VR/Plugins.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e1f06b56b3e7614419c5db24e2262938 +folderAsset: yes +timeCreated: 1493321336 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/1.44.0.meta b/Assets/Oculus/VR/Plugins/1.44.0.meta new file mode 100644 index 0000000..b8e0223 --- /dev/null +++ b/Assets/Oculus/VR/Plugins/1.44.0.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e7b8f2a984176f946a5d2b6c0c93f757 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/1.44.0/Android.meta b/Assets/Oculus/VR/Plugins/1.44.0/Android.meta new file mode 100644 index 0000000..450bbdf --- /dev/null +++ b/Assets/Oculus/VR/Plugins/1.44.0/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1bbe7de66ea429d40a5cd54729d5c9f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/1.44.0/Android/OVRPlugin.aar b/Assets/Oculus/VR/Plugins/1.44.0/Android/OVRPlugin.aar new file mode 100644 index 0000000..2dac8c8 Binary files /dev/null and b/Assets/Oculus/VR/Plugins/1.44.0/Android/OVRPlugin.aar differ diff --git a/Assets/Oculus/VR/Plugins/1.44.0/Android/OVRPlugin.aar.meta b/Assets/Oculus/VR/Plugins/1.44.0/Android/OVRPlugin.aar.meta new file mode 100644 index 0000000..ec1e1f2 --- /dev/null +++ b/Assets/Oculus/VR/Plugins/1.44.0/Android/OVRPlugin.aar.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: 64a5e221251d1a84e9130fe12729f839 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 0 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/1.44.0/AndroidUniversal.meta b/Assets/Oculus/VR/Plugins/1.44.0/AndroidUniversal.meta new file mode 100644 index 0000000..7dc1791 --- /dev/null +++ b/Assets/Oculus/VR/Plugins/1.44.0/AndroidUniversal.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5471a7517d1a76f46a4acf7fe9f47051 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/1.44.0/AndroidUniversal/OVRPlugin.aar b/Assets/Oculus/VR/Plugins/1.44.0/AndroidUniversal/OVRPlugin.aar new file mode 100644 index 0000000..eaf73cd Binary files /dev/null and b/Assets/Oculus/VR/Plugins/1.44.0/AndroidUniversal/OVRPlugin.aar differ diff --git a/Assets/Oculus/VR/Plugins/1.44.0/AndroidUniversal/OVRPlugin.aar.meta b/Assets/Oculus/VR/Plugins/1.44.0/AndroidUniversal/OVRPlugin.aar.meta new file mode 100644 index 0000000..b7af706 --- /dev/null +++ b/Assets/Oculus/VR/Plugins/1.44.0/AndroidUniversal/OVRPlugin.aar.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: 7c3365dfff8d64541ae4bddfc2acbafc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/1.44.0/Win.meta b/Assets/Oculus/VR/Plugins/1.44.0/Win.meta new file mode 100644 index 0000000..902771d --- /dev/null +++ b/Assets/Oculus/VR/Plugins/1.44.0/Win.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 981626e338d0c3645bf65b985e16301c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/1.44.0/Win/OVRPlugin.dll b/Assets/Oculus/VR/Plugins/1.44.0/Win/OVRPlugin.dll new file mode 100644 index 0000000..19eaedf Binary files /dev/null and b/Assets/Oculus/VR/Plugins/1.44.0/Win/OVRPlugin.dll differ diff --git a/Assets/Oculus/VR/Plugins/1.44.0/Win/OVRPlugin.dll.meta b/Assets/Oculus/VR/Plugins/1.44.0/Win/OVRPlugin.dll.meta new file mode 100644 index 0000000..c7645b1 --- /dev/null +++ b/Assets/Oculus/VR/Plugins/1.44.0/Win/OVRPlugin.dll.meta @@ -0,0 +1,41 @@ +fileFormatVersion: 2 +guid: a78b03c53f6a7c648b4c1da0cb4c3694 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Editor + second: + enabled: 0 + settings: + CPU: X86 + OS: Windows + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: X86 + DefaultValueInitialized: true + OS: Windows + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/1.44.0/Win64.meta b/Assets/Oculus/VR/Plugins/1.44.0/Win64.meta new file mode 100644 index 0000000..fb379a0 --- /dev/null +++ b/Assets/Oculus/VR/Plugins/1.44.0/Win64.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3d84750b61662814da5451dbae7ca888 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/1.44.0/Win64/OVRPlugin.dll b/Assets/Oculus/VR/Plugins/1.44.0/Win64/OVRPlugin.dll new file mode 100644 index 0000000..5eed06a Binary files /dev/null and b/Assets/Oculus/VR/Plugins/1.44.0/Win64/OVRPlugin.dll differ diff --git a/Assets/Oculus/VR/Plugins/1.44.0/Win64/OVRPlugin.dll.meta b/Assets/Oculus/VR/Plugins/1.44.0/Win64/OVRPlugin.dll.meta new file mode 100644 index 0000000..f56a1fc --- /dev/null +++ b/Assets/Oculus/VR/Plugins/1.44.0/Win64/OVRPlugin.dll.meta @@ -0,0 +1,41 @@ +fileFormatVersion: 2 +guid: 92aeff2f25d36774b98a3c878d32d4f4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Editor + second: + enabled: 0 + settings: + CPU: X86_64 + OS: Windows + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: X86_64 + DefaultValueInitialized: true + OS: Windows + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/MacOSX.meta b/Assets/Oculus/VR/Plugins/MacOSX.meta new file mode 100644 index 0000000..55b1e0f --- /dev/null +++ b/Assets/Oculus/VR/Plugins/MacOSX.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3b0808cda9a8d4b458fad2788f63ff7f +folderAsset: yes +timeCreated: 1522878718 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle.meta b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle.meta new file mode 100644 index 0000000..dee76e2 --- /dev/null +++ b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle.meta @@ -0,0 +1,141 @@ +fileFormatVersion: 2 +guid: 537f08a1aac8553459f3574a939a05ed +folderAsset: yes +timeCreated: 1441326310 +licenseType: Store +PluginImporter: + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + data: + first: + '': WP8 + second: + enabled: 0 + settings: + CPU: AnyCPU + DontProcess: False + PlaceholderPath: + data: + first: + Android: Android + second: + enabled: 0 + settings: + CPU: AnyCPU + data: + first: + Any: + second: + enabled: 0 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: OSX + data: + first: + Facebook: Win + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Facebook: Win64 + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Samsung TV: SamsungTV + second: + enabled: 0 + settings: + STV_MODEL: STANDARD_13 + data: + first: + Standalone: Linux + second: + enabled: 0 + settings: + CPU: x86 + data: + first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: x86_64 + data: + first: + Standalone: LinuxUniversal + second: + enabled: 0 + settings: + CPU: None + data: + first: + Standalone: OSXIntel + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Standalone: OSXIntel64 + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Standalone: Win + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Standalone: Win64 + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + DontProcess: False + PlaceholderPath: + SDK: AnySDK + data: + first: + iPhone: iOS + second: + enabled: 0 + settings: + CompileFlags: + FrameworkDependencies: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents.meta b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents.meta new file mode 100644 index 0000000..e6fba7d --- /dev/null +++ b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 648a2605a2bc848728f27adc59fe8010 +folderAsset: yes +timeCreated: 1441327083 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/Info.plist b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/Info.plist new file mode 100644 index 0000000..7420b23 --- /dev/null +++ b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/Info.plist @@ -0,0 +1,36 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + OVRGamepad + CFBundleGetInfoString + + CFBundleIconFile + + CFBundleIdentifier + + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLongVersionString + + CFBundleName + + CFBundlePackageType + APPL + CFBundleShortVersionString + + CFBundleSignature + ???? + CFBundleVersion + + CSResourcesFileMapped + + LSRequiresCarbon + + NSHumanReadableCopyright + + + diff --git a/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/Info.plist.meta b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/Info.plist.meta new file mode 100644 index 0000000..ebc9dac --- /dev/null +++ b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/Info.plist.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5de957de5187b406687f99aa5a30871b +timeCreated: 1441327083 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/MacOS.meta b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/MacOS.meta new file mode 100644 index 0000000..3fcc44b --- /dev/null +++ b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/MacOS.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8fad9c333897547a59f91edacd69f7db +folderAsset: yes +timeCreated: 1441327083 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/MacOS/OVRGamepad b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/MacOS/OVRGamepad new file mode 100644 index 0000000..7c7bf1c Binary files /dev/null and b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/MacOS/OVRGamepad differ diff --git a/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/MacOS/OVRGamepad.meta b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/MacOS/OVRGamepad.meta new file mode 100644 index 0000000..a9e1324 --- /dev/null +++ b/Assets/Oculus/VR/Plugins/MacOSX/OVRGamepad.bundle/Contents/MacOS/OVRGamepad.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3af79ea9cc1984e498b6a7e5409cdcac +timeCreated: 1441327083 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Plugins/placeholder.txt b/Assets/Oculus/VR/Plugins/placeholder.txt new file mode 100644 index 0000000..e69de29 diff --git a/Assets/Oculus/VR/Plugins/placeholder.txt.meta b/Assets/Oculus/VR/Plugins/placeholder.txt.meta new file mode 100644 index 0000000..8e735aa --- /dev/null +++ b/Assets/Oculus/VR/Plugins/placeholder.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6c111fff50cd6404baf2b833432e6ee8 +timeCreated: 1493325988 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Prefabs.meta b/Assets/Oculus/VR/Prefabs.meta new file mode 100644 index 0000000..598abc3 --- /dev/null +++ b/Assets/Oculus/VR/Prefabs.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: bfe39332fdb4cb044b619b3e4b890396 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Oculus/VR/Prefabs/Cursor_Timer.prefab b/Assets/Oculus/VR/Prefabs/Cursor_Timer.prefab new file mode 100644 index 0000000..15972c9 --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/Cursor_Timer.prefab @@ -0,0 +1,70 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &100000 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 400000} + - 33: {fileID: 3300000} + - 23: {fileID: 2300000} + m_Layer: 0 + m_Name: Cursor_Timer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &400000 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100000} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.70000005, z: 1} + m_LocalScale: {x: .25, y: .25, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 +--- !u!23 &2300000 +Renderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100000} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_LightmapIndex: 255 + m_LightmapTilingOffset: {x: 1, y: 1, z: 0, w: 0} + m_Materials: + - {fileID: 2100000, guid: 9531aa878fd5c4749b288b72024e8d2f, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_LightProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3300000 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100000} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 100000} + m_IsPrefabParent: 1 + m_IsExploded: 1 diff --git a/Assets/Oculus/VR/Prefabs/Cursor_Timer.prefab.meta b/Assets/Oculus/VR/Prefabs/Cursor_Timer.prefab.meta new file mode 100644 index 0000000..4d32837 --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/Cursor_Timer.prefab.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 5a7682c244a150b49965c007720bdbb7 +NativeFormatImporter: + userData: diff --git a/Assets/Oculus/VR/Prefabs/OVRCameraRig.prefab b/Assets/Oculus/VR/Prefabs/OVRCameraRig.prefab new file mode 100644 index 0000000..19b69a8 --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/OVRCameraRig.prefab @@ -0,0 +1,509 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &100000 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 400000} + - component: {fileID: 20000010189485334} + m_Layer: 0 + m_Name: RightEyeAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &100002 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 400002} + - component: {fileID: 8100000} + - component: {fileID: 2037080} + m_Layer: 0 + m_Name: CenterEyeAnchor + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &100004 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 400004} + - component: {fileID: 11400010} + - component: {fileID: 11400000} + - component: {fileID: 114473266101150724} + m_Layer: 0 + m_Name: OVRCameraRig + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &100006 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 400006} + - component: {fileID: 20000012175207052} + m_Layer: 0 + m_Name: LeftEyeAnchor + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &109308 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 482130} + m_Layer: 0 + m_Name: LeftHandAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &113768 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 487254} + m_Layer: 0 + m_Name: RightHandAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &159718 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 459718} + m_Layer: 0 + m_Name: TrackingSpace + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &168682 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 468682} + m_Layer: 0 + m_Name: TrackerAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &400000 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100000} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 459718} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &400002 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100002} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 459718} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &400004 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100004} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 459718} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &400006 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100006} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 459718} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &459718 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 159718} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 400006} + - {fileID: 400002} + - {fileID: 400000} + - {fileID: 468682} + - {fileID: 482130} + - {fileID: 487254} + m_Father: {fileID: 400004} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &468682 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 168682} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 459718} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &482130 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 109308} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4593680705043960} + m_Father: {fileID: 459718} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &487254 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 113768} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4484591312116288} + m_Father: {fileID: 459718} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &2037080 +Camera: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100002} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0.019607844} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 1000 + field of view: 90 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!81 &8100000 +AudioListener: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100002} + m_Enabled: 1 +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100004} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7e933e81d3c20c74ea6fdc708a67e3a5, type: 3} + m_Name: + m_EditorClassIdentifier: + queueAhead: 1 + useRecommendedMSAALevel: 1 + _monoscopic: 0 + enableAdaptiveResolution: 0 + minRenderScale: 0.7 + maxRenderScale: 1 + _headPoseRelativeOffsetRotation: {x: 0, y: 0, z: 0} + _headPoseRelativeOffsetTranslation: {x: 0, y: 0, z: 0} + profilerTcpPort: 32419 + expandMixedRealityCapturePropertySheet: 0 + enableMixedReality: 0 + compositionMethod: 0 + extraHiddenLayers: + serializedVersion: 2 + m_Bits: 0 + externalCompositionBackdropColor: {r: 0, g: 0, b: 0, a: 0} + capturingCameraDevice: 0 + flipCameraFrameHorizontally: 0 + flipCameraFrameVertically: 0 + handPoseStateLatency: 0 + sandwichCompositionRenderLatency: 0 + sandwichCompositionBufferedFrames: 8 + chromaKeyColor: {r: 0, g: 1, b: 0, a: 1} + chromaKeySimilarity: 0.6 + chromaKeySmoothRange: 0.03 + chromaKeySpillRange: 0.06 + useDynamicLighting: 0 + depthQuality: 1 + dynamicLightingSmoothFactor: 8 + dynamicLightingDepthVariationClampingValue: 0.001 + virtualGreenScreenType: 0 + virtualGreenScreenTopY: 10 + virtualGreenScreenBottomY: -10 + virtualGreenScreenApplyDepthCulling: 0 + virtualGreenScreenDepthTolerance: 0.2 + mrcActivationMode: 0 + _trackingOriginType: 0 + usePositionTracking: 1 + useRotationTracking: 1 + useIPDInPositionTracking: 1 + resetTrackerOnLoad: 0 + AllowRecenter: 1 + _reorientHMDOnControllerRecenter: 1 + LateControllerUpdate: 1 +--- !u!114 &11400010 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100004} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df9f338034892c44ebb62d97894772f1, type: 3} + m_Name: + m_EditorClassIdentifier: + usePerEyeCameras: 0 + useFixedUpdateForTracking: 0 + disableEyeAnchorCameras: 0 +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 100004} + m_IsPrefabParent: 1 +--- !u!1 &1054112583220142 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4484591312116288} + m_Layer: 0 + m_Name: RightControllerAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1983321904398200 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4593680705043960} + m_Layer: 0 + m_Name: LeftControllerAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4484591312116288 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1054112583220142} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 487254} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4593680705043960 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1983321904398200} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 482130} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &20000010189485334 +Camera: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100000} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 2 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!20 &20000012175207052 +Camera: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100006} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 1 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!114 &114473266101150724 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100004} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5178bc8574ce2bf4388e787a2e2af326, type: 3} + m_Name: + m_EditorClassIdentifier: + opMode: 1 + resetHmdPoseOnRelease: 1 + resetHmdPoseByMiddleMouseButton: 1 + activateKeys: 3201000031010000 + pitchKeys: 3401000033010000 diff --git a/Assets/Oculus/VR/Prefabs/OVRCameraRig.prefab.meta b/Assets/Oculus/VR/Prefabs/OVRCameraRig.prefab.meta new file mode 100644 index 0000000..6286515 --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/OVRCameraRig.prefab.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 126d619cf4daa52469682f85c1378b4a +NativeFormatImporter: + userData: diff --git a/Assets/Oculus/VR/Prefabs/OVRControllerPrefab.prefab b/Assets/Oculus/VR/Prefabs/OVRControllerPrefab.prefab new file mode 100644 index 0000000..caf303d --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/OVRControllerPrefab.prefab @@ -0,0 +1,3003 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &112276 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 488160} + - component: {fileID: 11479374} + m_Layer: 0 + m_Name: OVRControllerPrefab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &488160 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 112276} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4000011296770734} + - {fileID: 4464436526328426} + - {fileID: 4018669889632488} + - {fileID: 4590459659269666} + - {fileID: 4674903275779108} + - {fileID: 4424331664721706} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &11479374 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 112276} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: aed62bf3ae2456c408f247f96808ce96, type: 3} + m_Name: + m_EditorClassIdentifier: + m_modelGearVrController: {fileID: 1000010178323718} + m_modelOculusGoController: {fileID: 1956530202777762} + m_modelOculusTouchQuestAndRiftSLeftController: {fileID: 1864357959958104} + m_modelOculusTouchQuestAndRiftSRightController: {fileID: 1307870489563208} + m_modelOculusTouchRiftLeftController: {fileID: 1999073185825882} + m_modelOculusTouchRiftRightController: {fileID: 1351868014986946} + m_controller: 33554432 +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 112276} + m_IsPrefabParent: 1 +--- !u!1 &1000010178323718 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4000011296770734} + m_Layer: 0 + m_Name: GearVrControllerModel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1000011436655710 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4000012142331768} + - component: {fileID: 33000013153656990} + - component: {fileID: 23000011768000172} + m_Layer: 0 + m_Name: home_button_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1000011549955176 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4000012748093882} + - component: {fileID: 33000013186836272} + - component: {fileID: 23000013477210968} + m_Layer: 0 + m_Name: trigger_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1000012388513744 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4000010547406920} + - component: {fileID: 33000013134621756} + - component: {fileID: 23000010895726220} + m_Layer: 0 + m_Name: chassis_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1000012567764716 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4000010554578882} + - component: {fileID: 33000013511306870} + - component: {fileID: 23000012129420234} + m_Layer: 0 + m_Name: disc_button_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1000013696185028 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4000011347987256} + - component: {fileID: 33000013945561740} + - component: {fileID: 23000010818504298} + m_Layer: 0 + m_Name: back_button_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1000013718830530 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4000011835757296} + - component: {fileID: 33000010177796194} + - component: {fileID: 23000011389392996} + m_Layer: 0 + m_Name: text_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1000014047055526 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4000012637917122} + - component: {fileID: 33000013874298672} + - component: {fileID: 23000010051961506} + m_Layer: 0 + m_Name: center_button_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1043718319765106 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4217597188290772} + - component: {fileID: 137516833752771690} + m_Layer: 0 + m_Name: rctrl:o_button_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1046305140630946 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4145440608189314} + - component: {fileID: 137894515578887148} + m_Layer: 0 + m_Name: rctrl:ring_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1111836968271984 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4930198374904308} + m_Layer: 0 + m_Name: lctrl:b_trigger + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1150514829769540 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4054458720371030} + - component: {fileID: 137953460083308940} + m_Layer: 0 + m_Name: lctrl:main_trigger_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1153598635317830 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4475506175273502} + m_Layer: 0 + m_Name: lctrl:b_button01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1163019739493792 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4756900187738382} + m_Layer: 0 + m_Name: rctrl:b_trigger + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1175928214747458 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4160029557842794} + m_Layer: 0 + m_Name: rctrl:b_button03 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1272650095541868 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4984268951621866} + m_Layer: 0 + m_Name: rctrl:b_button02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1291433702725222 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4497618915451418} + m_Layer: 0 + m_Name: rctrl:geometry_null + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1307870489563208 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4590459659269666} + - component: {fileID: 33487662383985252} + - component: {fileID: 23740872028335676} + - component: {fileID: 95033031799970748} + m_Layer: 0 + m_Name: OculusTouchForQuestAndRiftSRightModel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1341283074334724 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4986827042887056} + m_Layer: 0 + m_Name: lctrl:b_button02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1346558941273396 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4336468700419714} + m_Layer: 0 + m_Name: lctrl:b_button03 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1351868014986946 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4424331664721706} + - component: {fileID: 95159725740943820} + m_Layer: 0 + m_Name: OculusTouchForRiftRightModel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1407562648133754 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4966908025643000} + m_Layer: 0 + m_Name: lctrl:b_stick_IGNORE + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1410792866537844 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4183120237395500} + m_Layer: 0 + m_Name: lctrl:b_hold + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1420546792291356 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4622968367758772} + m_Layer: 0 + m_Name: lctrl:left_touch_controller_world + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1501938979627348 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4781385269134180} + - component: {fileID: 137132433173345654} + m_Layer: 0 + m_Name: lctrl:side_trigger_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1580528522853954 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4519872946202134} + - component: {fileID: 137548540825210660} + m_Layer: 0 + m_Name: rctrl:controller_body_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1582883067469128 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4287477734124642} + - component: {fileID: 137013385765703262} + m_Layer: 0 + m_Name: lctrl:o_button_decal_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1591694296978774 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4488555750834636} + m_Layer: 0 + m_Name: rctrl:b_stick + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1634122703765650 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4835306428485234} + - component: {fileID: 137410385877248658} + m_Layer: 0 + m_Name: rctrl:thumbstick_ball_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1640091058704360 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4291277175788902} + m_Layer: 0 + m_Name: lctrl:geometry_null + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1653136352874222 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4844326987582138} + - component: {fileID: 137799296538821628} + m_Layer: 0 + m_Name: lctrl:controller_body_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1680001862499580 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4620985457895698} + m_Layer: 0 + m_Name: lctrl:b_stick + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1694063663317782 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4501959689107672} + m_Layer: 0 + m_Name: rctrl:b_hold + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1715807544907940 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4556676711426526} + m_Layer: 0 + m_Name: rctrl:right_touch_controller_world + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1731361599223734 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4593899846663936} + - component: {fileID: 137670343033052700} + m_Layer: 0 + m_Name: rctrl:o_button_decal_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1738261221487676 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4840275246547096} + - component: {fileID: 137020412966494170} + m_Layer: 0 + m_Name: rctrl:a_button_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1741382130313638 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4684588568180746} + - component: {fileID: 137310653907615322} + m_Layer: 0 + m_Name: lctrl:surface_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1758321880106294 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4401767331493524} + - component: {fileID: 137812751115180306} + m_Layer: 0 + m_Name: rctrl:side_trigger_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1833973838428082 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4626860071786586} + - component: {fileID: 137378573564850912} + m_Layer: 0 + m_Name: rctrl:b_button_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1846566732132504 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4471428637981784} + - component: {fileID: 137580252240055964} + m_Layer: 0 + m_Name: lctrl:y_button_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1864357959958104 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4018669889632488} + - component: {fileID: 33444066182808318} + - component: {fileID: 23022262598936998} + - component: {fileID: 95091669218293994} + m_Layer: 0 + m_Name: OculusTouchForQuestAndRiftSLeftModel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1864589419913158 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4043977657542554} + - component: {fileID: 137306554513006224} + m_Layer: 0 + m_Name: lctrl:thumbstick_ball_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1914456947047296 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4441198579746148} + - component: {fileID: 137735589292049982} + m_Layer: 0 + m_Name: rctrl:main_trigger_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1925473343199970 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4782286329022162} + - component: {fileID: 137119327089857916} + m_Layer: 0 + m_Name: lctrl:ring_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1930270789047778 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4944515266127590} + - component: {fileID: 137039721825203164} + m_Layer: 0 + m_Name: lctrl:x_button_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1937342357854408 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4771435348981660} + - component: {fileID: 137967895554077838} + m_Layer: 0 + m_Name: lctrl:o_button_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1938084028754538 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4273564299776498} + - component: {fileID: 137903369291241316} + m_Layer: 0 + m_Name: rctrl:surface_PLY + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1944473258442844 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4356416327803184} + m_Layer: 0 + m_Name: rctrl:b_button01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1956530202777762 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4464436526328426} + - component: {fileID: 33356632527651328} + - component: {fileID: 23705978566827108} + m_Layer: 0 + m_Name: OculusGoControllerModel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1971879593916346 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4095537424049504} + m_Layer: 0 + m_Name: rctrl:b_stick_IGNORE + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1999073185825882 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4674903275779108} + - component: {fileID: 95607614017261978} + m_Layer: 0 + m_Name: OculusTouchForRiftLeftModel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000010547406920 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000012388513744} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0.00007190227, z: -0.023617705} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4000011296770734} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4000010554578882 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000012567764716} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0.00007190227, z: -0.023617705} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4000011296770734} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4000011296770734 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000010178323718} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4000011347987256} + - {fileID: 4000012637917122} + - {fileID: 4000010547406920} + - {fileID: 4000010554578882} + - {fileID: 4000012142331768} + - {fileID: 4000011835757296} + - {fileID: 4000012748093882} + m_Father: {fileID: 488160} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4000011347987256 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000013696185028} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0.00007190227, z: -0.023617705} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4000011296770734} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4000011835757296 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000013718830530} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0.00007190227, z: -0.023617705} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4000011296770734} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4000012142331768 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000011436655710} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0.00007190227, z: -0.023617705} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4000011296770734} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4000012637917122 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000014047055526} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0.00007190227, z: -0.023617705} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4000011296770734} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4000012748093882 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000011549955176} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0.00007190227, z: -0.023617705} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4000011296770734} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4018669889632488 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1864357959958104} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 488160} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4043977657542554 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1864589419913158} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4291277175788902} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4054458720371030 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1150514829769540} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4291277175788902} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4095537424049504 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1971879593916346} + m_LocalRotation: {x: -4.5059287e-17, y: -0.70108956, z: -6.5911624e-17, w: 0.71307325} + m_LocalPosition: {x: -0.019321036, y: 0, z: 9.992007e-18} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4488555750834636} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4145440608189314 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1046305140630946} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4497618915451418} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4160029557842794 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1175928214747458} + m_LocalRotation: {x: 0.07876507, y: 0.01894126, z: 0.5343878, w: 0.8413483} + m_LocalPosition: {x: -0.012083728, y: -0.01402681, z: -0.0007126567} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4556676711426526} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4183120237395500 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1410792866537844} + m_LocalRotation: {x: -0.18065539, y: -0.13555649, z: -0.067166515, w: 0.97184193} + m_LocalPosition: {x: 0.013074442, y: -0.025639696, z: -0.027427113} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4622968367758772} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4217597188290772 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1043718319765106} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4497618915451418} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4273564299776498 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1938084028754538} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4497618915451418} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4287477734124642 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1582883067469128} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4291277175788902} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4291277175788902 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1640091058704360} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4844326987582138} + - {fileID: 4054458720371030} + - {fileID: 4287477734124642} + - {fileID: 4771435348981660} + - {fileID: 4782286329022162} + - {fileID: 4781385269134180} + - {fileID: 4684588568180746} + - {fileID: 4043977657542554} + - {fileID: 4944515266127590} + - {fileID: 4471428637981784} + m_Father: {fileID: 4674903275779108} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4336468700419714 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1346558941273396} + m_LocalRotation: {x: 0.05660452, y: -0.05795374, z: -0.0046757394, w: 0.9967023} + m_LocalPosition: {x: 0.012083728, y: -0.01402681, z: -0.0007126567} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4622968367758772} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4356416327803184 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1944473258442844} + m_LocalRotation: {x: 0.056604527, y: 0.05795374, z: 0.004675739, w: 0.9967023} + m_LocalPosition: {x: 0.0019170768, y: -0.0073837424, z: -0.00091214647} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4556676711426526} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4401767331493524 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1758321880106294} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4497618915451418} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4424331664721706 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1351868014986946} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4497618915451418} + - {fileID: 4556676711426526} + m_Father: {fileID: 488160} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4441198579746148 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1914456947047296} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4497618915451418} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4464436526328426 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1956530202777762} + m_LocalRotation: {x: 6.123234e-17, y: -0.0000000754979, z: 6.1232336e-17, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 488160} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4471428637981784 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1846566732132504} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4291277175788902} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4475506175273502 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1153598635317830} + m_LocalRotation: {x: 0.05660452, y: -0.05795374, z: -0.0046757394, w: 0.9967023} + m_LocalPosition: {x: -0.0019170768, y: -0.0073837424, z: -0.00091214647} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4622968367758772} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4488555750834636 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1591694296978774} + m_LocalRotation: {x: -0.003149668, y: 0.7098123, z: 0.002783398, w: 0.7043784} + m_LocalPosition: {x: -0.010637393, y: 0.00497835, z: -0.009418557} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4095537424049504} + m_Father: {fileID: 4556676711426526} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4497618915451418 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1291433702725222} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4840275246547096} + - {fileID: 4626860071786586} + - {fileID: 4519872946202134} + - {fileID: 4441198579746148} + - {fileID: 4593899846663936} + - {fileID: 4217597188290772} + - {fileID: 4145440608189314} + - {fileID: 4401767331493524} + - {fileID: 4273564299776498} + - {fileID: 4835306428485234} + m_Father: {fileID: 4424331664721706} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4501959689107672 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1694063663317782} + m_LocalRotation: {x: -0.17913595, y: 0.14914332, z: 0.022661837, w: 0.97218984} + m_LocalPosition: {x: -0.013074442, y: -0.025639696, z: -0.027427113} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4556676711426526} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4519872946202134 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1580528522853954} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4497618915451418} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4556676711426526 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1715807544907940} + m_LocalRotation: {x: 0, y: 0.7071068, z: 0.7071068, w: -8.659561e-17} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4356416327803184} + - {fileID: 4984268951621866} + - {fileID: 4160029557842794} + - {fileID: 4501959689107672} + - {fileID: 4488555750834636} + - {fileID: 4756900187738382} + m_Father: {fileID: 4424331664721706} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4590459659269666 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1307870489563208} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 488160} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4593899846663936 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1731361599223734} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4497618915451418} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4620985457895698 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1680001862499580} + m_LocalRotation: {x: 0.0027868259, y: 0.70437866, z: -0.0031505642, w: 0.7098119} + m_LocalPosition: {x: 0.010637393, y: 0.00497835, z: -0.009418557} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4966908025643000} + m_Father: {fileID: 4622968367758772} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4622968367758772 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1420546792291356} + m_LocalRotation: {x: 0, y: 0.7071068, z: 0.7071068, w: -8.659561e-17} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4475506175273502} + - {fileID: 4986827042887056} + - {fileID: 4336468700419714} + - {fileID: 4183120237395500} + - {fileID: 4620985457895698} + - {fileID: 4930198374904308} + m_Father: {fileID: 4674903275779108} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4626860071786586 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1833973838428082} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4497618915451418} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4674903275779108 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1999073185825882} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4291277175788902} + - {fileID: 4622968367758772} + m_Father: {fileID: 488160} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4684588568180746 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1741382130313638} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4291277175788902} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4756900187738382 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1163019739493792} + m_LocalRotation: {x: 0.056604527, y: 0.05795374, z: 0.004675739, w: 0.9967023} + m_LocalPosition: {x: 0.001420367, y: 0.021865888, z: -0.005495974} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4556676711426526} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4771435348981660 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1937342357854408} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4291277175788902} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4781385269134180 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1501938979627348} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4291277175788902} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4782286329022162 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1925473343199970} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4291277175788902} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4835306428485234 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1634122703765650} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4497618915451418} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4840275246547096 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1738261221487676} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4497618915451418} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4844326987582138 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1653136352874222} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4291277175788902} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4930198374904308 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1111836968271984} + m_LocalRotation: {x: -0.05795374, y: -0.05660452, z: 0.9967023, w: 0.0046757394} + m_LocalPosition: {x: -0.001420367, y: 0.021865888, z: -0.005495974} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4622968367758772} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4944515266127590 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1930270789047778} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4291277175788902} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4966908025643000 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1407562648133754} + m_LocalRotation: {x: 0, y: -0.70108956, z: -0, w: 0.71307325} + m_LocalPosition: {x: -0.019321036, y: 0, z: 9.992007e-18} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4620985457895698} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4984268951621866 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1272650095541868} + m_LocalRotation: {x: 0.07876507, y: 0.01894126, z: 0.5343878, w: 0.8413483} + m_LocalPosition: {x: 0.009152712, y: 0.0054823146, z: 0.000030916483} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4556676711426526} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4986827042887056 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1341283074334724} + m_LocalRotation: {x: 0.017080953, y: -0.07918932, z: 0.52647054, w: 0.84632504} + m_LocalPosition: {x: -0.0091353385, y: 0.005499125, z: -0.00011681918} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4622968367758772} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &23000010051961506 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000014047055526} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: f6ccc53b9bcfb114996e76ee88ce6948, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23000010818504298 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000013696185028} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: f6ccc53b9bcfb114996e76ee88ce6948, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23000010895726220 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000012388513744} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: f6ccc53b9bcfb114996e76ee88ce6948, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23000011389392996 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000013718830530} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: f6ccc53b9bcfb114996e76ee88ce6948, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23000011768000172 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000011436655710} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: f6ccc53b9bcfb114996e76ee88ce6948, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23000012129420234 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000012567764716} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: f6ccc53b9bcfb114996e76ee88ce6948, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23000013477210968 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000011549955176} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: f6ccc53b9bcfb114996e76ee88ce6948, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23022262598936998 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1864357959958104} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 01ac879f6ce09924e9c26663f798beaf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23705978566827108 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1956530202777762} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 6c0b208d35ece4a459821be19df69561, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23740872028335676 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1307870489563208} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 01ac879f6ce09924e9c26663f798beaf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &33000010177796194 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000013718830530} + m_Mesh: {fileID: 4300000, guid: 84c37137326e7b943a87be7ae2a7ea19, type: 3} +--- !u!33 &33000013134621756 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000012388513744} + m_Mesh: {fileID: 4300012, guid: 84c37137326e7b943a87be7ae2a7ea19, type: 3} +--- !u!33 &33000013153656990 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000011436655710} + m_Mesh: {fileID: 4300006, guid: 84c37137326e7b943a87be7ae2a7ea19, type: 3} +--- !u!33 &33000013186836272 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000011549955176} + m_Mesh: {fileID: 4300004, guid: 84c37137326e7b943a87be7ae2a7ea19, type: 3} +--- !u!33 &33000013511306870 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000012567764716} + m_Mesh: {fileID: 4300010, guid: 84c37137326e7b943a87be7ae2a7ea19, type: 3} +--- !u!33 &33000013874298672 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000014047055526} + m_Mesh: {fileID: 4300002, guid: 84c37137326e7b943a87be7ae2a7ea19, type: 3} +--- !u!33 &33000013945561740 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1000013696185028} + m_Mesh: {fileID: 4300008, guid: 84c37137326e7b943a87be7ae2a7ea19, type: 3} +--- !u!33 &33356632527651328 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1956530202777762} + m_Mesh: {fileID: 4300000, guid: e0f1914fdbfd3764faeff5474c0cbe1e, type: 3} +--- !u!33 &33444066182808318 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1864357959958104} + m_Mesh: {fileID: 4300000, guid: 32fbc8bcebb64584da5868aeeb086cda, type: 3} +--- !u!33 &33487662383985252 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1307870489563208} + m_Mesh: {fileID: 4300000, guid: 37ba10a26a648144fa2390c8adfb2c8a, type: 3} +--- !u!95 &95033031799970748 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1307870489563208} + m_Enabled: 1 + m_Avatar: {fileID: 9000000, guid: 37ba10a26a648144fa2390c8adfb2c8a, type: 3} + m_Controller: {fileID: 0} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 +--- !u!95 &95091669218293994 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1864357959958104} + m_Enabled: 1 + m_Avatar: {fileID: 9000000, guid: 32fbc8bcebb64584da5868aeeb086cda, type: 3} + m_Controller: {fileID: 0} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 +--- !u!95 &95159725740943820 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1351868014986946} + m_Enabled: 1 + m_Avatar: {fileID: 9000000, guid: eb8e07cd3e0ce494f81482c6835d2b10, type: 3} + m_Controller: {fileID: 0} + m_CullingMode: 1 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 +--- !u!95 &95607614017261978 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1999073185825882} + m_Enabled: 1 + m_Avatar: {fileID: 9000000, guid: 45137ecb2b0f9ba45b80adefb16de509, type: 3} + m_Controller: {fileID: 0} + m_CullingMode: 1 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 +--- !u!137 &137013385765703262 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1582883067469128} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300000, guid: 45137ecb2b0f9ba45b80adefb16de509, type: 3} + m_Bones: + - {fileID: 4336468700419714} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4336468700419714} + m_AABB: + m_Center: {x: 0.000017451588, y: -0.00010048866, z: 0.0012767098} + m_Extent: {x: 0.00211959, y: 0.001628002, z: 0.000015275553} + m_DirtyAABB: 0 +--- !u!137 &137020412966494170 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1738261221487676} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300018, guid: eb8e07cd3e0ce494f81482c6835d2b10, type: 3} + m_Bones: + - {fileID: 4356416327803184} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4356416327803184} + m_AABB: + m_Center: {x: 0.0000007292256, y: 0.000013417564, z: 0.00051031867} + m_Extent: {x: 0.0050891023, y: 0.005111115, z: 0.0025862483} + m_DirtyAABB: 0 +--- !u!137 &137039721825203164 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1930270789047778} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300004, guid: 45137ecb2b0f9ba45b80adefb16de509, type: 3} + m_Bones: + - {fileID: 4475506175273502} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4475506175273502} + m_AABB: + m_Center: {x: -0.00000072829425, y: 0.000013418496, z: 0.0004995642} + m_Extent: {x: 0.0050891023, y: 0.005111114, z: 0.0025754946} + m_DirtyAABB: 0 +--- !u!137 &137119327089857916 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1925473343199970} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300008, guid: 45137ecb2b0f9ba45b80adefb16de509, type: 3} + m_Bones: + - {fileID: 4622968367758772} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4622968367758772} + m_AABB: + m_Center: {x: 0.016699282, y: 0.010818447, z: -0.036364146} + m_Extent: {x: 0.054633915, y: 0.02167825, z: 0.050220706} + m_DirtyAABB: 0 +--- !u!137 &137132433173345654 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1501938979627348} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300018, guid: 45137ecb2b0f9ba45b80adefb16de509, type: 3} + m_Bones: + - {fileID: 4183120237395500} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4183120237395500} + m_AABB: + m_Center: {x: -0.015075568, y: -0.000016345643, z: 0.0018507424} + m_Extent: {x: 0.0069265533, y: 0.014548335, z: 0.007307569} + m_DirtyAABB: 0 +--- !u!137 &137306554513006224 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1864589419913158} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300016, guid: 45137ecb2b0f9ba45b80adefb16de509, type: 3} + m_Bones: + - {fileID: 4622968367758772} + - {fileID: 4620985457895698} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4622968367758772} + m_AABB: + m_Center: {x: 0.010604477, y: 0.0049807085, z: 0.0022465447} + m_Extent: {x: 0.010754766, y: 0.010751986, z: 0.007853852} + m_DirtyAABB: 0 +--- !u!137 &137310653907615322 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1741382130313638} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300002, guid: 45137ecb2b0f9ba45b80adefb16de509, type: 3} + m_Bones: + - {fileID: 4622968367758772} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4622968367758772} + m_AABB: + m_Center: {x: 0.00016466714, y: 0.00024955533, z: -0.0010734661} + m_Extent: {x: 0.02819586, y: 0.02827545, z: 0.005969927} + m_DirtyAABB: 0 +--- !u!137 &137378573564850912 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1833973838428082} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300016, guid: eb8e07cd3e0ce494f81482c6835d2b10, type: 3} + m_Bones: + - {fileID: 4984268951621866} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4984268951621866} + m_AABB: + m_Center: {x: 0.000000345055, y: -0.0000009192154, z: 0.0003571303} + m_Extent: {x: 0.0050524976, y: 0.0050528734, z: 0.0025179689} + m_DirtyAABB: 0 +--- !u!137 &137410385877248658 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1634122703765650} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300012, guid: eb8e07cd3e0ce494f81482c6835d2b10, type: 3} + m_Bones: + - {fileID: 4556676711426526} + - {fileID: 4488555750834636} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4556676711426526} + m_AABB: + m_Center: {x: -0.01054777, y: 0.004984765, z: 0.00224772} + m_Extent: {x: 0.010899382, y: 0.010843774, z: 0.007860384} + m_DirtyAABB: 0 +--- !u!137 &137516833752771690 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1043718319765106} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300010, guid: eb8e07cd3e0ce494f81482c6835d2b10, type: 3} + m_Bones: + - {fileID: 4160029557842794} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4160029557842794} + m_AABB: + m_Center: {x: -0.00000026635826, y: -0.00000013131648, z: 0.0005419669} + m_Extent: {x: 0.004489839, y: 0.0044893455, z: 0.0007474746} + m_DirtyAABB: 0 +--- !u!137 &137548540825210660 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1580528522853954} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300006, guid: eb8e07cd3e0ce494f81482c6835d2b10, type: 3} + m_Bones: + - {fileID: 4556676711426526} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4556676711426526} + m_AABB: + m_Center: {x: -0.0012377053, y: -0.019060574, z: -0.031160347} + m_Extent: {x: 0.030484851, y: 0.051344886, z: 0.035910763} + m_DirtyAABB: 0 +--- !u!137 &137580252240055964 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1846566732132504} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300006, guid: 45137ecb2b0f9ba45b80adefb16de509, type: 3} + m_Bones: + - {fileID: 4986827042887056} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4986827042887056} + m_AABB: + m_Center: {x: 0.0000023958273, y: -0.000002474524, z: 0.0004961197} + m_Extent: {x: 0.005060065, y: 0.0050237104, z: 0.0025072566} + m_DirtyAABB: 0 +--- !u!137 &137670343033052700 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1731361599223734} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300000, guid: eb8e07cd3e0ce494f81482c6835d2b10, type: 3} + m_Bones: + - {fileID: 4160029557842794} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4160029557842794} + m_AABB: + m_Center: {x: 0.00004066783, y: 0.00002745376, z: 0.0012303367} + m_Extent: {x: 0.0015236214, y: 0.0021297487, z: 0.00001941109} + m_DirtyAABB: 0 +--- !u!137 &137735589292049982 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1914456947047296} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300008, guid: eb8e07cd3e0ce494f81482c6835d2b10, type: 3} + m_Bones: + - {fileID: 4756900187738382} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4756900187738382} + m_AABB: + m_Center: {x: -0.0006609438, y: -0.0013324562, z: -0.013972085} + m_Extent: {x: 0.014561905, y: 0.009363498, z: 0.013364948} + m_DirtyAABB: 0 +--- !u!137 &137799296538821628 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1653136352874222} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300010, guid: 45137ecb2b0f9ba45b80adefb16de509, type: 3} + m_Bones: + - {fileID: 4622968367758772} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4622968367758772} + m_AABB: + m_Center: {x: 0.0012377053, y: -0.01906057, z: -0.031179678} + m_Extent: {x: 0.030484851, y: 0.051344883, z: 0.03589144} + m_DirtyAABB: 0 +--- !u!137 &137812751115180306 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1758321880106294} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300014, guid: eb8e07cd3e0ce494f81482c6835d2b10, type: 3} + m_Bones: + - {fileID: 4501959689107672} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4501959689107672} + m_AABB: + m_Center: {x: 0.015085926, y: 0.00079575554, z: 0.0022845895} + m_Extent: {x: 0.0075142607, y: 0.014562387, z: 0.0074783238} + m_DirtyAABB: 0 +--- !u!137 &137894515578887148 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1046305140630946} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300004, guid: eb8e07cd3e0ce494f81482c6835d2b10, type: 3} + m_Bones: + - {fileID: 4556676711426526} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4556676711426526} + m_AABB: + m_Center: {x: -0.016699282, y: 0.010818443, z: -0.036364153} + m_Extent: {x: 0.054633915, y: 0.021678247, z: 0.050220713} + m_DirtyAABB: 0 +--- !u!137 &137903369291241316 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1938084028754538} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300002, guid: eb8e07cd3e0ce494f81482c6835d2b10, type: 3} + m_Bones: + - {fileID: 4556676711426526} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4556676711426526} + m_AABB: + m_Center: {x: -0.00016466714, y: 0.00024955347, z: -0.0010734657} + m_Extent: {x: 0.02819586, y: 0.02827545, z: 0.0059699244} + m_DirtyAABB: 0 +--- !u!137 &137953460083308940 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1150514829769540} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300012, guid: 45137ecb2b0f9ba45b80adefb16de509, type: 3} + m_Bones: + - {fileID: 4930198374904308} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4930198374904308} + m_AABB: + m_Center: {x: -0.0006609438, y: 0.0013324535, z: -0.013972079} + m_Extent: {x: 0.0145619055, y: 0.009363498, z: 0.0133649465} + m_DirtyAABB: 0 +--- !u!137 &137967895554077838 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1937342357854408} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: eacafe280fdfa6a44845c135057ae6a5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300014, guid: 45137ecb2b0f9ba45b80adefb16de509, type: 3} + m_Bones: + - {fileID: 4336468700419714} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 4336468700419714} + m_AABB: + m_Center: {x: 0.00000037020072, y: 0.00000087032095, z: 0.00057196105} + m_Extent: {x: 0.004508083, y: 0.004509521, z: 0.0007474739} + m_DirtyAABB: 0 diff --git a/Assets/Oculus/VR/Prefabs/OVRControllerPrefab.prefab.meta b/Assets/Oculus/VR/Prefabs/OVRControllerPrefab.prefab.meta new file mode 100644 index 0000000..226b4d7 --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/OVRControllerPrefab.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d9809c5e8418bb047bf2c8ba1d1a2cec +timeCreated: 1486168892 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Prefabs/OVRCubemapCaptureProbe.prefab b/Assets/Oculus/VR/Prefabs/OVRCubemapCaptureProbe.prefab new file mode 100644 index 0000000..a4469f4 --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/OVRCubemapCaptureProbe.prefab @@ -0,0 +1,58 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &115974 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 400110} + - 114: {fileID: 11407504} + m_Layer: 0 + m_Name: OVRCubemapCaptureProbe + m_TagString: Untagged + m_Icon: {fileID: 2974397684917235467, guid: 0000000000000000d000000000000000, type: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &400110 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 115974} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3.74, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 +--- !u!114 &11407504 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 115974} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7a489178b0acf0147846b3873447beaf, type: 3} + m_Name: + m_EditorClassIdentifier: + autoTriggerAfterLaunch: 1 + autoTriggerDelay: 1 + triggeredByKey: 289 + pathName: + cubemapSize: 2048 +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 115974} + m_IsPrefabParent: 1 diff --git a/Assets/Oculus/VR/Prefabs/OVRCubemapCaptureProbe.prefab.meta b/Assets/Oculus/VR/Prefabs/OVRCubemapCaptureProbe.prefab.meta new file mode 100644 index 0000000..88f8bcd --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/OVRCubemapCaptureProbe.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7a400e96d4650ff4e827a7e727fad81d +timeCreated: 1464847331 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Prefabs/OVRHandPrefab.prefab b/Assets/Oculus/VR/Prefabs/OVRHandPrefab.prefab new file mode 100644 index 0000000..75b5806 --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/OVRHandPrefab.prefab @@ -0,0 +1,157 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 1870938896605422} + m_IsPrefabParent: 1 +--- !u!1 &1870938896605422 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4453513310108136} + - component: {fileID: 114428879332287356} + - component: {fileID: 114567484643301796} + - component: {fileID: 114392993255165844} + - component: {fileID: 114925265787909616} + - component: {fileID: 114252240061623322} + - component: {fileID: 137619227449585070} + m_Layer: 0 + m_Name: OVRHandPrefab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4453513310108136 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1870938896605422} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &114252240061623322 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1870938896605422} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73eac66b128fc8749a21623225c34541, type: 3} + m_Name: + m_EditorClassIdentifier: + _ovrMesh: {fileID: 0} + _ovrSkeleton: {fileID: 0} +--- !u!114 &114392993255165844 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1870938896605422} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 54c16b381e28e8d479237771d234dbae, type: 3} + m_Name: + m_EditorClassIdentifier: + _skeletonMaterial: {fileID: 0} +--- !u!114 &114428879332287356 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1870938896605422} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cb7623a8f0b49cf4dbaa40aea4d4be64, type: 3} + m_Name: + m_EditorClassIdentifier: + HandType: 0 +--- !u!114 &114567484643301796 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1870938896605422} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2609c54f376cffc4da1ab9401cc1a36f, type: 3} + m_Name: + m_EditorClassIdentifier: + _skeletonType: 0 + _updateRootPose: 0 + _updateRootScale: 1 + _enablePhysicsCapsules: 0 +--- !u!114 &114925265787909616 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1870938896605422} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5cc5c234723e3a54d8dd09b131117743, type: 3} + m_Name: + m_EditorClassIdentifier: + _meshType: 0 +--- !u!137 &137619227449585070 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1870938896605422} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 5ba7d209f622bb44e87b47ce27ee27b7, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 0} + m_Bones: [] + m_BlendShapeWeights: [] + m_RootBone: {fileID: 0} + m_AABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_DirtyAABB: 1 diff --git a/Assets/Oculus/VR/Prefabs/OVRHandPrefab.prefab.meta b/Assets/Oculus/VR/Prefabs/OVRHandPrefab.prefab.meta new file mode 100644 index 0000000..b73508d --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/OVRHandPrefab.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 835e735ca71bf78459fb2cababd74112 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Prefabs/OVRPlayerController.prefab b/Assets/Oculus/VR/Prefabs/OVRPlayerController.prefab new file mode 100644 index 0000000..80a6b96 --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/OVRPlayerController.prefab @@ -0,0 +1,656 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &100004 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 400008} + - component: {fileID: 11400020} + - component: {fileID: 11400002} + - component: {fileID: 114814064252544740} + m_Layer: 0 + m_Name: OVRCameraRig + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &100006 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 400002} + m_Layer: 0 + m_Name: ForwardDirection + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &100008 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 400006} + - component: {fileID: 14300000} + - component: {fileID: 11400010} + - component: {fileID: 11462408} + - component: {fileID: 11493974} + m_Layer: 0 + m_Name: OVRPlayerController + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &100010 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 400010} + - component: {fileID: 20131489337305086} + m_Layer: 0 + m_Name: LeftEyeAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &100012 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 400012} + - component: {fileID: 8100000} + - component: {fileID: 2015248} + - component: {fileID: 11414578} + m_Layer: 0 + m_Name: CenterEyeAnchor + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &100014 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 400014} + - component: {fileID: 20504667576486672} + m_Layer: 0 + m_Name: RightEyeAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &134650 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 481164} + m_Layer: 0 + m_Name: RightHandAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &162066 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 462066} + m_Layer: 0 + m_Name: TrackingSpace + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &162068 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 462068} + m_Layer: 0 + m_Name: TrackerAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &168962 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 477154} + m_Layer: 0 + m_Name: LeftHandAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &400002 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100006} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 400006} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &400006 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100008} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 400002} + - {fileID: 400008} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &400008 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100004} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 462066} + m_Father: {fileID: 400006} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &400010 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100010} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 462066} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &400012 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100012} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 462066} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &400014 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100014} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 462066} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &462066 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 162066} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 400010} + - {fileID: 400012} + - {fileID: 400014} + - {fileID: 462068} + - {fileID: 477154} + - {fileID: 481164} + m_Father: {fileID: 400008} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &462068 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 162068} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 462066} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &477154 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 168962} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4188412984752900} + m_Father: {fileID: 462066} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &481164 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 134650} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4471613377008970} + m_Father: {fileID: 462066} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &2015248 +Camera: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100012} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0.019607844} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 1000 + field of view: 90 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!81 &8100000 +AudioListener: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100012} + m_Enabled: 1 +--- !u!114 &11400002 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100004} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7e933e81d3c20c74ea6fdc708a67e3a5, type: 3} + m_Name: + m_EditorClassIdentifier: + queueAhead: 1 + useRecommendedMSAALevel: 1 + _monoscopic: 0 + enableAdaptiveResolution: 0 + minRenderScale: 0.7 + maxRenderScale: 1 + _headPoseRelativeOffsetRotation: {x: 0, y: 0, z: 0} + _headPoseRelativeOffsetTranslation: {x: 0, y: 0, z: 0} + profilerTcpPort: 32419 + expandMixedRealityCapturePropertySheet: 0 + enableMixedReality: 0 + compositionMethod: 0 + extraHiddenLayers: + serializedVersion: 2 + m_Bits: 0 + externalCompositionBackdropColor: {r: 0, g: 0, b: 0, a: 0} + capturingCameraDevice: 0 + flipCameraFrameHorizontally: 0 + flipCameraFrameVertically: 0 + handPoseStateLatency: 0 + sandwichCompositionRenderLatency: 0 + sandwichCompositionBufferedFrames: 8 + chromaKeyColor: {r: 0, g: 1, b: 0, a: 1} + chromaKeySimilarity: 0.6 + chromaKeySmoothRange: 0.03 + chromaKeySpillRange: 0.06 + useDynamicLighting: 0 + depthQuality: 1 + dynamicLightingSmoothFactor: 8 + dynamicLightingDepthVariationClampingValue: 0.001 + virtualGreenScreenType: 0 + virtualGreenScreenTopY: 10 + virtualGreenScreenBottomY: -10 + virtualGreenScreenApplyDepthCulling: 0 + virtualGreenScreenDepthTolerance: 0.2 + mrcActivationMode: 0 + _trackingOriginType: 0 + usePositionTracking: 1 + useRotationTracking: 1 + useIPDInPositionTracking: 1 + resetTrackerOnLoad: 0 + AllowRecenter: 1 + _reorientHMDOnControllerRecenter: 1 + LateControllerUpdate: 1 +--- !u!114 &11400010 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100008} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0950df82e7936c84983497630bde5b54, type: 3} + m_Name: + m_EditorClassIdentifier: + Acceleration: 0.1 + Damping: 0.3 + BackAndSideDampen: 0.5 + JumpForce: 0.3 + RotationAmount: 1.5 + RotationRatchet: 45 + SnapRotation: 1 + FixedSpeedSteps: 0 + HmdResetsY: 1 + HmdRotatesY: 1 + GravityModifier: 1 + useProfileData: 1 + EnableLinearMovement: 1 + EnableRotation: 1 + RotationEitherThumbstick: 0 +--- !u!114 &11400020 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100004} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df9f338034892c44ebb62d97894772f1, type: 3} + m_Name: + m_EditorClassIdentifier: + usePerEyeCameras: 0 + useFixedUpdateForTracking: 0 + disableEyeAnchorCameras: 0 +--- !u!114 &11414578 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100012} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df8e1d778abf442e4bec449c360e9e1c, type: 3} + m_Name: + m_EditorClassIdentifier: + fadeTime: 2 + fadeColor: {r: 0.01, g: 0.01, b: 0.01, a: 1} + fadeOnStart: 1 + renderQueue: 5000 +--- !u!114 &11462408 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100008} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f07515ada089df47868559a20dd6783, type: 3} + m_Name: + m_EditorClassIdentifier: + quitKey: 27 + fadeInTexture: {fileID: 0} + speedRotationIncrement: 0.05 + layerName: Default +--- !u!114 &11493974 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100008} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b71d1996d67004241a3b69960856ffcb, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!143 &14300000 +CharacterController: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100008} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Height: 2 + m_Radius: 0.5 + m_SlopeLimit: 45 + m_StepOffset: 0.3 + m_SkinWidth: 0.01 + m_MinMoveDistance: 0 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 100008} + m_IsPrefabParent: 1 +--- !u!1 &1125068011842588 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4471613377008970} + m_Layer: 0 + m_Name: RightControllerAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1660603843503870 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4188412984752900} + m_Layer: 0 + m_Name: LeftControllerAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4188412984752900 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1660603843503870} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 477154} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4471613377008970 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1125068011842588} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 481164} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &20131489337305086 +Camera: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100010} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 1 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!20 &20504667576486672 +Camera: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100014} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 2 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!114 &114814064252544740 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100004} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5178bc8574ce2bf4388e787a2e2af326, type: 3} + m_Name: + m_EditorClassIdentifier: + opMode: 1 + resetHmdPoseOnRelease: 1 + resetHmdPoseByMiddleMouseButton: 1 + activateKeys: 3201000031010000 + pitchKeys: 3401000033010000 diff --git a/Assets/Oculus/VR/Prefabs/OVRPlayerController.prefab.meta b/Assets/Oculus/VR/Prefabs/OVRPlayerController.prefab.meta new file mode 100644 index 0000000..06e2a6b --- /dev/null +++ b/Assets/Oculus/VR/Prefabs/OVRPlayerController.prefab.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: ce816f2e6abb0504092c23ed9b970dfd +NativeFormatImporter: + userData: diff --git a/Assets/Oculus/VR/Resources.meta b/Assets/Oculus/VR/Resources.meta new file mode 100644 index 0000000..475b401 --- /dev/null +++ b/Assets/Oculus/VR/Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 807714291dbf2a54c9b3975c271b2493 +folderAsset: yes +timeCreated: 1466707364 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Resources/Cubemap Blit.shader b/Assets/Oculus/VR/Resources/Cubemap Blit.shader new file mode 100644 index 0000000..dd1ba78 --- /dev/null +++ b/Assets/Oculus/VR/Resources/Cubemap Blit.shader @@ -0,0 +1,75 @@ +Shader "Oculus/Cubemap Blit" { + Properties{ + _MainTex("Base (RGB) Trans (A)", CUBE) = "white" {} + _face("Face", Int) = 0 + _linearToSrgb("Perform linear-to-gamma conversion", Int) = 0 + _premultiply("Cubemap Blit", Int) = 0 + } + SubShader{ + Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + + Pass{ + ZWrite Off + ColorMask RGBA + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata_t + { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + half3 cubedir : TEXCOORD0; + }; + + samplerCUBE _MainTex; + float4 _MainTex_ST; + int _face; + int _linearToSrgb; + int _premultiply; + + v2f vert (appdata_t va) + { + v2f vo; + vo.vertex = UnityObjectToClipPos(va.vertex); + + //Face bases, assuming +x, -x, +z, -z, +y, -y with origin at bottom-left. + float3 o[6] = { {1.0, -1.0, 1.0}, {-1.0, -1.0, -1.0}, {-1.0, 1.0, 1.0}, {-1.0, -1.0, -1.0}, {-1.0, -1.0, 1.0}, { 1.0, -1.0, -1.0} }; + float3 u[6] = { {0.0, 0.0, -1.0}, { 0.0, 0.0, 1.0}, { 1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, {-1.0, 0.0, 0.0} }; + float3 v[6] = { {0.0, 1.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, -1.0}, { 0.0, 0.0, 1.0}, { 0.0, 1.0, 0.0}, { 0.0, 1.0, 0.0} }; + + //Map the input UV to the corresponding face basis. + vo.cubedir = o[_face] + 2.0*va.texcoord.x * u[_face] + 2.0*(1.0 - va.texcoord.y) * v[_face]; + + return vo; + } + + fixed4 frag (v2f vi) : COLOR + { + fixed4 col = texCUBE(_MainTex, vi.cubedir); + + if (_linearToSrgb) + { + float3 S1 = sqrt(col.rgb); + float3 S2 = sqrt(S1); + float3 S3 = sqrt(S2); + col.rgb = 0.662002687 * S1 + 0.684122060 * S2 - 0.323583601 * S3 - 0.0225411470 * col.rgb; + } + + if (_premultiply) + col.rgb *= col.a; + + return col; + } + ENDCG + } + } +} diff --git a/Assets/Oculus/VR/Resources/Cubemap Blit.shader.meta b/Assets/Oculus/VR/Resources/Cubemap Blit.shader.meta new file mode 100644 index 0000000..b4199dc --- /dev/null +++ b/Assets/Oculus/VR/Resources/Cubemap Blit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 561ccac587275c745aec500620f12fc7 +timeCreated: 1507678760 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Resources/OVRMRCameraFrame.shader b/Assets/Oculus/VR/Resources/OVRMRCameraFrame.shader new file mode 100644 index 0000000..b2c082a --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRCameraFrame.shader @@ -0,0 +1,99 @@ +Shader "Oculus/OVRMRCameraFrame" +{ + Properties + { + _Color("Main Color", Color) = (1,1,1,1) + _MainTex("Main Texture", 2D) = "white" {} + _Visible("Visible", Range(0.0,1.0)) = 1.0 + _ChromaAlphaCutoff("ChromaAlphaCutoff", Range(0.0,1.0)) = 0.01 + _ChromaToleranceA("ChromaToleranceA", Range(0.0,50.0)) = 20.0 + _ChromaToleranceB("ChromaToleranceB", Range(0.0,50.0)) = 15.0 + _ChromaShadows("ChromaShadows", Range(0.0,1.0)) = 0.02 + } + SubShader + { + Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + Blend SrcAlpha OneMinusSrcAlpha + AlphaTest Greater .01 + Fog{ Mode Off } + LOD 100 + Cull Off + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "OVRMRChromaKey.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + float2 texcoord : TEXCOORD0; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + sampler2D _MaskTex; + + float4 _TextureDimension; // (w, h, 1/w, 1/h) + + fixed4 _Color; + fixed _Visible; + float4 _FlipParams; // (flip_h, flip_v, 0, 0) + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.vertex *= _Visible; + o.texcoord = TRANSFORM_TEX(float2(v.texcoord.x, 1.0-v.texcoord.y), _MainTex); + return o; + } + + fixed GetMask(float2 uv) + { + return tex2D(_MaskTex, uv).r; + } + + fixed4 GetCameraColor(float2 colorUV) + { + fixed4 c = tex2D(_MainTex, colorUV) * _Color; + return c; + } + + fixed4 frag (v2f i) : SV_Target + { + float2 colorUV = i.texcoord; + if (_FlipParams.x > 0.0) + { + colorUV.x = 1.0 - colorUV.x; + } + if (_FlipParams.y > 0.0) + { + colorUV.y = 1.0 - colorUV.y; + } + float mask = GetMask(float2(colorUV.x, 1.0 - colorUV.y)); + if (mask == 0.0) + { + discard; + } + float4 col = GetColorAfterChromaKey(colorUV, _TextureDimension.zw, 1.0); + if (col.a < 0.0) + { + discard; + } + return col; + } + ENDCG + } + } +} diff --git a/Assets/Oculus/VR/Resources/OVRMRCameraFrame.shader.meta b/Assets/Oculus/VR/Resources/OVRMRCameraFrame.shader.meta new file mode 100644 index 0000000..5e161da --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRCameraFrame.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2bd7618c3fa0e4b4ab8e08dc3fadc376 +timeCreated: 1497574409 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Resources/OVRMRCameraFrameLit.shader b/Assets/Oculus/VR/Resources/OVRMRCameraFrameLit.shader new file mode 100644 index 0000000..985092f --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRCameraFrameLit.shader @@ -0,0 +1,112 @@ +Shader "Oculus/OVRMRCameraFrameLit" { + Properties{ + _Color("Color", Color) = (1,1,1,1) + _MainTex("Albedo (RGB)", 2D) = "white" {} + _DepthTex("Depth (cm)", 2D) = "black" {} + _InconfidenceTex("Inconfidence (0-100)", 2D) = "black" {} + _Visible("Visible", Range(0.0,1.0)) = 1.0 + } + SubShader{ + Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" } + LOD 200 + + CGPROGRAM + #pragma surface surf Lambert alpha:fade + #pragma target 3.0 + + #include "OVRMRChromaKey.cginc" + + #define TEST_ENVIRONMENT 0 + + sampler2D _MainTex; + sampler2D _DepthTex; + sampler2D _MaskTex; + + float4 _TextureDimension; // (w, h, 1/w, 1/h) + float4 _TextureWorldSize; // (width_in_meter, height_in_meter, 0, 0) + + float _SmoothFactor; + float _DepthVariationClamp; + + float _CullingDistance; + + struct Input { + #if TEST_ENVIRONMENT + float2 uv_MainTex; + #endif + float4 screenPos; + }; + + fixed4 _Color; + fixed _Visible; + float4 _FlipParams; // (flip_h, flip_v, 0, 0) + + fixed GetMask(float2 uv) + { + return tex2D(_MaskTex, uv).r; + } + + fixed4 GetCameraColor(float2 colorUV) + { + fixed4 c = tex2D(_MainTex, colorUV) * _Color; + return c; + } + + float GetDepth(float2 uv) + { + float depth = tex2D(_DepthTex, uv).x * 1.0 / 100; + return depth; + } + + float3 GetNormal(float2 uv) + { + float dz_x = GetDepth(uv + float2(_TextureDimension.z, 0)) - GetDepth(uv - float2(_TextureDimension.z, 0)); + float dz_y = GetDepth(uv + float2(0, _TextureDimension.w)) - GetDepth(uv - float2(0, _TextureDimension.w)); + dz_x = clamp(dz_x, -_DepthVariationClamp, _DepthVariationClamp); + dz_y = clamp(dz_y, -_DepthVariationClamp, _DepthVariationClamp); + //float dist = 0.01; + //float3 normal = cross(float3(dist, 0, dz_x), float3(0, dist, dz_y)); + float3 normal = cross(float3(_TextureWorldSize.x * _TextureDimension.z * 2.0 * _SmoothFactor, 0, dz_x), float3(0, _TextureWorldSize.y * _TextureDimension.w * 2.0 * _SmoothFactor, dz_y)); + normal = normalize(normal); + return normal; + } + + void surf(Input IN, inout SurfaceOutput o) { + #if TEST_ENVIRONMENT + float2 colorUV = float2(IN.uv_MainTex.x, IN.uv_MainTex.y); + #else + float2 screenUV = IN.screenPos.xy / IN.screenPos.w; + float2 colorUV = float2(screenUV.x, 1.0 - screenUV.y); + #endif + if (_FlipParams.x > 0.0) + { + colorUV.x = 1.0 - colorUV.x; + } + if (_FlipParams.y > 0.0) + { + colorUV.y = 1.0 - colorUV.y; + } + float mask = GetMask(colorUV); + if (mask == 0.0) + { + discard; + } + float4 col = GetColorAfterChromaKey(colorUV, _TextureDimension.zw, 1.0); + if (col.a < 0.0) + { + discard; + } + float depth = GetDepth(colorUV); + if (depth > _CullingDistance) + { + discard; + } + float3 normal = GetNormal(colorUV); + o.Albedo = col.rgb; + o.Normal = normal; + o.Alpha = col.a *_Visible; + } + ENDCG + } + FallBack "Alpha-Diffuse" +} diff --git a/Assets/Oculus/VR/Resources/OVRMRCameraFrameLit.shader.meta b/Assets/Oculus/VR/Resources/OVRMRCameraFrameLit.shader.meta new file mode 100644 index 0000000..7fccea2 --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRCameraFrameLit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a8577c885e80d8043946ac5b7abcf9a1 +timeCreated: 1497574409 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Resources/OVRMRChromaKey.cginc b/Assets/Oculus/VR/Resources/OVRMRChromaKey.cginc new file mode 100644 index 0000000..50ceb7d --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRChromaKey.cginc @@ -0,0 +1,103 @@ +fixed4 _ChromaKeyColor; +float _ChromaKeySimilarity; +float _ChromaKeySmoothRange; +float _ChromaKeySpillRange; + +// https://en.wikipedia.org/wiki/YUV +float3 RGB2YUV(float3 rgb) +{ + float r = rgb.x; + float g = rgb.y; + float b = rgb.z; + float y = 0.2126 * r + 0.7152 * g + 0.0722 * b; + float u = -0.09991 * r - 0.33609 * g + 0.436 * b; + float v = 0.615 * r - 0.55861 * g - 0.05639 * b; + return float3(y, u, v); +} + +float3 YUV2RGB(float3 yuv) +{ + float y = yuv.x; + float u = yuv.y; + float v = yuv.z; + float r = y + 1.28033 * v; + float g = y - 0.21482 * u - 0.38059 * v; + float b = y + 2.12798 * u; + return float3(r, g, b); +} + +fixed4 GetCameraColor(float2 colorUV); + +float ColorDistance_YUV_YUV(float3 yuv1, float3 yuv2) +{ + float dist = distance(yuv1.yz, yuv2.yz); + // Increase the distance if the brightness of the first color is too high. + // It fixed the error on the over exposure areas + dist += saturate(yuv1.x - 0.9); + return dist; +} + +float ColorDistance_RGB_YUV(float3 rgb1, float3 yuv2) +{ + float3 yuv1 = RGB2YUV(rgb1); + return ColorDistance_YUV_YUV(yuv1, yuv2); +} + + +float ColorDistance_RGB_RGB(float3 rgb1, float3 rgb2) +{ + float3 yuv1 = RGB2YUV(rgb1); + float3 yuv2 = RGB2YUV(rgb2); + return ColorDistance_YUV_YUV(yuv1, yuv2); +} + +float RGB2Gray(float3 rgb) +{ + float r = rgb.x; + float g = rgb.y; + float b = rgb.z; + float y = 0.2126 * r + 0.7152 * g + 0.0722 * b; + return y; +} + +float GetAlphaFromDistance(float dist) +{ + float result = smoothstep(_ChromaKeySimilarity, _ChromaKeySimilarity + _ChromaKeySmoothRange, dist); + result = result * result; + return result; +} + +float GetSpillFromDistance(float dist) +{ + float result = smoothstep(_ChromaKeySimilarity, _ChromaKeySimilarity + _ChromaKeySpillRange, dist); + result = result * result * result; + return result; +} + + +float4 GetColorAfterChromaKey(float2 UV, float2 deltaUV, float step) +{ + float3 chromaColor = _ChromaKeyColor.rgb; + float3 chromaYUV = RGB2YUV(chromaColor); + float dist = 0.0; + const int samples = 3; + float offset = ((float)samples - 1.0) / 2.0; + for (int i = 0; i < samples; ++i) + { + for (int j = 0; j < samples; ++j) + { + fixed4 color = GetCameraColor(UV + float2((float)i - offset, (float)j - offset) * deltaUV * step); + float d = ColorDistance_RGB_YUV(color, chromaYUV); + dist += d; + } + } + dist /= (samples * samples); + fixed4 centerColor = GetCameraColor(UV); + float alpha = GetAlphaFromDistance(dist); + float spill = GetSpillFromDistance(dist); + float gray = RGB2Gray(centerColor.rgb); + float4 outColor; + outColor.rgb = lerp(float3(gray, gray, gray), centerColor.rgb, spill); + outColor.a = alpha; + return outColor; +} diff --git a/Assets/Oculus/VR/Resources/OVRMRChromaKey.cginc.meta b/Assets/Oculus/VR/Resources/OVRMRChromaKey.cginc.meta new file mode 100644 index 0000000..94f8dac --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRChromaKey.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 680577023e93e564c9b00f18b0164afa +timeCreated: 1503944830 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Resources/OVRMRClipPlane.shader b/Assets/Oculus/VR/Resources/OVRMRClipPlane.shader new file mode 100644 index 0000000..3a2e679 --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRClipPlane.shader @@ -0,0 +1,50 @@ +Shader "Oculus/OVRMRClipPlane" +{ + Properties + { + _Color("Chroma Key Color", Color) = (0,1,0,1) + _Visible("Visible", Range(0.0,1.0)) = 1.0 + } + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + }; + + fixed4 _Color; + fixed _Visible; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.vertex *= _Visible; + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + fixed4 col = _Color; + return col; + } + ENDCG + } + } +} diff --git a/Assets/Oculus/VR/Resources/OVRMRClipPlane.shader.meta b/Assets/Oculus/VR/Resources/OVRMRClipPlane.shader.meta new file mode 100644 index 0000000..541cc71 --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRClipPlane.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2ab721dccaa7e6f4693cedd904dfdcac +timeCreated: 1494743027 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Resources/OVRMRUnlit.shader b/Assets/Oculus/VR/Resources/OVRMRUnlit.shader new file mode 100644 index 0000000..a2cbd59 --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRUnlit.shader @@ -0,0 +1,48 @@ +Shader "Oculus/Unlit" { + Properties{ + _Color("Main Color", Color) = (1,1,1,1) + } + + SubShader{ + Tags{ "RenderType" = "Opaque" } + LOD 100 + + Pass{ + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + #pragma multi_compile_fog + + #include "UnityCG.cginc" + + struct appdata_t { + float4 vertex : POSITION; + }; + + struct v2f { + float4 vertex : SV_POSITION; + UNITY_FOG_COORDS(0) + }; + + fixed4 _Color; + + v2f vert(appdata_t v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + UNITY_TRANSFER_FOG(o,o.vertex); + return o; + } + + fixed4 frag(v2f i) : COLOR + { + fixed4 col = _Color; + UNITY_APPLY_FOG(i.fogCoord, col); + UNITY_OPAQUE_ALPHA(col.a); + return col; + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Oculus/VR/Resources/OVRMRUnlit.shader.meta b/Assets/Oculus/VR/Resources/OVRMRUnlit.shader.meta new file mode 100644 index 0000000..9ca9921 --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRUnlit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9aa46566e1d86644c9a55e3037e935f6 +timeCreated: 1504826310 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Resources/OVRMRUnlitTransparent.shader b/Assets/Oculus/VR/Resources/OVRMRUnlitTransparent.shader new file mode 100644 index 0000000..512a945 --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRUnlitTransparent.shader @@ -0,0 +1,54 @@ +Shader "Oculus/UnlitTransparent" { + Properties{ + _MainTex("Base (RGB) Trans (A)", 2D) = "white" {} + } + + SubShader{ + Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + LOD 100 + + ZWrite Off + Blend SrcAlpha OneMinusSrcAlpha + + Pass{ + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + #pragma multi_compile_fog + + #include "UnityCG.cginc" + + struct appdata_t { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : SV_POSITION; + half2 texcoord : TEXCOORD0; + UNITY_FOG_COORDS(1) + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + + v2f vert(appdata_t v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); + UNITY_TRANSFER_FOG(o,o.vertex); + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + fixed4 col = tex2D(_MainTex, i.texcoord); + UNITY_APPLY_FOG(i.fogCoord, col); + return col; + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Oculus/VR/Resources/OVRMRUnlitTransparent.shader.meta b/Assets/Oculus/VR/Resources/OVRMRUnlitTransparent.shader.meta new file mode 100644 index 0000000..312ab5f --- /dev/null +++ b/Assets/Oculus/VR/Resources/OVRMRUnlitTransparent.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 38ad33c152e32ee46a9bbbb0e656f7e1 +timeCreated: 1504826310 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Resources/Texture2D Blit.shader b/Assets/Oculus/VR/Resources/Texture2D Blit.shader new file mode 100644 index 0000000..c86e756 --- /dev/null +++ b/Assets/Oculus/VR/Resources/Texture2D Blit.shader @@ -0,0 +1,64 @@ +Shader "Oculus/Texture2D Blit" { + Properties{ + _MainTex("Base (RGB) Trans (A)", 2D) = "white" {} + _linearToSrgb("Perform linear-to-gamma conversion", Int) = 0 + _premultiply("Pre-multiply alpha", Int) = 0 + } + SubShader{ + Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + + Pass{ + ZWrite Off + ColorMask RGBA + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata_t + { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + half2 texcoord : TEXCOORD0; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + int _linearToSrgb; + int _premultiply; + + v2f vert (appdata_t v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + fixed4 frag (v2f i) : COLOR + { + fixed4 col = tex2D(_MainTex, i.texcoord); + if (_linearToSrgb) + { + float3 S1 = sqrt(col.rgb); + float3 S2 = sqrt(S1); + float3 S3 = sqrt(S2); + col.rgb = 0.662002687 * S1 + 0.684122060 * S2 - 0.323583601 * S3 - 0.0225411470 * col.rgb; + } + + if (_premultiply) + col.rgb *= col.a; + + return col; + } + ENDCG + } + } +} diff --git a/Assets/Oculus/VR/Resources/Texture2D Blit.shader.meta b/Assets/Oculus/VR/Resources/Texture2D Blit.shader.meta new file mode 100644 index 0000000..f9eec41 --- /dev/null +++ b/Assets/Oculus/VR/Resources/Texture2D Blit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a31796e9e8816c7448b55d584c9417f1 +timeCreated: 1498190241 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Resources/Underlay Impostor.shader b/Assets/Oculus/VR/Resources/Underlay Impostor.shader new file mode 100644 index 0000000..a55247e --- /dev/null +++ b/Assets/Oculus/VR/Resources/Underlay Impostor.shader @@ -0,0 +1,48 @@ +/* +This shader is used to render the impostor while clearing out the alpha of the eye buffer +The important details here are: +- the use of the Geometry+1 queue to make sure the impostor is drawn after all other opaque objects but before alpha +- the keepalpha parameter that allow unity to actually write the alpha we return at the end of the shader. +*/ + +Shader "Oculus/Underlay Impostor" { + Properties{ + _Color("Color", Color) = (1,1,1,1) + _MainTex("Albedo (RGB)", 2D) = "white" {} + _Glossiness("Smoothness", Range(0,1)) = 0.5 + _Metallic("Metallic", Range(0,1)) = 0.0 + } + SubShader{ + Tags { "Queue" = "Geometry+1" "RenderType" = "Opaque" } + LOD 200 + + CGPROGRAM + // Physically based Standard lighting model, and enable shadows on all light types + #pragma surface surf Standard fullforwardshadows keepalpha + + // Use shader model 3.0 target, to get nicer looking lighting + #pragma target 3.0 + + sampler2D _MainTex; + + struct Input { + float2 uv_MainTex; + }; + + half _Glossiness; + half _Metallic; + fixed4 _Color; + + void surf(Input IN, inout SurfaceOutputStandard o) { + // Albedo comes from a texture tinted by color + fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; + o.Albedo = c.rgb; + // Metallic and smoothness come from slider variables + o.Metallic = _Metallic; + o.Smoothness = _Glossiness; + o.Alpha = 0.f; + } + ENDCG + } + FallBack "Diffuse" +} diff --git a/Assets/Oculus/VR/Resources/Underlay Impostor.shader.meta b/Assets/Oculus/VR/Resources/Underlay Impostor.shader.meta new file mode 100644 index 0000000..6ab7548 --- /dev/null +++ b/Assets/Oculus/VR/Resources/Underlay Impostor.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: eaeac9ce83896a04691d2590189776f5 +timeCreated: 1471282585 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Resources/Underlay Transparent Occluder.shader b/Assets/Oculus/VR/Resources/Underlay Transparent Occluder.shader new file mode 100644 index 0000000..3bbf763 --- /dev/null +++ b/Assets/Oculus/VR/Resources/Underlay Transparent Occluder.shader @@ -0,0 +1,36 @@ +/* +Code for transparent object in front of the overlay +The keepalpha option is important to let unity maintain the alpha we return from the shader +*/ + +Shader "Oculus/Underlay Transparent Occluder" { + Properties{ + _Color("Main Color", Color) = (1,1,1,1) + _MainTex("Base (RGB) Trans (A)", 2D) = "white" {} + } + SubShader{ + Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + Blend SrcAlpha OneMinusSrcAlpha + + // extra pass that renders to depth buffer only + Pass{ + ZWrite On + ColorMask 0 + } + + CGPROGRAM + #pragma surface surf Lambert keepalpha + fixed4 _Color; + struct Input { + float4 color : COLOR; + }; + void surf(Input IN, inout SurfaceOutput o) { + o.Albedo = _Color.rgb; + o.Alpha = _Color.a; + } + ENDCG + } + + + Fallback "Transparent/VertexLit" +} diff --git a/Assets/Oculus/VR/Resources/Underlay Transparent Occluder.shader.meta b/Assets/Oculus/VR/Resources/Underlay Transparent Occluder.shader.meta new file mode 100644 index 0000000..edecc5c --- /dev/null +++ b/Assets/Oculus/VR/Resources/Underlay Transparent Occluder.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d6708eb99dec8334fb83db57b764097a +timeCreated: 1470867310 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Resources/Unlit Transparent Color.shader b/Assets/Oculus/VR/Resources/Unlit Transparent Color.shader new file mode 100644 index 0000000..4b8270e --- /dev/null +++ b/Assets/Oculus/VR/Resources/Unlit Transparent Color.shader @@ -0,0 +1,17 @@ +Shader "Oculus/Unlit Transparent Color" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + LOD 100 + Fog {Mode Off} + + ZTest Always + Blend SrcAlpha OneMinusSrcAlpha + Color [_Color] + + Pass {} +} +} diff --git a/Assets/Oculus/VR/Resources/Unlit Transparent Color.shader.meta b/Assets/Oculus/VR/Resources/Unlit Transparent Color.shader.meta new file mode 100644 index 0000000..263340d --- /dev/null +++ b/Assets/Oculus/VR/Resources/Unlit Transparent Color.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ced943c76cb8fb8489bab18c3dfcdcd3 +timeCreated: 1435284538 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scenes.meta b/Assets/Oculus/VR/Scenes.meta new file mode 100644 index 0000000..24df5c7 --- /dev/null +++ b/Assets/Oculus/VR/Scenes.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 68bc04068edcc1a4d89699ab4e2e69ae +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Oculus/VR/Scenes/ControllerModels.unity b/Assets/Oculus/VR/Scenes/ControllerModels.unity new file mode 100644 index 0000000..54949bd --- /dev/null +++ b/Assets/Oculus/VR/Scenes/ControllerModels.unity @@ -0,0 +1,6205 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientEquatorColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 1 + m_BakeResolution: 1 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 0 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 0 +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &36454512 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 36454513} + - component: {fileID: 36454516} + - component: {fileID: 36454515} + - component: {fileID: 36454514} + - component: {fileID: 36454518} + - component: {fileID: 36454517} + m_Layer: 0 + m_Name: Cube (20) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &36454513 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 19 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &36454514 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &36454515 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &36454516 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &36454517 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &36454518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &66877009 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 66877010} + - component: {fileID: 66877013} + - component: {fileID: 66877012} + - component: {fileID: 66877011} + - component: {fileID: 66877015} + - component: {fileID: 66877014} + m_Layer: 0 + m_Name: Cube (29) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &66877010 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 28 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &66877011 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &66877012 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &66877013 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &66877014 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &66877015 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &73524539 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 73524540} + - component: {fileID: 73524543} + - component: {fileID: 73524542} + - component: {fileID: 73524541} + - component: {fileID: 73524545} + - component: {fileID: 73524544} + m_Layer: 0 + m_Name: Cube (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &73524540 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &73524541 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &73524542 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &73524543 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &73524544 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &73524545 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &81954963 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 81954964} + m_Layer: 0 + m_Name: Grabbables + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &81954964 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81954963} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &107656903 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 107656907} + - component: {fileID: 107656906} + - component: {fileID: 107656905} + - component: {fileID: 107656904} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &107656904 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &107656905 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &107656906 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &107656907 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 5} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &113500680 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 113500681} + - component: {fileID: 113500684} + - component: {fileID: 113500683} + - component: {fileID: 113500682} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &113500681 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &113500682 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &113500683 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &113500684 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &154239276 stripped +Transform: + m_PrefabParentObject: {fileID: 4188412984752900, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!1 &156189377 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 156189378} + - component: {fileID: 156189381} + - component: {fileID: 156189380} + - component: {fileID: 156189379} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &156189378 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: -1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &156189379 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &156189380 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &156189381 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &166120574 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 166120575} + m_Layer: 0 + m_Name: Counter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &166120575 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 166120574} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1605028847} + - {fileID: 524771733} + - {fileID: 1519282573} + - {fileID: 1055723252} + - {fileID: 755868679} + - {fileID: 1962295111} + - {fileID: 243097430} + - {fileID: 261327897} + - {fileID: 383385450} + - {fileID: 1702096973} + - {fileID: 948387091} + - {fileID: 113500681} + - {fileID: 156189378} + - {fileID: 1500551998} + - {fileID: 907087224} + - {fileID: 580231891} + m_Father: {fileID: 346664030} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &204679842 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 204679846} + - component: {fileID: 204679845} + - component: {fileID: 204679844} + - component: {fileID: 204679843} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &204679843 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &204679844 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &204679845 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &204679846 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -5, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &206189564 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 206189565} + - component: {fileID: 206189568} + - component: {fileID: 206189567} + - component: {fileID: 206189566} + - component: {fileID: 206189570} + - component: {fileID: 206189569} + m_Layer: 0 + m_Name: Cube (12) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &206189565 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &206189566 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &206189567 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &206189568 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &206189569 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &206189570 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &210993500 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 210993504} + - component: {fileID: 210993503} + - component: {fileID: 210993502} + - component: {fileID: 210993501} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &210993501 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &210993502 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &210993503 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &210993504 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &224673155 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 224673156} + - component: {fileID: 224673159} + - component: {fileID: 224673158} + - component: {fileID: 224673157} + - component: {fileID: 224673161} + - component: {fileID: 224673160} + m_Layer: 0 + m_Name: Cube (11) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &224673156 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &224673157 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &224673158 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &224673159 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &224673160 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &224673161 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &243097429 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 243097430} + - component: {fileID: 243097433} + - component: {fileID: 243097432} + - component: {fileID: 243097431} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &243097430 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &243097431 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &243097432 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &243097433 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &261327896 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 261327897} + - component: {fileID: 261327900} + - component: {fileID: 261327899} + - component: {fileID: 261327898} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &261327897 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &261327898 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &261327899 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &261327900 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &329624603 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 329624604} + - component: {fileID: 329624607} + - component: {fileID: 329624606} + - component: {fileID: 329624605} + - component: {fileID: 329624609} + - component: {fileID: 329624608} + m_Layer: 0 + m_Name: Cube (14) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &329624604 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &329624605 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &329624606 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &329624607 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &329624608 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &329624609 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &346664029 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 346664030} + m_Layer: 0 + m_Name: Environment + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &346664030 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 346664029} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 537728712} + - {fileID: 166120575} + - {fileID: 1925469568} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &358988759 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 358988760} + - component: {fileID: 358988763} + - component: {fileID: 358988762} + - component: {fileID: 358988761} + - component: {fileID: 358988765} + - component: {fileID: 358988764} + m_Layer: 0 + m_Name: Cube (26) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &358988760 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 25 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &358988761 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &358988762 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &358988763 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &358988764 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &358988765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &383385449 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 383385450} + - component: {fileID: 383385453} + - component: {fileID: 383385452} + - component: {fileID: 383385451} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &383385450 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &383385451 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &383385452 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &383385453 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &383999543 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 383999547} + - component: {fileID: 383999546} + - component: {fileID: 383999545} + - component: {fileID: 383999544} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &383999544 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &383999545 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &383999546 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &383999547 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 5, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &452902406 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 452902407} + - component: {fileID: 452902410} + - component: {fileID: 452902409} + - component: {fileID: 452902408} + - component: {fileID: 452902412} + - component: {fileID: 452902411} + m_Layer: 0 + m_Name: Cube (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &452902407 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &452902408 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &452902409 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &452902410 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &452902411 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &452902412 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &467809853 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 467809857} + - component: {fileID: 467809856} + - component: {fileID: 467809855} + - component: {fileID: 467809854} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &467809854 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &467809855 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &467809856 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &467809857 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -5} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &516740337 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1879097668} + m_Modifications: + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11479374, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_controller + value: 2 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &524771732 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 524771733} + - component: {fileID: 524771736} + - component: {fileID: 524771735} + - component: {fileID: 524771734} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &524771733 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &524771734 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &524771735 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &524771736 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &537728711 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 537728712} + m_Layer: 0 + m_Name: Room + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &537728712 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 537728711} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 204679846} + - {fileID: 383999547} + - {fileID: 107656907} + - {fileID: 2026317950} + - {fileID: 210993504} + - {fileID: 467809857} + m_Father: {fileID: 346664030} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &568642233 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 568642234} + - component: {fileID: 568642237} + - component: {fileID: 568642236} + - component: {fileID: 568642235} + - component: {fileID: 568642239} + - component: {fileID: 568642238} + m_Layer: 0 + m_Name: Cube (31) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &568642234 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 30 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &568642235 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &568642236 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &568642237 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &568642238 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &568642239 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &575655890 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 575655891} + - component: {fileID: 575655894} + - component: {fileID: 575655893} + - component: {fileID: 575655892} + - component: {fileID: 575655896} + - component: {fileID: 575655895} + m_Layer: 0 + m_Name: Cube (16) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &575655891 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &575655892 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &575655893 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &575655894 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &575655895 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &575655896 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &580231890 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 580231891} + - component: {fileID: 580231894} + - component: {fileID: 580231893} + - component: {fileID: 580231892} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &580231891 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: 1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &580231892 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &580231893 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &580231894 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &617808497 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 617808498} + - component: {fileID: 617808501} + - component: {fileID: 617808500} + - component: {fileID: 617808499} + - component: {fileID: 617808503} + - component: {fileID: 617808502} + m_Layer: 0 + m_Name: Cube (32) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &617808498 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 31 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &617808499 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &617808500 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &617808501 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &617808502 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &617808503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &663437231 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 663437232} + - component: {fileID: 663437235} + - component: {fileID: 663437234} + - component: {fileID: 663437233} + - component: {fileID: 663437237} + - component: {fileID: 663437236} + m_Layer: 0 + m_Name: Cube (18) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &663437232 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 17 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &663437233 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &663437234 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &663437235 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &663437236 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &663437237 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &684017681 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 684017682} + - component: {fileID: 684017685} + - component: {fileID: 684017684} + - component: {fileID: 684017683} + - component: {fileID: 684017687} + - component: {fileID: 684017686} + m_Layer: 0 + m_Name: Cube (7) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &684017682 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &684017683 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &684017684 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &684017685 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &684017686 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &684017687 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &719105579 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 719105580} + - component: {fileID: 719105583} + - component: {fileID: 719105582} + - component: {fileID: 719105581} + - component: {fileID: 719105585} + - component: {fileID: 719105584} + m_Layer: 0 + m_Name: Cube (19) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &719105580 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 18 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &719105581 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &719105582 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &719105583 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &719105584 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &719105585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &755868678 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 755868679} + - component: {fileID: 755868682} + - component: {fileID: 755868681} + - component: {fileID: 755868680} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &755868679 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &755868680 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &755868681 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &755868682 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &857705792 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 857705793} + - component: {fileID: 857705796} + - component: {fileID: 857705795} + - component: {fileID: 857705794} + - component: {fileID: 857705798} + - component: {fileID: 857705797} + m_Layer: 0 + m_Name: Cube (10) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &857705793 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &857705794 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &857705795 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &857705796 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &857705797 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &857705798 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &907087223 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 907087224} + - component: {fileID: 907087227} + - component: {fileID: 907087226} + - component: {fileID: 907087225} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &907087224 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &907087225 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &907087226 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &907087227 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &943102110 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 943102111} + - component: {fileID: 943102114} + - component: {fileID: 943102113} + - component: {fileID: 943102112} + - component: {fileID: 943102116} + - component: {fileID: 943102115} + m_Layer: 0 + m_Name: Cube (27) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &943102111 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 26 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &943102112 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &943102113 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &943102114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &943102115 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &943102116 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &948387090 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 948387091} + - component: {fileID: 948387094} + - component: {fileID: 948387093} + - component: {fileID: 948387092} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &948387091 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: 1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &948387092 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &948387093 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &948387094 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1055723251 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1055723252} + - component: {fileID: 1055723255} + - component: {fileID: 1055723254} + - component: {fileID: 1055723253} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1055723252 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1055723253 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1055723254 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1055723255 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1065364693 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1065364694} + - component: {fileID: 1065364697} + - component: {fileID: 1065364696} + - component: {fileID: 1065364695} + - component: {fileID: 1065364699} + - component: {fileID: 1065364698} + m_Layer: 0 + m_Name: Cube (28) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1065364694 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 27 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1065364695 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1065364696 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1065364697 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1065364698 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1065364699 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1107310626 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1107310627} + - component: {fileID: 1107310630} + - component: {fileID: 1107310629} + - component: {fileID: 1107310628} + - component: {fileID: 1107310632} + - component: {fileID: 1107310631} + m_Layer: 0 + m_Name: Cube (17) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1107310627 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 16 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1107310628 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1107310629 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1107310630 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1107310631 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1107310632 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1206777512 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1206777513} + - component: {fileID: 1206777516} + - component: {fileID: 1206777515} + - component: {fileID: 1206777514} + - component: {fileID: 1206777518} + - component: {fileID: 1206777517} + m_Layer: 0 + m_Name: Cube (23) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1206777513 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 22 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1206777514 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1206777515 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1206777516 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1206777517 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1206777518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1267950892 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1267950893} + - component: {fileID: 1267950896} + - component: {fileID: 1267950895} + - component: {fileID: 1267950894} + - component: {fileID: 1267950898} + - component: {fileID: 1267950897} + m_Layer: 0 + m_Name: Cube (24) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1267950893 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 23 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1267950894 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1267950895 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1267950896 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1267950897 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1267950898 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1353144165 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1353144166} + - component: {fileID: 1353144169} + - component: {fileID: 1353144168} + - component: {fileID: 1353144167} + - component: {fileID: 1353144171} + - component: {fileID: 1353144170} + m_Layer: 0 + m_Name: Cube (13) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1353144166 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1353144167 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1353144168 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1353144169 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1353144170 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1353144171 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1380377873 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1380377874} + - component: {fileID: 1380377877} + - component: {fileID: 1380377876} + - component: {fileID: 1380377875} + - component: {fileID: 1380377879} + - component: {fileID: 1380377878} + m_Layer: 0 + m_Name: Cube (21) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1380377874 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 20 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1380377875 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1380377876 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1380377877 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1380377878 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1380377879 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1470509161 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1470509163} + - component: {fileID: 1470509162} + m_Layer: 0 + m_Name: Directional light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1470509162 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1470509161} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 2 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 1 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1470509163 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1470509161} + m_LocalRotation: {x: 0.40821794, y: -0.23456973, z: 0.10938166, w: 0.8754261} + m_LocalPosition: {x: 0.2, y: 0.61, z: 0.208} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1500117049 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1500117050} + - component: {fileID: 1500117053} + - component: {fileID: 1500117052} + - component: {fileID: 1500117051} + - component: {fileID: 1500117055} + - component: {fileID: 1500117054} + m_Layer: 0 + m_Name: Cube (9) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1500117050 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1500117051 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1500117052 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1500117053 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1500117054 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1500117055 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1500551997 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1500551998} + - component: {fileID: 1500552001} + - component: {fileID: 1500552000} + - component: {fileID: 1500551999} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1500551998 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: -1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1500551999 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1500552000 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1500552001 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1519282572 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1519282573} + - component: {fileID: 1519282576} + - component: {fileID: 1519282575} + - component: {fileID: 1519282574} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1519282573 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1519282574 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1519282575 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1519282576 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1525608981 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1525608982} + - component: {fileID: 1525608985} + - component: {fileID: 1525608984} + - component: {fileID: 1525608983} + - component: {fileID: 1525608987} + - component: {fileID: 1525608986} + m_Layer: 0 + m_Name: Cube (30) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1525608982 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 29 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1525608983 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1525608984 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1525608985 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1525608986 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1525608987 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1001 &1545968989 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 154239276} + m_Modifications: + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11479374, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_controller + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1605028846 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1605028847} + - component: {fileID: 1605028850} + - component: {fileID: 1605028849} + - component: {fileID: 1605028848} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1605028847 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1605028848 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1605028849 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1605028850 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1657719772 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1657719773} + - component: {fileID: 1657719776} + - component: {fileID: 1657719775} + - component: {fileID: 1657719774} + - component: {fileID: 1657719778} + - component: {fileID: 1657719777} + m_Layer: 0 + m_Name: Cube (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1657719773 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1657719774 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1657719775 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1657719776 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1657719777 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1657719778 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1702096972 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1702096973} + - component: {fileID: 1702096976} + - component: {fileID: 1702096975} + - component: {fileID: 1702096974} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1702096973 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1702096974 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1702096975 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1702096976 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1744811460 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1744811461} + - component: {fileID: 1744811464} + - component: {fileID: 1744811463} + - component: {fileID: 1744811462} + - component: {fileID: 1744811466} + - component: {fileID: 1744811465} + m_Layer: 0 + m_Name: Cube (6) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1744811461 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1744811462 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1744811463 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1744811464 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1744811465 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1744811466 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1840087110 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1840087111} + - component: {fileID: 1840087114} + - component: {fileID: 1840087113} + - component: {fileID: 1840087112} + - component: {fileID: 1840087116} + - component: {fileID: 1840087115} + m_Layer: 0 + m_Name: Cube (15) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1840087111 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1840087112 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1840087113 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1840087114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1840087115 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1840087116 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!4 &1879097668 stripped +Transform: + m_PrefabParentObject: {fileID: 4471613377008970, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!1 &1908482354 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1908482355} + - component: {fileID: 1908482358} + - component: {fileID: 1908482357} + - component: {fileID: 1908482356} + - component: {fileID: 1908482360} + - component: {fileID: 1908482359} + m_Layer: 0 + m_Name: Cube (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1908482355 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1908482356 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1908482357 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1908482358 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1908482359 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1908482360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1925469567 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1925469568} + m_Layer: 0 + m_Name: Grabbables + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1925469568 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1925469567} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 452902407} + - {fileID: 1657719773} + - {fileID: 2013597838} + - {fileID: 2055358989} + - {fileID: 1908482355} + - {fileID: 1744811461} + - {fileID: 684017682} + - {fileID: 73524540} + - {fileID: 1500117050} + - {fileID: 857705793} + - {fileID: 224673156} + - {fileID: 206189565} + - {fileID: 1353144166} + - {fileID: 329624604} + - {fileID: 1840087111} + - {fileID: 575655891} + - {fileID: 1107310627} + - {fileID: 663437232} + - {fileID: 719105580} + - {fileID: 36454513} + - {fileID: 1380377874} + - {fileID: 2137937538} + - {fileID: 1206777513} + - {fileID: 1267950893} + - {fileID: 1967851989} + - {fileID: 358988760} + - {fileID: 943102111} + - {fileID: 1065364694} + - {fileID: 66877010} + - {fileID: 1525608982} + - {fileID: 568642234} + - {fileID: 617808498} + m_Father: {fileID: 346664030} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1962295110 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1962295111} + - component: {fileID: 1962295114} + - component: {fileID: 1962295113} + - component: {fileID: 1962295112} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1962295111 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1962295112 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1962295113 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1962295114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1967851988 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1967851989} + - component: {fileID: 1967851992} + - component: {fileID: 1967851991} + - component: {fileID: 1967851990} + - component: {fileID: 1967851994} + - component: {fileID: 1967851993} + m_Layer: 0 + m_Name: Cube (25) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1967851989 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 24 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1967851990 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1967851991 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1967851992 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1967851993 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1967851994 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &2013597837 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2013597838} + - component: {fileID: 2013597841} + - component: {fileID: 2013597840} + - component: {fileID: 2013597839} + - component: {fileID: 2013597843} + - component: {fileID: 2013597842} + m_Layer: 0 + m_Name: Cube (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2013597838 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2013597839 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2013597840 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2013597841 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &2013597842 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &2013597843 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &2026317946 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2026317950} + - component: {fileID: 2026317949} + - component: {fileID: 2026317948} + - component: {fileID: 2026317947} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &2026317947 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2026317948 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2026317949 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &2026317950 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -5, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2055358988 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2055358989} + - component: {fileID: 2055358992} + - component: {fileID: 2055358991} + - component: {fileID: 2055358990} + - component: {fileID: 2055358994} + - component: {fileID: 2055358993} + m_Layer: 0 + m_Name: Cube (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2055358989 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2055358990 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2055358991 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2055358992 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &2055358993 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &2055358994 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1001 &2080101472 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11400010, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: useProfileData + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400008, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400002, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.y + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &2080101473 stripped +GameObject: + m_PrefabParentObject: {fileID: 100014, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!1 &2080101474 stripped +GameObject: + m_PrefabParentObject: {fileID: 100010, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!20 &2080101475 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101473} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 2 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!20 &2080101476 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101474} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 1 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!1 &2137937537 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2137937538} + - component: {fileID: 2137937541} + - component: {fileID: 2137937540} + - component: {fileID: 2137937539} + - component: {fileID: 2137937543} + - component: {fileID: 2137937542} + m_Layer: 0 + m_Name: Cube (22) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2137937538 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 21 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2137937539 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2137937540 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2137937541 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &2137937542 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &2137937543 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] diff --git a/Assets/Oculus/VR/Scenes/ControllerModels.unity.meta b/Assets/Oculus/VR/Scenes/ControllerModels.unity.meta new file mode 100644 index 0000000..17c19a2 --- /dev/null +++ b/Assets/Oculus/VR/Scenes/ControllerModels.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 39cfe7aa0a2d46c47994d8d0308ec663 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scenes/Cubes.unity b/Assets/Oculus/VR/Scenes/Cubes.unity new file mode 100644 index 0000000..890da2a --- /dev/null +++ b/Assets/Oculus/VR/Scenes/Cubes.unity @@ -0,0 +1,47147 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +SceneSettings: + m_ObjectHideFlags: 0 + m_PVSData: + m_PVSObjectsArray: [] + m_PVSPortalsArray: [] + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: .25 + backfaceThreshold: 100 +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 6 + m_Fog: 0 + m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogMode: 3 + m_FogDensity: .00999999978 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 1, g: 1, b: 1, a: 1} + m_AmbientEquatorColor: {r: 1, g: 1, b: 1, a: 1} + m_AmbientGroundColor: {r: 1, g: 1, b: 1, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: .5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} +--- !u!127 &3 +LevelGameManager: + m_ObjectHideFlags: 0 +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_GIWorkflowMode: 1 + m_LightmapsMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 3 + m_Resolution: 1 + m_BakeResolution: 50 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AOMaxDistance: 1 + m_Padding: 2 + m_CompAOExponent: 0 + m_LightmapParameters: {fileID: 0} + m_TextureCompression: 0 + m_FinalGather: 0 + m_FinalGatherRayCount: 1024 + m_LightmapSnapshot: {fileID: 0} + m_RuntimeCPUUsage: 25 +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentRadius: .5 + agentHeight: 2 + agentSlope: 45 + agentClimb: .400000006 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + accuratePlacement: 0 + minRegionArea: 2 + cellSize: .166666657 + manualCellSize: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &3664027 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 3664028} + - 33: {fileID: 3664030} + - 23: {fileID: 3664029} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3664028 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 3664027} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 366225505} + m_RootOrder: 5 +--- !u!23 &3664029 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 3664027} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3664030 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 3664027} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &4240588 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 4240589} + - 33: {fileID: 4240591} + - 23: {fileID: 4240590} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4240589 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 4240588} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1318928928} + m_RootOrder: 0 +--- !u!23 &4240590 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 4240588} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &4240591 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 4240588} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &6176330 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 6176331} + - 33: {fileID: 6176333} + - 23: {fileID: 6176332} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6176331 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 6176330} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1435433903} + m_RootOrder: 3 +--- !u!23 &6176332 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 6176330} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &6176333 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 6176330} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &10900166 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 10900167} + - 33: {fileID: 10900169} + - 23: {fileID: 10900168} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &10900167 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 10900166} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1991877734} + m_RootOrder: 7 +--- !u!23 &10900168 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 10900166} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &10900169 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 10900166} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &11815620 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 11815621} + - 33: {fileID: 11815623} + - 23: {fileID: 11815622} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &11815621 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 11815620} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 484270180} + m_RootOrder: 4 +--- !u!23 &11815622 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 11815620} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &11815623 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 11815620} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &13932139 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 13932140} + - 33: {fileID: 13932142} + - 23: {fileID: 13932141} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &13932140 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 13932139} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1392306390} + m_RootOrder: 2 +--- !u!23 &13932141 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 13932139} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &13932142 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 13932139} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &18001876 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 18001877} + - 33: {fileID: 18001879} + - 23: {fileID: 18001878} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &18001877 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 18001876} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 217104405} + m_RootOrder: 6 +--- !u!23 &18001878 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 18001876} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &18001879 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 18001876} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &18047732 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 18047733} + - 33: {fileID: 18047735} + - 23: {fileID: 18047734} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &18047733 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 18047732} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1038701522} + m_RootOrder: 2 +--- !u!23 &18047734 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 18047732} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &18047735 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 18047732} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &22254241 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 22254242} + - 33: {fileID: 22254244} + - 23: {fileID: 22254243} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &22254242 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 22254241} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1413035099} + m_RootOrder: 5 +--- !u!23 &22254243 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 22254241} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &22254244 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 22254241} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &22869809 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 22869810} + - 33: {fileID: 22869812} + - 23: {fileID: 22869811} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &22869810 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 22869809} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231626962} + m_RootOrder: 1 +--- !u!23 &22869811 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 22869809} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &22869812 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 22869809} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &24013132 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 24013133} + - 33: {fileID: 24013135} + - 23: {fileID: 24013134} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &24013133 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 24013132} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1758170125} + m_RootOrder: 7 +--- !u!23 &24013134 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 24013132} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &24013135 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 24013132} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &24304357 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 24304358} + - 33: {fileID: 24304360} + - 23: {fileID: 24304359} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &24304358 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 24304357} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1082956371} + m_RootOrder: 8 +--- !u!23 &24304359 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 24304357} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &24304360 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 24304357} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &26660321 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 26660322} + - 33: {fileID: 26660324} + - 23: {fileID: 26660323} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &26660322 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 26660321} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 440610438} + m_RootOrder: 3 +--- !u!23 &26660323 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 26660321} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &26660324 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 26660321} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &31880375 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 31880376} + - 33: {fileID: 31880378} + - 23: {fileID: 31880377} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &31880376 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 31880375} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1318928928} + m_RootOrder: 7 +--- !u!23 &31880377 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 31880375} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &31880378 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 31880375} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &32196260 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 32196261} + - 33: {fileID: 32196263} + - 23: {fileID: 32196262} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &32196261 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 32196260} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1318928928} + m_RootOrder: 3 +--- !u!23 &32196262 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 32196260} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &32196263 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 32196260} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &32676780 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 32676781} + - 33: {fileID: 32676783} + - 23: {fileID: 32676782} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &32676781 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 32676780} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1136402243} + m_RootOrder: 6 +--- !u!23 &32676782 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 32676780} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &32676783 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 32676780} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &35212799 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 35212800} + - 33: {fileID: 35212802} + - 23: {fileID: 35212801} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &35212800 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 35212799} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 484270180} + m_RootOrder: 1 +--- !u!23 &35212801 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 35212799} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &35212802 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 35212799} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &39903540 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 39903541} + - 33: {fileID: 39903543} + - 23: {fileID: 39903542} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &39903541 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 39903540} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1965163931} + m_RootOrder: 4 +--- !u!23 &39903542 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 39903540} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &39903543 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 39903540} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &39951912 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 39951913} + - 33: {fileID: 39951915} + - 23: {fileID: 39951914} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &39951913 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 39951912} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 433168050} + m_RootOrder: 6 +--- !u!23 &39951914 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 39951912} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &39951915 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 39951912} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &47831828 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 47831829} + - 33: {fileID: 47831831} + - 23: {fileID: 47831830} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &47831829 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47831828} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 412002962} + m_RootOrder: 4 +--- !u!23 &47831830 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47831828} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &47831831 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47831828} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &47951524 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 47951525} + - 33: {fileID: 47951527} + - 23: {fileID: 47951526} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &47951525 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47951524} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1269069112} + m_RootOrder: 1 +--- !u!23 &47951526 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47951524} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &47951527 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47951524} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &49728983 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 49728984} + - 33: {fileID: 49728986} + - 23: {fileID: 49728985} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &49728984 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 49728983} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1413035099} + m_RootOrder: 4 +--- !u!23 &49728985 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 49728983} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &49728986 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 49728983} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &51436667 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 51436668} + - 33: {fileID: 51436670} + - 23: {fileID: 51436669} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &51436668 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 51436667} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1082956371} + m_RootOrder: 1 +--- !u!23 &51436669 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 51436667} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &51436670 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 51436667} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &52129120 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 52129121} + - 33: {fileID: 52129123} + - 23: {fileID: 52129122} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &52129121 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 52129120} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1802157139} + m_RootOrder: 5 +--- !u!23 &52129122 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 52129120} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &52129123 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 52129120} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &52338613 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 52338614} + - 33: {fileID: 52338616} + - 23: {fileID: 52338615} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &52338614 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 52338613} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 352349652} + m_RootOrder: 1 +--- !u!23 &52338615 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 52338613} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &52338616 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 52338613} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &52357632 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 52357633} + - 33: {fileID: 52357635} + - 23: {fileID: 52357634} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &52357633 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 52357632} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 950631283} + m_RootOrder: 8 +--- !u!23 &52357634 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 52357632} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &52357635 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 52357632} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &53922723 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 53922724} + - 33: {fileID: 53922726} + - 23: {fileID: 53922725} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &53922724 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 53922723} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 604038727} + m_RootOrder: 8 +--- !u!23 &53922725 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 53922723} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &53922726 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 53922723} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &56780191 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 56780192} + - 33: {fileID: 56780194} + - 23: {fileID: 56780193} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &56780192 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 56780191} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 157447699} + m_RootOrder: 8 +--- !u!23 &56780193 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 56780191} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &56780194 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 56780191} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &60223817 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 60223818} + - 33: {fileID: 60223820} + - 23: {fileID: 60223819} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &60223818 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 60223817} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 698956160} + m_RootOrder: 7 +--- !u!23 &60223819 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 60223817} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &60223820 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 60223817} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &60943538 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 60943539} + - 33: {fileID: 60943541} + - 23: {fileID: 60943540} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &60943539 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 60943538} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1950362483} + m_RootOrder: 5 +--- !u!23 &60943540 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 60943538} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &60943541 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 60943538} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &61856426 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 61856427} + - 33: {fileID: 61856429} + - 23: {fileID: 61856428} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &61856427 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 61856426} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 989992470} + m_RootOrder: 5 +--- !u!23 &61856428 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 61856426} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &61856429 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 61856426} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &61866933 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 61866934} + - 33: {fileID: 61866936} + - 23: {fileID: 61866935} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &61866934 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 61866933} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 349606543} + m_RootOrder: 0 +--- !u!23 &61866935 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 61866933} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &61866936 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 61866933} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &63880794 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 63880795} + - 33: {fileID: 63880797} + - 23: {fileID: 63880796} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &63880795 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 63880794} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1965163931} + m_RootOrder: 2 +--- !u!23 &63880796 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 63880794} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &63880797 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 63880794} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &66939662 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 66939663} + - 33: {fileID: 66939665} + - 23: {fileID: 66939664} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &66939663 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66939662} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 698956160} + m_RootOrder: 3 +--- !u!23 &66939664 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66939662} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &66939665 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66939662} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &68974762 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 68974763} + - 33: {fileID: 68974765} + - 23: {fileID: 68974764} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &68974763 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 68974762} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1082956371} + m_RootOrder: 4 +--- !u!23 &68974764 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 68974762} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &68974765 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 68974762} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &72504182 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 72504183} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &72504183 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 72504182} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1345266611} + - {fileID: 1861128536} + - {fileID: 1991666046} + - {fileID: 1755946758} + - {fileID: 1563197119} + - {fileID: 448452949} + - {fileID: 1787459735} + - {fileID: 296827906} + - {fileID: 436597880} + m_Father: {fileID: 416898948} + m_RootOrder: 2 +--- !u!1 &73591252 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 73591253} + - 33: {fileID: 73591255} + - 23: {fileID: 73591254} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &73591253 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73591252} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1991877734} + m_RootOrder: 6 +--- !u!23 &73591254 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73591252} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &73591255 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73591252} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &75920194 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 75920195} + - 33: {fileID: 75920197} + - 23: {fileID: 75920196} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &75920195 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 75920194} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1536546683} + m_RootOrder: 7 +--- !u!23 &75920196 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 75920194} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &75920197 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 75920194} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &79316879 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 79316880} + - 33: {fileID: 79316882} + - 23: {fileID: 79316881} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &79316880 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 79316879} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2040025849} + m_RootOrder: 7 +--- !u!23 &79316881 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 79316879} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &79316882 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 79316879} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &81328366 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 81328367} + - 33: {fileID: 81328369} + - 23: {fileID: 81328368} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &81328367 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81328366} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 710806381} + m_RootOrder: 7 +--- !u!23 &81328368 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81328366} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &81328369 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81328366} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &89611125 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 89611126} + - 33: {fileID: 89611128} + - 23: {fileID: 89611127} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &89611126 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 89611125} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1396826707} + m_RootOrder: 5 +--- !u!23 &89611127 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 89611125} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &89611128 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 89611125} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &91951653 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 91951654} + - 33: {fileID: 91951656} + - 23: {fileID: 91951655} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &91951654 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 91951653} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1711378518} + m_RootOrder: 8 +--- !u!23 &91951655 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 91951653} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &91951656 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 91951653} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &97341078 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 97341079} + - 33: {fileID: 97341081} + - 23: {fileID: 97341080} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &97341079 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 97341078} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 379543545} + m_RootOrder: 8 +--- !u!23 &97341080 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 97341078} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &97341081 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 97341078} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &97446089 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 97446090} + - 33: {fileID: 97446092} + - 23: {fileID: 97446091} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &97446090 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 97446089} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 352349652} + m_RootOrder: 4 +--- !u!23 &97446091 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 97446089} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &97446092 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 97446089} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &99675306 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 99675307} + - 33: {fileID: 99675309} + - 23: {fileID: 99675308} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &99675307 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 99675306} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1392306390} + m_RootOrder: 0 +--- !u!23 &99675308 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 99675306} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &99675309 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 99675306} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &101568286 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 101568287} + - 33: {fileID: 101568289} + - 23: {fileID: 101568288} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &101568287 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 101568286} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 217104405} + m_RootOrder: 8 +--- !u!23 &101568288 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 101568286} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &101568289 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 101568286} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &101794872 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 101794873} + - 33: {fileID: 101794875} + - 23: {fileID: 101794874} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &101794873 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 101794872} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 309447440} + m_RootOrder: 1 +--- !u!23 &101794874 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 101794872} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &101794875 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 101794872} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &115371109 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 115371110} + - 33: {fileID: 115371112} + - 23: {fileID: 115371111} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &115371110 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 115371109} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231738743} + m_RootOrder: 1 +--- !u!23 &115371111 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 115371109} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &115371112 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 115371109} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &118428095 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 118428096} + - 33: {fileID: 118428098} + - 23: {fileID: 118428097} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &118428096 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 118428095} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1136402243} + m_RootOrder: 2 +--- !u!23 &118428097 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 118428095} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &118428098 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 118428095} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &121895491 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 121895492} + - 33: {fileID: 121895494} + - 23: {fileID: 121895493} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &121895492 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 121895491} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1591077534} + m_RootOrder: 2 +--- !u!23 &121895493 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 121895491} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &121895494 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 121895491} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &122792863 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 122792864} + - 33: {fileID: 122792866} + - 23: {fileID: 122792865} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &122792864 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 122792863} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1550093339} + m_RootOrder: 1 +--- !u!23 &122792865 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 122792863} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &122792866 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 122792863} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &123976716 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 123976717} + - 33: {fileID: 123976719} + - 23: {fileID: 123976718} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &123976717 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 123976716} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1802157139} + m_RootOrder: 6 +--- !u!23 &123976718 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 123976716} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &123976719 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 123976716} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &124953302 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 124953303} + - 33: {fileID: 124953305} + - 23: {fileID: 124953304} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &124953303 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 124953302} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1330598094} + m_RootOrder: 0 +--- !u!23 &124953304 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 124953302} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &124953305 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 124953302} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &128223065 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 128223066} + - 33: {fileID: 128223068} + - 23: {fileID: 128223067} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &128223066 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 128223065} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1758170125} + m_RootOrder: 8 +--- !u!23 &128223067 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 128223065} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &128223068 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 128223065} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &132263418 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 132263419} + - 33: {fileID: 132263421} + - 23: {fileID: 132263420} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &132263419 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 132263418} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1240836681} + m_RootOrder: 7 +--- !u!23 &132263420 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 132263418} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &132263421 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 132263418} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &133039176 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 133039177} + - 33: {fileID: 133039179} + - 23: {fileID: 133039178} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &133039177 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 133039176} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 768694475} + m_RootOrder: 3 +--- !u!23 &133039178 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 133039176} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &133039179 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 133039176} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &134224554 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 134224555} + - 33: {fileID: 134224557} + - 23: {fileID: 134224556} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &134224555 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 134224554} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 849571239} + m_RootOrder: 1 +--- !u!23 &134224556 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 134224554} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &134224557 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 134224554} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &138445034 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 138445035} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &138445035 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 138445034} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1779963277} + - {fileID: 1371947164} + - {fileID: 639002474} + - {fileID: 1325847477} + - {fileID: 843322475} + - {fileID: 1234331063} + - {fileID: 672418999} + - {fileID: 674325342} + - {fileID: 1809721791} + m_Father: {fileID: 357871943} + m_RootOrder: 8 +--- !u!1 &144254503 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 144254504} + - 33: {fileID: 144254506} + - 23: {fileID: 144254505} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &144254504 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 144254503} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 554489815} + m_RootOrder: 3 +--- !u!23 &144254505 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 144254503} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &144254506 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 144254503} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &146325015 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 146325016} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &146325016 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 146325015} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1438931484} + - {fileID: 215729169} + - {fileID: 1472923031} + - {fileID: 188878799} + - {fileID: 1209329983} + - {fileID: 1239907698} + - {fileID: 1113415722} + - {fileID: 494523048} + - {fileID: 159467062} + m_Father: {fileID: 1875085494} + m_RootOrder: 4 +--- !u!1 &150190141 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 150190142} + - 33: {fileID: 150190144} + - 23: {fileID: 150190143} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &150190142 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 150190141} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1357615428} + m_RootOrder: 8 +--- !u!23 &150190143 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 150190141} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &150190144 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 150190141} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &153267156 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 153267157} + - 33: {fileID: 153267159} + - 23: {fileID: 153267158} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &153267157 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 153267156} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1251486547} + m_RootOrder: 5 +--- !u!23 &153267158 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 153267156} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &153267159 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 153267156} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &155157966 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 155157967} + - 33: {fileID: 155157969} + - 23: {fileID: 155157968} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &155157967 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 155157966} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1330598094} + m_RootOrder: 7 +--- !u!23 &155157968 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 155157966} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &155157969 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 155157966} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &155545761 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 155545762} + - 33: {fileID: 155545764} + - 23: {fileID: 155545763} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &155545762 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 155545761} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 950631283} + m_RootOrder: 6 +--- !u!23 &155545763 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 155545761} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &155545764 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 155545761} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &157447698 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 157447699} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &157447699 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 157447698} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1793642500} + - {fileID: 1493653994} + - {fileID: 1368997100} + - {fileID: 345088240} + - {fileID: 539304524} + - {fileID: 1606405213} + - {fileID: 691554664} + - {fileID: 1350275575} + - {fileID: 56780192} + m_Father: {fileID: 416898948} + m_RootOrder: 7 +--- !u!1 &159467061 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 159467062} + - 33: {fileID: 159467064} + - 23: {fileID: 159467063} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &159467062 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 159467061} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 146325016} + m_RootOrder: 8 +--- !u!23 &159467063 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 159467061} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &159467064 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 159467061} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &161900531 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 161900532} + - 33: {fileID: 161900534} + - 23: {fileID: 161900533} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &161900532 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 161900531} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1587156216} + m_RootOrder: 6 +--- !u!23 &161900533 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 161900531} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &161900534 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 161900531} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &162559257 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 162559258} + - 33: {fileID: 162559260} + - 23: {fileID: 162559259} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &162559258 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 162559257} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1337936969} + m_RootOrder: 0 +--- !u!23 &162559259 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 162559257} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &162559260 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 162559257} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &173812876 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 173812877} + - 33: {fileID: 173812879} + - 23: {fileID: 173812878} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &173812877 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 173812876} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1711378518} + m_RootOrder: 6 +--- !u!23 &173812878 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 173812876} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &173812879 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 173812876} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &176026933 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 176026934} + - 33: {fileID: 176026936} + - 23: {fileID: 176026935} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &176026934 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 176026933} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 366225505} + m_RootOrder: 4 +--- !u!23 &176026935 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 176026933} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &176026936 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 176026933} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &178633823 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 178633824} + - 33: {fileID: 178633826} + - 23: {fileID: 178633825} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &178633824 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 178633823} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1965163931} + m_RootOrder: 0 +--- !u!23 &178633825 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 178633823} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &178633826 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 178633823} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &185328091 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 185328092} + - 33: {fileID: 185328094} + - 23: {fileID: 185328093} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &185328092 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 185328091} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 768694475} + m_RootOrder: 5 +--- !u!23 &185328093 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 185328091} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &185328094 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 185328091} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &188878798 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 188878799} + - 33: {fileID: 188878801} + - 23: {fileID: 188878800} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &188878799 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 188878798} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 146325016} + m_RootOrder: 3 +--- !u!23 &188878800 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 188878798} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &188878801 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 188878798} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &190771843 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 190771844} + - 33: {fileID: 190771846} + - 23: {fileID: 190771845} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &190771844 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 190771843} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2097222327} + m_RootOrder: 5 +--- !u!23 &190771845 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 190771843} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &190771846 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 190771843} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &191837272 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 191837273} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &191837273 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 191837272} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 764367998} + - {fileID: 1190442269} + - {fileID: 1354454586} + - {fileID: 1142309782} + - {fileID: 1013698094} + - {fileID: 1646787810} + - {fileID: 1127960877} + - {fileID: 1445609286} + - {fileID: 474628329} + m_Father: {fileID: 1288823789} + m_RootOrder: 0 +--- !u!1 &199543576 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 199543577} + - 33: {fileID: 199543579} + - 23: {fileID: 199543578} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &199543577 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 199543576} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1802157139} + m_RootOrder: 3 +--- !u!23 &199543578 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 199543576} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &199543579 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 199543576} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &201332831 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 201332832} + - 33: {fileID: 201332834} + - 23: {fileID: 201332833} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &201332832 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 201332831} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1251486547} + m_RootOrder: 3 +--- !u!23 &201332833 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 201332831} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &201332834 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 201332831} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &205582491 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 205582492} + - 33: {fileID: 205582494} + - 23: {fileID: 205582493} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &205582492 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 205582491} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 989992470} + m_RootOrder: 1 +--- !u!23 &205582493 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 205582491} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &205582494 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 205582491} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &209477139 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 209477140} + - 33: {fileID: 209477142} + - 23: {fileID: 209477141} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &209477140 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 209477139} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 969754910} + m_RootOrder: 5 +--- !u!23 &209477141 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 209477139} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &209477142 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 209477139} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &210983307 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 210983308} + - 33: {fileID: 210983310} + - 23: {fileID: 210983309} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &210983308 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210983307} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2070993649} + m_RootOrder: 1 +--- !u!23 &210983309 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210983307} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &210983310 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210983307} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &211645511 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 211645512} + - 33: {fileID: 211645514} + - 23: {fileID: 211645513} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &211645512 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 211645511} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1758170125} + m_RootOrder: 3 +--- !u!23 &211645513 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 211645511} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &211645514 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 211645511} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &214705699 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 214705700} + - 33: {fileID: 214705702} + - 23: {fileID: 214705701} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &214705700 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 214705699} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1950362483} + m_RootOrder: 7 +--- !u!23 &214705701 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 214705699} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &214705702 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 214705699} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &214908234 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 214908235} + - 33: {fileID: 214908237} + - 23: {fileID: 214908236} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &214908235 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 214908234} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1410998029} + m_RootOrder: 7 +--- !u!23 &214908236 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 214908234} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &214908237 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 214908234} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &215669801 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 215669802} + - 33: {fileID: 215669804} + - 23: {fileID: 215669803} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &215669802 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 215669801} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 554489815} + m_RootOrder: 0 +--- !u!23 &215669803 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 215669801} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &215669804 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 215669801} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &215729168 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 215729169} + - 33: {fileID: 215729171} + - 23: {fileID: 215729170} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &215729169 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 215729168} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 146325016} + m_RootOrder: 1 +--- !u!23 &215729170 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 215729168} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &215729171 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 215729168} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &216828086 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 216828087} + - 33: {fileID: 216828089} + - 23: {fileID: 216828088} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &216828087 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 216828086} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 768694475} + m_RootOrder: 4 +--- !u!23 &216828088 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 216828086} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &216828089 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 216828086} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &217104404 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 217104405} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &217104405 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 217104404} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 694583488} + - {fileID: 1808457319} + - {fileID: 1977979797} + - {fileID: 2099444889} + - {fileID: 413406532} + - {fileID: 697907466} + - {fileID: 18001877} + - {fileID: 799336607} + - {fileID: 101568287} + m_Father: {fileID: 1906654409} + m_RootOrder: 6 +--- !u!1 &225483471 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 225483472} + - 33: {fileID: 225483474} + - 23: {fileID: 225483473} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &225483472 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 225483471} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1552181540} + m_RootOrder: 0 +--- !u!23 &225483473 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 225483471} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &225483474 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 225483471} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &227008743 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 227008744} + - 33: {fileID: 227008746} + - 23: {fileID: 227008745} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &227008744 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 227008743} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 950631283} + m_RootOrder: 1 +--- !u!23 &227008745 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 227008743} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &227008746 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 227008743} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &227248109 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 227248110} + - 33: {fileID: 227248112} + - 23: {fileID: 227248111} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &227248110 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 227248109} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 440610438} + m_RootOrder: 7 +--- !u!23 &227248111 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 227248109} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &227248112 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 227248109} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &229979265 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 229979266} + - 33: {fileID: 229979268} + - 23: {fileID: 229979267} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &229979266 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 229979265} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 969754910} + m_RootOrder: 3 +--- !u!23 &229979267 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 229979265} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &229979268 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 229979265} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &231626961 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 231626962} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &231626962 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 231626961} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2064792706} + - {fileID: 22869810} + - {fileID: 2062746976} + - {fileID: 1389778215} + - {fileID: 1903182221} + - {fileID: 1116037529} + - {fileID: 1307348601} + - {fileID: 1414375560} + - {fileID: 549499155} + m_Father: {fileID: 1875085494} + m_RootOrder: 1 +--- !u!1 &231738742 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 231738743} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &231738743 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 231738742} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 801635955} + - {fileID: 115371110} + - {fileID: 1754474688} + - {fileID: 1487009763} + - {fileID: 1952045473} + - {fileID: 1360348676} + - {fileID: 504812018} + - {fileID: 1388392809} + - {fileID: 398823143} + m_Father: {fileID: 320694060} + m_RootOrder: 8 +--- !u!1 &232827029 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 232827030} + - 33: {fileID: 232827032} + - 23: {fileID: 232827031} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &232827030 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 232827029} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1402568966} + m_RootOrder: 6 +--- !u!23 &232827031 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 232827029} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &232827032 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 232827029} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &233977206 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 233977207} + - 33: {fileID: 233977209} + - 23: {fileID: 233977208} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &233977207 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 233977206} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 821285325} + m_RootOrder: 4 +--- !u!23 &233977208 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 233977206} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &233977209 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 233977206} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &234401192 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 234401193} + - 33: {fileID: 234401195} + - 23: {fileID: 234401194} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &234401193 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 234401192} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 870806955} + m_RootOrder: 3 +--- !u!23 &234401194 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 234401192} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &234401195 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 234401192} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &249804278 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 249804279} + - 33: {fileID: 249804281} + - 23: {fileID: 249804280} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &249804279 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 249804278} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1243272144} + m_RootOrder: 3 +--- !u!23 &249804280 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 249804278} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &249804281 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 249804278} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &250318198 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 250318199} + - 33: {fileID: 250318201} + - 23: {fileID: 250318200} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &250318199 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 250318198} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1536546683} + m_RootOrder: 1 +--- !u!23 &250318200 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 250318198} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &250318201 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 250318198} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &254407488 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 254407489} + - 33: {fileID: 254407491} + - 23: {fileID: 254407490} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &254407489 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 254407488} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1950362483} + m_RootOrder: 1 +--- !u!23 &254407490 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 254407488} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &254407491 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 254407488} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &260159408 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 260159409} + - 33: {fileID: 260159411} + - 23: {fileID: 260159410} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &260159409 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 260159408} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 698956160} + m_RootOrder: 8 +--- !u!23 &260159410 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 260159408} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &260159411 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 260159408} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &262542701 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 262542702} + - 33: {fileID: 262542704} + - 23: {fileID: 262542703} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &262542702 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 262542701} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 379543545} + m_RootOrder: 1 +--- !u!23 &262542703 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 262542701} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &262542704 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 262542701} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &264309449 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 264309450} + - 33: {fileID: 264309452} + - 23: {fileID: 264309451} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &264309450 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 264309449} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1624250639} + m_RootOrder: 7 +--- !u!23 &264309451 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 264309449} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &264309452 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 264309449} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &265207075 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 265207076} + - 33: {fileID: 265207078} + - 23: {fileID: 265207077} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &265207076 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 265207075} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 433168050} + m_RootOrder: 2 +--- !u!23 &265207077 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 265207075} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &265207078 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 265207075} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &268222374 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 268222375} + - 33: {fileID: 268222377} + - 23: {fileID: 268222376} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &268222375 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 268222374} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 989992470} + m_RootOrder: 2 +--- !u!23 &268222376 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 268222374} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &268222377 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 268222374} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &271422295 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 271422296} + - 33: {fileID: 271422298} + - 23: {fileID: 271422297} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &271422296 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 271422295} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 604038727} + m_RootOrder: 5 +--- !u!23 &271422297 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 271422295} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &271422298 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 271422295} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &272056893 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 272056894} + - 33: {fileID: 272056896} + - 23: {fileID: 272056895} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &272056894 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 272056893} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1802157139} + m_RootOrder: 8 +--- !u!23 &272056895 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 272056893} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &272056896 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 272056893} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &276138906 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 276138907} + - 33: {fileID: 276138909} + - 23: {fileID: 276138908} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &276138907 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 276138906} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 969754910} + m_RootOrder: 6 +--- !u!23 &276138908 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 276138906} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &276138909 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 276138906} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &277228139 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 277228140} + - 33: {fileID: 277228142} + - 23: {fileID: 277228141} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &277228140 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 277228139} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1413035099} + m_RootOrder: 8 +--- !u!23 &277228141 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 277228139} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &277228142 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 277228139} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &283110880 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 283110881} + - 33: {fileID: 283110883} + - 23: {fileID: 283110882} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &283110881 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 283110880} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1711378518} + m_RootOrder: 2 +--- !u!23 &283110882 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 283110880} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &283110883 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 283110880} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &283747328 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 283747329} + - 33: {fileID: 283747331} + - 23: {fileID: 283747330} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &283747329 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 283747328} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1613309483} + m_RootOrder: 0 +--- !u!23 &283747330 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 283747328} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &283747331 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 283747328} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &284640321 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 284640322} + - 33: {fileID: 284640324} + - 23: {fileID: 284640323} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &284640322 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 284640321} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 366225505} + m_RootOrder: 7 +--- !u!23 &284640323 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 284640321} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &284640324 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 284640321} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &285840096 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 285840097} + - 33: {fileID: 285840099} + - 23: {fileID: 285840098} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &285840097 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 285840096} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1881349947} + m_RootOrder: 2 +--- !u!23 &285840098 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 285840096} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &285840099 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 285840096} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &287649692 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 287649693} + - 33: {fileID: 287649695} + - 23: {fileID: 287649694} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &287649693 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 287649692} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1049063299} + m_RootOrder: 0 +--- !u!23 &287649694 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 287649692} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &287649695 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 287649692} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &292936479 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 292936480} + - 33: {fileID: 292936482} + - 23: {fileID: 292936481} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &292936480 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 292936479} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1038701522} + m_RootOrder: 7 +--- !u!23 &292936481 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 292936479} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &292936482 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 292936479} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &296827905 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 296827906} + - 33: {fileID: 296827908} + - 23: {fileID: 296827907} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &296827906 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 296827905} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 72504183} + m_RootOrder: 7 +--- !u!23 &296827907 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 296827905} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &296827908 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 296827905} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &304245273 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 304245274} + - 33: {fileID: 304245276} + - 23: {fileID: 304245275} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &304245274 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 304245273} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1587156216} + m_RootOrder: 2 +--- !u!23 &304245275 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 304245273} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &304245276 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 304245273} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &306662444 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 306662445} + - 33: {fileID: 306662447} + - 23: {fileID: 306662446} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &306662445 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 306662444} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1337936969} + m_RootOrder: 4 +--- !u!23 &306662446 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 306662444} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &306662447 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 306662444} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &307869077 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 307869078} + - 33: {fileID: 307869080} + - 23: {fileID: 307869079} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &307869078 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 307869077} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1711378518} + m_RootOrder: 3 +--- !u!23 &307869079 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 307869077} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &307869080 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 307869077} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &309447439 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 309447440} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &309447440 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 309447439} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1825222277} + - {fileID: 101794873} + - {fileID: 1470668112} + - {fileID: 840540659} + - {fileID: 1276774529} + - {fileID: 1595097606} + - {fileID: 1283742115} + - {fileID: 1136746723} + - {fileID: 1211858530} + m_Father: {fileID: 1285129845} + m_RootOrder: 5 +--- !u!1 &311797877 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 311797878} + m_Layer: 0 + m_Name: CubeGrid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &311797878 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 311797877} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.02090001, y: -.402413607, z: -7.52141666} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2097222327} + - {fileID: 1396826707} + - {fileID: 857026539} + - {fileID: 1711378518} + - {fileID: 2040025849} + - {fileID: 1528982994} + - {fileID: 1881349947} + - {fileID: 499152561} + - {fileID: 1240836681} + m_Father: {fileID: 1335403818} + m_RootOrder: 5 +--- !u!1 &316302724 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 316302725} + - 33: {fileID: 316302727} + - 23: {fileID: 316302726} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &316302725 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 316302724} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1145749506} + m_RootOrder: 2 +--- !u!23 &316302726 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 316302724} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &316302727 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 316302724} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &320694059 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 320694060} + m_Layer: 0 + m_Name: CubeGrid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &320694060 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 320694059} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.02090001, y: -.402413607, z: -5.52141666} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 379543545} + - {fileID: 1613309483} + - {fileID: 1337936969} + - {fileID: 1435433903} + - {fileID: 849571239} + - {fileID: 732523451} + - {fileID: 1950362483} + - {fileID: 1392306390} + - {fileID: 231738743} + m_Father: {fileID: 1335403818} + m_RootOrder: 0 +--- !u!1 &332742598 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 332742599} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &332742599 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 332742598} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1646799001} + - {fileID: 925124721} + - {fileID: 1364969516} + - {fileID: 511318834} + - {fileID: 1355525086} + - {fileID: 1479376376} + - {fileID: 1291389607} + - {fileID: 606569945} + - {fileID: 866611229} + m_Father: {fileID: 2047955730} + m_RootOrder: 1 +--- !u!1 &333333697 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 333333698} + - 33: {fileID: 333333700} + - 23: {fileID: 333333699} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &333333698 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 333333697} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1240836681} + m_RootOrder: 5 +--- !u!23 &333333699 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 333333697} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &333333700 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 333333697} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &335083539 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 335083540} + - 33: {fileID: 335083542} + - 23: {fileID: 335083541} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &335083540 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 335083539} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1330598094} + m_RootOrder: 4 +--- !u!23 &335083541 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 335083539} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &335083542 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 335083539} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &339113544 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 339113545} + - 33: {fileID: 339113547} + - 23: {fileID: 339113546} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &339113545 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 339113544} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 349606543} + m_RootOrder: 2 +--- !u!23 &339113546 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 339113544} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &339113547 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 339113544} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &345088239 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 345088240} + - 33: {fileID: 345088242} + - 23: {fileID: 345088241} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &345088240 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 345088239} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 157447699} + m_RootOrder: 3 +--- !u!23 &345088241 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 345088239} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &345088242 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 345088239} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &349606542 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 349606543} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &349606543 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 349606542} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 61866934} + - {fileID: 1602538143} + - {fileID: 339113545} + - {fileID: 1102846825} + - {fileID: 653589771} + - {fileID: 2139240985} + - {fileID: 850494880} + - {fileID: 851576731} + - {fileID: 1169682652} + m_Father: {fileID: 1288823789} + m_RootOrder: 5 +--- !u!1 &349988447 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 349988448} + - 33: {fileID: 349988450} + - 23: {fileID: 349988449} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &349988448 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 349988447} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 358145806} + m_RootOrder: 6 +--- !u!23 &349988449 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 349988447} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &349988450 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 349988447} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &351209545 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 351209546} + - 33: {fileID: 351209548} + - 23: {fileID: 351209547} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &351209546 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 351209545} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1613309483} + m_RootOrder: 3 +--- !u!23 &351209547 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 351209545} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &351209548 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 351209545} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &352250861 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 352250862} + - 33: {fileID: 352250864} + - 23: {fileID: 352250863} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &352250862 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 352250861} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 604038727} + m_RootOrder: 3 +--- !u!23 &352250863 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 352250861} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &352250864 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 352250861} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &352349651 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 352349652} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &352349652 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 352349651} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 655133131} + - {fileID: 52338614} + - {fileID: 920142118} + - {fileID: 1475028433} + - {fileID: 97446090} + - {fileID: 1902281420} + - {fileID: 1445696865} + - {fileID: 1865533535} + - {fileID: 1305541519} + m_Father: {fileID: 1906654409} + m_RootOrder: 1 +--- !u!1 &352927685 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 352927686} + - 33: {fileID: 352927688} + - 23: {fileID: 352927687} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &352927686 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 352927685} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1591077534} + m_RootOrder: 8 +--- !u!23 &352927687 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 352927685} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &352927688 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 352927685} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &352977277 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 352977278} + - 33: {fileID: 352977280} + - 23: {fileID: 352977279} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &352977278 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 352977277} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 821285325} + m_RootOrder: 6 +--- !u!23 &352977279 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 352977277} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &352977280 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 352977277} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &354724695 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 354724696} + - 33: {fileID: 354724698} + - 23: {fileID: 354724697} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &354724696 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 354724695} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 969754910} + m_RootOrder: 2 +--- !u!23 &354724697 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 354724695} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &354724698 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 354724695} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &357871942 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 357871943} + m_Layer: 0 + m_Name: CubeGrid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &357871943 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 357871942} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.02090001, y: -.402413607, z: -1.52141666} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1624250639} + - {fileID: 1366031035} + - {fileID: 1243272144} + - {fileID: 1038701522} + - {fileID: 1049063299} + - {fileID: 1802157139} + - {fileID: 1536546683} + - {fileID: 1357615428} + - {fileID: 138445035} + m_Father: {fileID: 1335403818} + m_RootOrder: 4 +--- !u!1 &358145805 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 358145806} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &358145806 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358145805} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1001880624} + - {fileID: 1711515864} + - {fileID: 1505898926} + - {fileID: 1161644336} + - {fileID: 570170665} + - {fileID: 869062404} + - {fileID: 349988448} + - {fileID: 1465525031} + - {fileID: 1622807706} + m_Father: {fileID: 2047955730} + m_RootOrder: 3 +--- !u!1 &363080942 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 363080943} + - 33: {fileID: 363080945} + - 23: {fileID: 363080944} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &363080943 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 363080942} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 870806955} + m_RootOrder: 7 +--- !u!23 &363080944 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 363080942} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &363080945 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 363080942} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &364803735 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 364803736} + - 33: {fileID: 364803738} + - 23: {fileID: 364803737} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &364803736 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 364803735} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 415594698} + m_RootOrder: 6 +--- !u!23 &364803737 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 364803735} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &364803738 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 364803735} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &366225504 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 366225505} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &366225505 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 366225504} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 598451971} + - {fileID: 1288023954} + - {fileID: 583863356} + - {fileID: 776061702} + - {fileID: 176026934} + - {fileID: 3664028} + - {fileID: 1362344587} + - {fileID: 284640322} + - {fileID: 2093071929} + m_Father: {fileID: 1288823789} + m_RootOrder: 8 +--- !u!1 &368109053 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 368109054} + - 33: {fileID: 368109056} + - 23: {fileID: 368109055} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &368109054 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 368109053} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1136402243} + m_RootOrder: 0 +--- !u!23 &368109055 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 368109053} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &368109056 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 368109053} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &375505130 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 375505131} + - 33: {fileID: 375505133} + - 23: {fileID: 375505132} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &375505131 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 375505130} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 498431041} + m_RootOrder: 5 +--- !u!23 &375505132 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 375505130} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &375505133 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 375505130} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &379543544 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 379543545} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &379543545 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 379543544} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 944084776} + - {fileID: 262542702} + - {fileID: 1887303632} + - {fileID: 1334569733} + - {fileID: 540466442} + - {fileID: 1520303005} + - {fileID: 1128731190} + - {fileID: 578583990} + - {fileID: 97341079} + m_Father: {fileID: 320694060} + m_RootOrder: 0 +--- !u!1 &382491389 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 382491390} + - 33: {fileID: 382491392} + - 23: {fileID: 382491391} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &382491390 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 382491389} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 554489815} + m_RootOrder: 4 +--- !u!23 &382491391 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 382491389} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &382491392 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 382491389} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &382685687 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 382685688} + - 33: {fileID: 382685690} + - 23: {fileID: 382685689} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &382685688 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 382685687} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 498431041} + m_RootOrder: 3 +--- !u!23 &382685689 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 382685687} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &382685690 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 382685687} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &387035446 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 387035447} + - 33: {fileID: 387035449} + - 23: {fileID: 387035448} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &387035447 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 387035446} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1413035099} + m_RootOrder: 0 +--- !u!23 &387035448 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 387035446} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &387035449 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 387035446} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &396729916 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 396729917} + - 33: {fileID: 396729919} + - 23: {fileID: 396729918} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &396729917 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 396729916} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 412002962} + m_RootOrder: 5 +--- !u!23 &396729918 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 396729916} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &396729919 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 396729916} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &398582822 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 398582823} + - 33: {fileID: 398582825} + - 23: {fileID: 398582824} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &398582823 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 398582822} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2097222327} + m_RootOrder: 0 +--- !u!23 &398582824 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 398582822} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &398582825 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 398582822} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &398823142 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 398823143} + - 33: {fileID: 398823145} + - 23: {fileID: 398823144} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &398823143 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 398823142} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231738743} + m_RootOrder: 8 +--- !u!23 &398823144 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 398823142} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &398823145 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 398823142} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &404626639 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 404626640} + - 33: {fileID: 404626642} + - 23: {fileID: 404626641} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &404626640 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 404626639} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1049063299} + m_RootOrder: 2 +--- !u!23 &404626641 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 404626639} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &404626642 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 404626639} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &405307837 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 405307838} + - 33: {fileID: 405307840} + - 23: {fileID: 405307839} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &405307838 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 405307837} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1624250639} + m_RootOrder: 8 +--- !u!23 &405307839 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 405307837} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &405307840 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 405307837} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &406100770 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 406100771} + - 33: {fileID: 406100773} + - 23: {fileID: 406100772} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &406100771 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406100770} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1961106353} + m_RootOrder: 4 +--- !u!23 &406100772 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406100770} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &406100773 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406100770} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &412002961 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 412002962} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &412002962 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 412002961} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1571448786} + - {fileID: 1063450513} + - {fileID: 1767762801} + - {fileID: 821731846} + - {fileID: 47831829} + - {fileID: 396729917} + - {fileID: 1195783902} + - {fileID: 1462913751} + - {fileID: 715690333} + m_Father: {fileID: 2047955730} + m_RootOrder: 7 +--- !u!1 &413262253 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 413262254} + - 33: {fileID: 413262256} + - 23: {fileID: 413262255} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &413262254 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 413262253} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1950362483} + m_RootOrder: 0 +--- !u!23 &413262255 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 413262253} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &413262256 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 413262253} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &413406531 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 413406532} + - 33: {fileID: 413406534} + - 23: {fileID: 413406533} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &413406532 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 413406531} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 217104405} + m_RootOrder: 4 +--- !u!23 &413406533 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 413406531} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &413406534 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 413406531} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &415594697 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 415594698} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &415594698 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 415594697} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1475930363} + - {fileID: 1492260308} + - {fileID: 2085279771} + - {fileID: 1883108106} + - {fileID: 513028103} + - {fileID: 683790916} + - {fileID: 364803736} + - {fileID: 865105502} + - {fileID: 1459732962} + m_Father: {fileID: 416898948} + m_RootOrder: 8 +--- !u!1 &415624977 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 415624978} + - 33: {fileID: 415624980} + - 23: {fileID: 415624979} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &415624978 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 415624977} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 849571239} + m_RootOrder: 5 +--- !u!23 &415624979 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 415624977} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &415624980 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 415624977} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &416384452 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 416384453} + - 33: {fileID: 416384455} + - 23: {fileID: 416384454} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &416384453 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 416384452} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1038701522} + m_RootOrder: 0 +--- !u!23 &416384454 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 416384452} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &416384455 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 416384452} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &416898947 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 416898948} + m_Layer: 0 + m_Name: CubeGrid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &416898948 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 416898947} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.02090001, y: -.402413607, z: -2.52141666} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 768694475} + - {fileID: 1041296208} + - {fileID: 72504183} + - {fileID: 498431041} + - {fileID: 1965163931} + - {fileID: 554489815} + - {fileID: 471463405} + - {fileID: 157447699} + - {fileID: 415594698} + m_Father: {fileID: 1335403818} + m_RootOrder: 7 +--- !u!1 &418861001 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 418861002} + - 33: {fileID: 418861004} + - 23: {fileID: 418861003} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &418861002 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 418861001} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1591077534} + m_RootOrder: 4 +--- !u!23 &418861003 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 418861001} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &418861004 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 418861001} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &423336366 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 423336367} + - 33: {fileID: 423336369} + - 23: {fileID: 423336368} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &423336367 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 423336366} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1687020670} + m_RootOrder: 6 +--- !u!23 &423336368 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 423336366} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &423336369 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 423336366} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &426250120 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 426250121} + - 33: {fileID: 426250123} + - 23: {fileID: 426250122} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &426250121 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 426250120} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1410998029} + m_RootOrder: 0 +--- !u!23 &426250122 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 426250120} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &426250123 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 426250120} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &427916688 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 427916689} + - 33: {fileID: 427916691} + - 23: {fileID: 427916690} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &427916689 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 427916688} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1410998029} + m_RootOrder: 4 +--- !u!23 &427916690 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 427916688} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &427916691 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 427916688} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &428027776 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 428027777} + - 33: {fileID: 428027779} + - 23: {fileID: 428027778} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &428027777 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 428027776} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 471463405} + m_RootOrder: 7 +--- !u!23 &428027778 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 428027776} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &428027779 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 428027776} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &429781487 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 429781488} + - 33: {fileID: 429781490} + - 23: {fileID: 429781489} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &429781488 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 429781487} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1965163931} + m_RootOrder: 8 +--- !u!23 &429781489 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 429781487} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &429781490 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 429781487} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1001 &430584707 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 400004, guid: 126d619cf4daa52469682f85c1378b4a, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 126d619cf4daa52469682f85c1378b4a, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 126d619cf4daa52469682f85c1378b4a, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 126d619cf4daa52469682f85c1378b4a, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 126d619cf4daa52469682f85c1378b4a, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 126d619cf4daa52469682f85c1378b4a, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 126d619cf4daa52469682f85c1378b4a, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 126d619cf4daa52469682f85c1378b4a, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 126d619cf4daa52469682f85c1378b4a, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &430685318 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 430685319} + - 33: {fileID: 430685321} + - 23: {fileID: 430685320} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &430685319 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 430685318} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1049063299} + m_RootOrder: 8 +--- !u!23 &430685320 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 430685318} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &430685321 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 430685318} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &433168049 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 433168050} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &433168050 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 433168049} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1574963638} + - {fileID: 579785515} + - {fileID: 265207076} + - {fileID: 1173828076} + - {fileID: 626833814} + - {fileID: 1665684508} + - {fileID: 39951913} + - {fileID: 1741551535} + - {fileID: 784653061} + m_Father: {fileID: 1285129845} + m_RootOrder: 8 +--- !u!1 &433219885 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 433219886} + - 33: {fileID: 433219888} + - 23: {fileID: 433219887} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &433219886 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 433219885} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2040025849} + m_RootOrder: 0 +--- !u!23 &433219887 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 433219885} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &433219888 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 433219885} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &433220171 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 433220172} + - 33: {fileID: 433220174} + - 23: {fileID: 433220173} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &433220172 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 433220171} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1041296208} + m_RootOrder: 8 +--- !u!23 &433220173 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 433220171} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &433220174 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 433220171} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &433647461 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 433647462} + - 33: {fileID: 433647464} + - 23: {fileID: 433647463} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &433647462 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 433647461} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1041296208} + m_RootOrder: 5 +--- !u!23 &433647463 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 433647461} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &433647464 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 433647461} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &434164392 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 434164393} + - 33: {fileID: 434164395} + - 23: {fileID: 434164394} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &434164393 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 434164392} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1550093339} + m_RootOrder: 0 +--- !u!23 &434164394 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 434164392} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &434164395 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 434164392} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &436597879 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 436597880} + - 33: {fileID: 436597882} + - 23: {fileID: 436597881} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &436597880 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 436597879} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 72504183} + m_RootOrder: 8 +--- !u!23 &436597881 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 436597879} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &436597882 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 436597879} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &437676467 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 437676468} + - 33: {fileID: 437676470} + - 23: {fileID: 437676469} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &437676468 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 437676467} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 857026539} + m_RootOrder: 4 +--- !u!23 &437676469 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 437676467} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &437676470 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 437676467} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &440610437 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 440610438} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &440610438 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 440610437} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 645802775} + - {fileID: 452972113} + - {fileID: 575084346} + - {fileID: 26660322} + - {fileID: 1729768773} + - {fileID: 1834334019} + - {fileID: 1044959949} + - {fileID: 227248110} + - {fileID: 1475464809} + m_Father: {fileID: 1285129845} + m_RootOrder: 0 +--- !u!1 &445368523 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 445368524} + - 33: {fileID: 445368526} + - 23: {fileID: 445368525} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &445368524 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 445368523} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1243272144} + m_RootOrder: 7 +--- !u!23 &445368525 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 445368523} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &445368526 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 445368523} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &447053504 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 447053505} + - 33: {fileID: 447053507} + - 23: {fileID: 447053506} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &447053505 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 447053504} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 870806955} + m_RootOrder: 1 +--- !u!23 &447053506 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 447053504} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &447053507 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 447053504} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &448229885 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 448229886} + - 33: {fileID: 448229888} + - 23: {fileID: 448229887} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &448229886 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 448229885} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1410998029} + m_RootOrder: 3 +--- !u!23 &448229887 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 448229885} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &448229888 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 448229885} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &448452948 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 448452949} + - 33: {fileID: 448452951} + - 23: {fileID: 448452950} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &448452949 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 448452948} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 72504183} + m_RootOrder: 5 +--- !u!23 &448452950 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 448452948} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &448452951 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 448452948} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &451337794 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 451337795} + - 33: {fileID: 451337797} + - 23: {fileID: 451337796} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &451337795 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 451337794} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1041296208} + m_RootOrder: 2 +--- !u!23 &451337796 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 451337794} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &451337797 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 451337794} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &452972112 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 452972113} + - 33: {fileID: 452972115} + - 23: {fileID: 452972114} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &452972113 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452972112} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 440610438} + m_RootOrder: 1 +--- !u!23 &452972114 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452972112} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &452972115 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452972112} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &461508963 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 461508964} + - 33: {fileID: 461508966} + - 23: {fileID: 461508965} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &461508964 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 461508963} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 499152561} + m_RootOrder: 0 +--- !u!23 &461508965 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 461508963} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &461508966 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 461508963} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &463653235 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 463653236} + - 33: {fileID: 463653238} + - 23: {fileID: 463653237} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &463653236 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 463653235} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1402568966} + m_RootOrder: 4 +--- !u!23 &463653237 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 463653235} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &463653238 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 463653235} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &469176261 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 469176262} + - 33: {fileID: 469176264} + - 23: {fileID: 469176263} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &469176262 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 469176261} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1330598094} + m_RootOrder: 3 +--- !u!23 &469176263 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 469176261} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &469176264 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 469176261} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &471463404 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 471463405} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &471463405 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 471463404} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1512158322} + - {fileID: 726430108} + - {fileID: 1827989466} + - {fileID: 621855946} + - {fileID: 1052080523} + - {fileID: 626371961} + - {fileID: 1448535561} + - {fileID: 428027777} + - {fileID: 1662872402} + m_Father: {fileID: 416898948} + m_RootOrder: 6 +--- !u!1 &471620195 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 471620196} + - 33: {fileID: 471620198} + - 23: {fileID: 471620197} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &471620196 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 471620195} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 698956160} + m_RootOrder: 6 +--- !u!23 &471620197 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 471620195} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &471620198 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 471620195} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &474628328 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 474628329} + - 33: {fileID: 474628331} + - 23: {fileID: 474628330} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &474628329 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 474628328} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 191837273} + m_RootOrder: 8 +--- !u!23 &474628330 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 474628328} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &474628331 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 474628328} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &477954934 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 477954935} + - 33: {fileID: 477954937} + - 23: {fileID: 477954936} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &477954935 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 477954934} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1410998029} + m_RootOrder: 5 +--- !u!23 &477954936 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 477954934} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &477954937 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 477954934} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &484195583 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 484195584} + - 33: {fileID: 484195586} + - 23: {fileID: 484195585} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &484195584 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 484195583} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1038701522} + m_RootOrder: 6 +--- !u!23 &484195585 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 484195583} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &484195586 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 484195583} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &484270179 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 484270180} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &484270180 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 484270179} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1585804692} + - {fileID: 35212800} + - {fileID: 1245497275} + - {fileID: 555280643} + - {fileID: 11815621} + - {fileID: 1202756945} + - {fileID: 716723409} + - {fileID: 2004483208} + - {fileID: 1717160740} + m_Father: {fileID: 1906654409} + m_RootOrder: 4 +--- !u!1 &484418414 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 484418415} + - 33: {fileID: 484418417} + - 23: {fileID: 484418416} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &484418415 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 484418414} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1145749506} + m_RootOrder: 4 +--- !u!23 &484418416 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 484418414} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &484418417 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 484418414} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &484522387 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 484522388} + - 33: {fileID: 484522390} + - 23: {fileID: 484522389} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &484522388 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 484522387} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 843886803} + m_RootOrder: 2 +--- !u!23 &484522389 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 484522387} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &484522390 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 484522387} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &485922318 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 485922319} + - 33: {fileID: 485922321} + - 23: {fileID: 485922320} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &485922319 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 485922318} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2049357828} + m_RootOrder: 8 +--- !u!23 &485922320 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 485922318} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &485922321 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 485922318} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &494523047 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 494523048} + - 33: {fileID: 494523050} + - 23: {fileID: 494523049} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &494523048 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 494523047} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 146325016} + m_RootOrder: 7 +--- !u!23 &494523049 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 494523047} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &494523050 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 494523047} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &498431040 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 498431041} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &498431041 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 498431040} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 905568585} + - {fileID: 882231446} + - {fileID: 754377028} + - {fileID: 382685688} + - {fileID: 2068883891} + - {fileID: 375505131} + - {fileID: 2057664975} + - {fileID: 1741033992} + - {fileID: 778259615} + m_Father: {fileID: 416898948} + m_RootOrder: 3 +--- !u!1 &499152560 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 499152561} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &499152561 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 499152560} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 461508964} + - {fileID: 1948389798} + - {fileID: 981850443} + - {fileID: 2045179446} + - {fileID: 1700747218} + - {fileID: 1074652779} + - {fileID: 1274924130} + - {fileID: 1396288340} + - {fileID: 1587431538} + m_Father: {fileID: 311797878} + m_RootOrder: 7 +--- !u!1 &504812017 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 504812018} + - 33: {fileID: 504812020} + - 23: {fileID: 504812019} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &504812018 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 504812017} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231738743} + m_RootOrder: 6 +--- !u!23 &504812019 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 504812017} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &504812020 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 504812017} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &506744596 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 506744597} + - 33: {fileID: 506744599} + - 23: {fileID: 506744598} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &506744597 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 506744596} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1758170125} + m_RootOrder: 6 +--- !u!23 &506744598 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 506744596} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &506744599 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 506744596} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &511318833 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 511318834} + - 33: {fileID: 511318836} + - 23: {fileID: 511318835} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &511318834 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 511318833} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 332742599} + m_RootOrder: 3 +--- !u!23 &511318835 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 511318833} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &511318836 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 511318833} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &511402743 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 511402744} + - 33: {fileID: 511402746} + - 23: {fileID: 511402745} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &511402744 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 511402743} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1613309483} + m_RootOrder: 5 +--- !u!23 &511402745 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 511402743} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &511402746 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 511402743} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &513028102 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 513028103} + - 33: {fileID: 513028105} + - 23: {fileID: 513028104} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &513028103 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 513028102} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 415594698} + m_RootOrder: 4 +--- !u!23 &513028104 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 513028102} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &513028105 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 513028102} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &514001096 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 514001097} + - 33: {fileID: 514001099} + - 23: {fileID: 514001098} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &514001097 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 514001096} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1251486547} + m_RootOrder: 8 +--- !u!23 &514001098 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 514001096} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &514001099 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 514001096} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &520605638 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 520605639} + - 33: {fileID: 520605641} + - 23: {fileID: 520605640} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &520605639 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 520605638} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2070993649} + m_RootOrder: 2 +--- !u!23 &520605640 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 520605638} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &520605641 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 520605638} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &523985742 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 523985743} + - 33: {fileID: 523985745} + - 23: {fileID: 523985744} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &523985743 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 523985742} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 857026539} + m_RootOrder: 1 +--- !u!23 &523985744 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 523985742} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &523985745 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 523985742} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &531698856 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 531698857} + - 33: {fileID: 531698859} + - 23: {fileID: 531698858} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &531698857 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 531698856} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1687020670} + m_RootOrder: 3 +--- !u!23 &531698858 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 531698856} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &531698859 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 531698856} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &532371071 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 532371072} + - 33: {fileID: 532371074} + - 23: {fileID: 532371073} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &532371072 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 532371071} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1587156216} + m_RootOrder: 5 +--- !u!23 &532371073 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 532371071} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &532371074 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 532371071} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &539304523 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 539304524} + - 33: {fileID: 539304526} + - 23: {fileID: 539304525} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &539304524 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 539304523} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 157447699} + m_RootOrder: 4 +--- !u!23 &539304525 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 539304523} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &539304526 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 539304523} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &540466441 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 540466442} + - 33: {fileID: 540466444} + - 23: {fileID: 540466443} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &540466442 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 540466441} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 379543545} + m_RootOrder: 4 +--- !u!23 &540466443 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 540466441} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &540466444 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 540466441} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &540681793 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 540681794} + - 33: {fileID: 540681796} + - 23: {fileID: 540681795} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &540681794 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 540681793} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1269069112} + m_RootOrder: 7 +--- !u!23 &540681795 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 540681793} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &540681796 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 540681793} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &546731475 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 546731476} + - 33: {fileID: 546731478} + - 23: {fileID: 546731477} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &546731476 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 546731475} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1881349947} + m_RootOrder: 1 +--- !u!23 &546731477 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 546731475} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &546731478 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 546731475} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &546913079 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 546913080} + - 33: {fileID: 546913082} + - 23: {fileID: 546913081} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &546913080 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 546913079} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1396826707} + m_RootOrder: 2 +--- !u!23 &546913081 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 546913079} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &546913082 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 546913079} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &548293211 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 548293212} + - 33: {fileID: 548293214} + - 23: {fileID: 548293213} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &548293212 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 548293211} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1357615428} + m_RootOrder: 6 +--- !u!23 &548293213 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 548293211} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &548293214 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 548293211} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &548381933 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 548381934} + - 33: {fileID: 548381936} + - 23: {fileID: 548381935} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &548381934 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 548381933} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 774647436} + m_RootOrder: 1 +--- !u!23 &548381935 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 548381933} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &548381936 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 548381933} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &549499154 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 549499155} + - 33: {fileID: 549499157} + - 23: {fileID: 549499156} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &549499155 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 549499154} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231626962} + m_RootOrder: 8 +--- !u!23 &549499156 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 549499154} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &549499157 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 549499154} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &554489814 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 554489815} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &554489815 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 554489814} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 215669802} + - {fileID: 579658403} + - {fileID: 1389388062} + - {fileID: 144254504} + - {fileID: 382491390} + - {fileID: 1424159264} + - {fileID: 1318505279} + - {fileID: 1457726232} + - {fileID: 1822101654} + m_Father: {fileID: 416898948} + m_RootOrder: 5 +--- !u!1 &555280642 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 555280643} + - 33: {fileID: 555280645} + - 23: {fileID: 555280644} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &555280643 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 555280642} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 484270180} + m_RootOrder: 3 +--- !u!23 &555280644 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 555280642} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &555280645 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 555280642} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &564326637 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 564326638} + - 33: {fileID: 564326640} + - 23: {fileID: 564326639} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &564326638 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 564326637} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1550093339} + m_RootOrder: 4 +--- !u!23 &564326639 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 564326637} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &564326640 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 564326637} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &567130466 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 567130467} + - 33: {fileID: 567130469} + - 23: {fileID: 567130468} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &567130467 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 567130466} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1082956371} + m_RootOrder: 7 +--- !u!23 &567130468 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 567130466} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &567130469 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 567130466} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &570170664 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 570170665} + - 33: {fileID: 570170667} + - 23: {fileID: 570170666} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &570170665 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 570170664} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 358145806} + m_RootOrder: 4 +--- !u!23 &570170666 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 570170664} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &570170667 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 570170664} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &571634747 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 571634748} + - 33: {fileID: 571634750} + - 23: {fileID: 571634749} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &571634748 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 571634747} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1758170125} + m_RootOrder: 2 +--- !u!23 &571634749 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 571634747} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &571634750 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 571634747} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &575084345 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 575084346} + - 33: {fileID: 575084348} + - 23: {fileID: 575084347} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &575084346 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575084345} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 440610438} + m_RootOrder: 2 +--- !u!23 &575084347 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575084345} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &575084348 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575084345} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &578583989 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 578583990} + - 33: {fileID: 578583992} + - 23: {fileID: 578583991} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &578583990 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 578583989} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 379543545} + m_RootOrder: 7 +--- !u!23 &578583991 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 578583989} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &578583992 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 578583989} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &579658402 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 579658403} + - 33: {fileID: 579658405} + - 23: {fileID: 579658404} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &579658403 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 579658402} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 554489815} + m_RootOrder: 1 +--- !u!23 &579658404 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 579658402} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &579658405 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 579658402} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &579785514 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 579785515} + - 33: {fileID: 579785517} + - 23: {fileID: 579785516} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &579785515 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 579785514} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 433168050} + m_RootOrder: 1 +--- !u!23 &579785516 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 579785514} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &579785517 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 579785514} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &583863355 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 583863356} + - 33: {fileID: 583863358} + - 23: {fileID: 583863357} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &583863356 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 583863355} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 366225505} + m_RootOrder: 2 +--- !u!23 &583863357 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 583863355} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &583863358 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 583863355} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &585764506 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 585764507} + - 33: {fileID: 585764509} + - 23: {fileID: 585764508} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &585764507 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 585764506} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 989992470} + m_RootOrder: 7 +--- !u!23 &585764508 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 585764506} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &585764509 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 585764506} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &589321229 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 589321230} + - 33: {fileID: 589321232} + - 23: {fileID: 589321231} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &589321230 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 589321229} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1591077534} + m_RootOrder: 5 +--- !u!23 &589321231 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 589321229} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &589321232 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 589321229} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &591298305 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 591298306} + - 33: {fileID: 591298308} + - 23: {fileID: 591298307} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &591298306 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 591298305} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 698956160} + m_RootOrder: 2 +--- !u!23 &591298307 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 591298305} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &591298308 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 591298305} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &592028978 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 592028979} + - 33: {fileID: 592028981} + - 23: {fileID: 592028980} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &592028979 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 592028978} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1396826707} + m_RootOrder: 8 +--- !u!23 &592028980 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 592028978} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &592028981 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 592028978} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &597432347 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 597432348} + - 33: {fileID: 597432350} + - 23: {fileID: 597432349} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &597432348 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 597432347} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 843886803} + m_RootOrder: 6 +--- !u!23 &597432349 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 597432347} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &597432350 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 597432347} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &598451970 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 598451971} + - 33: {fileID: 598451973} + - 23: {fileID: 598451972} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &598451971 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 598451970} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 366225505} + m_RootOrder: 0 +--- !u!23 &598451972 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 598451970} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &598451973 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 598451970} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &604038726 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 604038727} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &604038727 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 604038726} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 912679176} + - {fileID: 714657756} + - {fileID: 1026110227} + - {fileID: 352250862} + - {fileID: 1400544811} + - {fileID: 271422296} + - {fileID: 1059900642} + - {fileID: 1660802535} + - {fileID: 53922724} + m_Father: {fileID: 1875085494} + m_RootOrder: 2 +--- !u!1 &606569944 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 606569945} + - 33: {fileID: 606569947} + - 23: {fileID: 606569946} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &606569945 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 606569944} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 332742599} + m_RootOrder: 7 +--- !u!23 &606569946 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 606569944} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &606569947 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 606569944} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &607719587 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 607719588} + - 33: {fileID: 607719590} + - 23: {fileID: 607719589} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &607719588 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 607719587} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1613309483} + m_RootOrder: 4 +--- !u!23 &607719589 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 607719587} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &607719590 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 607719587} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &608429980 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 608429981} + - 33: {fileID: 608429983} + - 23: {fileID: 608429982} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &608429981 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 608429980} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1145749506} + m_RootOrder: 7 +--- !u!23 &608429982 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 608429980} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &608429983 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 608429980} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &608618474 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 608618475} + - 33: {fileID: 608618477} + - 23: {fileID: 608618476} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &608618475 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 608618474} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 774647436} + m_RootOrder: 0 +--- !u!23 &608618476 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 608618474} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &608618477 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 608618474} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &608944952 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 608944953} + - 33: {fileID: 608944955} + - 23: {fileID: 608944954} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &608944953 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 608944952} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1396826707} + m_RootOrder: 1 +--- !u!23 &608944954 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 608944952} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &608944955 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 608944952} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &610586810 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 610586811} + - 33: {fileID: 610586813} + - 23: {fileID: 610586812} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &610586811 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 610586810} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 774647436} + m_RootOrder: 5 +--- !u!23 &610586812 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 610586810} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &610586813 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 610586810} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &614301047 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 614301048} + - 33: {fileID: 614301050} + - 23: {fileID: 614301049} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &614301048 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 614301047} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1337936969} + m_RootOrder: 8 +--- !u!23 &614301049 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 614301047} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &614301050 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 614301047} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &617739922 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 617739923} + - 33: {fileID: 617739925} + - 23: {fileID: 617739924} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &617739923 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617739922} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1318928928} + m_RootOrder: 6 +--- !u!23 &617739924 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617739922} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &617739925 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617739922} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &621855945 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 621855946} + - 33: {fileID: 621855948} + - 23: {fileID: 621855947} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &621855946 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 621855945} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 471463405} + m_RootOrder: 3 +--- !u!23 &621855947 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 621855945} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &621855948 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 621855945} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &621882597 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 621882598} + - 33: {fileID: 621882600} + - 23: {fileID: 621882599} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &621882598 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 621882597} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1269069112} + m_RootOrder: 5 +--- !u!23 &621882599 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 621882597} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &621882600 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 621882597} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &626371960 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 626371961} + - 33: {fileID: 626371963} + - 23: {fileID: 626371962} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &626371961 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 626371960} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 471463405} + m_RootOrder: 5 +--- !u!23 &626371962 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 626371960} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &626371963 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 626371960} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &626833813 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 626833814} + - 33: {fileID: 626833816} + - 23: {fileID: 626833815} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &626833814 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 626833813} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 433168050} + m_RootOrder: 4 +--- !u!23 &626833815 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 626833813} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &626833816 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 626833813} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &628298918 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 628298919} + - 33: {fileID: 628298921} + - 23: {fileID: 628298920} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &628298919 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 628298918} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 969754910} + m_RootOrder: 0 +--- !u!23 &628298920 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 628298918} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &628298921 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 628298918} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &633738327 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 633738328} + - 33: {fileID: 633738330} + - 23: {fileID: 633738329} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &633738328 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 633738327} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1330598094} + m_RootOrder: 2 +--- !u!23 &633738329 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 633738327} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &633738330 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 633738327} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &639002473 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 639002474} + - 33: {fileID: 639002476} + - 23: {fileID: 639002475} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &639002474 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 639002473} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 138445035} + m_RootOrder: 2 +--- !u!23 &639002475 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 639002473} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &639002476 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 639002473} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &642335543 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 642335544} + - 33: {fileID: 642335546} + - 23: {fileID: 642335545} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &642335544 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 642335543} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 768694475} + m_RootOrder: 7 +--- !u!23 &642335545 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 642335543} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &642335546 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 642335543} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &645802774 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 645802775} + - 33: {fileID: 645802777} + - 23: {fileID: 645802776} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &645802775 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 645802774} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 440610438} + m_RootOrder: 0 +--- !u!23 &645802776 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 645802774} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &645802777 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 645802774} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &646509305 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 646509306} + - 33: {fileID: 646509308} + - 23: {fileID: 646509307} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &646509306 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 646509305} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1591077534} + m_RootOrder: 1 +--- !u!23 &646509307 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 646509305} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &646509308 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 646509305} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &653589770 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 653589771} + - 33: {fileID: 653589773} + - 23: {fileID: 653589772} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &653589771 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 653589770} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 349606543} + m_RootOrder: 4 +--- !u!23 &653589772 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 653589770} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &653589773 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 653589770} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &653981193 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 653981194} + - 33: {fileID: 653981196} + - 23: {fileID: 653981195} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &653981194 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 653981193} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2070993649} + m_RootOrder: 7 +--- !u!23 &653981195 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 653981193} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &653981196 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 653981193} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &655133130 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 655133131} + - 33: {fileID: 655133133} + - 23: {fileID: 655133132} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &655133131 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 655133130} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 352349652} + m_RootOrder: 0 +--- !u!23 &655133132 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 655133130} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &655133133 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 655133130} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &656027562 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 656027563} + - 33: {fileID: 656027565} + - 23: {fileID: 656027564} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &656027563 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 656027562} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1337936969} + m_RootOrder: 6 +--- !u!23 &656027564 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 656027562} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &656027565 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 656027562} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &664229993 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 664229994} + - 33: {fileID: 664229996} + - 23: {fileID: 664229995} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &664229994 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 664229993} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1240836681} + m_RootOrder: 8 +--- !u!23 &664229995 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 664229993} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &664229996 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 664229993} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &668452299 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 668452300} + - 33: {fileID: 668452302} + - 23: {fileID: 668452301} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &668452300 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 668452299} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1337936969} + m_RootOrder: 3 +--- !u!23 &668452301 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 668452299} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &668452302 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 668452299} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &670426898 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 670426899} + - 33: {fileID: 670426901} + - 23: {fileID: 670426900} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &670426899 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 670426898} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1687020670} + m_RootOrder: 1 +--- !u!23 &670426900 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 670426898} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &670426901 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 670426898} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &670736872 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 670736873} + - 33: {fileID: 670736875} + - 23: {fileID: 670736874} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &670736873 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 670736872} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2049357828} + m_RootOrder: 0 +--- !u!23 &670736874 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 670736872} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &670736875 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 670736872} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &671668762 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 671668763} + - 33: {fileID: 671668765} + - 23: {fileID: 671668764} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &671668763 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 671668762} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 710806381} + m_RootOrder: 1 +--- !u!23 &671668764 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 671668762} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &671668765 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 671668762} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &672418998 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 672418999} + - 33: {fileID: 672419001} + - 23: {fileID: 672419000} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &672418999 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 672418998} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 138445035} + m_RootOrder: 6 +--- !u!23 &672419000 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 672418998} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &672419001 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 672418998} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &674325341 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 674325342} + - 33: {fileID: 674325344} + - 23: {fileID: 674325343} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &674325342 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 674325341} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 138445035} + m_RootOrder: 7 +--- !u!23 &674325343 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 674325341} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &674325344 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 674325341} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &683790915 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 683790916} + - 33: {fileID: 683790918} + - 23: {fileID: 683790917} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &683790916 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 683790915} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 415594698} + m_RootOrder: 5 +--- !u!23 &683790917 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 683790915} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &683790918 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 683790915} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &688419947 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 688419948} + - 33: {fileID: 688419950} + - 23: {fileID: 688419949} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &688419948 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 688419947} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 950631283} + m_RootOrder: 2 +--- !u!23 &688419949 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 688419947} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &688419950 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 688419947} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &688604065 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 688604066} + - 33: {fileID: 688604068} + - 23: {fileID: 688604067} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &688604066 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 688604065} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 950631283} + m_RootOrder: 7 +--- !u!23 &688604067 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 688604065} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &688604068 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 688604065} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &690061369 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 690061370} + - 33: {fileID: 690061372} + - 23: {fileID: 690061371} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &690061370 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 690061369} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 710806381} + m_RootOrder: 6 +--- !u!23 &690061371 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 690061369} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &690061372 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 690061369} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &691554663 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 691554664} + - 33: {fileID: 691554666} + - 23: {fileID: 691554665} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &691554664 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 691554663} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 157447699} + m_RootOrder: 6 +--- !u!23 &691554665 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 691554663} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &691554666 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 691554663} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &692314445 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 692314446} + - 33: {fileID: 692314448} + - 23: {fileID: 692314447} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &692314446 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 692314445} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1881349947} + m_RootOrder: 5 +--- !u!23 &692314447 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 692314445} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &692314448 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 692314445} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &694065972 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 694065973} + - 33: {fileID: 694065975} + - 23: {fileID: 694065974} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &694065973 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 694065972} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 969754910} + m_RootOrder: 7 +--- !u!23 &694065974 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 694065972} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &694065975 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 694065972} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &694583487 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 694583488} + - 33: {fileID: 694583490} + - 23: {fileID: 694583489} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &694583488 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 694583487} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 217104405} + m_RootOrder: 0 +--- !u!23 &694583489 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 694583487} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &694583490 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 694583487} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &695396972 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 695396973} + - 33: {fileID: 695396975} + - 23: {fileID: 695396974} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &695396973 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 695396972} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1251486547} + m_RootOrder: 1 +--- !u!23 &695396974 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 695396972} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &695396975 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 695396972} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &697907465 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 697907466} + - 33: {fileID: 697907468} + - 23: {fileID: 697907467} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &697907466 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 697907465} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 217104405} + m_RootOrder: 5 +--- !u!23 &697907467 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 697907465} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &697907468 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 697907465} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &698956159 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 698956160} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &698956160 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 698956159} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1979134599} + - {fileID: 1446319686} + - {fileID: 591298306} + - {fileID: 66939663} + - {fileID: 1825854681} + - {fileID: 950671321} + - {fileID: 471620196} + - {fileID: 60223818} + - {fileID: 260159409} + m_Father: {fileID: 1288823789} + m_RootOrder: 4 +--- !u!1 &704930281 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 704930282} + - 33: {fileID: 704930284} + - 23: {fileID: 704930283} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &704930282 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 704930281} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1758170125} + m_RootOrder: 1 +--- !u!23 &704930283 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 704930281} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &704930284 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 704930281} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &707099599 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 707099600} + - 33: {fileID: 707099602} + - 23: {fileID: 707099601} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &707099600 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 707099599} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1330598094} + m_RootOrder: 8 +--- !u!23 &707099601 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 707099599} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &707099602 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 707099599} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &710806380 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 710806381} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &710806381 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 710806380} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1506383276} + - {fileID: 671668763} + - {fileID: 1913051230} + - {fileID: 1954311486} + - {fileID: 1494943606} + - {fileID: 1181315792} + - {fileID: 690061370} + - {fileID: 81328367} + - {fileID: 921992683} + m_Father: {fileID: 1288823789} + m_RootOrder: 1 +--- !u!1 &711857078 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 711857079} + - 33: {fileID: 711857081} + - 23: {fileID: 711857080} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &711857079 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 711857078} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 774647436} + m_RootOrder: 4 +--- !u!23 &711857080 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 711857078} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &711857081 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 711857078} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &712597645 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 712597646} + - 33: {fileID: 712597648} + - 23: {fileID: 712597647} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &712597646 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 712597645} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2070993649} + m_RootOrder: 6 +--- !u!23 &712597647 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 712597645} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &712597648 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 712597645} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &714657755 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 714657756} + - 33: {fileID: 714657758} + - 23: {fileID: 714657757} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &714657756 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 714657755} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 604038727} + m_RootOrder: 1 +--- !u!23 &714657757 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 714657755} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &714657758 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 714657755} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &715690332 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 715690333} + - 33: {fileID: 715690335} + - 23: {fileID: 715690334} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &715690333 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 715690332} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 412002962} + m_RootOrder: 8 +--- !u!23 &715690334 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 715690332} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &715690335 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 715690332} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &716723408 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 716723409} + - 33: {fileID: 716723411} + - 23: {fileID: 716723410} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &716723409 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 716723408} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 484270180} + m_RootOrder: 6 +--- !u!23 &716723410 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 716723408} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &716723411 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 716723408} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &719486258 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 719486259} + - 33: {fileID: 719486261} + - 23: {fileID: 719486260} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &719486259 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719486258} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1711378518} + m_RootOrder: 5 +--- !u!23 &719486260 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719486258} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &719486261 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719486258} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &723900744 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 723900745} + - 33: {fileID: 723900747} + - 23: {fileID: 723900746} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &723900745 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 723900744} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1587156216} + m_RootOrder: 1 +--- !u!23 &723900746 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 723900744} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &723900747 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 723900744} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &726430107 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 726430108} + - 33: {fileID: 726430110} + - 23: {fileID: 726430109} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &726430108 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 726430107} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 471463405} + m_RootOrder: 1 +--- !u!23 &726430109 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 726430107} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &726430110 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 726430107} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &728103436 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 728103437} + - 33: {fileID: 728103439} + - 23: {fileID: 728103438} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &728103437 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 728103436} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1269069112} + m_RootOrder: 0 +--- !u!23 &728103438 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 728103436} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &728103439 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 728103436} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &728585452 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 728585453} + - 33: {fileID: 728585455} + - 23: {fileID: 728585454} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &728585453 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 728585452} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1687020670} + m_RootOrder: 7 +--- !u!23 &728585454 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 728585452} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &728585455 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 728585452} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &729236453 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 729236454} + - 33: {fileID: 729236456} + - 23: {fileID: 729236455} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &729236454 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 729236453} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1357615428} + m_RootOrder: 3 +--- !u!23 &729236455 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 729236453} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &729236456 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 729236453} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &732523450 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 732523451} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &732523451 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 732523450} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 827734987} + - {fileID: 1608184003} + - {fileID: 1395995597} + - {fileID: 1444405829} + - {fileID: 881430522} + - {fileID: 2056972174} + - {fileID: 1942119077} + - {fileID: 1685836021} + - {fileID: 1961694172} + m_Father: {fileID: 320694060} + m_RootOrder: 5 +--- !u!1 &741110641 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 741110642} + - 33: {fileID: 741110644} + - 23: {fileID: 741110643} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &741110642 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 741110641} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 857026539} + m_RootOrder: 7 +--- !u!23 &741110643 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 741110641} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &741110644 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 741110641} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &741883664 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 741883665} + - 33: {fileID: 741883667} + - 23: {fileID: 741883666} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &741883665 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 741883664} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1413035099} + m_RootOrder: 3 +--- !u!23 &741883666 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 741883664} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &741883667 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 741883664} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &743617656 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 743617657} + - 33: {fileID: 743617659} + - 23: {fileID: 743617658} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &743617657 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 743617656} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1337936969} + m_RootOrder: 1 +--- !u!23 &743617658 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 743617656} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &743617659 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 743617656} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &744483483 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 744483484} + - 33: {fileID: 744483486} + - 23: {fileID: 744483485} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &744483484 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 744483483} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 843886803} + m_RootOrder: 4 +--- !u!23 &744483485 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 744483483} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &744483486 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 744483483} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &745174096 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 745174097} + - 33: {fileID: 745174099} + - 23: {fileID: 745174098} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &745174097 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 745174096} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1413035099} + m_RootOrder: 2 +--- !u!23 &745174098 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 745174096} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &745174099 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 745174096} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &750480529 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 750480530} + - 33: {fileID: 750480532} + - 23: {fileID: 750480531} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &750480530 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 750480529} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 870806955} + m_RootOrder: 8 +--- !u!23 &750480531 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 750480529} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &750480532 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 750480529} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &751968217 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 751968218} + - 33: {fileID: 751968220} + - 23: {fileID: 751968219} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &751968218 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 751968217} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1243272144} + m_RootOrder: 6 +--- !u!23 &751968219 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 751968217} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &751968220 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 751968217} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &754377027 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 754377028} + - 33: {fileID: 754377030} + - 23: {fileID: 754377029} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &754377028 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 754377027} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 498431041} + m_RootOrder: 2 +--- !u!23 &754377029 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 754377027} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &754377030 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 754377027} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &761392684 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 761392685} + - 33: {fileID: 761392687} + - 23: {fileID: 761392686} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &761392685 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 761392684} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1687020670} + m_RootOrder: 4 +--- !u!23 &761392686 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 761392684} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &761392687 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 761392684} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &764367997 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 764367998} + - 33: {fileID: 764368000} + - 23: {fileID: 764367999} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &764367998 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 764367997} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 191837273} + m_RootOrder: 0 +--- !u!23 &764367999 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 764367997} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &764368000 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 764367997} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &768694474 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 768694475} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &768694475 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 768694474} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1017860057} + - {fileID: 964621625} + - {fileID: 831706930} + - {fileID: 133039177} + - {fileID: 216828087} + - {fileID: 185328092} + - {fileID: 1356626587} + - {fileID: 642335544} + - {fileID: 1438264998} + m_Father: {fileID: 416898948} + m_RootOrder: 0 +--- !u!1 &772855986 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 772855987} + - 33: {fileID: 772855989} + - 23: {fileID: 772855988} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &772855987 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 772855986} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1413035099} + m_RootOrder: 7 +--- !u!23 &772855988 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 772855986} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &772855989 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 772855986} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &774647435 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 774647436} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &774647436 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 774647435} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 608618475} + - {fileID: 548381934} + - {fileID: 1912384768} + - {fileID: 1597171771} + - {fileID: 711857079} + - {fileID: 610586811} + - {fileID: 787635895} + - {fileID: 1396544291} + - {fileID: 1548314696} + m_Father: {fileID: 1285129845} + m_RootOrder: 7 +--- !u!1 &776061701 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 776061702} + - 33: {fileID: 776061704} + - 23: {fileID: 776061703} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &776061702 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 776061701} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 366225505} + m_RootOrder: 3 +--- !u!23 &776061703 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 776061701} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &776061704 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 776061701} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &778259614 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 778259615} + - 33: {fileID: 778259617} + - 23: {fileID: 778259616} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &778259615 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 778259614} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 498431041} + m_RootOrder: 8 +--- !u!23 &778259616 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 778259614} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &778259617 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 778259614} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &784653060 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 784653061} + - 33: {fileID: 784653063} + - 23: {fileID: 784653062} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &784653061 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 784653060} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 433168050} + m_RootOrder: 8 +--- !u!23 &784653062 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 784653060} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &784653063 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 784653060} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &785564258 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 785564259} + - 33: {fileID: 785564261} + - 23: {fileID: 785564260} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &785564259 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 785564258} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1049063299} + m_RootOrder: 1 +--- !u!23 &785564260 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 785564258} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &785564261 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 785564258} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &787635894 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 787635895} + - 33: {fileID: 787635897} + - 23: {fileID: 787635896} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &787635895 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 787635894} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 774647436} + m_RootOrder: 6 +--- !u!23 &787635896 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 787635894} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &787635897 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 787635894} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &790229013 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 790229014} + - 33: {fileID: 790229016} + - 23: {fileID: 790229015} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &790229014 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 790229013} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1687020670} + m_RootOrder: 5 +--- !u!23 &790229015 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 790229013} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &790229016 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 790229013} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &790672578 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 790672579} + - 33: {fileID: 790672581} + - 23: {fileID: 790672580} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &790672579 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 790672578} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1624250639} + m_RootOrder: 3 +--- !u!23 &790672580 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 790672578} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &790672581 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 790672578} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &798455659 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 798455660} + - 33: {fileID: 798455662} + - 23: {fileID: 798455661} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &798455660 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 798455659} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 950631283} + m_RootOrder: 5 +--- !u!23 &798455661 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 798455659} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &798455662 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 798455659} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &799336606 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 799336607} + - 33: {fileID: 799336609} + - 23: {fileID: 799336608} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &799336607 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 799336606} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 217104405} + m_RootOrder: 7 +--- !u!23 &799336608 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 799336606} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &799336609 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 799336606} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &801635954 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 801635955} + - 33: {fileID: 801635957} + - 23: {fileID: 801635956} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &801635955 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801635954} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231738743} + m_RootOrder: 0 +--- !u!23 &801635956 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801635954} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &801635957 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801635954} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &803068173 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 803068174} + - 33: {fileID: 803068176} + - 23: {fileID: 803068175} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &803068174 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 803068173} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1337936969} + m_RootOrder: 7 +--- !u!23 &803068175 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 803068173} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &803068176 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 803068173} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &810814967 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 810814968} + - 33: {fileID: 810814970} + - 23: {fileID: 810814969} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &810814968 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 810814967} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1049063299} + m_RootOrder: 5 +--- !u!23 &810814969 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 810814967} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &810814970 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 810814967} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &813174887 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 813174888} + - 33: {fileID: 813174890} + - 23: {fileID: 813174889} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &813174888 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 813174887} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 950631283} + m_RootOrder: 3 +--- !u!23 &813174889 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 813174887} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &813174890 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 813174887} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &820016391 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 820016392} + - 33: {fileID: 820016394} + - 23: {fileID: 820016393} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &820016392 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 820016391} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 870806955} + m_RootOrder: 2 +--- !u!23 &820016393 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 820016391} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &820016394 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 820016391} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &821285324 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 821285325} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &821285325 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 821285324} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2055671388} + - {fileID: 1605042668} + - {fileID: 1921026973} + - {fileID: 1414446055} + - {fileID: 233977207} + - {fileID: 918680893} + - {fileID: 352977278} + - {fileID: 829114950} + - {fileID: 1171171817} + m_Father: {fileID: 1875085494} + m_RootOrder: 7 +--- !u!1 &821731845 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 821731846} + - 33: {fileID: 821731848} + - 23: {fileID: 821731847} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &821731846 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 821731845} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 412002962} + m_RootOrder: 3 +--- !u!23 &821731847 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 821731845} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &821731848 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 821731845} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &827734986 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 827734987} + - 33: {fileID: 827734989} + - 23: {fileID: 827734988} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &827734987 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 827734986} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 732523451} + m_RootOrder: 0 +--- !u!23 &827734988 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 827734986} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &827734989 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 827734986} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &829114949 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 829114950} + - 33: {fileID: 829114952} + - 23: {fileID: 829114951} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &829114950 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 829114949} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 821285325} + m_RootOrder: 7 +--- !u!23 &829114951 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 829114949} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &829114952 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 829114949} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &831706929 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 831706930} + - 33: {fileID: 831706932} + - 23: {fileID: 831706931} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &831706930 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 831706929} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 768694475} + m_RootOrder: 2 +--- !u!23 &831706931 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 831706929} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &831706932 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 831706929} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &838733921 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 838733922} + - 33: {fileID: 838733924} + - 23: {fileID: 838733923} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &838733922 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 838733921} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1965163931} + m_RootOrder: 7 +--- !u!23 &838733923 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 838733921} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &838733924 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 838733921} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &840540658 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 840540659} + - 33: {fileID: 840540661} + - 23: {fileID: 840540660} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &840540659 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 840540658} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 309447440} + m_RootOrder: 3 +--- !u!23 &840540660 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 840540658} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &840540661 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 840540658} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &843322474 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 843322475} + - 33: {fileID: 843322477} + - 23: {fileID: 843322476} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &843322475 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 843322474} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 138445035} + m_RootOrder: 4 +--- !u!23 &843322476 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 843322474} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &843322477 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 843322474} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &843886802 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 843886803} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &843886803 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 843886802} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2038017096} + - {fileID: 2136417289} + - {fileID: 484522388} + - {fileID: 1969505723} + - {fileID: 744483484} + - {fileID: 1645935153} + - {fileID: 597432348} + - {fileID: 1161507921} + - {fileID: 1285184253} + m_Father: {fileID: 1285129845} + m_RootOrder: 4 +--- !u!1 &846805636 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 846805637} + - 33: {fileID: 846805639} + - 23: {fileID: 846805638} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &846805637 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 846805636} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1240836681} + m_RootOrder: 3 +--- !u!23 &846805638 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 846805636} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &846805639 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 846805636} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &849571238 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 849571239} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &849571239 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 849571238} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 905063055} + - {fileID: 134224555} + - {fileID: 1916262351} + - {fileID: 1373919401} + - {fileID: 1532310221} + - {fileID: 415624978} + - {fileID: 934230524} + - {fileID: 1630920717} + - {fileID: 1362136244} + m_Father: {fileID: 320694060} + m_RootOrder: 4 +--- !u!1 &850494879 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 850494880} + - 33: {fileID: 850494882} + - 23: {fileID: 850494881} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &850494880 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 850494879} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 349606543} + m_RootOrder: 6 +--- !u!23 &850494881 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 850494879} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &850494882 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 850494879} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &851576730 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 851576731} + - 33: {fileID: 851576733} + - 23: {fileID: 851576732} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &851576731 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 851576730} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 349606543} + m_RootOrder: 7 +--- !u!23 &851576732 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 851576730} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &851576733 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 851576730} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &854490569 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 854490570} + - 33: {fileID: 854490572} + - 23: {fileID: 854490571} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &854490570 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 854490569} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1950362483} + m_RootOrder: 2 +--- !u!23 &854490571 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 854490569} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &854490572 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 854490569} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &857026538 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 857026539} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &857026539 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857026538} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1298782549} + - {fileID: 523985743} + - {fileID: 1318559587} + - {fileID: 2010793939} + - {fileID: 437676468} + - {fileID: 1462172971} + - {fileID: 1357123422} + - {fileID: 741110642} + - {fileID: 1074566051} + m_Father: {fileID: 311797878} + m_RootOrder: 2 +--- !u!1 &864853647 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 864853648} + - 33: {fileID: 864853650} + - 23: {fileID: 864853649} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &864853648 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 864853647} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1550093339} + m_RootOrder: 6 +--- !u!23 &864853649 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 864853647} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &864853650 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 864853647} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &865105501 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 865105502} + - 33: {fileID: 865105504} + - 23: {fileID: 865105503} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &865105502 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 865105501} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 415594698} + m_RootOrder: 7 +--- !u!23 &865105503 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 865105501} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &865105504 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 865105501} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &866611228 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 866611229} + - 33: {fileID: 866611231} + - 23: {fileID: 866611230} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &866611229 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 866611228} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 332742599} + m_RootOrder: 8 +--- !u!23 &866611230 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 866611228} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &866611231 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 866611228} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &869062403 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 869062404} + - 33: {fileID: 869062406} + - 23: {fileID: 869062405} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &869062404 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 869062403} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 358145806} + m_RootOrder: 5 +--- !u!23 &869062405 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 869062403} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &869062406 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 869062403} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &869552658 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 869552659} + - 33: {fileID: 869552661} + - 23: {fileID: 869552660} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &869552659 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 869552658} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1552181540} + m_RootOrder: 6 +--- !u!23 &869552660 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 869552658} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &869552661 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 869552658} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &870806954 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 870806955} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &870806955 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 870806954} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1570922059} + - {fileID: 447053505} + - {fileID: 820016392} + - {fileID: 234401193} + - {fileID: 1249659886} + - {fileID: 1178177618} + - {fileID: 1736130680} + - {fileID: 363080943} + - {fileID: 750480530} + m_Father: {fileID: 1875085494} + m_RootOrder: 3 +--- !u!1 &872716103 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 872716104} + - 33: {fileID: 872716106} + - 23: {fileID: 872716105} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &872716104 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 872716103} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2049357828} + m_RootOrder: 7 +--- !u!23 &872716105 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 872716103} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &872716106 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 872716103} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &877289651 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 877289652} + - 33: {fileID: 877289654} + - 23: {fileID: 877289653} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &877289652 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 877289651} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1136402243} + m_RootOrder: 7 +--- !u!23 &877289653 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 877289651} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &877289654 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 877289651} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &881430521 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 881430522} + - 33: {fileID: 881430524} + - 23: {fileID: 881430523} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &881430522 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 881430521} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 732523451} + m_RootOrder: 4 +--- !u!23 &881430523 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 881430521} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &881430524 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 881430521} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &882231445 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 882231446} + - 33: {fileID: 882231448} + - 23: {fileID: 882231447} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &882231446 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 882231445} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 498431041} + m_RootOrder: 1 +--- !u!23 &882231447 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 882231445} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &882231448 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 882231445} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &882425813 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 882425814} + - 33: {fileID: 882425816} + - 23: {fileID: 882425815} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &882425814 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 882425813} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1041296208} + m_RootOrder: 3 +--- !u!23 &882425815 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 882425813} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &882425816 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 882425813} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &886402405 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 886402406} + - 33: {fileID: 886402408} + - 23: {fileID: 886402407} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &886402406 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 886402405} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1082956371} + m_RootOrder: 3 +--- !u!23 &886402407 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 886402405} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &886402408 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 886402405} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &887646774 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 887646775} + - 33: {fileID: 887646777} + - 23: {fileID: 887646776} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &887646775 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 887646774} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1357615428} + m_RootOrder: 4 +--- !u!23 &887646776 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 887646774} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &887646777 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 887646774} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &893748540 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 893748541} + - 33: {fileID: 893748543} + - 23: {fileID: 893748542} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &893748541 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 893748540} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 950631283} + m_RootOrder: 4 +--- !u!23 &893748542 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 893748540} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &893748543 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 893748540} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &899438176 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 899438177} + - 33: {fileID: 899438179} + - 23: {fileID: 899438178} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &899438177 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 899438176} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1038701522} + m_RootOrder: 4 +--- !u!23 &899438178 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 899438176} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &899438179 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 899438176} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &900299405 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 900299406} + - 33: {fileID: 900299408} + - 23: {fileID: 900299407} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &900299406 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 900299405} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1392306390} + m_RootOrder: 4 +--- !u!23 &900299407 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 900299405} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &900299408 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 900299405} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &904842064 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 904842065} + - 33: {fileID: 904842067} + - 23: {fileID: 904842066} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &904842065 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 904842064} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1881349947} + m_RootOrder: 8 +--- !u!23 &904842066 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 904842064} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &904842067 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 904842064} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &905063054 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 905063055} + - 33: {fileID: 905063057} + - 23: {fileID: 905063056} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &905063055 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 905063054} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 849571239} + m_RootOrder: 0 +--- !u!23 &905063056 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 905063054} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &905063057 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 905063054} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &905568584 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 905568585} + - 33: {fileID: 905568587} + - 23: {fileID: 905568586} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &905568585 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 905568584} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 498431041} + m_RootOrder: 0 +--- !u!23 &905568586 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 905568584} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &905568587 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 905568584} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &906056251 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 906056252} + - 33: {fileID: 906056254} + - 23: {fileID: 906056253} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &906056252 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 906056251} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1711378518} + m_RootOrder: 1 +--- !u!23 &906056253 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 906056251} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &906056254 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 906056251} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &909924637 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 909924638} + - 33: {fileID: 909924640} + - 23: {fileID: 909924639} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &909924638 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 909924637} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1802157139} + m_RootOrder: 0 +--- !u!23 &909924639 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 909924637} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &909924640 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 909924637} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &912679175 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 912679176} + - 33: {fileID: 912679178} + - 23: {fileID: 912679177} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &912679176 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 912679175} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 604038727} + m_RootOrder: 0 +--- !u!23 &912679177 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 912679175} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &912679178 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 912679175} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &918680892 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 918680893} + - 33: {fileID: 918680895} + - 23: {fileID: 918680894} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &918680893 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 918680892} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 821285325} + m_RootOrder: 5 +--- !u!23 &918680894 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 918680892} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &918680895 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 918680892} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &919535431 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 919535432} + - 33: {fileID: 919535434} + - 23: {fileID: 919535433} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &919535432 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 919535431} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1145749506} + m_RootOrder: 6 +--- !u!23 &919535433 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 919535431} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &919535434 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 919535431} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &920142117 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 920142118} + - 33: {fileID: 920142120} + - 23: {fileID: 920142119} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &920142118 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 920142117} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 352349652} + m_RootOrder: 2 +--- !u!23 &920142119 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 920142117} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &920142120 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 920142117} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &921388390 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 921388391} + - 33: {fileID: 921388393} + - 23: {fileID: 921388392} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &921388391 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 921388390} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1366031035} + m_RootOrder: 6 +--- !u!23 &921388392 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 921388390} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &921388393 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 921388390} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &921992682 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 921992683} + - 33: {fileID: 921992685} + - 23: {fileID: 921992684} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &921992683 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 921992682} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 710806381} + m_RootOrder: 8 +--- !u!23 &921992684 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 921992682} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &921992685 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 921992682} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &925124720 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 925124721} + - 33: {fileID: 925124723} + - 23: {fileID: 925124722} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &925124721 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 925124720} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 332742599} + m_RootOrder: 1 +--- !u!23 &925124722 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 925124720} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &925124723 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 925124720} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &926533328 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 926533329} + - 33: {fileID: 926533331} + - 23: {fileID: 926533330} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &926533329 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 926533328} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1145749506} + m_RootOrder: 0 +--- !u!23 &926533330 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 926533328} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &926533331 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 926533328} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &930170084 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 930170085} + - 33: {fileID: 930170087} + - 23: {fileID: 930170086} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &930170085 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 930170084} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1041296208} + m_RootOrder: 7 +--- !u!23 &930170086 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 930170084} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &930170087 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 930170084} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &930864240 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 930864241} + - 33: {fileID: 930864243} + - 23: {fileID: 930864242} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &930864241 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 930864240} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1552181540} + m_RootOrder: 3 +--- !u!23 &930864242 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 930864240} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &930864243 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 930864240} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &932174127 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 932174128} + - 33: {fileID: 932174130} + - 23: {fileID: 932174129} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &932174128 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 932174127} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1402568966} + m_RootOrder: 3 +--- !u!23 &932174129 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 932174127} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &932174130 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 932174127} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &933014247 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 933014248} + - 33: {fileID: 933014250} + - 23: {fileID: 933014249} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &933014248 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 933014247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1711378518} + m_RootOrder: 4 +--- !u!23 &933014249 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 933014247} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &933014250 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 933014247} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &934230523 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 934230524} + - 33: {fileID: 934230526} + - 23: {fileID: 934230525} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &934230524 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 934230523} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 849571239} + m_RootOrder: 6 +--- !u!23 &934230525 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 934230523} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &934230526 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 934230523} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &937185859 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 937185860} + - 33: {fileID: 937185862} + - 23: {fileID: 937185861} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &937185860 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 937185859} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1410998029} + m_RootOrder: 6 +--- !u!23 &937185861 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 937185859} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &937185862 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 937185859} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &941245591 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 941245592} + - 33: {fileID: 941245594} + - 23: {fileID: 941245593} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &941245592 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 941245591} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2097222327} + m_RootOrder: 4 +--- !u!23 &941245593 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 941245591} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &941245594 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 941245591} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &944018027 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 944018028} + - 33: {fileID: 944018030} + - 23: {fileID: 944018029} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &944018028 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 944018027} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1550093339} + m_RootOrder: 3 +--- !u!23 &944018029 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 944018027} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &944018030 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 944018027} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &944084775 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 944084776} + - 33: {fileID: 944084778} + - 23: {fileID: 944084777} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &944084776 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 944084775} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 379543545} + m_RootOrder: 0 +--- !u!23 &944084777 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 944084775} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &944084778 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 944084775} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &950492261 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 950492262} + - 33: {fileID: 950492264} + - 23: {fileID: 950492263} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &950492262 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950492261} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1552181540} + m_RootOrder: 5 +--- !u!23 &950492263 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950492261} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &950492264 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950492261} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &950631282 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 950631283} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &950631283 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950631282} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1206665284} + - {fileID: 227008744} + - {fileID: 688419948} + - {fileID: 813174888} + - {fileID: 893748541} + - {fileID: 798455660} + - {fileID: 155545762} + - {fileID: 688604066} + - {fileID: 52357633} + m_Father: {fileID: 2047955730} + m_RootOrder: 4 +--- !u!1 &950671320 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 950671321} + - 33: {fileID: 950671323} + - 23: {fileID: 950671322} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &950671321 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950671320} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 698956160} + m_RootOrder: 5 +--- !u!23 &950671322 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950671320} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &950671323 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950671320} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &950889723 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 950889724} + - 33: {fileID: 950889726} + - 23: {fileID: 950889725} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &950889724 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950889723} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2040025849} + m_RootOrder: 5 +--- !u!23 &950889725 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950889723} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &950889726 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950889723} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &952424227 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 952424228} + - 33: {fileID: 952424230} + - 23: {fileID: 952424229} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &952424228 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 952424227} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1240836681} + m_RootOrder: 0 +--- !u!23 &952424229 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 952424227} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &952424230 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 952424227} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &964621624 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 964621625} + - 33: {fileID: 964621627} + - 23: {fileID: 964621626} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &964621625 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 964621624} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 768694475} + m_RootOrder: 1 +--- !u!23 &964621626 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 964621624} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &964621627 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 964621624} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &969739217 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 969739218} + - 33: {fileID: 969739220} + - 23: {fileID: 969739219} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &969739218 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 969739217} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1802157139} + m_RootOrder: 2 +--- !u!23 &969739219 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 969739217} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &969739220 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 969739217} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &969754909 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 969754910} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &969754910 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 969754909} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 628298919} + - {fileID: 1164755370} + - {fileID: 354724696} + - {fileID: 229979266} + - {fileID: 1548254633} + - {fileID: 209477140} + - {fileID: 276138907} + - {fileID: 694065973} + - {fileID: 1185660834} + m_Father: {fileID: 1906654409} + m_RootOrder: 8 +--- !u!1 &970902514 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 970902515} + - 33: {fileID: 970902517} + - 23: {fileID: 970902516} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &970902515 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 970902514} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1687020670} + m_RootOrder: 8 +--- !u!23 &970902516 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 970902514} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &970902517 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 970902514} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &978106560 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 978106561} + - 33: {fileID: 978106563} + - 23: {fileID: 978106562} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &978106561 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 978106560} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1366031035} + m_RootOrder: 3 +--- !u!23 &978106562 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 978106560} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &978106563 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 978106560} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &979464283 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 979464284} + - 33: {fileID: 979464286} + - 23: {fileID: 979464285} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &979464284 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 979464283} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1961106353} + m_RootOrder: 3 +--- !u!23 &979464285 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 979464283} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &979464286 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 979464283} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &981850442 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 981850443} + - 33: {fileID: 981850445} + - 23: {fileID: 981850444} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &981850443 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 981850442} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 499152561} + m_RootOrder: 2 +--- !u!23 &981850444 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 981850442} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &981850445 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 981850442} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &986720924 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 986720925} + - 33: {fileID: 986720927} + - 23: {fileID: 986720926} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &986720925 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 986720924} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1041296208} + m_RootOrder: 4 +--- !u!23 &986720926 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 986720924} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &986720927 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 986720924} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &988035053 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 988035054} + - 33: {fileID: 988035056} + - 23: {fileID: 988035055} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &988035054 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 988035053} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1961106353} + m_RootOrder: 5 +--- !u!23 &988035055 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 988035053} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &988035056 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 988035053} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &989992469 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 989992470} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &989992470 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 989992469} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1802005357} + - {fileID: 205582492} + - {fileID: 268222375} + - {fileID: 1164068985} + - {fileID: 1792245261} + - {fileID: 61856427} + - {fileID: 1424197207} + - {fileID: 585764507} + - {fileID: 1220977469} + m_Father: {fileID: 1875085494} + m_RootOrder: 8 +--- !u!1 &997052065 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 997052066} + - 33: {fileID: 997052068} + - 23: {fileID: 997052067} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &997052066 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 997052065} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2097222327} + m_RootOrder: 1 +--- !u!23 &997052067 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 997052065} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &997052068 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 997052065} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &997973276 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 997973277} + - 33: {fileID: 997973279} + - 23: {fileID: 997973278} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &997973277 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 997973276} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1145749506} + m_RootOrder: 5 +--- !u!23 &997973278 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 997973276} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &997973279 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 997973276} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1001880623 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1001880624} + - 33: {fileID: 1001880626} + - 23: {fileID: 1001880625} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1001880624 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1001880623} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 358145806} + m_RootOrder: 0 +--- !u!23 &1001880625 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1001880623} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1001880626 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1001880623} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1009138637 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1009138638} + - 33: {fileID: 1009138640} + - 23: {fileID: 1009138639} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1009138638 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1009138637} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1435433903} + m_RootOrder: 8 +--- !u!23 &1009138639 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1009138637} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1009138640 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1009138637} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1013698093 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1013698094} + - 33: {fileID: 1013698096} + - 23: {fileID: 1013698095} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1013698094 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1013698093} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 191837273} + m_RootOrder: 4 +--- !u!23 &1013698095 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1013698093} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1013698096 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1013698093} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1017860056 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1017860057} + - 33: {fileID: 1017860059} + - 23: {fileID: 1017860058} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1017860057 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1017860056} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 768694475} + m_RootOrder: 0 +--- !u!23 &1017860058 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1017860056} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1017860059 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1017860056} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1022286118 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1022286119} + - 33: {fileID: 1022286121} + - 23: {fileID: 1022286120} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1022286119 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1022286118} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1528982994} + m_RootOrder: 1 +--- !u!23 &1022286120 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1022286118} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1022286121 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1022286118} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1025853054 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1025853055} + - 33: {fileID: 1025853057} + - 23: {fileID: 1025853056} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1025853055 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1025853054} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1624250639} + m_RootOrder: 2 +--- !u!23 &1025853056 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1025853054} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1025853057 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1025853054} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1026110226 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1026110227} + - 33: {fileID: 1026110229} + - 23: {fileID: 1026110228} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1026110227 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1026110226} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 604038727} + m_RootOrder: 2 +--- !u!23 &1026110228 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1026110226} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1026110229 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1026110226} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1029417252 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1029417253} + - 33: {fileID: 1029417255} + - 23: {fileID: 1029417254} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1029417253 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1029417252} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1337936969} + m_RootOrder: 5 +--- !u!23 &1029417254 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1029417252} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1029417255 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1029417252} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1033298435 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1033298436} + - 33: {fileID: 1033298438} + - 23: {fileID: 1033298437} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1033298436 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1033298435} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1991877734} + m_RootOrder: 5 +--- !u!23 &1033298437 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1033298435} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1033298438 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1033298435} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1038701521 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1038701522} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1038701522 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1038701521} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 416384453} + - {fileID: 1275270260} + - {fileID: 18047733} + - {fileID: 2136117257} + - {fileID: 899438177} + - {fileID: 1997209207} + - {fileID: 484195584} + - {fileID: 292936480} + - {fileID: 2121867677} + m_Father: {fileID: 357871943} + m_RootOrder: 3 +--- !u!1 &1041296207 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1041296208} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1041296208 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1041296207} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2025153729} + - {fileID: 1703452020} + - {fileID: 451337795} + - {fileID: 882425814} + - {fileID: 986720925} + - {fileID: 433647462} + - {fileID: 2091783723} + - {fileID: 930170085} + - {fileID: 433220172} + m_Father: {fileID: 416898948} + m_RootOrder: 1 +--- !u!1 &1044959948 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1044959949} + - 33: {fileID: 1044959951} + - 23: {fileID: 1044959950} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1044959949 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1044959948} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 440610438} + m_RootOrder: 6 +--- !u!23 &1044959950 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1044959948} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1044959951 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1044959948} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1049063298 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1049063299} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1049063299 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1049063298} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 287649693} + - {fileID: 785564259} + - {fileID: 404626640} + - {fileID: 1138680043} + - {fileID: 1938902971} + - {fileID: 810814968} + - {fileID: 2129935185} + - {fileID: 1631514759} + - {fileID: 430685319} + m_Father: {fileID: 357871943} + m_RootOrder: 4 +--- !u!1 &1050258139 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1050258140} + - 33: {fileID: 1050258142} + - 23: {fileID: 1050258141} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1050258140 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1050258139} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1330598094} + m_RootOrder: 1 +--- !u!23 &1050258141 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1050258139} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1050258142 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1050258139} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1052080522 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1052080523} + - 33: {fileID: 1052080525} + - 23: {fileID: 1052080524} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1052080523 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1052080522} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 471463405} + m_RootOrder: 4 +--- !u!23 &1052080524 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1052080522} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1052080525 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1052080522} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1053463224 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1053463225} + - 33: {fileID: 1053463227} + - 23: {fileID: 1053463226} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1053463225 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1053463224} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1396826707} + m_RootOrder: 3 +--- !u!23 &1053463226 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1053463224} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1053463227 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1053463224} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1059390652 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1059390653} + - 33: {fileID: 1059390655} + - 23: {fileID: 1059390654} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1059390653 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1059390652} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1251486547} + m_RootOrder: 7 +--- !u!23 &1059390654 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1059390652} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1059390655 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1059390652} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1059900641 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1059900642} + - 33: {fileID: 1059900644} + - 23: {fileID: 1059900643} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1059900642 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1059900641} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 604038727} + m_RootOrder: 6 +--- !u!23 &1059900643 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1059900641} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1059900644 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1059900641} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1061289306 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1061289307} + - 33: {fileID: 1061289309} + - 23: {fileID: 1061289308} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1061289307 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1061289306} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1961106353} + m_RootOrder: 1 +--- !u!23 &1061289308 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1061289306} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1061289309 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1061289306} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1063450512 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1063450513} + - 33: {fileID: 1063450515} + - 23: {fileID: 1063450514} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1063450513 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1063450512} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 412002962} + m_RootOrder: 1 +--- !u!23 &1063450514 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1063450512} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1063450515 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1063450512} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1068914480 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1068914481} + - 33: {fileID: 1068914483} + - 23: {fileID: 1068914482} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1068914481 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1068914480} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1587156216} + m_RootOrder: 7 +--- !u!23 &1068914482 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1068914480} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1068914483 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1068914480} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1074566050 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1074566051} + - 33: {fileID: 1074566053} + - 23: {fileID: 1074566052} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1074566051 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1074566050} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 857026539} + m_RootOrder: 8 +--- !u!23 &1074566052 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1074566050} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1074566053 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1074566050} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1074652778 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1074652779} + - 33: {fileID: 1074652781} + - 23: {fileID: 1074652780} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1074652779 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1074652778} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 499152561} + m_RootOrder: 5 +--- !u!23 &1074652780 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1074652778} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1074652781 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1074652778} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1082956370 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1082956371} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1082956371 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1082956370} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1556928009} + - {fileID: 51436668} + - {fileID: 1427766161} + - {fileID: 886402406} + - {fileID: 68974763} + - {fileID: 1834653030} + - {fileID: 1271373334} + - {fileID: 567130467} + - {fileID: 24304358} + m_Father: {fileID: 2047955730} + m_RootOrder: 8 +--- !u!1 &1086529297 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1086529298} + - 33: {fileID: 1086529300} + - 23: {fileID: 1086529299} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1086529298 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1086529297} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2097222327} + m_RootOrder: 7 +--- !u!23 &1086529299 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1086529297} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1086529300 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1086529297} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1087830974 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1087830975} + - 33: {fileID: 1087830977} + - 23: {fileID: 1087830976} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1087830975 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1087830974} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1392306390} + m_RootOrder: 6 +--- !u!23 &1087830976 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1087830974} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1087830977 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1087830974} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1094574350 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1094574351} + - 33: {fileID: 1094574353} + - 23: {fileID: 1094574352} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1094574351 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1094574350} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1550093339} + m_RootOrder: 5 +--- !u!23 &1094574352 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1094574350} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1094574353 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1094574350} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1102846824 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1102846825} + - 33: {fileID: 1102846827} + - 23: {fileID: 1102846826} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1102846825 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1102846824} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 349606543} + m_RootOrder: 3 +--- !u!23 &1102846826 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1102846824} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1102846827 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1102846824} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1106686635 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1106686636} + - 33: {fileID: 1106686638} + - 23: {fileID: 1106686637} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1106686636 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1106686635} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1396826707} + m_RootOrder: 6 +--- !u!23 &1106686637 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1106686635} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1106686638 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1106686635} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1108133970 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1108133971} + - 33: {fileID: 1108133973} + - 23: {fileID: 1108133972} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1108133971 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1108133970} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1711378518} + m_RootOrder: 7 +--- !u!23 &1108133972 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1108133970} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1108133973 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1108133970} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1113415721 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1113415722} + - 33: {fileID: 1113415724} + - 23: {fileID: 1113415723} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1113415722 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1113415721} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 146325016} + m_RootOrder: 6 +--- !u!23 &1113415723 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1113415721} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1113415724 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1113415721} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1114328168 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1114328169} + - 33: {fileID: 1114328171} + - 23: {fileID: 1114328170} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1114328169 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1114328168} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1318928928} + m_RootOrder: 4 +--- !u!23 &1114328170 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1114328168} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1114328171 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1114328168} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1116037528 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1116037529} + - 33: {fileID: 1116037531} + - 23: {fileID: 1116037530} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1116037529 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1116037528} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231626962} + m_RootOrder: 5 +--- !u!23 &1116037530 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1116037528} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1116037531 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1116037528} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1116708661 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1116708662} + - 33: {fileID: 1116708664} + - 23: {fileID: 1116708663} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1116708662 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1116708661} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1366031035} + m_RootOrder: 5 +--- !u!23 &1116708663 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1116708661} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1116708664 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1116708661} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1124369258 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1124369259} + - 33: {fileID: 1124369261} + - 23: {fileID: 1124369260} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1124369259 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1124369258} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2040025849} + m_RootOrder: 2 +--- !u!23 &1124369260 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1124369258} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1124369261 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1124369258} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1127960876 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1127960877} + - 33: {fileID: 1127960879} + - 23: {fileID: 1127960878} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1127960877 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1127960876} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 191837273} + m_RootOrder: 6 +--- !u!23 &1127960878 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1127960876} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1127960879 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1127960876} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1128731189 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1128731190} + - 33: {fileID: 1128731192} + - 23: {fileID: 1128731191} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1128731190 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1128731189} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 379543545} + m_RootOrder: 6 +--- !u!23 &1128731191 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1128731189} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1128731192 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1128731189} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1129404312 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1129404313} + - 33: {fileID: 1129404315} + - 23: {fileID: 1129404314} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1129404313 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1129404312} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1587156216} + m_RootOrder: 0 +--- !u!23 &1129404314 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1129404312} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1129404315 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1129404312} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1136402242 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1136402243} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1136402243 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1136402242} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 368109054} + - {fileID: 1339390101} + - {fileID: 118428096} + - {fileID: 1913048508} + - {fileID: 1856202064} + - {fileID: 1172780683} + - {fileID: 32676781} + - {fileID: 877289652} + - {fileID: 1844490899} + m_Father: {fileID: 1285129845} + m_RootOrder: 6 +--- !u!1 &1136746722 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1136746723} + - 33: {fileID: 1136746725} + - 23: {fileID: 1136746724} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1136746723 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1136746722} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 309447440} + m_RootOrder: 7 +--- !u!23 &1136746724 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1136746722} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1136746725 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1136746722} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1138680042 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1138680043} + - 33: {fileID: 1138680045} + - 23: {fileID: 1138680044} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1138680043 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1138680042} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1049063299} + m_RootOrder: 3 +--- !u!23 &1138680044 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1138680042} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1138680045 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1138680042} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1138922967 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1138922968} + - 33: {fileID: 1138922970} + - 23: {fileID: 1138922969} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1138922968 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1138922967} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1536546683} + m_RootOrder: 6 +--- !u!23 &1138922969 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1138922967} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1138922970 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1138922967} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1142309781 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1142309782} + - 33: {fileID: 1142309784} + - 23: {fileID: 1142309783} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1142309782 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1142309781} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 191837273} + m_RootOrder: 3 +--- !u!23 &1142309783 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1142309781} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1142309784 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1142309781} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1145749505 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1145749506} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1145749506 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1145749505} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 926533329} + - {fileID: 1652927164} + - {fileID: 316302725} + - {fileID: 1593517168} + - {fileID: 484418415} + - {fileID: 997973277} + - {fileID: 919535432} + - {fileID: 608429981} + - {fileID: 1853333956} + m_Father: {fileID: 1875085494} + m_RootOrder: 6 +--- !u!1 &1146317989 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1146317990} + - 33: {fileID: 1146317992} + - 23: {fileID: 1146317991} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1146317990 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1146317989} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1435433903} + m_RootOrder: 1 +--- !u!23 &1146317991 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1146317989} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1146317992 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1146317989} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1161408033 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1161408034} + - 33: {fileID: 1161408036} + - 23: {fileID: 1161408035} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1161408034 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1161408033} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1528982994} + m_RootOrder: 6 +--- !u!23 &1161408035 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1161408033} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1161408036 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1161408033} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1161507920 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1161507921} + - 33: {fileID: 1161507923} + - 23: {fileID: 1161507922} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1161507921 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1161507920} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 843886803} + m_RootOrder: 7 +--- !u!23 &1161507922 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1161507920} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1161507923 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1161507920} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1161644335 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1161644336} + - 33: {fileID: 1161644338} + - 23: {fileID: 1161644337} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1161644336 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1161644335} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 358145806} + m_RootOrder: 3 +--- !u!23 &1161644337 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1161644335} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1161644338 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1161644335} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1163212112 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1163212113} + - 33: {fileID: 1163212115} + - 23: {fileID: 1163212114} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1163212113 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1163212112} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2049357828} + m_RootOrder: 6 +--- !u!23 &1163212114 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1163212112} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1163212115 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1163212112} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1164068984 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1164068985} + - 33: {fileID: 1164068987} + - 23: {fileID: 1164068986} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1164068985 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1164068984} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 989992470} + m_RootOrder: 3 +--- !u!23 &1164068986 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1164068984} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1164068987 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1164068984} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1164755369 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1164755370} + - 33: {fileID: 1164755372} + - 23: {fileID: 1164755371} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1164755370 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1164755369} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 969754910} + m_RootOrder: 1 +--- !u!23 &1164755371 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1164755369} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1164755372 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1164755369} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1167775414 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1167775415} + - 33: {fileID: 1167775417} + - 23: {fileID: 1167775416} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1167775415 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1167775414} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1240836681} + m_RootOrder: 6 +--- !u!23 &1167775416 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1167775414} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1167775417 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1167775414} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1169682651 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1169682652} + - 33: {fileID: 1169682654} + - 23: {fileID: 1169682653} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1169682652 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1169682651} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 349606543} + m_RootOrder: 8 +--- !u!23 &1169682653 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1169682651} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1169682654 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1169682651} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1171171816 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1171171817} + - 33: {fileID: 1171171819} + - 23: {fileID: 1171171818} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1171171817 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1171171816} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 821285325} + m_RootOrder: 8 +--- !u!23 &1171171818 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1171171816} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1171171819 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1171171816} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1171733633 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1171733634} + - 33: {fileID: 1171733636} + - 23: {fileID: 1171733635} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1171733634 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1171733633} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1366031035} + m_RootOrder: 1 +--- !u!23 &1171733635 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1171733633} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1171733636 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1171733633} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1172780682 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1172780683} + - 33: {fileID: 1172780685} + - 23: {fileID: 1172780684} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1172780683 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1172780682} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1136402243} + m_RootOrder: 5 +--- !u!23 &1172780684 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1172780682} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1172780685 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1172780682} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1173828075 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1173828076} + - 33: {fileID: 1173828078} + - 23: {fileID: 1173828077} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1173828076 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1173828075} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 433168050} + m_RootOrder: 3 +--- !u!23 &1173828077 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1173828075} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1173828078 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1173828075} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1178177617 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1178177618} + - 33: {fileID: 1178177620} + - 23: {fileID: 1178177619} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1178177618 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1178177617} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 870806955} + m_RootOrder: 5 +--- !u!23 &1178177619 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1178177617} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1178177620 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1178177617} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1181315791 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1181315792} + - 33: {fileID: 1181315794} + - 23: {fileID: 1181315793} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1181315792 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1181315791} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 710806381} + m_RootOrder: 5 +--- !u!23 &1181315793 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1181315791} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1181315794 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1181315791} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1183162455 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1183162456} + - 33: {fileID: 1183162458} + - 23: {fileID: 1183162457} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1183162456 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1183162455} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1528982994} + m_RootOrder: 7 +--- !u!23 &1183162457 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1183162455} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1183162458 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1183162455} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1185660833 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1185660834} + - 33: {fileID: 1185660836} + - 23: {fileID: 1185660835} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1185660834 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1185660833} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 969754910} + m_RootOrder: 8 +--- !u!23 &1185660835 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1185660833} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1185660836 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1185660833} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1188557688 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1188557689} + - 33: {fileID: 1188557691} + - 23: {fileID: 1188557690} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1188557689 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1188557688} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1965163931} + m_RootOrder: 1 +--- !u!23 &1188557690 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1188557688} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1188557691 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1188557688} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1190442268 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1190442269} + - 33: {fileID: 1190442271} + - 23: {fileID: 1190442270} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1190442269 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1190442268} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 191837273} + m_RootOrder: 1 +--- !u!23 &1190442270 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1190442268} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1190442271 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1190442268} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1195783901 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1195783902} + - 33: {fileID: 1195783904} + - 23: {fileID: 1195783903} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1195783902 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1195783901} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 412002962} + m_RootOrder: 6 +--- !u!23 &1195783903 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1195783901} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1195783904 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1195783901} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1202756944 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1202756945} + - 33: {fileID: 1202756947} + - 23: {fileID: 1202756946} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1202756945 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1202756944} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 484270180} + m_RootOrder: 5 +--- !u!23 &1202756946 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1202756944} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1202756947 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1202756944} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1206665283 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1206665284} + - 33: {fileID: 1206665286} + - 23: {fileID: 1206665285} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1206665284 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206665283} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 950631283} + m_RootOrder: 0 +--- !u!23 &1206665285 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206665283} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1206665286 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206665283} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1206765016 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1206765017} + - 33: {fileID: 1206765019} + - 23: {fileID: 1206765018} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1206765017 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206765016} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1802157139} + m_RootOrder: 1 +--- !u!23 &1206765018 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206765016} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1206765019 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206765016} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1209329982 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1209329983} + - 33: {fileID: 1209329985} + - 23: {fileID: 1209329984} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1209329983 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1209329982} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 146325016} + m_RootOrder: 4 +--- !u!23 &1209329984 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1209329982} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1209329985 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1209329982} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1210024156 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1210024157} + - 33: {fileID: 1210024159} + - 23: {fileID: 1210024158} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1210024157 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1210024156} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1251486547} + m_RootOrder: 2 +--- !u!23 &1210024158 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1210024156} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1210024159 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1210024156} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1211858529 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1211858530} + - 33: {fileID: 1211858532} + - 23: {fileID: 1211858531} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1211858530 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1211858529} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 309447440} + m_RootOrder: 8 +--- !u!23 &1211858531 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1211858529} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1211858532 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1211858529} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1215951043 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1215951044} + - 33: {fileID: 1215951046} + - 23: {fileID: 1215951045} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1215951044 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1215951043} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1961106353} + m_RootOrder: 0 +--- !u!23 &1215951045 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1215951043} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1215951046 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1215951043} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1220977468 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1220977469} + - 33: {fileID: 1220977471} + - 23: {fileID: 1220977470} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1220977469 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1220977468} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 989992470} + m_RootOrder: 8 +--- !u!23 &1220977470 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1220977468} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1220977471 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1220977468} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1227423407 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1227423408} + - 33: {fileID: 1227423410} + - 23: {fileID: 1227423409} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1227423408 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1227423407} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1392306390} + m_RootOrder: 1 +--- !u!23 &1227423409 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1227423407} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1227423410 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1227423407} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1227646395 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1227646396} + - 33: {fileID: 1227646398} + - 23: {fileID: 1227646397} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1227646396 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1227646395} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1528982994} + m_RootOrder: 0 +--- !u!23 &1227646397 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1227646395} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1227646398 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1227646395} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1233842171 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1233842172} + - 33: {fileID: 1233842174} + - 23: {fileID: 1233842173} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1233842172 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1233842171} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1591077534} + m_RootOrder: 0 +--- !u!23 &1233842173 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1233842171} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1233842174 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1233842171} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1234331062 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1234331063} + - 33: {fileID: 1234331065} + - 23: {fileID: 1234331064} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1234331063 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1234331062} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 138445035} + m_RootOrder: 5 +--- !u!23 &1234331064 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1234331062} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1234331065 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1234331062} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1235025734 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1235025735} + - 33: {fileID: 1235025737} + - 23: {fileID: 1235025736} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1235025735 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1235025734} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1965163931} + m_RootOrder: 5 +--- !u!23 &1235025736 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1235025734} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1235025737 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1235025734} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1239907697 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1239907698} + - 33: {fileID: 1239907700} + - 23: {fileID: 1239907699} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1239907698 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1239907697} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 146325016} + m_RootOrder: 5 +--- !u!23 &1239907699 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1239907697} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1239907700 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1239907697} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1240836680 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1240836681} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1240836681 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1240836680} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 952424228} + - {fileID: 2135229808} + - {fileID: 2046589814} + - {fileID: 846805637} + - {fileID: 1979390745} + - {fileID: 333333698} + - {fileID: 1167775415} + - {fileID: 132263419} + - {fileID: 664229994} + m_Father: {fileID: 311797878} + m_RootOrder: 8 +--- !u!1 &1243272143 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1243272144} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1243272144 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1243272143} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1755673663} + - {fileID: 2080097013} + - {fileID: 1875242169} + - {fileID: 249804279} + - {fileID: 1860104359} + - {fileID: 1404137074} + - {fileID: 751968218} + - {fileID: 445368524} + - {fileID: 1850445106} + m_Father: {fileID: 357871943} + m_RootOrder: 2 +--- !u!1 &1245497274 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1245497275} + - 33: {fileID: 1245497277} + - 23: {fileID: 1245497276} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1245497275 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1245497274} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 484270180} + m_RootOrder: 2 +--- !u!23 &1245497276 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1245497274} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1245497277 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1245497274} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1249280388 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1249280389} + - 33: {fileID: 1249280391} + - 23: {fileID: 1249280390} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1249280389 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1249280388} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2070993649} + m_RootOrder: 8 +--- !u!23 &1249280390 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1249280388} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1249280391 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1249280388} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1249659885 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1249659886} + - 33: {fileID: 1249659888} + - 23: {fileID: 1249659887} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1249659886 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1249659885} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 870806955} + m_RootOrder: 4 +--- !u!23 &1249659887 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1249659885} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1249659888 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1249659885} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1251486546 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1251486547} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1251486547 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1251486546} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1546548683} + - {fileID: 695396973} + - {fileID: 1210024157} + - {fileID: 201332832} + - {fileID: 1316770378} + - {fileID: 153267157} + - {fileID: 2134487187} + - {fileID: 1059390653} + - {fileID: 514001097} + m_Father: {fileID: 1875085494} + m_RootOrder: 5 +--- !u!1 &1257843376 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1257843377} + - 33: {fileID: 1257843379} + - 23: {fileID: 1257843378} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1257843377 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1257843376} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2049357828} + m_RootOrder: 4 +--- !u!23 &1257843378 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1257843376} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1257843379 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1257843376} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1269069111 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1269069112} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1269069112 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1269069111} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 728103437} + - {fileID: 47951525} + - {fileID: 1328647144} + - {fileID: 1839525250} + - {fileID: 1995638828} + - {fileID: 621882598} + - {fileID: 1960183756} + - {fileID: 540681794} + - {fileID: 1523936020} + m_Father: {fileID: 1285129845} + m_RootOrder: 3 +--- !u!1 &1271373333 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1271373334} + - 33: {fileID: 1271373336} + - 23: {fileID: 1271373335} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1271373334 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1271373333} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1082956371} + m_RootOrder: 6 +--- !u!23 &1271373335 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1271373333} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1271373336 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1271373333} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1274924129 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1274924130} + - 33: {fileID: 1274924132} + - 23: {fileID: 1274924131} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1274924130 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1274924129} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 499152561} + m_RootOrder: 6 +--- !u!23 &1274924131 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1274924129} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1274924132 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1274924129} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1275248165 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1275248166} + - 33: {fileID: 1275248168} + - 23: {fileID: 1275248167} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1275248166 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1275248165} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2070993649} + m_RootOrder: 4 +--- !u!23 &1275248167 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1275248165} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1275248168 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1275248165} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1275270259 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1275270260} + - 33: {fileID: 1275270262} + - 23: {fileID: 1275270261} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1275270260 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1275270259} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1038701522} + m_RootOrder: 1 +--- !u!23 &1275270261 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1275270259} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1275270262 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1275270259} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1276774528 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1276774529} + - 33: {fileID: 1276774531} + - 23: {fileID: 1276774530} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1276774529 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1276774528} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 309447440} + m_RootOrder: 4 +--- !u!23 &1276774530 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1276774528} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1276774531 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1276774528} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1283742114 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1283742115} + - 33: {fileID: 1283742117} + - 23: {fileID: 1283742116} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1283742115 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1283742114} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 309447440} + m_RootOrder: 6 +--- !u!23 &1283742116 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1283742114} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1283742117 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1283742114} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1285129844 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1285129845} + m_Layer: 0 + m_Name: CubeGrid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1285129845 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1285129844} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.02090001, y: -.402413607, z: -3.52141666} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 440610438} + - {fileID: 1991877734} + - {fileID: 1758170125} + - {fileID: 1269069112} + - {fileID: 843886803} + - {fileID: 309447440} + - {fileID: 1136402243} + - {fileID: 774647436} + - {fileID: 433168050} + m_Father: {fileID: 1335403818} + m_RootOrder: 2 +--- !u!1 &1285184252 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1285184253} + - 33: {fileID: 1285184255} + - 23: {fileID: 1285184254} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1285184253 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1285184252} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 843886803} + m_RootOrder: 8 +--- !u!23 &1285184254 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1285184252} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1285184255 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1285184252} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1288023953 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1288023954} + - 33: {fileID: 1288023956} + - 23: {fileID: 1288023955} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1288023954 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1288023953} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 366225505} + m_RootOrder: 1 +--- !u!23 &1288023955 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1288023953} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1288023956 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1288023953} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1288823788 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1288823789} + m_Layer: 0 + m_Name: CubeGrid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1288823789 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1288823788} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.02090001, y: -.402413607, z: -4.52141666} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 191837273} + - {fileID: 710806381} + - {fileID: 2070993649} + - {fileID: 1550093339} + - {fileID: 698956160} + - {fileID: 349606543} + - {fileID: 1633108726} + - {fileID: 1413035099} + - {fileID: 366225505} + m_Father: {fileID: 1335403818} + m_RootOrder: 8 +--- !u!1 &1291389606 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1291389607} + - 33: {fileID: 1291389609} + - 23: {fileID: 1291389608} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1291389607 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1291389606} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 332742599} + m_RootOrder: 6 +--- !u!23 &1291389608 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1291389606} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1291389609 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1291389606} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1294857583 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1294857584} + - 33: {fileID: 1294857586} + - 23: {fileID: 1294857585} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1294857584 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1294857583} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1366031035} + m_RootOrder: 7 +--- !u!23 &1294857585 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1294857583} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1294857586 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1294857583} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1298782548 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1298782549} + - 33: {fileID: 1298782551} + - 23: {fileID: 1298782550} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1298782549 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1298782548} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 857026539} + m_RootOrder: 0 +--- !u!23 &1298782550 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1298782548} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1298782551 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1298782548} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1305541518 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1305541519} + - 33: {fileID: 1305541521} + - 23: {fileID: 1305541520} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1305541519 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1305541518} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 352349652} + m_RootOrder: 8 +--- !u!23 &1305541520 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1305541518} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1305541521 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1305541518} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1307348600 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1307348601} + - 33: {fileID: 1307348603} + - 23: {fileID: 1307348602} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1307348601 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1307348600} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231626962} + m_RootOrder: 6 +--- !u!23 &1307348602 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1307348600} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1307348603 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1307348600} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1307516387 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1307516388} + - 33: {fileID: 1307516390} + - 23: {fileID: 1307516389} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1307516388 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1307516387} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1528982994} + m_RootOrder: 4 +--- !u!23 &1307516389 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1307516387} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1307516390 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1307516387} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1307719058 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1307719059} + - 33: {fileID: 1307719061} + - 23: {fileID: 1307719060} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1307719059 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1307719058} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1528982994} + m_RootOrder: 5 +--- !u!23 &1307719060 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1307719058} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1307719061 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1307719058} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1314660167 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1314660168} + - 33: {fileID: 1314660170} + - 23: {fileID: 1314660169} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1314660168 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1314660167} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1961106353} + m_RootOrder: 7 +--- !u!23 &1314660169 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1314660167} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1314660170 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1314660167} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1316770377 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1316770378} + - 33: {fileID: 1316770380} + - 23: {fileID: 1316770379} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1316770378 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1316770377} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1251486547} + m_RootOrder: 4 +--- !u!23 &1316770379 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1316770377} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1316770380 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1316770377} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1318505278 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1318505279} + - 33: {fileID: 1318505281} + - 23: {fileID: 1318505280} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1318505279 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1318505278} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 554489815} + m_RootOrder: 6 +--- !u!23 &1318505280 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1318505278} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1318505281 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1318505278} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1318559586 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1318559587} + - 33: {fileID: 1318559589} + - 23: {fileID: 1318559588} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1318559587 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1318559586} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 857026539} + m_RootOrder: 2 +--- !u!23 &1318559588 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1318559586} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1318559589 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1318559586} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1318928927 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1318928928} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1318928928 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1318928927} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4240589} + - {fileID: 1394467957} + - {fileID: 1956088724} + - {fileID: 32196261} + - {fileID: 1114328169} + - {fileID: 1525434092} + - {fileID: 617739923} + - {fileID: 31880376} + - {fileID: 1650041202} + m_Father: {fileID: 2047955730} + m_RootOrder: 2 +--- !u!1 &1319814372 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1319814373} + - 33: {fileID: 1319814375} + - 23: {fileID: 1319814374} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1319814373 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1319814372} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1965163931} + m_RootOrder: 3 +--- !u!23 &1319814374 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1319814372} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1319814375 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1319814372} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1325847476 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1325847477} + - 33: {fileID: 1325847479} + - 23: {fileID: 1325847478} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1325847477 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1325847476} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 138445035} + m_RootOrder: 3 +--- !u!23 &1325847478 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1325847476} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1325847479 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1325847476} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1328647143 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1328647144} + - 33: {fileID: 1328647146} + - 23: {fileID: 1328647145} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1328647144 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1328647143} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1269069112} + m_RootOrder: 2 +--- !u!23 &1328647145 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1328647143} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1328647146 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1328647143} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1330598093 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1330598094} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1330598094 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1330598093} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 124953303} + - {fileID: 1050258140} + - {fileID: 633738328} + - {fileID: 469176262} + - {fileID: 335083540} + - {fileID: 1365593391} + - {fileID: 1980932116} + - {fileID: 155157967} + - {fileID: 707099600} + m_Father: {fileID: 2047955730} + m_RootOrder: 6 +--- !u!1 &1332082080 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1332082081} + - 33: {fileID: 1332082083} + - 23: {fileID: 1332082082} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1332082081 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1332082080} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1991877734} + m_RootOrder: 4 +--- !u!23 &1332082082 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1332082080} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1332082083 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1332082080} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1334569732 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1334569733} + - 33: {fileID: 1334569735} + - 23: {fileID: 1334569734} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1334569733 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1334569732} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 379543545} + m_RootOrder: 3 +--- !u!23 &1334569734 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1334569732} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1334569735 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1334569732} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1335403817 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1335403818} + m_Layer: 0 + m_Name: FullCubeGrid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1335403818 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1335403817} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2.02090001, y: .402413607, z: 3.52141666} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 320694060} + - {fileID: 1875085494} + - {fileID: 1285129845} + - {fileID: 1906654409} + - {fileID: 357871943} + - {fileID: 311797878} + - {fileID: 2047955730} + - {fileID: 416898948} + - {fileID: 1288823789} + m_Father: {fileID: 0} + m_RootOrder: 0 +--- !u!1 &1337936968 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1337936969} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1337936969 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1337936968} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 162559258} + - {fileID: 743617657} + - {fileID: 2080981882} + - {fileID: 668452300} + - {fileID: 306662445} + - {fileID: 1029417253} + - {fileID: 656027563} + - {fileID: 803068174} + - {fileID: 614301048} + m_Father: {fileID: 320694060} + m_RootOrder: 2 +--- !u!1 &1339390100 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1339390101} + - 33: {fileID: 1339390103} + - 23: {fileID: 1339390102} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1339390101 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1339390100} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1136402243} + m_RootOrder: 1 +--- !u!23 &1339390102 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1339390100} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1339390103 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1339390100} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1345266610 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1345266611} + - 33: {fileID: 1345266613} + - 23: {fileID: 1345266612} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1345266611 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1345266610} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 72504183} + m_RootOrder: 0 +--- !u!23 &1345266612 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1345266610} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1345266613 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1345266610} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1348129137 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1348129138} + - 33: {fileID: 1348129140} + - 23: {fileID: 1348129139} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1348129138 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1348129137} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1711378518} + m_RootOrder: 0 +--- !u!23 &1348129139 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1348129137} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1348129140 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1348129137} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1349524316 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1349524317} + - 33: {fileID: 1349524319} + - 23: {fileID: 1349524318} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1349524317 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1349524316} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1950362483} + m_RootOrder: 8 +--- !u!23 &1349524318 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1349524316} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1349524319 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1349524316} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1350275574 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1350275575} + - 33: {fileID: 1350275577} + - 23: {fileID: 1350275576} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1350275575 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1350275574} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 157447699} + m_RootOrder: 7 +--- !u!23 &1350275576 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1350275574} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1350275577 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1350275574} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1350385640 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1350385641} + - 33: {fileID: 1350385643} + - 23: {fileID: 1350385642} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1350385641 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1350385640} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1587156216} + m_RootOrder: 4 +--- !u!23 &1350385642 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1350385640} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1350385643 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1350385640} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1352935614 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1352935615} + - 33: {fileID: 1352935617} + - 23: {fileID: 1352935616} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1352935615 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1352935614} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1550093339} + m_RootOrder: 2 +--- !u!23 &1352935616 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1352935614} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1352935617 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1352935614} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1354454585 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1354454586} + - 33: {fileID: 1354454588} + - 23: {fileID: 1354454587} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1354454586 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1354454585} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 191837273} + m_RootOrder: 2 +--- !u!23 &1354454587 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1354454585} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1354454588 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1354454585} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1355525085 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1355525086} + - 33: {fileID: 1355525088} + - 23: {fileID: 1355525087} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1355525086 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1355525085} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 332742599} + m_RootOrder: 4 +--- !u!23 &1355525087 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1355525085} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1355525088 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1355525085} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1356626586 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1356626587} + - 33: {fileID: 1356626589} + - 23: {fileID: 1356626588} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1356626587 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1356626586} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 768694475} + m_RootOrder: 6 +--- !u!23 &1356626588 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1356626586} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1356626589 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1356626586} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1357123421 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1357123422} + - 33: {fileID: 1357123424} + - 23: {fileID: 1357123423} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1357123422 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1357123421} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 857026539} + m_RootOrder: 6 +--- !u!23 &1357123423 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1357123421} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1357123424 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1357123421} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1357615427 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1357615428} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1357615428 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1357615427} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1491400366} + - {fileID: 2087000649} + - {fileID: 1868659282} + - {fileID: 729236454} + - {fileID: 887646775} + - {fileID: 1560013112} + - {fileID: 548293212} + - {fileID: 1923092696} + - {fileID: 150190142} + m_Father: {fileID: 357871943} + m_RootOrder: 7 +--- !u!1 &1360348675 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1360348676} + - 33: {fileID: 1360348678} + - 23: {fileID: 1360348677} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1360348676 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1360348675} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231738743} + m_RootOrder: 5 +--- !u!23 &1360348677 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1360348675} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1360348678 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1360348675} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1362136243 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1362136244} + - 33: {fileID: 1362136246} + - 23: {fileID: 1362136245} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1362136244 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1362136243} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 849571239} + m_RootOrder: 8 +--- !u!23 &1362136245 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1362136243} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1362136246 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1362136243} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1362344586 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1362344587} + - 33: {fileID: 1362344589} + - 23: {fileID: 1362344588} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1362344587 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1362344586} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 366225505} + m_RootOrder: 6 +--- !u!23 &1362344588 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1362344586} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1362344589 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1362344586} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1362647241 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1362647242} + - 33: {fileID: 1362647244} + - 23: {fileID: 1362647243} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1362647242 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1362647241} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1633108726} + m_RootOrder: 3 +--- !u!23 &1362647243 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1362647241} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1362647244 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1362647241} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1364969515 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1364969516} + - 33: {fileID: 1364969518} + - 23: {fileID: 1364969517} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1364969516 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1364969515} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 332742599} + m_RootOrder: 2 +--- !u!23 &1364969517 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1364969515} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1364969518 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1364969515} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1365593390 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1365593391} + - 33: {fileID: 1365593393} + - 23: {fileID: 1365593392} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1365593391 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1365593390} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1330598094} + m_RootOrder: 5 +--- !u!23 &1365593392 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1365593390} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1365593393 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1365593390} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1366031034 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1366031035} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1366031035 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1366031034} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1730739918} + - {fileID: 1171733634} + - {fileID: 1721123157} + - {fileID: 978106561} + - {fileID: 1581096373} + - {fileID: 1116708662} + - {fileID: 921388391} + - {fileID: 1294857584} + - {fileID: 1803047123} + m_Father: {fileID: 357871943} + m_RootOrder: 1 +--- !u!1 &1368997099 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1368997100} + - 33: {fileID: 1368997102} + - 23: {fileID: 1368997101} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1368997100 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1368997099} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 157447699} + m_RootOrder: 2 +--- !u!23 &1368997101 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1368997099} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1368997102 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1368997099} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1371947163 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1371947164} + - 33: {fileID: 1371947166} + - 23: {fileID: 1371947165} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1371947164 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1371947163} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 138445035} + m_RootOrder: 1 +--- !u!23 &1371947165 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1371947163} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1371947166 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1371947163} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1373919400 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1373919401} + - 33: {fileID: 1373919403} + - 23: {fileID: 1373919402} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1373919401 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1373919400} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 849571239} + m_RootOrder: 3 +--- !u!23 &1373919402 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1373919400} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1373919403 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1373919400} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1374736383 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1374736384} + - 33: {fileID: 1374736386} + - 23: {fileID: 1374736385} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1374736384 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1374736383} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1802157139} + m_RootOrder: 7 +--- !u!23 &1374736385 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1374736383} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1374736386 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1374736383} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1388392808 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1388392809} + - 33: {fileID: 1388392811} + - 23: {fileID: 1388392810} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1388392809 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1388392808} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231738743} + m_RootOrder: 7 +--- !u!23 &1388392810 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1388392808} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1388392811 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1388392808} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1389388061 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1389388062} + - 33: {fileID: 1389388064} + - 23: {fileID: 1389388063} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1389388062 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1389388061} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 554489815} + m_RootOrder: 2 +--- !u!23 &1389388063 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1389388061} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1389388064 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1389388061} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1389778214 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1389778215} + - 33: {fileID: 1389778217} + - 23: {fileID: 1389778216} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1389778215 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1389778214} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231626962} + m_RootOrder: 3 +--- !u!23 &1389778216 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1389778214} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1389778217 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1389778214} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1392306389 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1392306390} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1392306390 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1392306389} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 99675307} + - {fileID: 1227423408} + - {fileID: 13932140} + - {fileID: 1972144157} + - {fileID: 900299406} + - {fileID: 2087585606} + - {fileID: 1087830975} + - {fileID: 2099650449} + - {fileID: 1931155964} + m_Father: {fileID: 320694060} + m_RootOrder: 7 +--- !u!1 &1394467956 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1394467957} + - 33: {fileID: 1394467959} + - 23: {fileID: 1394467958} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1394467957 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1394467956} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1318928928} + m_RootOrder: 1 +--- !u!23 &1394467958 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1394467956} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1394467959 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1394467956} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1395995596 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1395995597} + - 33: {fileID: 1395995599} + - 23: {fileID: 1395995598} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1395995597 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1395995596} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 732523451} + m_RootOrder: 2 +--- !u!23 &1395995598 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1395995596} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1395995599 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1395995596} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1396288339 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1396288340} + - 33: {fileID: 1396288342} + - 23: {fileID: 1396288341} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1396288340 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1396288339} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 499152561} + m_RootOrder: 7 +--- !u!23 &1396288341 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1396288339} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1396288342 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1396288339} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1396544290 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1396544291} + - 33: {fileID: 1396544293} + - 23: {fileID: 1396544292} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1396544291 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1396544290} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 774647436} + m_RootOrder: 7 +--- !u!23 &1396544292 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1396544290} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1396544293 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1396544290} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1396826706 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1396826707} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1396826707 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1396826706} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1407376152} + - {fileID: 608944953} + - {fileID: 546913080} + - {fileID: 1053463225} + - {fileID: 1651113725} + - {fileID: 89611126} + - {fileID: 1106686636} + - {fileID: 1814604996} + - {fileID: 592028979} + m_Father: {fileID: 311797878} + m_RootOrder: 1 +--- !u!1 &1397087031 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1397087032} + - 33: {fileID: 1397087034} + - 23: {fileID: 1397087033} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1397087032 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1397087031} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1536546683} + m_RootOrder: 8 +--- !u!23 &1397087033 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1397087031} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1397087034 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1397087031} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1400544810 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1400544811} + - 33: {fileID: 1400544813} + - 23: {fileID: 1400544812} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1400544811 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1400544810} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 604038727} + m_RootOrder: 4 +--- !u!23 &1400544812 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1400544810} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1400544813 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1400544810} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1402568965 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1402568966} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1402568966 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1402568965} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1729114802} + - {fileID: 2056503529} + - {fileID: 1645729896} + - {fileID: 932174128} + - {fileID: 463653236} + - {fileID: 1601487170} + - {fileID: 232827030} + - {fileID: 1758280295} + - {fileID: 1974779908} + m_Father: {fileID: 1906654409} + m_RootOrder: 3 +--- !u!1 &1402866201 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1402866202} + - 33: {fileID: 1402866204} + - 23: {fileID: 1402866203} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1402866202 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1402866201} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1624250639} + m_RootOrder: 0 +--- !u!23 &1402866203 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1402866201} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1402866204 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1402866201} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1404137073 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1404137074} + - 33: {fileID: 1404137076} + - 23: {fileID: 1404137075} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1404137074 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1404137073} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1243272144} + m_RootOrder: 5 +--- !u!23 &1404137075 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1404137073} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1404137076 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1404137073} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1407376151 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1407376152} + - 33: {fileID: 1407376154} + - 23: {fileID: 1407376153} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1407376152 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1407376151} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1396826707} + m_RootOrder: 0 +--- !u!23 &1407376153 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1407376151} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1407376154 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1407376151} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1410625549 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1410625550} + - 33: {fileID: 1410625552} + - 23: {fileID: 1410625551} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1410625550 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1410625549} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1536546683} + m_RootOrder: 3 +--- !u!23 &1410625551 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1410625549} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1410625552 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1410625549} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1410998028 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1410998029} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1410998029 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1410998028} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 426250121} + - {fileID: 1423351329} + - {fileID: 1615833740} + - {fileID: 448229886} + - {fileID: 427916689} + - {fileID: 477954935} + - {fileID: 937185860} + - {fileID: 214908235} + - {fileID: 1886985853} + m_Father: {fileID: 2047955730} + m_RootOrder: 5 +--- !u!1 &1413035098 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1413035099} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1413035099 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1413035098} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 387035447} + - {fileID: 2033352913} + - {fileID: 745174097} + - {fileID: 741883665} + - {fileID: 49728984} + - {fileID: 22254242} + - {fileID: 1922963495} + - {fileID: 772855987} + - {fileID: 277228140} + m_Father: {fileID: 1288823789} + m_RootOrder: 7 +--- !u!1 &1414375559 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1414375560} + - 33: {fileID: 1414375562} + - 23: {fileID: 1414375561} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1414375560 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1414375559} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231626962} + m_RootOrder: 7 +--- !u!23 &1414375561 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1414375559} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1414375562 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1414375559} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1414446054 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1414446055} + - 33: {fileID: 1414446057} + - 23: {fileID: 1414446056} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1414446055 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1414446054} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 821285325} + m_RootOrder: 3 +--- !u!23 &1414446056 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1414446054} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1414446057 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1414446054} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1423351328 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1423351329} + - 33: {fileID: 1423351331} + - 23: {fileID: 1423351330} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1423351329 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1423351328} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1410998029} + m_RootOrder: 1 +--- !u!23 &1423351330 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1423351328} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1423351331 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1423351328} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1423757291 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1423757292} + - 33: {fileID: 1423757294} + - 23: {fileID: 1423757293} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1423757292 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1423757291} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1633108726} + m_RootOrder: 7 +--- !u!23 &1423757293 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1423757291} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1423757294 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1423757291} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1424159263 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1424159264} + - 33: {fileID: 1424159266} + - 23: {fileID: 1424159265} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1424159264 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1424159263} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 554489815} + m_RootOrder: 5 +--- !u!23 &1424159265 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1424159263} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1424159266 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1424159263} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1424197206 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1424197207} + - 33: {fileID: 1424197209} + - 23: {fileID: 1424197208} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1424197207 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1424197206} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 989992470} + m_RootOrder: 6 +--- !u!23 &1424197208 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1424197206} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1424197209 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1424197206} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1427766160 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1427766161} + - 33: {fileID: 1427766163} + - 23: {fileID: 1427766162} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1427766161 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1427766160} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1082956371} + m_RootOrder: 2 +--- !u!23 &1427766162 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1427766160} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1427766163 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1427766160} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1435433902 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1435433903} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1435433903 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1435433902} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1820456659} + - {fileID: 1146317990} + - {fileID: 1950717896} + - {fileID: 6176331} + - {fileID: 1461556913} + - {fileID: 1600012675} + - {fileID: 1752355734} + - {fileID: 1900178042} + - {fileID: 1009138638} + m_Father: {fileID: 320694060} + m_RootOrder: 3 +--- !u!1 &1438264997 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1438264998} + - 33: {fileID: 1438265000} + - 23: {fileID: 1438264999} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1438264998 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1438264997} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 768694475} + m_RootOrder: 8 +--- !u!23 &1438264999 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1438264997} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1438265000 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1438264997} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1438931483 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1438931484} + - 33: {fileID: 1438931486} + - 23: {fileID: 1438931485} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1438931484 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1438931483} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 146325016} + m_RootOrder: 0 +--- !u!23 &1438931485 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1438931483} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1438931486 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1438931483} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1439132006 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1439132007} + - 33: {fileID: 1439132009} + - 23: {fileID: 1439132008} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1439132007 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1439132006} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1591077534} + m_RootOrder: 7 +--- !u!23 &1439132008 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1439132006} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1439132009 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1439132006} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1444405828 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1444405829} + - 33: {fileID: 1444405831} + - 23: {fileID: 1444405830} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1444405829 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1444405828} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 732523451} + m_RootOrder: 3 +--- !u!23 &1444405830 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1444405828} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1444405831 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1444405828} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1445022527 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1445022528} + - 33: {fileID: 1445022530} + - 23: {fileID: 1445022529} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1445022528 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445022527} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1613309483} + m_RootOrder: 2 +--- !u!23 &1445022529 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445022527} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1445022530 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445022527} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1445609285 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1445609286} + - 33: {fileID: 1445609288} + - 23: {fileID: 1445609287} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1445609286 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445609285} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 191837273} + m_RootOrder: 7 +--- !u!23 &1445609287 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445609285} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1445609288 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445609285} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1445696864 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1445696865} + - 33: {fileID: 1445696867} + - 23: {fileID: 1445696866} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1445696865 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445696864} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 352349652} + m_RootOrder: 6 +--- !u!23 &1445696866 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445696864} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1445696867 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445696864} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1446319685 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1446319686} + - 33: {fileID: 1446319688} + - 23: {fileID: 1446319687} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1446319686 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1446319685} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 698956160} + m_RootOrder: 1 +--- !u!23 &1446319687 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1446319685} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1446319688 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1446319685} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1448535560 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1448535561} + - 33: {fileID: 1448535563} + - 23: {fileID: 1448535562} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1448535561 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1448535560} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 471463405} + m_RootOrder: 6 +--- !u!23 &1448535562 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1448535560} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1448535563 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1448535560} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1455756222 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1455756223} + - 33: {fileID: 1455756225} + - 23: {fileID: 1455756224} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1455756223 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1455756222} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1758170125} + m_RootOrder: 5 +--- !u!23 &1455756224 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1455756222} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1455756225 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1455756222} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1457726231 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1457726232} + - 33: {fileID: 1457726234} + - 23: {fileID: 1457726233} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1457726232 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1457726231} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 554489815} + m_RootOrder: 7 +--- !u!23 &1457726233 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1457726231} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1457726234 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1457726231} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1459732961 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1459732962} + - 33: {fileID: 1459732964} + - 23: {fileID: 1459732963} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1459732962 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1459732961} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 415594698} + m_RootOrder: 8 +--- !u!23 &1459732963 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1459732961} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1459732964 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1459732961} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1460781735 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1460781736} + - 33: {fileID: 1460781738} + - 23: {fileID: 1460781737} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1460781736 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1460781735} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1633108726} + m_RootOrder: 4 +--- !u!23 &1460781737 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1460781735} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1460781738 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1460781735} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1461556912 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1461556913} + - 33: {fileID: 1461556915} + - 23: {fileID: 1461556914} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1461556913 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1461556912} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1435433903} + m_RootOrder: 4 +--- !u!23 &1461556914 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1461556912} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1461556915 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1461556912} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1462172970 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1462172971} + - 33: {fileID: 1462172973} + - 23: {fileID: 1462172972} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1462172971 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1462172970} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 857026539} + m_RootOrder: 5 +--- !u!23 &1462172972 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1462172970} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1462172973 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1462172970} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1462913750 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1462913751} + - 33: {fileID: 1462913753} + - 23: {fileID: 1462913752} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1462913751 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1462913750} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 412002962} + m_RootOrder: 7 +--- !u!23 &1462913752 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1462913750} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1462913753 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1462913750} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1465525030 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1465525031} + - 33: {fileID: 1465525033} + - 23: {fileID: 1465525032} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1465525031 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1465525030} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 358145806} + m_RootOrder: 7 +--- !u!23 &1465525032 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1465525030} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1465525033 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1465525030} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1470668111 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1470668112} + - 33: {fileID: 1470668114} + - 23: {fileID: 1470668113} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1470668112 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1470668111} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 309447440} + m_RootOrder: 2 +--- !u!23 &1470668113 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1470668111} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1470668114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1470668111} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1471964765 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1471964766} + - 33: {fileID: 1471964768} + - 23: {fileID: 1471964767} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1471964766 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1471964765} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2049357828} + m_RootOrder: 2 +--- !u!23 &1471964767 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1471964765} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1471964768 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1471964765} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1472923030 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1472923031} + - 33: {fileID: 1472923033} + - 23: {fileID: 1472923032} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1472923031 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1472923030} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 146325016} + m_RootOrder: 2 +--- !u!23 &1472923032 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1472923030} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1472923033 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1472923030} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1475028432 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1475028433} + - 33: {fileID: 1475028435} + - 23: {fileID: 1475028434} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1475028433 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1475028432} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 352349652} + m_RootOrder: 3 +--- !u!23 &1475028434 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1475028432} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1475028435 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1475028432} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1475464808 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1475464809} + - 33: {fileID: 1475464811} + - 23: {fileID: 1475464810} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1475464809 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1475464808} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 440610438} + m_RootOrder: 8 +--- !u!23 &1475464810 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1475464808} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1475464811 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1475464808} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1475930362 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1475930363} + - 33: {fileID: 1475930365} + - 23: {fileID: 1475930364} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1475930363 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1475930362} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 415594698} + m_RootOrder: 0 +--- !u!23 &1475930364 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1475930362} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1475930365 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1475930362} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1478520777 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1478520778} + - 33: {fileID: 1478520780} + - 23: {fileID: 1478520779} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1478520778 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1478520777} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1550093339} + m_RootOrder: 7 +--- !u!23 &1478520779 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1478520777} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1478520780 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1478520777} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1479376375 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1479376376} + - 33: {fileID: 1479376378} + - 23: {fileID: 1479376377} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1479376376 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1479376375} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 332742599} + m_RootOrder: 5 +--- !u!23 &1479376377 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1479376375} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1479376378 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1479376375} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1483046243 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1483046244} + - 33: {fileID: 1483046246} + - 23: {fileID: 1483046245} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1483046244 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1483046243} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1881349947} + m_RootOrder: 7 +--- !u!23 &1483046245 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1483046243} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1483046246 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1483046243} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1484333753 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1484333754} + - 33: {fileID: 1484333756} + - 23: {fileID: 1484333755} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1484333754 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1484333753} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1687020670} + m_RootOrder: 0 +--- !u!23 &1484333755 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1484333753} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1484333756 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1484333753} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1484629979 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1484629980} + - 33: {fileID: 1484629982} + - 23: {fileID: 1484629981} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1484629980 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1484629979} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1950362483} + m_RootOrder: 6 +--- !u!23 &1484629981 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1484629979} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1484629982 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1484629979} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1487009762 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1487009763} + - 33: {fileID: 1487009765} + - 23: {fileID: 1487009764} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1487009763 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1487009762} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231738743} + m_RootOrder: 3 +--- !u!23 &1487009764 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1487009762} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1487009765 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1487009762} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1491400365 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1491400366} + - 33: {fileID: 1491400368} + - 23: {fileID: 1491400367} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1491400366 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1491400365} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1357615428} + m_RootOrder: 0 +--- !u!23 &1491400367 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1491400365} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1491400368 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1491400365} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1492260307 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1492260308} + - 33: {fileID: 1492260310} + - 23: {fileID: 1492260309} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1492260308 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1492260307} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 415594698} + m_RootOrder: 1 +--- !u!23 &1492260309 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1492260307} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1492260310 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1492260307} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1493653993 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1493653994} + - 33: {fileID: 1493653996} + - 23: {fileID: 1493653995} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1493653994 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1493653993} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 157447699} + m_RootOrder: 1 +--- !u!23 &1493653995 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1493653993} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1493653996 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1493653993} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1494943605 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1494943606} + - 33: {fileID: 1494943608} + - 23: {fileID: 1494943607} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1494943606 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1494943605} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 710806381} + m_RootOrder: 4 +--- !u!23 &1494943607 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1494943605} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1494943608 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1494943605} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1504082959 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1504082960} + - 33: {fileID: 1504082962} + - 23: {fileID: 1504082961} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1504082960 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1504082959} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2049357828} + m_RootOrder: 1 +--- !u!23 &1504082961 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1504082959} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1504082962 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1504082959} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1505898925 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1505898926} + - 33: {fileID: 1505898928} + - 23: {fileID: 1505898927} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1505898926 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1505898925} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 358145806} + m_RootOrder: 2 +--- !u!23 &1505898927 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1505898925} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1505898928 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1505898925} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1506383275 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1506383276} + - 33: {fileID: 1506383278} + - 23: {fileID: 1506383277} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1506383276 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1506383275} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 710806381} + m_RootOrder: 0 +--- !u!23 &1506383277 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1506383275} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1506383278 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1506383275} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1507586982 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1507586983} + - 33: {fileID: 1507586985} + - 23: {fileID: 1507586984} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1507586983 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1507586982} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1881349947} + m_RootOrder: 4 +--- !u!23 &1507586984 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1507586982} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1507586985 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1507586982} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1512158321 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1512158322} + - 33: {fileID: 1512158324} + - 23: {fileID: 1512158323} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1512158322 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1512158321} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 471463405} + m_RootOrder: 0 +--- !u!23 &1512158323 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1512158321} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1512158324 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1512158321} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1515367541 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1515367542} + - 33: {fileID: 1515367544} + - 23: {fileID: 1515367543} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1515367542 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1515367541} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1587156216} + m_RootOrder: 8 +--- !u!23 &1515367543 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1515367541} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1515367544 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1515367541} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1520303004 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1520303005} + - 33: {fileID: 1520303007} + - 23: {fileID: 1520303006} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1520303005 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1520303004} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 379543545} + m_RootOrder: 5 +--- !u!23 &1520303006 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1520303004} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1520303007 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1520303004} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1523936019 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1523936020} + - 33: {fileID: 1523936022} + - 23: {fileID: 1523936021} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1523936020 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1523936019} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1269069112} + m_RootOrder: 8 +--- !u!23 &1523936021 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1523936019} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1523936022 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1523936019} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1524800846 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1524800847} + - 33: {fileID: 1524800849} + - 23: {fileID: 1524800848} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1524800847 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1524800846} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2097222327} + m_RootOrder: 3 +--- !u!23 &1524800848 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1524800846} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1524800849 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1524800846} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1525434091 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1525434092} + - 33: {fileID: 1525434094} + - 23: {fileID: 1525434093} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1525434092 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525434091} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1318928928} + m_RootOrder: 5 +--- !u!23 &1525434093 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525434091} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1525434094 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525434091} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1525654003 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1525654004} + - 33: {fileID: 1525654006} + - 23: {fileID: 1525654005} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1525654004 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525654003} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1633108726} + m_RootOrder: 2 +--- !u!23 &1525654005 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525654003} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1525654006 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525654003} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1528982993 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1528982994} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1528982994 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1528982993} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1227646396} + - {fileID: 1022286119} + - {fileID: 2033597957} + - {fileID: 2058419006} + - {fileID: 1307516388} + - {fileID: 1307719059} + - {fileID: 1161408034} + - {fileID: 1183162456} + - {fileID: 1545214687} + m_Father: {fileID: 311797878} + m_RootOrder: 5 +--- !u!1 &1532310220 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1532310221} + - 33: {fileID: 1532310223} + - 23: {fileID: 1532310222} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1532310221 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1532310220} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 849571239} + m_RootOrder: 4 +--- !u!23 &1532310222 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1532310220} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1532310223 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1532310220} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1533958429 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1533958430} + - 33: {fileID: 1533958432} + - 23: {fileID: 1533958431} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1533958430 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1533958429} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1881349947} + m_RootOrder: 3 +--- !u!23 &1533958431 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1533958429} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1533958432 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1533958429} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1536546682 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1536546683} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1536546683 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1536546682} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1754871150} + - {fileID: 250318199} + - {fileID: 1846421688} + - {fileID: 1410625550} + - {fileID: 1711567330} + - {fileID: 1965897961} + - {fileID: 1138922968} + - {fileID: 75920195} + - {fileID: 1397087032} + m_Father: {fileID: 357871943} + m_RootOrder: 6 +--- !u!1 &1539671134 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1539671135} + - 33: {fileID: 1539671137} + - 23: {fileID: 1539671136} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1539671135 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1539671134} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2040025849} + m_RootOrder: 3 +--- !u!23 &1539671136 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1539671134} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1539671137 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1539671134} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1545214686 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1545214687} + - 33: {fileID: 1545214689} + - 23: {fileID: 1545214688} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1545214687 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1545214686} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1528982994} + m_RootOrder: 8 +--- !u!23 &1545214688 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1545214686} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1545214689 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1545214686} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1546548682 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1546548683} + - 33: {fileID: 1546548685} + - 23: {fileID: 1546548684} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1546548683 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1546548682} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1251486547} + m_RootOrder: 0 +--- !u!23 &1546548684 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1546548682} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1546548685 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1546548682} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1548254632 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1548254633} + - 33: {fileID: 1548254635} + - 23: {fileID: 1548254634} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1548254633 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1548254632} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 969754910} + m_RootOrder: 4 +--- !u!23 &1548254634 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1548254632} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1548254635 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1548254632} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1548314695 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1548314696} + - 33: {fileID: 1548314698} + - 23: {fileID: 1548314697} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1548314696 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1548314695} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 774647436} + m_RootOrder: 8 +--- !u!23 &1548314697 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1548314695} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1548314698 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1548314695} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1550093338 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1550093339} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1550093339 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1550093338} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 434164393} + - {fileID: 122792864} + - {fileID: 1352935615} + - {fileID: 944018028} + - {fileID: 564326638} + - {fileID: 1094574351} + - {fileID: 864853648} + - {fileID: 1478520778} + - {fileID: 2037708930} + m_Father: {fileID: 1288823789} + m_RootOrder: 3 +--- !u!1 &1552181539 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1552181540} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1552181540 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1552181539} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 225483472} + - {fileID: 2115837886} + - {fileID: 2091853998} + - {fileID: 930864241} + - {fileID: 2029131286} + - {fileID: 950492262} + - {fileID: 869552659} + - {fileID: 1736648754} + - {fileID: 1623881286} + m_Father: {fileID: 1875085494} + m_RootOrder: 0 +--- !u!1 &1553925359 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1553925360} + - 33: {fileID: 1553925362} + - 23: {fileID: 1553925361} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1553925360 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1553925359} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1591077534} + m_RootOrder: 6 +--- !u!23 &1553925361 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1553925359} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1553925362 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1553925359} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1556928008 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1556928009} + - 33: {fileID: 1556928011} + - 23: {fileID: 1556928010} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1556928009 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1556928008} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1082956371} + m_RootOrder: 0 +--- !u!23 &1556928010 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1556928008} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1556928011 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1556928008} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1560013111 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1560013112} + - 33: {fileID: 1560013114} + - 23: {fileID: 1560013113} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1560013112 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1560013111} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1357615428} + m_RootOrder: 5 +--- !u!23 &1560013113 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1560013111} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1560013114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1560013111} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1563197118 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1563197119} + - 33: {fileID: 1563197121} + - 23: {fileID: 1563197120} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1563197119 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1563197118} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 72504183} + m_RootOrder: 4 +--- !u!23 &1563197120 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1563197118} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1563197121 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1563197118} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1567144311 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1567144312} + - 33: {fileID: 1567144314} + - 23: {fileID: 1567144313} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1567144312 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1567144311} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2097222327} + m_RootOrder: 2 +--- !u!23 &1567144313 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1567144311} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1567144314 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1567144311} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1570922058 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1570922059} + - 33: {fileID: 1570922061} + - 23: {fileID: 1570922060} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1570922059 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1570922058} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 870806955} + m_RootOrder: 0 +--- !u!23 &1570922060 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1570922058} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1570922061 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1570922058} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1571448785 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1571448786} + - 33: {fileID: 1571448788} + - 23: {fileID: 1571448787} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1571448786 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1571448785} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 412002962} + m_RootOrder: 0 +--- !u!23 &1571448787 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1571448785} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1571448788 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1571448785} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1574493099 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1574493100} + - 33: {fileID: 1574493102} + - 23: {fileID: 1574493101} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1574493100 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1574493099} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1687020670} + m_RootOrder: 2 +--- !u!23 &1574493101 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1574493099} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1574493102 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1574493099} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1574963637 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1574963638} + - 33: {fileID: 1574963640} + - 23: {fileID: 1574963639} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1574963638 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1574963637} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 433168050} + m_RootOrder: 0 +--- !u!23 &1574963639 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1574963637} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1574963640 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1574963637} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1581096372 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1581096373} + - 33: {fileID: 1581096375} + - 23: {fileID: 1581096374} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1581096373 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1581096372} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1366031035} + m_RootOrder: 4 +--- !u!23 &1581096374 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1581096372} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1581096375 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1581096372} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1585804691 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1585804692} + - 33: {fileID: 1585804694} + - 23: {fileID: 1585804693} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1585804692 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1585804691} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 484270180} + m_RootOrder: 0 +--- !u!23 &1585804693 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1585804691} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1585804694 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1585804691} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1587156215 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1587156216} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1587156216 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1587156215} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1129404313} + - {fileID: 723900745} + - {fileID: 304245274} + - {fileID: 1897181989} + - {fileID: 1350385641} + - {fileID: 532371072} + - {fileID: 161900532} + - {fileID: 1068914481} + - {fileID: 1515367542} + m_Father: {fileID: 1906654409} + m_RootOrder: 2 +--- !u!1 &1587431537 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1587431538} + - 33: {fileID: 1587431540} + - 23: {fileID: 1587431539} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1587431538 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1587431537} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 499152561} + m_RootOrder: 8 +--- !u!23 &1587431539 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1587431537} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1587431540 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1587431537} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1591077533 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1591077534} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1591077534 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1591077533} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1233842172} + - {fileID: 646509306} + - {fileID: 121895492} + - {fileID: 1596187163} + - {fileID: 418861002} + - {fileID: 589321230} + - {fileID: 1553925360} + - {fileID: 1439132007} + - {fileID: 352927686} + m_Father: {fileID: 1906654409} + m_RootOrder: 5 +--- !u!1 &1592857979 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1592857980} + - 33: {fileID: 1592857982} + - 23: {fileID: 1592857981} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1592857980 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1592857979} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1950362483} + m_RootOrder: 4 +--- !u!23 &1592857981 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1592857979} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1592857982 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1592857979} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1593517167 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1593517168} + - 33: {fileID: 1593517170} + - 23: {fileID: 1593517169} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1593517168 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1593517167} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1145749506} + m_RootOrder: 3 +--- !u!23 &1593517169 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1593517167} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1593517170 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1593517167} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1595097605 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1595097606} + - 33: {fileID: 1595097608} + - 23: {fileID: 1595097607} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1595097606 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1595097605} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 309447440} + m_RootOrder: 5 +--- !u!23 &1595097607 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1595097605} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1595097608 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1595097605} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1596187162 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1596187163} + - 33: {fileID: 1596187165} + - 23: {fileID: 1596187164} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1596187163 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1596187162} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1591077534} + m_RootOrder: 3 +--- !u!23 &1596187164 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1596187162} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1596187165 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1596187162} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1597171770 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1597171771} + - 33: {fileID: 1597171773} + - 23: {fileID: 1597171772} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1597171771 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1597171770} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 774647436} + m_RootOrder: 3 +--- !u!23 &1597171772 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1597171770} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1597171773 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1597171770} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1600012674 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1600012675} + - 33: {fileID: 1600012677} + - 23: {fileID: 1600012676} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1600012675 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1600012674} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1435433903} + m_RootOrder: 5 +--- !u!23 &1600012676 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1600012674} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1600012677 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1600012674} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1601450018 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1601450019} + - 33: {fileID: 1601450021} + - 23: {fileID: 1601450020} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1601450019 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1601450018} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1613309483} + m_RootOrder: 6 +--- !u!23 &1601450020 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1601450018} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1601450021 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1601450018} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1601487169 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1601487170} + - 33: {fileID: 1601487172} + - 23: {fileID: 1601487171} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1601487170 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1601487169} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1402568966} + m_RootOrder: 5 +--- !u!23 &1601487171 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1601487169} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1601487172 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1601487169} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1602538142 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1602538143} + - 33: {fileID: 1602538145} + - 23: {fileID: 1602538144} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1602538143 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1602538142} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 349606543} + m_RootOrder: 1 +--- !u!23 &1602538144 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1602538142} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1602538145 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1602538142} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1605042667 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1605042668} + - 33: {fileID: 1605042670} + - 23: {fileID: 1605042669} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1605042668 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605042667} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 821285325} + m_RootOrder: 1 +--- !u!23 &1605042669 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605042667} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1605042670 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605042667} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1606405212 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1606405213} + - 33: {fileID: 1606405215} + - 23: {fileID: 1606405214} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1606405213 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1606405212} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 157447699} + m_RootOrder: 5 +--- !u!23 &1606405214 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1606405212} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1606405215 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1606405212} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1608184002 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1608184003} + - 33: {fileID: 1608184005} + - 23: {fileID: 1608184004} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1608184003 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1608184002} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 732523451} + m_RootOrder: 1 +--- !u!23 &1608184004 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1608184002} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1608184005 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1608184002} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1610958732 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1610958733} + - 33: {fileID: 1610958735} + - 23: {fileID: 1610958734} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1610958733 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1610958732} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2040025849} + m_RootOrder: 4 +--- !u!23 &1610958734 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1610958732} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1610958735 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1610958732} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1613309482 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1613309483} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1613309483 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1613309482} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 283747329} + - {fileID: 1872063052} + - {fileID: 1445022528} + - {fileID: 351209546} + - {fileID: 607719588} + - {fileID: 511402744} + - {fileID: 1601450019} + - {fileID: 1683129561} + - {fileID: 1849951075} + m_Father: {fileID: 320694060} + m_RootOrder: 1 +--- !u!1 &1615833739 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1615833740} + - 33: {fileID: 1615833742} + - 23: {fileID: 1615833741} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1615833740 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1615833739} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1410998029} + m_RootOrder: 2 +--- !u!23 &1615833741 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1615833739} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1615833742 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1615833739} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1622807705 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1622807706} + - 33: {fileID: 1622807708} + - 23: {fileID: 1622807707} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1622807706 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1622807705} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 358145806} + m_RootOrder: 8 +--- !u!23 &1622807707 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1622807705} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1622807708 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1622807705} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1623881285 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1623881286} + - 33: {fileID: 1623881288} + - 23: {fileID: 1623881287} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1623881286 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1623881285} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1552181540} + m_RootOrder: 8 +--- !u!23 &1623881287 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1623881285} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1623881288 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1623881285} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1624250638 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1624250639} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1624250639 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1624250638} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1402866202} + - {fileID: 1891078375} + - {fileID: 1025853055} + - {fileID: 790672579} + - {fileID: 1732926627} + - {fileID: 2008569424} + - {fileID: 1790590802} + - {fileID: 264309450} + - {fileID: 405307838} + m_Father: {fileID: 357871943} + m_RootOrder: 0 +--- !u!1 &1630920716 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1630920717} + - 33: {fileID: 1630920719} + - 23: {fileID: 1630920718} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1630920717 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1630920716} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 849571239} + m_RootOrder: 7 +--- !u!23 &1630920718 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1630920716} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1630920719 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1630920716} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1631514758 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1631514759} + - 33: {fileID: 1631514761} + - 23: {fileID: 1631514760} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1631514759 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1631514758} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1049063299} + m_RootOrder: 7 +--- !u!23 &1631514760 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1631514758} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1631514761 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1631514758} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1633108725 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1633108726} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1633108726 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1633108725} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2051291023} + - {fileID: 2020642359} + - {fileID: 1525654004} + - {fileID: 1362647242} + - {fileID: 1460781736} + - {fileID: 1830645292} + - {fileID: 2079882518} + - {fileID: 1423757292} + - {fileID: 1932418424} + m_Father: {fileID: 1288823789} + m_RootOrder: 6 +--- !u!1 &1645729895 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1645729896} + - 33: {fileID: 1645729898} + - 23: {fileID: 1645729897} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1645729896 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1645729895} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1402568966} + m_RootOrder: 2 +--- !u!23 &1645729897 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1645729895} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1645729898 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1645729895} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1645935152 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1645935153} + - 33: {fileID: 1645935155} + - 23: {fileID: 1645935154} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1645935153 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1645935152} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 843886803} + m_RootOrder: 5 +--- !u!23 &1645935154 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1645935152} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1645935155 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1645935152} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1646787809 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1646787810} + - 33: {fileID: 1646787812} + - 23: {fileID: 1646787811} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1646787810 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1646787809} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 191837273} + m_RootOrder: 5 +--- !u!23 &1646787811 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1646787809} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1646787812 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1646787809} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1646799000 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1646799001} + - 33: {fileID: 1646799003} + - 23: {fileID: 1646799002} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1646799001 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1646799000} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 332742599} + m_RootOrder: 0 +--- !u!23 &1646799002 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1646799000} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1646799003 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1646799000} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1650041201 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1650041202} + - 33: {fileID: 1650041204} + - 23: {fileID: 1650041203} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1650041202 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1650041201} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1318928928} + m_RootOrder: 8 +--- !u!23 &1650041203 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1650041201} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1650041204 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1650041201} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1651113724 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1651113725} + - 33: {fileID: 1651113727} + - 23: {fileID: 1651113726} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1651113725 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1651113724} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1396826707} + m_RootOrder: 4 +--- !u!23 &1651113726 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1651113724} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1651113727 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1651113724} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1652927163 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1652927164} + - 33: {fileID: 1652927166} + - 23: {fileID: 1652927165} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1652927164 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1652927163} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1145749506} + m_RootOrder: 1 +--- !u!23 &1652927165 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1652927163} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1652927166 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1652927163} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1655346523 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1655346524} + - 33: {fileID: 1655346526} + - 23: {fileID: 1655346525} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1655346524 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1655346523} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2070993649} + m_RootOrder: 5 +--- !u!23 &1655346525 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1655346523} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1655346526 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1655346523} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1660802534 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1660802535} + - 33: {fileID: 1660802537} + - 23: {fileID: 1660802536} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1660802535 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1660802534} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 604038727} + m_RootOrder: 7 +--- !u!23 &1660802536 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1660802534} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1660802537 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1660802534} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1662872401 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1662872402} + - 33: {fileID: 1662872404} + - 23: {fileID: 1662872403} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1662872402 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1662872401} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 471463405} + m_RootOrder: 8 +--- !u!23 &1662872403 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1662872401} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1662872404 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1662872401} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1665684507 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1665684508} + - 33: {fileID: 1665684510} + - 23: {fileID: 1665684509} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1665684508 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1665684507} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 433168050} + m_RootOrder: 5 +--- !u!23 &1665684509 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1665684507} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1665684510 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1665684507} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1673459333 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1673459334} + - 33: {fileID: 1673459336} + - 23: {fileID: 1673459335} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1673459334 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1673459333} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1802157139} + m_RootOrder: 4 +--- !u!23 &1673459335 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1673459333} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1673459336 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1673459333} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1675013452 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1675013453} + - 33: {fileID: 1675013455} + - 23: {fileID: 1675013454} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1675013453 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1675013452} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2040025849} + m_RootOrder: 6 +--- !u!23 &1675013454 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1675013452} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1675013455 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1675013452} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1679991483 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1679991484} + - 33: {fileID: 1679991486} + - 23: {fileID: 1679991485} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1679991484 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1679991483} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2070993649} + m_RootOrder: 3 +--- !u!23 &1679991485 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1679991483} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1679991486 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1679991483} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1683129560 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1683129561} + - 33: {fileID: 1683129563} + - 23: {fileID: 1683129562} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1683129561 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1683129560} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1613309483} + m_RootOrder: 7 +--- !u!23 &1683129562 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1683129560} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1683129563 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1683129560} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1685836020 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1685836021} + - 33: {fileID: 1685836023} + - 23: {fileID: 1685836022} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1685836021 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1685836020} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 732523451} + m_RootOrder: 7 +--- !u!23 &1685836022 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1685836020} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1685836023 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1685836020} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1687020669 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1687020670} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1687020670 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1687020669} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1484333754} + - {fileID: 670426899} + - {fileID: 1574493100} + - {fileID: 531698857} + - {fileID: 761392685} + - {fileID: 790229014} + - {fileID: 423336367} + - {fileID: 728585453} + - {fileID: 970902515} + m_Father: {fileID: 1906654409} + m_RootOrder: 7 +--- !u!1 &1700747217 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1700747218} + - 33: {fileID: 1700747220} + - 23: {fileID: 1700747219} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1700747218 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1700747217} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 499152561} + m_RootOrder: 4 +--- !u!23 &1700747219 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1700747217} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1700747220 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1700747217} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1702680168 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1702680169} + - 33: {fileID: 1702680171} + - 23: {fileID: 1702680170} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1702680169 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702680168} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2040025849} + m_RootOrder: 8 +--- !u!23 &1702680170 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702680168} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1702680171 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702680168} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1703452019 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1703452020} + - 33: {fileID: 1703452022} + - 23: {fileID: 1703452021} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1703452020 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1703452019} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1041296208} + m_RootOrder: 1 +--- !u!23 &1703452021 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1703452019} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1703452022 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1703452019} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1711378517 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1711378518} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1711378518 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1711378517} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1348129138} + - {fileID: 906056252} + - {fileID: 283110881} + - {fileID: 307869078} + - {fileID: 933014248} + - {fileID: 719486259} + - {fileID: 173812877} + - {fileID: 1108133971} + - {fileID: 91951654} + m_Father: {fileID: 311797878} + m_RootOrder: 3 +--- !u!1 &1711515863 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1711515864} + - 33: {fileID: 1711515866} + - 23: {fileID: 1711515865} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1711515864 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1711515863} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 358145806} + m_RootOrder: 1 +--- !u!23 &1711515865 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1711515863} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1711515866 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1711515863} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1711567329 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1711567330} + - 33: {fileID: 1711567332} + - 23: {fileID: 1711567331} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1711567330 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1711567329} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1536546683} + m_RootOrder: 4 +--- !u!23 &1711567331 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1711567329} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1711567332 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1711567329} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1717160739 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1717160740} + - 33: {fileID: 1717160742} + - 23: {fileID: 1717160741} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1717160740 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1717160739} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 484270180} + m_RootOrder: 8 +--- !u!23 &1717160741 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1717160739} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1717160742 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1717160739} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1721123156 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1721123157} + - 33: {fileID: 1721123159} + - 23: {fileID: 1721123158} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1721123157 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1721123156} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1366031035} + m_RootOrder: 2 +--- !u!23 &1721123158 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1721123156} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1721123159 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1721123156} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1729114801 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1729114802} + - 33: {fileID: 1729114804} + - 23: {fileID: 1729114803} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1729114802 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1729114801} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1402568966} + m_RootOrder: 0 +--- !u!23 &1729114803 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1729114801} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1729114804 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1729114801} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1729768772 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1729768773} + - 33: {fileID: 1729768775} + - 23: {fileID: 1729768774} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1729768773 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1729768772} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 440610438} + m_RootOrder: 4 +--- !u!23 &1729768774 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1729768772} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1729768775 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1729768772} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1730739917 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1730739918} + - 33: {fileID: 1730739920} + - 23: {fileID: 1730739919} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1730739918 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1730739917} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1366031035} + m_RootOrder: 0 +--- !u!23 &1730739919 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1730739917} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1730739920 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1730739917} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1732926626 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1732926627} + - 33: {fileID: 1732926629} + - 23: {fileID: 1732926628} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1732926627 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1732926626} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1624250639} + m_RootOrder: 4 +--- !u!23 &1732926628 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1732926626} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1732926629 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1732926626} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1736130679 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1736130680} + - 33: {fileID: 1736130682} + - 23: {fileID: 1736130681} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1736130680 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1736130679} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 870806955} + m_RootOrder: 6 +--- !u!23 &1736130681 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1736130679} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1736130682 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1736130679} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1736648753 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1736648754} + - 33: {fileID: 1736648756} + - 23: {fileID: 1736648755} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1736648754 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1736648753} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1552181540} + m_RootOrder: 7 +--- !u!23 &1736648755 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1736648753} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1736648756 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1736648753} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1737309124 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1737309125} + - 33: {fileID: 1737309127} + - 23: {fileID: 1737309126} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1737309125 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1737309124} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1991877734} + m_RootOrder: 2 +--- !u!23 &1737309126 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1737309124} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1737309127 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1737309124} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1741033991 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1741033992} + - 33: {fileID: 1741033994} + - 23: {fileID: 1741033993} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1741033992 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1741033991} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 498431041} + m_RootOrder: 7 +--- !u!23 &1741033993 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1741033991} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1741033994 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1741033991} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1741551534 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1741551535} + - 33: {fileID: 1741551537} + - 23: {fileID: 1741551536} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1741551535 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1741551534} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 433168050} + m_RootOrder: 7 +--- !u!23 &1741551536 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1741551534} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1741551537 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1741551534} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1748920385 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1748920386} + - 33: {fileID: 1748920388} + - 23: {fileID: 1748920387} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1748920386 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1748920385} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1881349947} + m_RootOrder: 6 +--- !u!23 &1748920387 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1748920385} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1748920388 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1748920385} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1752355733 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1752355734} + - 33: {fileID: 1752355736} + - 23: {fileID: 1752355735} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1752355734 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1752355733} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1435433903} + m_RootOrder: 6 +--- !u!23 &1752355735 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1752355733} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1752355736 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1752355733} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1754474687 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1754474688} + - 33: {fileID: 1754474690} + - 23: {fileID: 1754474689} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1754474688 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1754474687} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231738743} + m_RootOrder: 2 +--- !u!23 &1754474689 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1754474687} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1754474690 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1754474687} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1754871149 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1754871150} + - 33: {fileID: 1754871152} + - 23: {fileID: 1754871151} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1754871150 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1754871149} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1536546683} + m_RootOrder: 0 +--- !u!23 &1754871151 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1754871149} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1754871152 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1754871149} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1755673662 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1755673663} + - 33: {fileID: 1755673665} + - 23: {fileID: 1755673664} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1755673663 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1755673662} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1243272144} + m_RootOrder: 0 +--- !u!23 &1755673664 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1755673662} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1755673665 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1755673662} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1755946757 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1755946758} + - 33: {fileID: 1755946760} + - 23: {fileID: 1755946759} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1755946758 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1755946757} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 72504183} + m_RootOrder: 3 +--- !u!23 &1755946759 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1755946757} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1755946760 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1755946757} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1758170124 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1758170125} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1758170125 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1758170124} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2092823651} + - {fileID: 704930282} + - {fileID: 571634748} + - {fileID: 211645512} + - {fileID: 2142769701} + - {fileID: 1455756223} + - {fileID: 506744597} + - {fileID: 24013133} + - {fileID: 128223066} + m_Father: {fileID: 1285129845} + m_RootOrder: 2 +--- !u!1 &1758280294 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1758280295} + - 33: {fileID: 1758280297} + - 23: {fileID: 1758280296} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1758280295 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1758280294} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1402568966} + m_RootOrder: 7 +--- !u!23 &1758280296 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1758280294} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1758280297 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1758280294} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1767762800 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1767762801} + - 33: {fileID: 1767762803} + - 23: {fileID: 1767762802} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1767762801 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1767762800} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 412002962} + m_RootOrder: 2 +--- !u!23 &1767762802 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1767762800} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1767762803 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1767762800} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1779963276 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1779963277} + - 33: {fileID: 1779963279} + - 23: {fileID: 1779963278} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1779963277 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1779963276} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 138445035} + m_RootOrder: 0 +--- !u!23 &1779963278 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1779963276} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1779963279 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1779963276} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1787459734 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1787459735} + - 33: {fileID: 1787459737} + - 23: {fileID: 1787459736} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1787459735 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1787459734} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 72504183} + m_RootOrder: 6 +--- !u!23 &1787459736 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1787459734} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1787459737 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1787459734} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1790590801 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1790590802} + - 33: {fileID: 1790590804} + - 23: {fileID: 1790590803} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1790590802 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1790590801} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1624250639} + m_RootOrder: 6 +--- !u!23 &1790590803 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1790590801} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1790590804 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1790590801} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1792245260 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1792245261} + - 33: {fileID: 1792245263} + - 23: {fileID: 1792245262} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1792245261 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1792245260} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 989992470} + m_RootOrder: 4 +--- !u!23 &1792245262 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1792245260} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1792245263 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1792245260} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1793642499 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1793642500} + - 33: {fileID: 1793642502} + - 23: {fileID: 1793642501} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1793642500 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1793642499} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 157447699} + m_RootOrder: 0 +--- !u!23 &1793642501 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1793642499} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1793642502 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1793642499} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1798609836 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1798609837} + - 33: {fileID: 1798609839} + - 23: {fileID: 1798609838} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1798609837 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1798609836} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1961106353} + m_RootOrder: 2 +--- !u!23 &1798609838 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1798609836} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1798609839 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1798609836} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1800441099 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1800441100} + - 33: {fileID: 1800441102} + - 23: {fileID: 1800441101} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1800441100 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1800441099} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2097222327} + m_RootOrder: 6 +--- !u!23 &1800441101 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1800441099} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1800441102 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1800441099} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1802005356 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1802005357} + - 33: {fileID: 1802005359} + - 23: {fileID: 1802005358} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1802005357 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1802005356} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 989992470} + m_RootOrder: 0 +--- !u!23 &1802005358 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1802005356} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1802005359 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1802005356} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1802157138 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1802157139} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1802157139 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1802157138} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 909924638} + - {fileID: 1206765017} + - {fileID: 969739218} + - {fileID: 199543577} + - {fileID: 1673459334} + - {fileID: 52129121} + - {fileID: 123976717} + - {fileID: 1374736384} + - {fileID: 272056894} + m_Father: {fileID: 357871943} + m_RootOrder: 5 +--- !u!1 &1803047122 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1803047123} + - 33: {fileID: 1803047125} + - 23: {fileID: 1803047124} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1803047123 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1803047122} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1366031035} + m_RootOrder: 8 +--- !u!23 &1803047124 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1803047122} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1803047125 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1803047122} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1808457318 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1808457319} + - 33: {fileID: 1808457321} + - 23: {fileID: 1808457320} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1808457319 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1808457318} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 217104405} + m_RootOrder: 1 +--- !u!23 &1808457320 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1808457318} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1808457321 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1808457318} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1809721790 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1809721791} + - 33: {fileID: 1809721793} + - 23: {fileID: 1809721792} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1809721791 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1809721790} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 138445035} + m_RootOrder: 8 +--- !u!23 &1809721792 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1809721790} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1809721793 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1809721790} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1814604995 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1814604996} + - 33: {fileID: 1814604998} + - 23: {fileID: 1814604997} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1814604996 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1814604995} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1396826707} + m_RootOrder: 7 +--- !u!23 &1814604997 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1814604995} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1814604998 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1814604995} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1820456658 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1820456659} + - 33: {fileID: 1820456661} + - 23: {fileID: 1820456660} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1820456659 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1820456658} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1435433903} + m_RootOrder: 0 +--- !u!23 &1820456660 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1820456658} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1820456661 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1820456658} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1822101653 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1822101654} + - 33: {fileID: 1822101656} + - 23: {fileID: 1822101655} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1822101654 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1822101653} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 554489815} + m_RootOrder: 8 +--- !u!23 &1822101655 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1822101653} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1822101656 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1822101653} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1825222276 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1825222277} + - 33: {fileID: 1825222279} + - 23: {fileID: 1825222278} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1825222277 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1825222276} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 309447440} + m_RootOrder: 0 +--- !u!23 &1825222278 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1825222276} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1825222279 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1825222276} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1825854680 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1825854681} + - 33: {fileID: 1825854683} + - 23: {fileID: 1825854682} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1825854681 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1825854680} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 698956160} + m_RootOrder: 4 +--- !u!23 &1825854682 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1825854680} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1825854683 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1825854680} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1827989465 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1827989466} + - 33: {fileID: 1827989468} + - 23: {fileID: 1827989467} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1827989466 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1827989465} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 471463405} + m_RootOrder: 2 +--- !u!23 &1827989467 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1827989465} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1827989468 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1827989465} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1830645291 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1830645292} + - 33: {fileID: 1830645294} + - 23: {fileID: 1830645293} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1830645292 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1830645291} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1633108726} + m_RootOrder: 5 +--- !u!23 &1830645293 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1830645291} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1830645294 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1830645291} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1834334018 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1834334019} + - 33: {fileID: 1834334021} + - 23: {fileID: 1834334020} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1834334019 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1834334018} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 440610438} + m_RootOrder: 5 +--- !u!23 &1834334020 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1834334018} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1834334021 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1834334018} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1834653029 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1834653030} + - 33: {fileID: 1834653032} + - 23: {fileID: 1834653031} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1834653030 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1834653029} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1082956371} + m_RootOrder: 5 +--- !u!23 &1834653031 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1834653029} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1834653032 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1834653029} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1839525249 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1839525250} + - 33: {fileID: 1839525252} + - 23: {fileID: 1839525251} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1839525250 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1839525249} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1269069112} + m_RootOrder: 3 +--- !u!23 &1839525251 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1839525249} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1839525252 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1839525249} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1844490898 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1844490899} + - 33: {fileID: 1844490901} + - 23: {fileID: 1844490900} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1844490899 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1844490898} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1136402243} + m_RootOrder: 8 +--- !u!23 &1844490900 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1844490898} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1844490901 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1844490898} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1846421687 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1846421688} + - 33: {fileID: 1846421690} + - 23: {fileID: 1846421689} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1846421688 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1846421687} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1536546683} + m_RootOrder: 2 +--- !u!23 &1846421689 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1846421687} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1846421690 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1846421687} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1849914201 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1849914202} + - 33: {fileID: 1849914204} + - 23: {fileID: 1849914203} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1849914202 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1849914201} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1965163931} + m_RootOrder: 6 +--- !u!23 &1849914203 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1849914201} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1849914204 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1849914201} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1849951074 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1849951075} + - 33: {fileID: 1849951077} + - 23: {fileID: 1849951076} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1849951075 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1849951074} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1613309483} + m_RootOrder: 8 +--- !u!23 &1849951076 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1849951074} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1849951077 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1849951074} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1850445105 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1850445106} + - 33: {fileID: 1850445108} + - 23: {fileID: 1850445107} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1850445106 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1850445105} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1243272144} + m_RootOrder: 8 +--- !u!23 &1850445107 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1850445105} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1850445108 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1850445105} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1853333955 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1853333956} + - 33: {fileID: 1853333958} + - 23: {fileID: 1853333957} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1853333956 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1853333955} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1145749506} + m_RootOrder: 8 +--- !u!23 &1853333957 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1853333955} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1853333958 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1853333955} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1856202063 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1856202064} + - 33: {fileID: 1856202066} + - 23: {fileID: 1856202065} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1856202064 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1856202063} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1136402243} + m_RootOrder: 4 +--- !u!23 &1856202065 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1856202063} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1856202066 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1856202063} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1860104358 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1860104359} + - 33: {fileID: 1860104361} + - 23: {fileID: 1860104360} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1860104359 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1860104358} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1243272144} + m_RootOrder: 4 +--- !u!23 &1860104360 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1860104358} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1860104361 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1860104358} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1861128535 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1861128536} + - 33: {fileID: 1861128538} + - 23: {fileID: 1861128537} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1861128536 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1861128535} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 72504183} + m_RootOrder: 1 +--- !u!23 &1861128537 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1861128535} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1861128538 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1861128535} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1861844908 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1861844911} + - 33: {fileID: 1861844910} + - 23: {fileID: 1861844909} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &1861844909 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1861844908} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1861844910 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1861844908} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1861844911 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1861844908} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2049357828} + m_RootOrder: 5 +--- !u!1 &1865533534 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1865533535} + - 33: {fileID: 1865533537} + - 23: {fileID: 1865533536} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1865533535 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1865533534} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 352349652} + m_RootOrder: 7 +--- !u!23 &1865533536 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1865533534} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1865533537 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1865533534} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1868659281 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1868659282} + - 33: {fileID: 1868659284} + - 23: {fileID: 1868659283} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1868659282 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1868659281} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1357615428} + m_RootOrder: 2 +--- !u!23 &1868659283 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1868659281} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1868659284 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1868659281} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1872063051 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1872063052} + - 33: {fileID: 1872063054} + - 23: {fileID: 1872063053} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1872063052 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1872063051} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1613309483} + m_RootOrder: 1 +--- !u!23 &1872063053 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1872063051} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1872063054 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1872063051} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1875085493 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1875085494} + m_Layer: 0 + m_Name: CubeGrid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1875085494 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1875085493} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.02090001, y: -.402413607, z: .478583336} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1552181540} + - {fileID: 231626962} + - {fileID: 604038727} + - {fileID: 870806955} + - {fileID: 146325016} + - {fileID: 1251486547} + - {fileID: 1145749506} + - {fileID: 821285325} + - {fileID: 989992470} + m_Father: {fileID: 1335403818} + m_RootOrder: 1 +--- !u!1 &1875242168 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1875242169} + - 33: {fileID: 1875242171} + - 23: {fileID: 1875242170} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1875242169 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1875242168} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1243272144} + m_RootOrder: 2 +--- !u!23 &1875242170 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1875242168} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1875242171 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1875242168} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1881349946 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1881349947} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1881349947 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1881349946} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1891805611} + - {fileID: 546731476} + - {fileID: 285840097} + - {fileID: 1533958430} + - {fileID: 1507586983} + - {fileID: 692314446} + - {fileID: 1748920386} + - {fileID: 1483046244} + - {fileID: 904842065} + m_Father: {fileID: 311797878} + m_RootOrder: 6 +--- !u!1 &1882555734 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1882555735} + - 33: {fileID: 1882555737} + - 23: {fileID: 1882555736} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1882555735 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1882555734} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1991877734} + m_RootOrder: 8 +--- !u!23 &1882555736 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1882555734} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1882555737 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1882555734} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1883108105 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1883108106} + - 33: {fileID: 1883108108} + - 23: {fileID: 1883108107} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1883108106 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1883108105} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 415594698} + m_RootOrder: 3 +--- !u!23 &1883108107 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1883108105} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1883108108 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1883108105} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1886985852 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1886985853} + - 33: {fileID: 1886985855} + - 23: {fileID: 1886985854} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1886985853 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1886985852} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1410998029} + m_RootOrder: 8 +--- !u!23 &1886985854 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1886985852} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1886985855 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1886985852} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1887303631 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1887303632} + - 33: {fileID: 1887303634} + - 23: {fileID: 1887303633} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1887303632 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1887303631} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 379543545} + m_RootOrder: 2 +--- !u!23 &1887303633 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1887303631} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1887303634 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1887303631} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1891078374 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1891078375} + - 33: {fileID: 1891078377} + - 23: {fileID: 1891078376} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1891078375 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1891078374} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1624250639} + m_RootOrder: 1 +--- !u!23 &1891078376 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1891078374} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1891078377 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1891078374} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1891805610 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1891805611} + - 33: {fileID: 1891805613} + - 23: {fileID: 1891805612} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1891805611 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1891805610} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1881349947} + m_RootOrder: 0 +--- !u!23 &1891805612 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1891805610} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1891805613 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1891805610} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1897181988 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1897181989} + - 33: {fileID: 1897181991} + - 23: {fileID: 1897181990} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1897181989 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1897181988} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1587156216} + m_RootOrder: 3 +--- !u!23 &1897181990 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1897181988} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1897181991 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1897181988} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1899159633 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1899159634} + - 33: {fileID: 1899159636} + - 23: {fileID: 1899159635} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1899159634 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1899159633} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1961106353} + m_RootOrder: 6 +--- !u!23 &1899159635 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1899159633} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1899159636 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1899159633} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1900178041 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1900178042} + - 33: {fileID: 1900178044} + - 23: {fileID: 1900178043} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1900178042 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1900178041} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1435433903} + m_RootOrder: 7 +--- !u!23 &1900178043 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1900178041} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1900178044 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1900178041} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1902281419 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1902281420} + - 33: {fileID: 1902281422} + - 23: {fileID: 1902281421} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1902281420 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1902281419} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 352349652} + m_RootOrder: 5 +--- !u!23 &1902281421 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1902281419} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1902281422 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1902281419} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1903182220 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1903182221} + - 33: {fileID: 1903182223} + - 23: {fileID: 1903182222} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1903182221 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1903182220} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231626962} + m_RootOrder: 4 +--- !u!23 &1903182222 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1903182220} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1903182223 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1903182220} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1906654408 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1906654409} + m_Layer: 0 + m_Name: CubeGrid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1906654409 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1906654408} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.02090001, y: -.402413607, z: -.521416664} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2049357828} + - {fileID: 352349652} + - {fileID: 1587156216} + - {fileID: 1402568966} + - {fileID: 484270180} + - {fileID: 1591077534} + - {fileID: 217104405} + - {fileID: 1687020670} + - {fileID: 969754910} + m_Father: {fileID: 1335403818} + m_RootOrder: 3 +--- !u!1 &1912384767 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1912384768} + - 33: {fileID: 1912384770} + - 23: {fileID: 1912384769} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1912384768 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1912384767} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 774647436} + m_RootOrder: 2 +--- !u!23 &1912384769 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1912384767} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1912384770 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1912384767} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1913048507 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1913048508} + - 33: {fileID: 1913048510} + - 23: {fileID: 1913048509} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1913048508 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1913048507} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1136402243} + m_RootOrder: 3 +--- !u!23 &1913048509 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1913048507} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1913048510 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1913048507} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1913051229 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1913051230} + - 33: {fileID: 1913051232} + - 23: {fileID: 1913051231} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1913051230 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1913051229} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 710806381} + m_RootOrder: 2 +--- !u!23 &1913051231 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1913051229} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1913051232 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1913051229} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1916262350 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1916262351} + - 33: {fileID: 1916262353} + - 23: {fileID: 1916262352} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1916262351 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1916262350} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 849571239} + m_RootOrder: 2 +--- !u!23 &1916262352 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1916262350} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1916262353 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1916262350} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1921026972 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1921026973} + - 33: {fileID: 1921026975} + - 23: {fileID: 1921026974} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1921026973 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1921026972} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 821285325} + m_RootOrder: 2 +--- !u!23 &1921026974 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1921026972} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1921026975 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1921026972} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1922963494 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1922963495} + - 33: {fileID: 1922963497} + - 23: {fileID: 1922963496} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1922963495 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1922963494} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1413035099} + m_RootOrder: 6 +--- !u!23 &1922963496 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1922963494} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1922963497 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1922963494} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1923092695 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1923092696} + - 33: {fileID: 1923092698} + - 23: {fileID: 1923092697} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1923092696 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1923092695} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1357615428} + m_RootOrder: 7 +--- !u!23 &1923092697 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1923092695} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1923092698 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1923092695} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1925558713 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1925558714} + - 33: {fileID: 1925558716} + - 23: {fileID: 1925558715} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1925558714 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1925558713} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1950362483} + m_RootOrder: 3 +--- !u!23 &1925558715 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1925558713} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1925558716 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1925558713} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1931155963 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1931155964} + - 33: {fileID: 1931155966} + - 23: {fileID: 1931155965} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1931155964 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1931155963} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1392306390} + m_RootOrder: 8 +--- !u!23 &1931155965 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1931155963} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1931155966 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1931155963} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1932418423 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1932418424} + - 33: {fileID: 1932418426} + - 23: {fileID: 1932418425} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1932418424 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1932418423} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1633108726} + m_RootOrder: 8 +--- !u!23 &1932418425 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1932418423} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1932418426 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1932418423} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1938902970 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1938902971} + - 33: {fileID: 1938902973} + - 23: {fileID: 1938902972} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1938902971 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1938902970} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1049063299} + m_RootOrder: 4 +--- !u!23 &1938902972 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1938902970} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1938902973 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1938902970} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1942119076 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1942119077} + - 33: {fileID: 1942119079} + - 23: {fileID: 1942119078} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1942119077 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1942119076} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 732523451} + m_RootOrder: 6 +--- !u!23 &1942119078 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1942119076} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1942119079 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1942119076} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1948389797 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1948389798} + - 33: {fileID: 1948389800} + - 23: {fileID: 1948389799} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1948389798 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1948389797} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 499152561} + m_RootOrder: 1 +--- !u!23 &1948389799 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1948389797} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1948389800 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1948389797} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1950362482 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1950362483} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1950362483 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1950362482} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 413262254} + - {fileID: 254407489} + - {fileID: 854490570} + - {fileID: 1925558714} + - {fileID: 1592857980} + - {fileID: 60943539} + - {fileID: 1484629980} + - {fileID: 214705700} + - {fileID: 1349524317} + m_Father: {fileID: 320694060} + m_RootOrder: 6 +--- !u!1 &1950717895 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1950717896} + - 33: {fileID: 1950717898} + - 23: {fileID: 1950717897} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1950717896 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1950717895} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1435433903} + m_RootOrder: 2 +--- !u!23 &1950717897 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1950717895} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1950717898 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1950717895} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1952045472 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1952045473} + - 33: {fileID: 1952045475} + - 23: {fileID: 1952045474} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1952045473 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1952045472} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231738743} + m_RootOrder: 4 +--- !u!23 &1952045474 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1952045472} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1952045475 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1952045472} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1953469276 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1953469277} + - 33: {fileID: 1953469279} + - 23: {fileID: 1953469278} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1953469277 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1953469276} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2070993649} + m_RootOrder: 0 +--- !u!23 &1953469278 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1953469276} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1953469279 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1953469276} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1954311485 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1954311486} + - 33: {fileID: 1954311488} + - 23: {fileID: 1954311487} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1954311486 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1954311485} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 710806381} + m_RootOrder: 3 +--- !u!23 &1954311487 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1954311485} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1954311488 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1954311485} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1956088723 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1956088724} + - 33: {fileID: 1956088726} + - 23: {fileID: 1956088725} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1956088724 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1956088723} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1318928928} + m_RootOrder: 2 +--- !u!23 &1956088725 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1956088723} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1956088726 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1956088723} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1960183755 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1960183756} + - 33: {fileID: 1960183758} + - 23: {fileID: 1960183757} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1960183756 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1960183755} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1269069112} + m_RootOrder: 6 +--- !u!23 &1960183757 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1960183755} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1960183758 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1960183755} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1961106352 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1961106353} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1961106353 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1961106352} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1215951044} + - {fileID: 1061289307} + - {fileID: 1798609837} + - {fileID: 979464284} + - {fileID: 406100771} + - {fileID: 988035054} + - {fileID: 1899159634} + - {fileID: 1314660168} + - {fileID: 1967484968} + m_Father: {fileID: 2047955730} + m_RootOrder: 0 +--- !u!1 &1961694171 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1961694172} + - 33: {fileID: 1961694174} + - 23: {fileID: 1961694173} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1961694172 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1961694171} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 732523451} + m_RootOrder: 8 +--- !u!23 &1961694173 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1961694171} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1961694174 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1961694171} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1965163930 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1965163931} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1965163931 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1965163930} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 178633824} + - {fileID: 1188557689} + - {fileID: 63880795} + - {fileID: 1319814373} + - {fileID: 39903541} + - {fileID: 1235025735} + - {fileID: 1849914202} + - {fileID: 838733922} + - {fileID: 429781488} + m_Father: {fileID: 416898948} + m_RootOrder: 4 +--- !u!1 &1965897960 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1965897961} + - 33: {fileID: 1965897963} + - 23: {fileID: 1965897962} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1965897961 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1965897960} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1536546683} + m_RootOrder: 5 +--- !u!23 &1965897962 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1965897960} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1965897963 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1965897960} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1967484967 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1967484968} + - 33: {fileID: 1967484970} + - 23: {fileID: 1967484969} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1967484968 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967484967} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1961106353} + m_RootOrder: 8 +--- !u!23 &1967484969 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967484967} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1967484970 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967484967} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1969505722 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1969505723} + - 33: {fileID: 1969505725} + - 23: {fileID: 1969505724} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1969505723 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1969505722} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 843886803} + m_RootOrder: 3 +--- !u!23 &1969505724 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1969505722} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1969505725 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1969505722} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1972144156 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1972144157} + - 33: {fileID: 1972144159} + - 23: {fileID: 1972144158} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1972144157 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1972144156} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1392306390} + m_RootOrder: 3 +--- !u!23 &1972144158 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1972144156} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1972144159 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1972144156} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1974779907 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1974779908} + - 33: {fileID: 1974779910} + - 23: {fileID: 1974779909} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1974779908 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1974779907} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1402568966} + m_RootOrder: 8 +--- !u!23 &1974779909 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1974779907} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1974779910 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1974779907} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1977979796 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1977979797} + - 33: {fileID: 1977979799} + - 23: {fileID: 1977979798} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1977979797 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1977979796} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 217104405} + m_RootOrder: 2 +--- !u!23 &1977979798 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1977979796} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1977979799 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1977979796} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1979134598 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1979134599} + - 33: {fileID: 1979134601} + - 23: {fileID: 1979134600} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1979134599 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1979134598} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 698956160} + m_RootOrder: 0 +--- !u!23 &1979134600 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1979134598} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1979134601 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1979134598} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1979390744 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1979390745} + - 33: {fileID: 1979390747} + - 23: {fileID: 1979390746} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1979390745 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1979390744} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1240836681} + m_RootOrder: 4 +--- !u!23 &1979390746 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1979390744} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1979390747 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1979390744} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1980932115 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1980932116} + - 33: {fileID: 1980932118} + - 23: {fileID: 1980932117} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1980932116 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1980932115} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1330598094} + m_RootOrder: 6 +--- !u!23 &1980932117 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1980932115} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1980932118 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1980932115} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1986362226 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1986362227} + - 33: {fileID: 1986362229} + - 23: {fileID: 1986362228} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1986362227 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1986362226} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1991877734} + m_RootOrder: 0 +--- !u!23 &1986362228 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1986362226} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1986362229 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1986362226} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1991666045 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1991666046} + - 33: {fileID: 1991666048} + - 23: {fileID: 1991666047} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1991666046 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1991666045} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 72504183} + m_RootOrder: 2 +--- !u!23 &1991666047 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1991666045} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1991666048 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1991666045} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1991877733 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1991877734} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1991877734 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1991877733} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1986362227} + - {fileID: 2077132620} + - {fileID: 1737309125} + - {fileID: 2013232999} + - {fileID: 1332082081} + - {fileID: 1033298436} + - {fileID: 73591253} + - {fileID: 10900167} + - {fileID: 1882555735} + m_Father: {fileID: 1285129845} + m_RootOrder: 1 +--- !u!1 &1995638827 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1995638828} + - 33: {fileID: 1995638830} + - 23: {fileID: 1995638829} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1995638828 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1995638827} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1269069112} + m_RootOrder: 4 +--- !u!23 &1995638829 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1995638827} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1995638830 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1995638827} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1997209206 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1997209207} + - 33: {fileID: 1997209209} + - 23: {fileID: 1997209208} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1997209207 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1997209206} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1038701522} + m_RootOrder: 5 +--- !u!23 &1997209208 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1997209206} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &1997209209 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1997209206} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2004483207 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2004483208} + - 33: {fileID: 2004483210} + - 23: {fileID: 2004483209} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2004483208 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2004483207} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 484270180} + m_RootOrder: 7 +--- !u!23 &2004483209 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2004483207} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2004483210 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2004483207} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2008569423 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2008569424} + - 33: {fileID: 2008569426} + - 23: {fileID: 2008569425} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2008569424 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2008569423} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1624250639} + m_RootOrder: 5 +--- !u!23 &2008569425 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2008569423} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2008569426 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2008569423} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2010793938 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2010793939} + - 33: {fileID: 2010793941} + - 23: {fileID: 2010793940} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2010793939 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2010793938} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 857026539} + m_RootOrder: 3 +--- !u!23 &2010793940 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2010793938} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2010793941 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2010793938} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2013232998 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2013232999} + - 33: {fileID: 2013233001} + - 23: {fileID: 2013233000} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2013232999 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013232998} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1991877734} + m_RootOrder: 3 +--- !u!23 &2013233000 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013232998} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2013233001 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013232998} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2020642358 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2020642359} + - 33: {fileID: 2020642361} + - 23: {fileID: 2020642360} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2020642359 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2020642358} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1633108726} + m_RootOrder: 1 +--- !u!23 &2020642360 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2020642358} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2020642361 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2020642358} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2025153728 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2025153729} + - 33: {fileID: 2025153731} + - 23: {fileID: 2025153730} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2025153729 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2025153728} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1041296208} + m_RootOrder: 0 +--- !u!23 &2025153730 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2025153728} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2025153731 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2025153728} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2026052348 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2026052349} + - 33: {fileID: 2026052351} + - 23: {fileID: 2026052350} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2026052349 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026052348} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2097222327} + m_RootOrder: 8 +--- !u!23 &2026052350 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026052348} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2026052351 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026052348} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2029131285 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2029131286} + - 33: {fileID: 2029131288} + - 23: {fileID: 2029131287} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2029131286 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2029131285} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1552181540} + m_RootOrder: 4 +--- !u!23 &2029131287 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2029131285} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2029131288 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2029131285} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2033352912 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2033352913} + - 33: {fileID: 2033352915} + - 23: {fileID: 2033352914} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2033352913 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2033352912} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1413035099} + m_RootOrder: 1 +--- !u!23 &2033352914 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2033352912} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2033352915 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2033352912} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2033597956 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2033597957} + - 33: {fileID: 2033597959} + - 23: {fileID: 2033597958} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2033597957 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2033597956} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1528982994} + m_RootOrder: 2 +--- !u!23 &2033597958 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2033597956} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2033597959 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2033597956} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2037708929 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2037708930} + - 33: {fileID: 2037708932} + - 23: {fileID: 2037708931} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2037708930 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2037708929} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1550093339} + m_RootOrder: 8 +--- !u!23 &2037708931 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2037708929} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2037708932 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2037708929} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2038017095 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2038017096} + - 33: {fileID: 2038017098} + - 23: {fileID: 2038017097} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2038017096 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2038017095} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 843886803} + m_RootOrder: 0 +--- !u!23 &2038017097 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2038017095} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2038017098 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2038017095} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2040025848 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2040025849} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2040025849 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2040025848} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 433219886} + - {fileID: 2122151701} + - {fileID: 1124369259} + - {fileID: 1539671135} + - {fileID: 1610958733} + - {fileID: 950889724} + - {fileID: 1675013453} + - {fileID: 79316880} + - {fileID: 1702680169} + m_Father: {fileID: 311797878} + m_RootOrder: 4 +--- !u!1 &2045179445 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2045179446} + - 33: {fileID: 2045179448} + - 23: {fileID: 2045179447} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2045179446 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2045179445} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 499152561} + m_RootOrder: 3 +--- !u!23 &2045179447 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2045179445} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2045179448 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2045179445} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2046589813 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2046589814} + - 33: {fileID: 2046589816} + - 23: {fileID: 2046589815} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2046589814 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2046589813} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1240836681} + m_RootOrder: 2 +--- !u!23 &2046589815 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2046589813} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2046589816 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2046589813} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2047955729 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2047955730} + m_Layer: 0 + m_Name: CubeGrid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2047955730 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2047955729} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.02090001, y: -.402413607, z: -6.52141666} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1961106353} + - {fileID: 332742599} + - {fileID: 1318928928} + - {fileID: 358145806} + - {fileID: 950631283} + - {fileID: 1410998029} + - {fileID: 1330598094} + - {fileID: 412002962} + - {fileID: 1082956371} + m_Father: {fileID: 1335403818} + m_RootOrder: 6 +--- !u!1 &2049357827 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2049357828} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2049357828 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2049357827} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 670736873} + - {fileID: 1504082960} + - {fileID: 1471964766} + - {fileID: 2122632236} + - {fileID: 1257843377} + - {fileID: 1861844911} + - {fileID: 1163212113} + - {fileID: 872716104} + - {fileID: 485922319} + m_Father: {fileID: 1906654409} + m_RootOrder: 0 +--- !u!1 &2051291022 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2051291023} + - 33: {fileID: 2051291025} + - 23: {fileID: 2051291024} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2051291023 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2051291022} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -.0442743301, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1633108726} + m_RootOrder: 0 +--- !u!23 &2051291024 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2051291022} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2051291025 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2051291022} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2055671387 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2055671388} + - 33: {fileID: 2055671390} + - 23: {fileID: 2055671389} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2055671388 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055671387} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 821285325} + m_RootOrder: 0 +--- !u!23 &2055671389 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055671387} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2055671390 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055671387} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2056503528 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2056503529} + - 33: {fileID: 2056503531} + - 23: {fileID: 2056503530} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2056503529 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2056503528} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1402568966} + m_RootOrder: 1 +--- !u!23 &2056503530 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2056503528} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2056503531 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2056503528} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2056972173 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2056972174} + - 33: {fileID: 2056972176} + - 23: {fileID: 2056972175} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2056972174 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2056972173} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 732523451} + m_RootOrder: 5 +--- !u!23 &2056972175 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2056972173} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2056972176 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2056972173} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2057664974 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2057664975} + - 33: {fileID: 2057664977} + - 23: {fileID: 2057664976} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2057664975 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2057664974} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 498431041} + m_RootOrder: 6 +--- !u!23 &2057664976 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2057664974} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2057664977 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2057664974} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2058419005 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2058419006} + - 33: {fileID: 2058419008} + - 23: {fileID: 2058419007} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2058419006 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2058419005} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1528982994} + m_RootOrder: 3 +--- !u!23 &2058419007 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2058419005} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2058419008 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2058419005} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2062746975 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2062746976} + - 33: {fileID: 2062746978} + - 23: {fileID: 2062746977} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2062746976 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2062746975} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231626962} + m_RootOrder: 2 +--- !u!23 &2062746977 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2062746975} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2062746978 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2062746975} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2064792705 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2064792706} + - 33: {fileID: 2064792708} + - 23: {fileID: 2064792707} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2064792706 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2064792705} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 231626962} + m_RootOrder: 0 +--- !u!23 &2064792707 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2064792705} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2064792708 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2064792705} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2068883890 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2068883891} + - 33: {fileID: 2068883893} + - 23: {fileID: 2068883892} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2068883891 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2068883890} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 498431041} + m_RootOrder: 4 +--- !u!23 &2068883892 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2068883890} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2068883893 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2068883890} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2070993648 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2070993649} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2070993649 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2070993648} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1953469277} + - {fileID: 210983308} + - {fileID: 520605639} + - {fileID: 1679991484} + - {fileID: 1275248166} + - {fileID: 1655346524} + - {fileID: 712597646} + - {fileID: 653981194} + - {fileID: 1249280389} + m_Father: {fileID: 1288823789} + m_RootOrder: 2 +--- !u!1 &2077132619 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2077132620} + - 33: {fileID: 2077132622} + - 23: {fileID: 2077132621} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2077132620 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2077132619} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1991877734} + m_RootOrder: 1 +--- !u!23 &2077132621 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2077132619} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2077132622 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2077132619} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2079882517 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2079882518} + - 33: {fileID: 2079882520} + - 23: {fileID: 2079882519} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2079882518 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2079882517} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1633108726} + m_RootOrder: 6 +--- !u!23 &2079882519 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2079882517} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2079882520 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2079882517} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2080097012 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2080097013} + - 33: {fileID: 2080097015} + - 23: {fileID: 2080097014} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2080097013 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080097012} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1243272144} + m_RootOrder: 1 +--- !u!23 &2080097014 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080097012} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2080097015 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080097012} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2080981881 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2080981882} + - 33: {fileID: 2080981884} + - 23: {fileID: 2080981883} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2080981882 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080981881} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1337936969} + m_RootOrder: 2 +--- !u!23 &2080981883 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080981881} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2080981884 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080981881} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2085279770 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2085279771} + - 33: {fileID: 2085279773} + - 23: {fileID: 2085279772} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2085279771 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2085279770} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 415594698} + m_RootOrder: 2 +--- !u!23 &2085279772 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2085279770} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2085279773 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2085279770} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2087000648 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2087000649} + - 33: {fileID: 2087000651} + - 23: {fileID: 2087000650} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2087000649 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2087000648} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1357615428} + m_RootOrder: 1 +--- !u!23 &2087000650 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2087000648} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2087000651 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2087000648} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2087585605 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2087585606} + - 33: {fileID: 2087585608} + - 23: {fileID: 2087585607} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2087585606 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2087585605} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1392306390} + m_RootOrder: 5 +--- !u!23 &2087585607 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2087585605} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2087585608 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2087585605} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2091783722 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2091783723} + - 33: {fileID: 2091783725} + - 23: {fileID: 2091783724} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2091783723 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2091783722} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1041296208} + m_RootOrder: 6 +--- !u!23 &2091783724 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2091783722} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2091783725 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2091783722} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2091853997 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2091853998} + - 33: {fileID: 2091854000} + - 23: {fileID: 2091853999} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2091853998 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2091853997} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1552181540} + m_RootOrder: 2 +--- !u!23 &2091853999 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2091853997} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2091854000 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2091853997} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2092823650 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2092823651} + - 33: {fileID: 2092823653} + - 23: {fileID: 2092823652} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2092823651 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2092823650} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1758170125} + m_RootOrder: 0 +--- !u!23 &2092823652 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2092823650} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2092823653 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2092823650} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2093071928 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2093071929} + - 33: {fileID: 2093071931} + - 23: {fileID: 2093071930} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2093071929 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2093071928} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 366225505} + m_RootOrder: 8 +--- !u!23 &2093071930 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2093071928} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2093071931 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2093071928} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2097222326 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2097222327} + m_Layer: 0 + m_Name: CubeArray1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2097222327 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2097222326} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 398582823} + - {fileID: 997052066} + - {fileID: 1567144312} + - {fileID: 1524800847} + - {fileID: 941245592} + - {fileID: 190771844} + - {fileID: 1800441100} + - {fileID: 1086529298} + - {fileID: 2026052349} + m_Father: {fileID: 311797878} + m_RootOrder: 0 +--- !u!1 &2099444888 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2099444889} + - 33: {fileID: 2099444891} + - 23: {fileID: 2099444890} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2099444889 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2099444888} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 217104405} + m_RootOrder: 3 +--- !u!23 &2099444890 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2099444888} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2099444891 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2099444888} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2099650448 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2099650449} + - 33: {fileID: 2099650451} + - 23: {fileID: 2099650450} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2099650449 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2099650448} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1392306390} + m_RootOrder: 7 +--- !u!23 &2099650450 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2099650448} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2099650451 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2099650448} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2115837885 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2115837886} + - 33: {fileID: 2115837888} + - 23: {fileID: 2115837887} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2115837886 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2115837885} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1552181540} + m_RootOrder: 1 +--- !u!23 &2115837887 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2115837885} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2115837888 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2115837885} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2121867676 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2121867677} + - 33: {fileID: 2121867679} + - 23: {fileID: 2121867678} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2121867677 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2121867676} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1038701522} + m_RootOrder: 8 +--- !u!23 &2121867678 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2121867676} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2121867679 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2121867676} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2122151700 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2122151701} + - 33: {fileID: 2122151703} + - 23: {fileID: 2122151702} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2122151701 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2122151700} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2040025849} + m_RootOrder: 1 +--- !u!23 &2122151702 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2122151700} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2122151703 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2122151700} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2122632235 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2122632236} + - 33: {fileID: 2122632238} + - 23: {fileID: 2122632237} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2122632236 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2122632235} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 2049357828} + m_RootOrder: 3 +--- !u!23 &2122632237 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2122632235} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2122632238 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2122632235} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2129935184 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2129935185} + - 33: {fileID: 2129935187} + - 23: {fileID: 2129935186} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2129935185 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2129935184} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1049063299} + m_RootOrder: 6 +--- !u!23 &2129935186 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2129935184} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2129935187 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2129935184} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2134487186 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2134487187} + - 33: {fileID: 2134487189} + - 23: {fileID: 2134487188} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2134487187 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2134487186} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1251486547} + m_RootOrder: 6 +--- !u!23 &2134487188 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2134487186} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2134487189 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2134487186} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2135229807 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2135229808} + - 33: {fileID: 2135229810} + - 23: {fileID: 2135229809} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2135229808 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2135229807} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1240836681} + m_RootOrder: 1 +--- !u!23 &2135229809 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2135229807} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2135229810 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2135229807} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2136117256 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2136117257} + - 33: {fileID: 2136117259} + - 23: {fileID: 2136117258} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2136117257 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2136117256} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1038701522} + m_RootOrder: 3 +--- !u!23 &2136117258 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2136117256} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2136117259 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2136117256} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2136417288 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2136417289} + - 33: {fileID: 2136417291} + - 23: {fileID: 2136417290} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2136417289 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2136417288} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 843886803} + m_RootOrder: 1 +--- !u!23 &2136417290 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2136417288} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2136417291 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2136417288} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2139240984 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2139240985} + - 33: {fileID: 2139240987} + - 23: {fileID: 2139240986} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2139240985 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2139240984} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 349606543} + m_RootOrder: 5 +--- !u!23 &2139240986 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2139240984} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2139240987 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2139240984} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2142769700 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 2142769701} + - 33: {fileID: 2142769703} + - 23: {fileID: 2142769702} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2142769701 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2142769700} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: .25, y: .25, z: .25} + m_Children: [] + m_Father: {fileID: 1758170125} + m_RootOrder: 4 +--- !u!23 &2142769702 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2142769700} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &2142769703 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2142769700} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Oculus/VR/Scenes/Cubes.unity.meta b/Assets/Oculus/VR/Scenes/Cubes.unity.meta new file mode 100644 index 0000000..3e768fe --- /dev/null +++ b/Assets/Oculus/VR/Scenes/Cubes.unity.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: d920b3d2525670f4abad3d20eda3b349 +DefaultImporter: + userData: diff --git a/Assets/Oculus/VR/Scenes/GearVrControllerTest.unity b/Assets/Oculus/VR/Scenes/GearVrControllerTest.unity new file mode 100644 index 0000000..44448f1 --- /dev/null +++ b/Assets/Oculus/VR/Scenes/GearVrControllerTest.unity @@ -0,0 +1,1105 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 8 + m_Resolution: 2 + m_BakeResolution: 40 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_LightingDataAsset: {fileID: 0} + m_ShadowMaskMode: 2 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &265337587 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 265337588} + - component: {fileID: 265337590} + - component: {fileID: 265337589} + - component: {fileID: 265337591} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &265337588 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 265337587} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 2100857862} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 250, y: 700} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &265337589 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 265337587} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &265337590 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 265337587} +--- !u!114 &265337591 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 265337587} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7acc4619d4cb5e64e9ed05e5a7a8099f, type: 3} + m_Name: + m_EditorClassIdentifier: + uiText: {fileID: 265337589} +--- !u!1 &358702056 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100012, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 358702057} + - component: {fileID: 358702060} + - component: {fileID: 358702059} + - component: {fileID: 358702058} + m_Layer: 0 + m_Name: CenterEyeAnchor + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &358702057 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400012, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358702056} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2100857862} + m_Father: {fileID: 863221866} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &358702058 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11414578, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358702056} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df8e1d778abf442e4bec449c360e9e1c, type: 3} + m_Name: + m_EditorClassIdentifier: + fadeTime: 2 + fadeColor: {r: 0.01, g: 0.01, b: 0.01, a: 1} + fadeOnStart: 1 +--- !u!20 &358702059 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2015248, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358702056} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0.019607844} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 1000 + field of view: 90 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: 1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 + m_StereoMirrorMode: 0 +--- !u!81 &358702060 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 8100000, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358702056} + m_Enabled: 1 +--- !u!1 &432959205 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 168962, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1594308570} + m_Layer: 0 + m_Name: LeftHandAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &654211503 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 134650, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1594308569} + m_Layer: 0 + m_Name: RightHandAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1001 &678225789 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1594308570} + m_Modifications: + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11479374, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_controller + value: 16777216 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &678225790 stripped +Transform: + m_PrefabParentObject: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_PrefabInternal: {fileID: 678225789} +--- !u!1 &863221865 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 162066, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 863221866} + m_Layer: 0 + m_Name: TrackingSpace + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &863221866 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 462066, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 863221865} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1568687149} + - {fileID: 358702057} + - {fileID: 1795229448} + - {fileID: 1277714291} + - {fileID: 1594308570} + - {fileID: 1594308569} + m_Father: {fileID: 1594308573} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &887455119 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1594308569} + m_Modifications: + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11479374, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_controller + value: 33554432 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1007573585 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1007573588} + - component: {fileID: 1007573587} + - component: {fileID: 1007573586} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1007573586 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1007573585} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1007573587 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1007573585} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &1007573588 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1007573585} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1117748289 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1117748290} + - component: {fileID: 1117748292} + - component: {fileID: 1117748291} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1117748290 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1117748289} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.3, y: 0.9, z: 0.1} + m_Children: [] + m_Father: {fileID: 2100857862} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1117748291 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1117748289} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.909} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1117748292 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1117748289} +--- !u!4 &1212613231 stripped +Transform: + m_PrefabParentObject: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_PrefabInternal: {fileID: 887455119} +--- !u!1 &1277714290 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 162068, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1277714291} + m_Layer: 0 + m_Name: TrackerAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1277714291 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 462068, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1277714290} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 863221866} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1444637086 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1444637088} + - component: {fileID: 1444637087} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1444637087 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1444637086} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1444637088 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1444637086} + m_LocalRotation: {x: 0.40821794, y: -0.23456973, z: 0.109381676, w: 0.87542605} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1445337725 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1445337729} + - component: {fileID: 1445337728} + - component: {fileID: 1445337727} + - component: {fileID: 1445337726} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &1445337726 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445337725} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1445337727 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445337725} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1445337728 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445337725} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1445337729 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445337725} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -5.97, z: 0} + m_LocalScale: {x: 10, y: 10, z: 10} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1568687148 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100010, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1568687149} + - component: {fileID: 1568687150} + m_Layer: 0 + m_Name: LeftEyeAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1568687149 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400010, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1568687148} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 863221866} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &1568687150 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1568687148} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 1 + m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 + m_StereoMirrorMode: 0 +--- !u!4 &1594308569 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 481164, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 654211503} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1212613231} + m_Father: {fileID: 863221866} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &1594308570 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 477154, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 432959205} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 678225790} + m_Father: {fileID: 863221866} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1594308571 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1594308573} + - component: {fileID: 1594308576} + - component: {fileID: 1594308575} + m_Layer: 0 + m_Name: OVRCameraRig + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1594308573 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400008, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1594308571} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 863221866} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1594308575 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11400002, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1594308571} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7e933e81d3c20c74ea6fdc708a67e3a5, type: 3} + m_Name: + m_EditorClassIdentifier: + queueAhead: 1 + useRecommendedMSAALevel: 0 + enableAdaptiveResolution: 0 + minRenderScale: 0.7 + maxRenderScale: 1 + expandMixedRealityCapturePropertySheet: 0 + enableMixedReality: 0 + compositionMethod: 0 + extraHiddenLayers: + serializedVersion: 2 + m_Bits: 0 + capturingCameraDevice: 0 + flipCameraFrameHorizontally: 0 + flipCameraFrameVertically: 0 + handPoseStateLatency: 0 + sandwichCompositionRenderLatency: 0 + sandwichCompositionBufferedFrames: 8 + chromaKeyColor: {r: 0, g: 1, b: 0, a: 1} + chromaKeySimilarity: 0.6 + chromaKeySmoothRange: 0.03 + chromaKeySpillRange: 0.06 + useDynamicLighting: 0 + depthQuality: 1 + dynamicLightingSmoothFactor: 8 + dynamicLightingDepthVariationClampingValue: 0.001 + virtualGreenScreenType: 0 + virtualGreenScreenTopY: 10 + virtualGreenScreenBottomY: -10 + virtualGreenScreenApplyDepthCulling: 0 + virtualGreenScreenDepthTolerance: 0.2 + _trackingOriginType: 1 + usePositionTracking: 1 + useRotationTracking: 1 + useIPDInPositionTracking: 1 + resetTrackerOnLoad: 1 +--- !u!114 &1594308576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11400020, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1594308571} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df9f338034892c44ebb62d97894772f1, type: 3} + m_Name: + m_EditorClassIdentifier: + usePerEyeCameras: 0 + useFixedUpdateForTracking: 0 +--- !u!1 &1795229447 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100014, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1795229448} + - component: {fileID: 1795229449} + m_Layer: 0 + m_Name: RightEyeAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1795229448 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400014, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1795229447} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 863221866} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &1795229449 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1795229447} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 2 + m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 + m_StereoMirrorMode: 0 +--- !u!1 &2100857858 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2100857862} + - component: {fileID: 2100857861} + - component: {fileID: 2100857860} + - component: {fileID: 2100857859} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2100857859 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2100857858} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &2100857860 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2100857858} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &2100857861 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2100857858} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &2100857862 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2100857858} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 1} + m_LocalScale: {x: 0.01, y: 0.01, z: 0.01} + m_Children: + - {fileID: 1117748290} + - {fileID: 265337588} + m_Father: {fileID: 358702057} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 125} + m_Pivot: {x: 0.5, y: 0.5} diff --git a/Assets/Oculus/VR/Scenes/GearVrControllerTest.unity.meta b/Assets/Oculus/VR/Scenes/GearVrControllerTest.unity.meta new file mode 100644 index 0000000..1a5f7df --- /dev/null +++ b/Assets/Oculus/VR/Scenes/GearVrControllerTest.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d56af3aeb2176e7459f753c1c2e2dd97 +timeCreated: 1486173281 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scenes/HandTest.unity b/Assets/Oculus/VR/Scenes/HandTest.unity new file mode 100644 index 0000000..2068edd --- /dev/null +++ b/Assets/Oculus/VR/Scenes/HandTest.unity @@ -0,0 +1,1292 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18028331, g: 0.22571328, b: 0.30692166, a: 1} +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 2 + m_BakeResolution: 40 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1001 &7611566 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1594308570} + m_Modifications: + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 11479374, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_controller + value: 16777216 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &7611567 stripped +Transform: + m_PrefabParentObject: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_PrefabInternal: {fileID: 7611566} +--- !u!1 &265337587 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 265337588} + - component: {fileID: 265337590} + - component: {fileID: 265337589} + - component: {fileID: 265337591} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &265337588 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 265337587} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 2100857862} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 250, y: 700} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &265337589 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 265337587} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &265337590 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 265337587} +--- !u!114 &265337591 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 265337587} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 12a1e4a79af8fe849b7a2769ff0d3886, type: 3} + m_Name: + m_EditorClassIdentifier: + uiText: {fileID: 265337589} +--- !u!4 &312666934 stripped +Transform: + m_PrefabParentObject: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, + type: 2} + m_PrefabInternal: {fileID: 680101560} +--- !u!1 &358702056 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100012, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 358702057} + - component: {fileID: 358702060} + - component: {fileID: 358702059} + - component: {fileID: 358702058} + m_Layer: 0 + m_Name: CenterEyeAnchor + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &358702057 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400012, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358702056} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2100857862} + m_Father: {fileID: 863221866} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &358702058 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11414578, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358702056} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df8e1d778abf442e4bec449c360e9e1c, type: 3} + m_Name: + m_EditorClassIdentifier: + fadeTime: 2 + fadeColor: {r: 0.01, g: 0.01, b: 0.01, a: 1} + fadeOnStart: 1 + renderQueue: 5000 +--- !u!20 &358702059 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2015248, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358702056} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0.019607844} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 1000 + field of view: 90 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: 1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!81 &358702060 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 8100000, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358702056} + m_Enabled: 1 +--- !u!1 &432959205 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 168962, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1594308570} + m_Layer: 0 + m_Name: LeftHandAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &654211503 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 134650, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1594308569} + m_Layer: 0 + m_Name: RightHandAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1001 &680101560 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1594308570} + m_Modifications: + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114428879332287356, guid: 835e735ca71bf78459fb2cababd74112, + type: 2} + propertyPath: _pointerPoseGO + value: + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &747178298 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1594308569} + m_Modifications: + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &747178299 stripped +Transform: + m_PrefabParentObject: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_PrefabInternal: {fileID: 747178298} +--- !u!1 &863221865 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 162066, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 863221866} + m_Layer: 0 + m_Name: TrackingSpace + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &863221866 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 462066, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 863221865} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1568687149} + - {fileID: 358702057} + - {fileID: 1795229448} + - {fileID: 1277714291} + - {fileID: 1594308570} + - {fileID: 1594308569} + m_Father: {fileID: 1594308573} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1007573585 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1007573588} + - component: {fileID: 1007573587} + - component: {fileID: 1007573586} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1007573586 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1007573585} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1007573587 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1007573585} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &1007573588 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1007573585} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1117748289 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1117748290} + - component: {fileID: 1117748292} + - component: {fileID: 1117748291} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1117748290 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1117748289} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.3, y: 0.9, z: 0.1} + m_Children: [] + m_Father: {fileID: 2100857862} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1117748291 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1117748289} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.909} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1117748292 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1117748289} +--- !u!1001 &1191662067 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1594308569} + m_Modifications: + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114428879332287356, guid: 835e735ca71bf78459fb2cababd74112, + type: 2} + propertyPath: HandType + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 114567484643301796, guid: 835e735ca71bf78459fb2cababd74112, + type: 2} + propertyPath: _skeletonType + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 114925265787909616, guid: 835e735ca71bf78459fb2cababd74112, + type: 2} + propertyPath: _meshType + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 835e735ca71bf78459fb2cababd74112, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1191662068 stripped +Transform: + m_PrefabParentObject: {fileID: 4453513310108136, guid: 835e735ca71bf78459fb2cababd74112, + type: 2} + m_PrefabInternal: {fileID: 1191662067} +--- !u!1 &1277714290 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 162068, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1277714291} + m_Layer: 0 + m_Name: TrackerAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1277714291 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 462068, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1277714290} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 863221866} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1444637086 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1444637088} + - component: {fileID: 1444637087} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1444637087 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1444637086} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1444637088 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1444637086} + m_LocalRotation: {x: 0.40821794, y: -0.23456973, z: 0.109381676, w: 0.87542605} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1445337725 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1445337729} + - component: {fileID: 1445337728} + - component: {fileID: 1445337727} + - component: {fileID: 1445337726} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!23 &1445337726 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445337725} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1445337727 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445337725} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1445337728 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445337725} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1445337729 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1445337725} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -5.97, z: 0} + m_LocalScale: {x: 10, y: 10, z: 10} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1502660808 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1502660809} + m_Layer: 0 + m_Name: LeftControllerAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1502660809 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1502660808} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1594308570} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1568687148 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100010, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1568687149} + - component: {fileID: 1568687150} + m_Layer: 0 + m_Name: LeftEyeAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1568687149 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400010, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1568687148} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 863221866} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &1568687150 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1568687148} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 1 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1594308569 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 481164, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 654211503} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1191662068} + - {fileID: 1623181386} + - {fileID: 747178299} + m_Father: {fileID: 863221866} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &1594308570 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 477154, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 432959205} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 312666934} + - {fileID: 1502660809} + - {fileID: 7611567} + m_Father: {fileID: 863221866} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1594308571 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1594308573} + - component: {fileID: 1594308576} + - component: {fileID: 1594308575} + m_Layer: 0 + m_Name: OVRCameraRig + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1594308573 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400008, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1594308571} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 863221866} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1594308575 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11400002, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1594308571} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7e933e81d3c20c74ea6fdc708a67e3a5, type: 3} + m_Name: + m_EditorClassIdentifier: + queueAhead: 1 + useRecommendedMSAALevel: 0 + _monoscopic: 0 + enableAdaptiveResolution: 0 + minRenderScale: 0.7 + maxRenderScale: 1 + _headPoseRelativeOffsetRotation: {x: 0, y: 0, z: 0} + _headPoseRelativeOffsetTranslation: {x: 0, y: 0, z: 0} + profilerTcpPort: 32419 + expandMixedRealityCapturePropertySheet: 0 + enableMixedReality: 0 + compositionMethod: 0 + extraHiddenLayers: + serializedVersion: 2 + m_Bits: 0 + externalCompositionBackdropColorRift: {r: 0, g: 1, b: 0, a: 1} + externalCompositionBackdropColorQuest: {r: 0, g: 0, b: 0, a: 0} + capturingCameraDevice: 0 + flipCameraFrameHorizontally: 0 + flipCameraFrameVertically: 0 + handPoseStateLatency: 0 + sandwichCompositionRenderLatency: 0 + sandwichCompositionBufferedFrames: 8 + chromaKeyColor: {r: 0, g: 1, b: 0, a: 1} + chromaKeySimilarity: 0.6 + chromaKeySmoothRange: 0.03 + chromaKeySpillRange: 0.06 + useDynamicLighting: 0 + depthQuality: 1 + dynamicLightingSmoothFactor: 8 + dynamicLightingDepthVariationClampingValue: 0.001 + virtualGreenScreenType: 0 + virtualGreenScreenTopY: 10 + virtualGreenScreenBottomY: -10 + virtualGreenScreenApplyDepthCulling: 0 + virtualGreenScreenDepthTolerance: 0.2 + mrcActivationMode: 0 + _trackingOriginType: 0 + usePositionTracking: 1 + useRotationTracking: 1 + useIPDInPositionTracking: 1 + resetTrackerOnLoad: 1 + AllowRecenter: 1 + _reorientHMDOnControllerRecenter: 1 + LateControllerUpdate: 1 +--- !u!114 &1594308576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11400020, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1594308571} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df9f338034892c44ebb62d97894772f1, type: 3} + m_Name: + m_EditorClassIdentifier: + usePerEyeCameras: 0 + useFixedUpdateForTracking: 0 + disableEyeAnchorCameras: 0 +--- !u!1 &1623181385 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1623181386} + m_Layer: 0 + m_Name: RightControllerAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1623181386 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1623181385} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1594308569} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1795229447 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100014, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1795229448} + - component: {fileID: 1795229449} + m_Layer: 0 + m_Name: RightEyeAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1795229448 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400014, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1795229447} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 863221866} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &1795229449 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1795229447} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 2 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!1 &2100857858 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2100857862} + - component: {fileID: 2100857861} + - component: {fileID: 2100857860} + - component: {fileID: 2100857859} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &2100857859 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2100857858} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &2100857860 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2100857858} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &2100857861 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2100857858} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &2100857862 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2100857858} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 1} + m_LocalScale: {x: 0.01, y: 0.01, z: 0.01} + m_Children: + - {fileID: 1117748290} + - {fileID: 265337588} + m_Father: {fileID: 358702057} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 125} + m_Pivot: {x: 0.5, y: 0.5} diff --git a/Assets/Oculus/VR/Scenes/HandTest.unity.meta b/Assets/Oculus/VR/Scenes/HandTest.unity.meta new file mode 100644 index 0000000..4e54e69 --- /dev/null +++ b/Assets/Oculus/VR/Scenes/HandTest.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b9a31e08066d6e343a208d34ec298f09 +timeCreated: 1486173281 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scenes/MRC.unity b/Assets/Oculus/VR/Scenes/MRC.unity new file mode 100644 index 0000000..a06e4e0 --- /dev/null +++ b/Assets/Oculus/VR/Scenes/MRC.unity @@ -0,0 +1,6702 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientEquatorColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 1 + m_BakeResolution: 1 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 0 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 0 +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &36454512 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 36454513} + - component: {fileID: 36454516} + - component: {fileID: 36454515} + - component: {fileID: 36454514} + - component: {fileID: 36454518} + - component: {fileID: 36454517} + m_Layer: 0 + m_Name: Cube (20) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &36454513 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 19 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &36454514 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &36454515 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &36454516 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &36454517 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &36454518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &66877009 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 66877010} + - component: {fileID: 66877013} + - component: {fileID: 66877012} + - component: {fileID: 66877011} + - component: {fileID: 66877015} + - component: {fileID: 66877014} + m_Layer: 0 + m_Name: Cube (29) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &66877010 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 28 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &66877011 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &66877012 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &66877013 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &66877014 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &66877015 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &73524539 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 73524540} + - component: {fileID: 73524543} + - component: {fileID: 73524542} + - component: {fileID: 73524541} + - component: {fileID: 73524545} + - component: {fileID: 73524544} + m_Layer: 0 + m_Name: Cube (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &73524540 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &73524541 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &73524542 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &73524543 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &73524544 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &73524545 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &81954963 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 81954964} + m_Layer: 0 + m_Name: Grabbables + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &81954964 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81954963} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &103704585 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1430582761} + m_Modifications: + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &107656903 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 107656907} + - component: {fileID: 107656906} + - component: {fileID: 107656905} + - component: {fileID: 107656904} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &107656904 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 26cadeeaa29498d4889f43542f3add58, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &107656905 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &107656906 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &107656907 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 5} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &113500680 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 113500681} + - component: {fileID: 113500684} + - component: {fileID: 113500683} + - component: {fileID: 113500682} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &113500681 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &113500682 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &113500683 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &113500684 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &156189377 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 156189378} + - component: {fileID: 156189381} + - component: {fileID: 156189380} + - component: {fileID: 156189379} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &156189378 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: -1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &156189379 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &156189380 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &156189381 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &166120574 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 166120575} + m_Layer: 0 + m_Name: Counter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &166120575 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 166120574} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1605028847} + - {fileID: 524771733} + - {fileID: 1519282573} + - {fileID: 1055723252} + - {fileID: 755868679} + - {fileID: 1962295111} + - {fileID: 243097430} + - {fileID: 261327897} + - {fileID: 383385450} + - {fileID: 1702096973} + - {fileID: 948387091} + - {fileID: 113500681} + - {fileID: 156189378} + - {fileID: 1500551998} + - {fileID: 907087224} + - {fileID: 580231891} + m_Father: {fileID: 346664030} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &204679842 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 204679846} + - component: {fileID: 204679845} + - component: {fileID: 204679844} + - component: {fileID: 204679843} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &204679843 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 26cadeeaa29498d4889f43542f3add58, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &204679844 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &204679845 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &204679846 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -5, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &206189564 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 206189565} + - component: {fileID: 206189568} + - component: {fileID: 206189567} + - component: {fileID: 206189566} + - component: {fileID: 206189570} + - component: {fileID: 206189569} + m_Layer: 0 + m_Name: Cube (12) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &206189565 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &206189566 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &206189567 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &206189568 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &206189569 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &206189570 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &210993500 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 210993504} + - component: {fileID: 210993503} + - component: {fileID: 210993502} + - component: {fileID: 210993501} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &210993501 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 26cadeeaa29498d4889f43542f3add58, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &210993502 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &210993503 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &210993504 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &224673155 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 224673156} + - component: {fileID: 224673159} + - component: {fileID: 224673158} + - component: {fileID: 224673157} + - component: {fileID: 224673161} + - component: {fileID: 224673160} + m_Layer: 0 + m_Name: Cube (11) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &224673156 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &224673157 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &224673158 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &224673159 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &224673160 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &224673161 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &243097429 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 243097430} + - component: {fileID: 243097433} + - component: {fileID: 243097432} + - component: {fileID: 243097431} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &243097430 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &243097431 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &243097432 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &243097433 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &261327896 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 261327897} + - component: {fileID: 261327900} + - component: {fileID: 261327899} + - component: {fileID: 261327898} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &261327897 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &261327898 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &261327899 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &261327900 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &304397617 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 304397620} + - component: {fileID: 304397619} + - component: {fileID: 304397618} + m_Layer: 0 + m_Name: OVRMixedRealityCaptureTest + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!20 &304397618 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 304397617} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 0 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!114 &304397619 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 304397617} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 95a5f282b22a9d846bd1a9d2de25079c, type: 3} + m_Name: + m_EditorClassIdentifier: + defaultExternalCamera: {fileID: 475359475} +--- !u!4 &304397620 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 304397617} + m_LocalRotation: {x: -0, y: -0.68325126, z: -0, w: 0.7301834} + m_LocalPosition: {x: 0, y: -0.513, z: -0.373} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: -86.19601, z: 0} +--- !u!1 &329624603 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 329624604} + - component: {fileID: 329624607} + - component: {fileID: 329624606} + - component: {fileID: 329624605} + - component: {fileID: 329624609} + - component: {fileID: 329624608} + m_Layer: 0 + m_Name: Cube (14) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &329624604 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &329624605 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &329624606 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &329624607 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &329624608 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &329624609 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &346664029 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 346664030} + m_Layer: 0 + m_Name: Environment + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &346664030 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 346664029} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 537728712} + - {fileID: 166120575} + - {fileID: 1925469568} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &358988759 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 358988760} + - component: {fileID: 358988763} + - component: {fileID: 358988762} + - component: {fileID: 358988761} + - component: {fileID: 358988765} + - component: {fileID: 358988764} + m_Layer: 0 + m_Name: Cube (26) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &358988760 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 25 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &358988761 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &358988762 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &358988763 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &358988764 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &358988765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &383385449 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 383385450} + - component: {fileID: 383385453} + - component: {fileID: 383385452} + - component: {fileID: 383385451} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &383385450 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &383385451 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &383385452 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &383385453 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &383999543 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 383999547} + - component: {fileID: 383999546} + - component: {fileID: 383999545} + - component: {fileID: 383999544} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &383999544 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 26cadeeaa29498d4889f43542f3add58, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &383999545 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &383999546 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &383999547 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 5, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &406692678 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 406692683} + - component: {fileID: 406692682} + - component: {fileID: 406692680} + - component: {fileID: 406692679} + - component: {fileID: 406692681} + m_Layer: 0 + m_Name: AudioSource + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!82 &406692679 +AudioSource: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406692678} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 8300000, guid: d716392289ac6764994885f5821f7d7b, type: 3} + m_PlayOnAwake: 0 + m_Volume: 1 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + - serializedVersion: 2 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 +--- !u!23 &406692680 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406692678} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 26cadeeaa29498d4889f43542f3add58, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!114 &406692681 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406692678} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 358b12a21a8aa9540b435051f334fe9b, type: 3} + m_Name: + m_EditorClassIdentifier: + period: 2 +--- !u!33 &406692682 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406692678} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &406692683 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406692678} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.102, y: -0.472, z: 0.162} + m_LocalScale: {x: 0.05, y: 0.05, z: 0.05} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &452902406 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 452902407} + - component: {fileID: 452902410} + - component: {fileID: 452902409} + - component: {fileID: 452902408} + - component: {fileID: 452902412} + - component: {fileID: 452902411} + m_Layer: 0 + m_Name: Cube (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &452902407 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &452902408 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &452902409 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &452902410 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &452902411 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &452902412 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &467809853 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 467809857} + - component: {fileID: 467809856} + - component: {fileID: 467809855} + - component: {fileID: 467809854} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &467809854 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 26cadeeaa29498d4889f43542f3add58, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &467809855 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &467809856 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &467809857 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -5} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &475359474 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 475359477} + - component: {fileID: 475359475} + m_Layer: 0 + m_Name: OVRDefaultExternalCamera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!20 &475359475 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 475359474} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 0 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &475359477 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 475359474} + m_LocalRotation: {x: -0, y: -0.65438914, z: -0, w: -0.756158} + m_LocalPosition: {x: -0.816, y: -0.513, z: -0.541} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: -278.253, z: 0} +--- !u!4 &496004193 stripped +Transform: + m_PrefabParentObject: {fileID: 4188412984752900, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 1441110968} +--- !u!1 &524771732 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 524771733} + - component: {fileID: 524771736} + - component: {fileID: 524771735} + - component: {fileID: 524771734} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &524771733 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &524771734 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &524771735 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &524771736 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &537728711 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 537728712} + m_Layer: 0 + m_Name: Room + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &537728712 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 537728711} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 204679846} + - {fileID: 383999547} + - {fileID: 107656907} + - {fileID: 2026317950} + - {fileID: 210993504} + - {fileID: 467809857} + m_Father: {fileID: 346664030} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &560116090 stripped +Transform: + m_PrefabParentObject: {fileID: 400012, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 1441110968} +--- !u!1 &568642233 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 568642234} + - component: {fileID: 568642237} + - component: {fileID: 568642236} + - component: {fileID: 568642235} + - component: {fileID: 568642239} + - component: {fileID: 568642238} + m_Layer: 0 + m_Name: Cube (31) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &568642234 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 30 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &568642235 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &568642236 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &568642237 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &568642238 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &568642239 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &575655890 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 575655891} + - component: {fileID: 575655894} + - component: {fileID: 575655893} + - component: {fileID: 575655892} + - component: {fileID: 575655896} + - component: {fileID: 575655895} + m_Layer: 0 + m_Name: Cube (16) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &575655891 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &575655892 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &575655893 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &575655894 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &575655895 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &575655896 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &580231890 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 580231891} + - component: {fileID: 580231894} + - component: {fileID: 580231893} + - component: {fileID: 580231892} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &580231891 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: 1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &580231892 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &580231893 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &580231894 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &617808497 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 617808498} + - component: {fileID: 617808501} + - component: {fileID: 617808500} + - component: {fileID: 617808499} + - component: {fileID: 617808503} + - component: {fileID: 617808502} + m_Layer: 0 + m_Name: Cube (32) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &617808498 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 31 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &617808499 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &617808500 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &617808501 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &617808502 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &617808503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &663437231 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 663437232} + - component: {fileID: 663437235} + - component: {fileID: 663437234} + - component: {fileID: 663437233} + - component: {fileID: 663437237} + - component: {fileID: 663437236} + m_Layer: 0 + m_Name: Cube (18) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &663437232 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 17 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &663437233 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &663437234 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &663437235 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &663437236 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &663437237 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &684017681 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 684017682} + - component: {fileID: 684017685} + - component: {fileID: 684017684} + - component: {fileID: 684017683} + - component: {fileID: 684017687} + - component: {fileID: 684017686} + m_Layer: 0 + m_Name: Cube (7) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &684017682 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &684017683 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &684017684 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &684017685 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &684017686 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &684017687 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &719105579 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 719105580} + - component: {fileID: 719105583} + - component: {fileID: 719105582} + - component: {fileID: 719105581} + - component: {fileID: 719105585} + - component: {fileID: 719105584} + m_Layer: 0 + m_Name: Cube (19) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &719105580 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 18 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &719105581 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &719105582 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &719105583 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &719105584 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &719105585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &755868678 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 755868679} + - component: {fileID: 755868682} + - component: {fileID: 755868681} + - component: {fileID: 755868680} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &755868679 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &755868680 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &755868681 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &755868682 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &857705792 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 857705793} + - component: {fileID: 857705796} + - component: {fileID: 857705795} + - component: {fileID: 857705794} + - component: {fileID: 857705798} + - component: {fileID: 857705797} + m_Layer: 0 + m_Name: Cube (10) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &857705793 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &857705794 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &857705795 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &857705796 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &857705797 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &857705798 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &907087223 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 907087224} + - component: {fileID: 907087227} + - component: {fileID: 907087226} + - component: {fileID: 907087225} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &907087224 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &907087225 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &907087226 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &907087227 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &943102110 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 943102111} + - component: {fileID: 943102114} + - component: {fileID: 943102113} + - component: {fileID: 943102112} + - component: {fileID: 943102116} + - component: {fileID: 943102115} + m_Layer: 0 + m_Name: Cube (27) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &943102111 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 26 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &943102112 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &943102113 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &943102114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &943102115 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &943102116 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &948387090 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 948387091} + - component: {fileID: 948387094} + - component: {fileID: 948387093} + - component: {fileID: 948387092} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &948387091 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: 1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &948387092 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &948387093 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &948387094 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1055723251 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1055723252} + - component: {fileID: 1055723255} + - component: {fileID: 1055723254} + - component: {fileID: 1055723253} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1055723252 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1055723253 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1055723254 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1055723255 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1065364693 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1065364694} + - component: {fileID: 1065364697} + - component: {fileID: 1065364696} + - component: {fileID: 1065364695} + - component: {fileID: 1065364699} + - component: {fileID: 1065364698} + m_Layer: 0 + m_Name: Cube (28) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1065364694 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 27 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1065364695 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1065364696 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1065364697 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1065364698 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1065364699 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1107310626 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1107310627} + - component: {fileID: 1107310630} + - component: {fileID: 1107310629} + - component: {fileID: 1107310628} + - component: {fileID: 1107310632} + - component: {fileID: 1107310631} + m_Layer: 0 + m_Name: Cube (17) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1107310627 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 16 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1107310628 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1107310629 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1107310630 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1107310631 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1107310632 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1206777512 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1206777513} + - component: {fileID: 1206777516} + - component: {fileID: 1206777515} + - component: {fileID: 1206777514} + - component: {fileID: 1206777518} + - component: {fileID: 1206777517} + m_Layer: 0 + m_Name: Cube (23) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1206777513 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 22 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1206777514 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1206777515 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1206777516 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1206777517 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1206777518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1267950892 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1267950893} + - component: {fileID: 1267950896} + - component: {fileID: 1267950895} + - component: {fileID: 1267950894} + - component: {fileID: 1267950898} + - component: {fileID: 1267950897} + m_Layer: 0 + m_Name: Cube (24) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1267950893 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 23 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1267950894 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1267950895 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1267950896 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1267950897 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1267950898 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1353144165 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1353144166} + - component: {fileID: 1353144169} + - component: {fileID: 1353144168} + - component: {fileID: 1353144167} + - component: {fileID: 1353144171} + - component: {fileID: 1353144170} + m_Layer: 0 + m_Name: Cube (13) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1353144166 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1353144167 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1353144168 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1353144169 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1353144170 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1353144171 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1380377873 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1380377874} + - component: {fileID: 1380377877} + - component: {fileID: 1380377876} + - component: {fileID: 1380377875} + - component: {fileID: 1380377879} + - component: {fileID: 1380377878} + m_Layer: 0 + m_Name: Cube (21) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1380377874 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 20 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1380377875 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1380377876 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1380377877 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1380377878 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1380377879 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1403534324 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1403534327} + - component: {fileID: 1403534326} + - component: {fileID: 1403534325} + m_Layer: 0 + m_Name: DefaultCameraText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!102 &1403534325 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1403534324} + m_Text: DEFAULT + m_OffsetZ: 0 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 32 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_Color: + serializedVersion: 2 + rgba: 4294901790 +--- !u!23 &1403534326 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1403534324} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!4 &1403534327 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1403534324} + m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} + m_LocalPosition: {x: 2.392, y: 0.705, z: 0.444} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} +--- !u!4 &1430582761 stripped +Transform: + m_PrefabParentObject: {fileID: 4471613377008970, guid: ce816f2e6abb0504092c23ed9b970dfd, + type: 2} + m_PrefabInternal: {fileID: 1441110968} +--- !u!1001 &1441110968 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11400002, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: _trackingOriginType + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11400002, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: usePositionTracking + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1470509161 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1470509163} + - component: {fileID: 1470509162} + m_Layer: 0 + m_Name: Directional light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1470509162 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1470509161} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 2 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 1 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1470509163 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1470509161} + m_LocalRotation: {x: 0.40821794, y: -0.23456973, z: 0.10938166, w: 0.8754261} + m_LocalPosition: {x: 0.2, y: 0.61, z: 0.208} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1500117049 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1500117050} + - component: {fileID: 1500117053} + - component: {fileID: 1500117052} + - component: {fileID: 1500117051} + - component: {fileID: 1500117055} + - component: {fileID: 1500117054} + m_Layer: 0 + m_Name: Cube (9) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1500117050 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1500117051 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1500117052 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1500117053 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1500117054 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1500117055 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1500551997 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1500551998} + - component: {fileID: 1500552001} + - component: {fileID: 1500552000} + - component: {fileID: 1500551999} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1500551998 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: -1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1500551999 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1500552000 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1500552001 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1519282572 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1519282573} + - component: {fileID: 1519282576} + - component: {fileID: 1519282575} + - component: {fileID: 1519282574} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1519282573 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1519282574 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1519282575 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1519282576 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1525608981 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1525608982} + - component: {fileID: 1525608985} + - component: {fileID: 1525608984} + - component: {fileID: 1525608983} + - component: {fileID: 1525608987} + - component: {fileID: 1525608986} + m_Layer: 0 + m_Name: Cube (30) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1525608982 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 29 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1525608983 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1525608984 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1525608985 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1525608986 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1525608987 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1605028846 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1605028847} + - component: {fileID: 1605028850} + - component: {fileID: 1605028849} + - component: {fileID: 1605028848} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1605028847 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1605028848 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1605028849 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1605028850 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1657719772 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1657719773} + - component: {fileID: 1657719776} + - component: {fileID: 1657719775} + - component: {fileID: 1657719774} + - component: {fileID: 1657719778} + - component: {fileID: 1657719777} + m_Layer: 0 + m_Name: Cube (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1657719773 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1657719774 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1657719775 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1657719776 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1657719777 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1657719778 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1702096972 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1702096973} + - component: {fileID: 1702096976} + - component: {fileID: 1702096975} + - component: {fileID: 1702096974} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1702096973 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1702096974 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1702096975 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1702096976 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1001 &1725458243 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 496004193} + m_Modifications: + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 488160, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11479374, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + propertyPath: m_controller + value: 16777216 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: d9809c5e8418bb047bf2c8ba1d1a2cec, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1744811460 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1744811461} + - component: {fileID: 1744811464} + - component: {fileID: 1744811463} + - component: {fileID: 1744811462} + - component: {fileID: 1744811466} + - component: {fileID: 1744811465} + m_Layer: 0 + m_Name: Cube (6) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1744811461 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1744811462 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1744811463 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1744811464 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1744811465 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1744811466 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1840087110 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1840087111} + - component: {fileID: 1840087114} + - component: {fileID: 1840087113} + - component: {fileID: 1840087112} + - component: {fileID: 1840087116} + - component: {fileID: 1840087115} + m_Layer: 0 + m_Name: Cube (15) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1840087111 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1840087112 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1840087113 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1840087114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1840087115 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1840087116 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1908482354 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1908482355} + - component: {fileID: 1908482358} + - component: {fileID: 1908482357} + - component: {fileID: 1908482356} + - component: {fileID: 1908482360} + - component: {fileID: 1908482359} + m_Layer: 0 + m_Name: Cube (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1908482355 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1908482356 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1908482357 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1908482358 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1908482359 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1908482360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1925469567 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1925469568} + m_Layer: 0 + m_Name: Grabbables + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1925469568 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1925469567} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 452902407} + - {fileID: 1657719773} + - {fileID: 2013597838} + - {fileID: 2055358989} + - {fileID: 1908482355} + - {fileID: 1744811461} + - {fileID: 684017682} + - {fileID: 73524540} + - {fileID: 1500117050} + - {fileID: 857705793} + - {fileID: 224673156} + - {fileID: 206189565} + - {fileID: 1353144166} + - {fileID: 329624604} + - {fileID: 1840087111} + - {fileID: 575655891} + - {fileID: 1107310627} + - {fileID: 663437232} + - {fileID: 719105580} + - {fileID: 36454513} + - {fileID: 1380377874} + - {fileID: 2137937538} + - {fileID: 1206777513} + - {fileID: 1267950893} + - {fileID: 1967851989} + - {fileID: 358988760} + - {fileID: 943102111} + - {fileID: 1065364694} + - {fileID: 66877010} + - {fileID: 1525608982} + - {fileID: 568642234} + - {fileID: 617808498} + m_Father: {fileID: 346664030} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1962295110 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1962295111} + - component: {fileID: 1962295114} + - component: {fileID: 1962295113} + - component: {fileID: 1962295112} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1962295111 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1962295112 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1962295113 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1962295114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1967851988 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1967851989} + - component: {fileID: 1967851992} + - component: {fileID: 1967851991} + - component: {fileID: 1967851990} + - component: {fileID: 1967851994} + - component: {fileID: 1967851993} + m_Layer: 0 + m_Name: Cube (25) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1967851989 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 24 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1967851990 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1967851991 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1967851992 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1967851993 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1967851994 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &2013597837 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2013597838} + - component: {fileID: 2013597841} + - component: {fileID: 2013597840} + - component: {fileID: 2013597839} + - component: {fileID: 2013597843} + - component: {fileID: 2013597842} + m_Layer: 0 + m_Name: Cube (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2013597838 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2013597839 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2013597840 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2013597841 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &2013597842 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &2013597843 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &2026317946 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2026317950} + - component: {fileID: 2026317949} + - component: {fileID: 2026317948} + - component: {fileID: 2026317947} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &2026317947 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 26cadeeaa29498d4889f43542f3add58, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2026317948 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2026317949 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &2026317950 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -5, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2050501778 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2050501781} + - component: {fileID: 2050501780} + - component: {fileID: 2050501779} + m_Layer: 0 + m_Name: ThirdPersonCameraText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!102 &2050501779 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2050501778} + m_Text: THIRD PERSON + m_OffsetZ: 0 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 32 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_Color: + serializedVersion: 2 + rgba: 4278190335 +--- !u!23 &2050501780 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2050501778} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!4 &2050501781 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2050501778} + m_LocalRotation: {x: 0, y: -0.7071068, z: 0, w: 0.7071068} + m_LocalPosition: {x: -2.4, y: 0.07, z: -1.248} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: -90, z: 0} +--- !u!1 &2055358988 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2055358989} + - component: {fileID: 2055358992} + - component: {fileID: 2055358991} + - component: {fileID: 2055358990} + - component: {fileID: 2055358994} + - component: {fileID: 2055358993} + m_Layer: 0 + m_Name: Cube (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2055358989 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2055358990 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2055358991 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2055358992 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &2055358993 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &2055358994 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &2121340245 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2121340246} + - component: {fileID: 2121340248} + - component: {fileID: 2121340247} + - component: {fileID: 2121340249} + m_Layer: 0 + m_Name: IntroText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2121340246 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2121340245} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.2, z: 1} + m_LocalScale: {x: 0.01, y: 0.01, z: 1} + m_Children: [] + m_Father: {fileID: 560116090} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!102 &2121340247 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2121340245} + m_Text: 'press "A" to switch MRC camera + + * pre-calibrated camera + + * pre-calibrated camera with large FOV + + * alternative 3rd person camera' + m_OffsetZ: 0 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 4 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 32 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!23 &2121340248 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2121340245} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!114 &2121340249 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2121340245} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 42a68265e2d624d49ae7fced6a7e4d91, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &2137937537 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2137937538} + - component: {fileID: 2137937541} + - component: {fileID: 2137937540} + - component: {fileID: 2137937539} + - component: {fileID: 2137937543} + - component: {fileID: 2137937542} + m_Layer: 0 + m_Name: Cube (22) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2137937538 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 21 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2137937539 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2137937540 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2137937541 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &2137937542 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &2137937543 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] diff --git a/Assets/Oculus/VR/Scenes/MRC.unity.meta b/Assets/Oculus/VR/Scenes/MRC.unity.meta new file mode 100644 index 0000000..2944d64 --- /dev/null +++ b/Assets/Oculus/VR/Scenes/MRC.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c249320cff740054f973da7f7e24bd1f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scenes/Room.unity b/Assets/Oculus/VR/Scenes/Room.unity new file mode 100644 index 0000000..e13f0cc --- /dev/null +++ b/Assets/Oculus/VR/Scenes/Room.unity @@ -0,0 +1,6363 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientEquatorColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 1 + m_BakeResolution: 1 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 0 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 0 +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &36454512 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 36454513} + - component: {fileID: 36454516} + - component: {fileID: 36454515} + - component: {fileID: 36454514} + - component: {fileID: 36454518} + - component: {fileID: 36454517} + m_Layer: 0 + m_Name: Cube (20) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &36454513 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 19 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &36454514 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &36454515 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &36454516 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &36454517 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &36454518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 36454512} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &66877009 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 66877010} + - component: {fileID: 66877013} + - component: {fileID: 66877012} + - component: {fileID: 66877011} + - component: {fileID: 66877015} + - component: {fileID: 66877014} + m_Layer: 0 + m_Name: Cube (29) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &66877010 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 28 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &66877011 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &66877012 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &66877013 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &66877014 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &66877015 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 66877009} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &73524539 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 73524540} + - component: {fileID: 73524543} + - component: {fileID: 73524542} + - component: {fileID: 73524541} + - component: {fileID: 73524545} + - component: {fileID: 73524544} + m_Layer: 0 + m_Name: Cube (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &73524540 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &73524541 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &73524542 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &73524543 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &73524544 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &73524545 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 73524539} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &81954963 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 81954964} + m_Layer: 0 + m_Name: Grabbables + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &81954964 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81954963} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &107656903 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 107656907} + - component: {fileID: 107656906} + - component: {fileID: 107656905} + - component: {fileID: 107656904} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &107656904 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &107656905 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &107656906 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &107656907 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 5} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &113500680 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 113500681} + - component: {fileID: 113500684} + - component: {fileID: 113500683} + - component: {fileID: 113500682} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &113500681 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &113500682 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &113500683 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &113500684 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 113500680} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &156189377 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 156189378} + - component: {fileID: 156189381} + - component: {fileID: 156189380} + - component: {fileID: 156189379} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &156189378 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: -1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &156189379 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &156189380 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &156189381 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 156189377} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &166120574 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 166120575} + m_Layer: 0 + m_Name: Counter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &166120575 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 166120574} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1605028847} + - {fileID: 524771733} + - {fileID: 1519282573} + - {fileID: 1055723252} + - {fileID: 755868679} + - {fileID: 1962295111} + - {fileID: 243097430} + - {fileID: 261327897} + - {fileID: 383385450} + - {fileID: 1702096973} + - {fileID: 948387091} + - {fileID: 113500681} + - {fileID: 156189378} + - {fileID: 1500551998} + - {fileID: 907087224} + - {fileID: 580231891} + m_Father: {fileID: 346664030} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &204679842 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 204679846} + - component: {fileID: 204679845} + - component: {fileID: 204679844} + - component: {fileID: 204679843} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &204679843 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &204679844 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &204679845 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &204679846 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -5, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &206189564 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 206189565} + - component: {fileID: 206189568} + - component: {fileID: 206189567} + - component: {fileID: 206189566} + - component: {fileID: 206189570} + - component: {fileID: 206189569} + m_Layer: 0 + m_Name: Cube (12) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &206189565 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &206189566 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &206189567 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &206189568 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &206189569 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &206189570 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 206189564} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &210993500 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 210993504} + - component: {fileID: 210993503} + - component: {fileID: 210993502} + - component: {fileID: 210993501} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &210993501 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &210993502 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &210993503 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &210993504 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &224673155 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 224673156} + - component: {fileID: 224673159} + - component: {fileID: 224673158} + - component: {fileID: 224673157} + - component: {fileID: 224673161} + - component: {fileID: 224673160} + m_Layer: 0 + m_Name: Cube (11) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &224673156 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &224673157 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &224673158 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &224673159 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &224673160 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &224673161 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 224673155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &243097429 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 243097430} + - component: {fileID: 243097433} + - component: {fileID: 243097432} + - component: {fileID: 243097431} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &243097430 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &243097431 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &243097432 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &243097433 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 243097429} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &261327896 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 261327897} + - component: {fileID: 261327900} + - component: {fileID: 261327899} + - component: {fileID: 261327898} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &261327897 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &261327898 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &261327899 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &261327900 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 261327896} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &329624603 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 329624604} + - component: {fileID: 329624607} + - component: {fileID: 329624606} + - component: {fileID: 329624605} + - component: {fileID: 329624609} + - component: {fileID: 329624608} + m_Layer: 0 + m_Name: Cube (14) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &329624604 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &329624605 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &329624606 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &329624607 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &329624608 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &329624609 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329624603} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &346664029 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 346664030} + m_Layer: 0 + m_Name: Environment + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &346664030 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 346664029} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 537728712} + - {fileID: 166120575} + - {fileID: 1925469568} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &358988759 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 358988760} + - component: {fileID: 358988763} + - component: {fileID: 358988762} + - component: {fileID: 358988761} + - component: {fileID: 358988765} + - component: {fileID: 358988764} + m_Layer: 0 + m_Name: Cube (26) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &358988760 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 25 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &358988761 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &358988762 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &358988763 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &358988764 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &358988765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 358988759} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &383385449 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 383385450} + - component: {fileID: 383385453} + - component: {fileID: 383385452} + - component: {fileID: 383385451} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &383385450 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &383385451 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &383385452 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &383385453 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383385449} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &383999543 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 383999547} + - component: {fileID: 383999546} + - component: {fileID: 383999545} + - component: {fileID: 383999544} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &383999544 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &383999545 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &383999546 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &383999547 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 5, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &452902406 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 452902407} + - component: {fileID: 452902410} + - component: {fileID: 452902409} + - component: {fileID: 452902408} + - component: {fileID: 452902412} + - component: {fileID: 452902411} + m_Layer: 0 + m_Name: Cube (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &452902407 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &452902408 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &452902409 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &452902410 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &452902411 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &452902412 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452902406} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &467809853 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 467809857} + - component: {fileID: 467809856} + - component: {fileID: 467809855} + - component: {fileID: 467809854} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &467809854 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &467809855 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &467809856 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &467809857 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -5} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &524771732 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 524771733} + - component: {fileID: 524771736} + - component: {fileID: 524771735} + - component: {fileID: 524771734} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &524771733 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &524771734 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &524771735 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &524771736 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 524771732} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &537728711 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 537728712} + m_Layer: 0 + m_Name: Room + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &537728712 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 537728711} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 204679846} + - {fileID: 383999547} + - {fileID: 107656907} + - {fileID: 2026317950} + - {fileID: 210993504} + - {fileID: 467809857} + m_Father: {fileID: 346664030} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &568642233 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 568642234} + - component: {fileID: 568642237} + - component: {fileID: 568642236} + - component: {fileID: 568642235} + - component: {fileID: 568642239} + - component: {fileID: 568642238} + m_Layer: 0 + m_Name: Cube (31) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &568642234 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 30 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &568642235 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &568642236 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &568642237 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &568642238 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &568642239 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 568642233} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &575655890 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 575655891} + - component: {fileID: 575655894} + - component: {fileID: 575655893} + - component: {fileID: 575655892} + - component: {fileID: 575655896} + - component: {fileID: 575655895} + m_Layer: 0 + m_Name: Cube (16) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &575655891 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &575655892 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &575655893 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &575655894 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &575655895 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &575655896 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575655890} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &580231890 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 580231891} + - component: {fileID: 580231894} + - component: {fileID: 580231893} + - component: {fileID: 580231892} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &580231891 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: 1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &580231892 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &580231893 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &580231894 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 580231890} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &617808497 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 617808498} + - component: {fileID: 617808501} + - component: {fileID: 617808500} + - component: {fileID: 617808499} + - component: {fileID: 617808503} + - component: {fileID: 617808502} + m_Layer: 0 + m_Name: Cube (32) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &617808498 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 31 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &617808499 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &617808500 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &617808501 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &617808502 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &617808503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 617808497} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &663437231 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 663437232} + - component: {fileID: 663437235} + - component: {fileID: 663437234} + - component: {fileID: 663437233} + - component: {fileID: 663437237} + - component: {fileID: 663437236} + m_Layer: 0 + m_Name: Cube (18) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &663437232 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 17 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &663437233 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &663437234 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &663437235 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &663437236 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &663437237 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 663437231} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &684017681 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 684017682} + - component: {fileID: 684017685} + - component: {fileID: 684017684} + - component: {fileID: 684017683} + - component: {fileID: 684017687} + - component: {fileID: 684017686} + m_Layer: 0 + m_Name: Cube (7) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &684017682 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &684017683 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &684017684 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &684017685 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &684017686 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &684017687 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 684017681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &719105579 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 719105580} + - component: {fileID: 719105583} + - component: {fileID: 719105582} + - component: {fileID: 719105581} + - component: {fileID: 719105585} + - component: {fileID: 719105584} + m_Layer: 0 + m_Name: Cube (19) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &719105580 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 18 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &719105581 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &719105582 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &719105583 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &719105584 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &719105585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 719105579} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &755868678 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 755868679} + - component: {fileID: 755868682} + - component: {fileID: 755868681} + - component: {fileID: 755868680} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &755868679 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &755868680 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &755868681 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &755868682 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 755868678} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &857705792 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 857705793} + - component: {fileID: 857705796} + - component: {fileID: 857705795} + - component: {fileID: 857705794} + - component: {fileID: 857705798} + - component: {fileID: 857705797} + m_Layer: 0 + m_Name: Cube (10) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &857705793 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &857705794 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &857705795 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &857705796 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &857705797 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &857705798 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 857705792} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &907087223 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 907087224} + - component: {fileID: 907087227} + - component: {fileID: 907087226} + - component: {fileID: 907087225} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &907087224 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &907087225 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &907087226 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &907087227 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 907087223} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &943102110 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 943102111} + - component: {fileID: 943102114} + - component: {fileID: 943102113} + - component: {fileID: 943102112} + - component: {fileID: 943102116} + - component: {fileID: 943102115} + m_Layer: 0 + m_Name: Cube (27) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &943102111 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 26 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &943102112 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &943102113 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &943102114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &943102115 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &943102116 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 943102110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &948387090 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 948387091} + - component: {fileID: 948387094} + - component: {fileID: 948387093} + - component: {fileID: 948387092} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &948387091 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -2, z: 1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &948387092 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &948387093 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &948387094 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948387090} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1055723251 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1055723252} + - component: {fileID: 1055723255} + - component: {fileID: 1055723254} + - component: {fileID: 1055723253} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1055723252 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1055723253 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1055723254 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1055723255 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1055723251} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1065364693 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1065364694} + - component: {fileID: 1065364697} + - component: {fileID: 1065364696} + - component: {fileID: 1065364695} + - component: {fileID: 1065364699} + - component: {fileID: 1065364698} + m_Layer: 0 + m_Name: Cube (28) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1065364694 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 27 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1065364695 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1065364696 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1065364697 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1065364698 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1065364699 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1065364693} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1107310626 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1107310627} + - component: {fileID: 1107310630} + - component: {fileID: 1107310629} + - component: {fileID: 1107310628} + - component: {fileID: 1107310632} + - component: {fileID: 1107310631} + m_Layer: 0 + m_Name: Cube (17) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1107310627 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 16 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1107310628 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1107310629 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1107310630 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1107310631 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1107310632 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1107310626} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1206777512 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1206777513} + - component: {fileID: 1206777516} + - component: {fileID: 1206777515} + - component: {fileID: 1206777514} + - component: {fileID: 1206777518} + - component: {fileID: 1206777517} + m_Layer: 0 + m_Name: Cube (23) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1206777513 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 22 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1206777514 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1206777515 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1206777516 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1206777517 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1206777518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1206777512} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1267950892 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1267950893} + - component: {fileID: 1267950896} + - component: {fileID: 1267950895} + - component: {fileID: 1267950894} + - component: {fileID: 1267950898} + - component: {fileID: 1267950897} + m_Layer: 0 + m_Name: Cube (24) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1267950893 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 23 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1267950894 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1267950895 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1267950896 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1267950897 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1267950898 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267950892} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1353144165 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1353144166} + - component: {fileID: 1353144169} + - component: {fileID: 1353144168} + - component: {fileID: 1353144167} + - component: {fileID: 1353144171} + - component: {fileID: 1353144170} + m_Layer: 0 + m_Name: Cube (13) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1353144166 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1353144167 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1353144168 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1353144169 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1353144170 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1353144171 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1353144165} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1380377873 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1380377874} + - component: {fileID: 1380377877} + - component: {fileID: 1380377876} + - component: {fileID: 1380377875} + - component: {fileID: 1380377879} + - component: {fileID: 1380377878} + m_Layer: 0 + m_Name: Cube (21) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1380377874 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 20 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1380377875 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1380377876 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1380377877 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1380377878 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1380377879 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1380377873} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1470509161 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1470509163} + - component: {fileID: 1470509162} + m_Layer: 0 + m_Name: Directional light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1470509162 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1470509161} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 2 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 1 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1470509163 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1470509161} + m_LocalRotation: {x: 0.40821794, y: -0.23456973, z: 0.10938166, w: 0.8754261} + m_LocalPosition: {x: 0.2, y: 0.61, z: 0.208} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1500117049 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1500117050} + - component: {fileID: 1500117053} + - component: {fileID: 1500117052} + - component: {fileID: 1500117051} + - component: {fileID: 1500117055} + - component: {fileID: 1500117054} + m_Layer: 0 + m_Name: Cube (9) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1500117050 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1500117051 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1500117052 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1500117053 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1500117054 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1500117055 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500117049} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1500551997 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1500551998} + - component: {fileID: 1500552001} + - component: {fileID: 1500552000} + - component: {fileID: 1500551999} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1500551998 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: -1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1500551999 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1500552000 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1500552001 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1500551997} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1519282572 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1519282573} + - component: {fileID: 1519282576} + - component: {fileID: 1519282575} + - component: {fileID: 1519282574} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1519282573 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1519282574 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1519282575 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1519282576 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1519282572} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1525608981 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1525608982} + - component: {fileID: 1525608985} + - component: {fileID: 1525608984} + - component: {fileID: 1525608983} + - component: {fileID: 1525608987} + - component: {fileID: 1525608986} + m_Layer: 0 + m_Name: Cube (30) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1525608982 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 29 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1525608983 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1525608984 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1525608985 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1525608986 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1525608987 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1525608981} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1605028846 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1605028847} + - component: {fileID: 1605028850} + - component: {fileID: 1605028849} + - component: {fileID: 1605028848} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1605028847 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -2, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1605028848 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1605028849 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1605028850 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1605028846} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1657719772 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1657719773} + - component: {fileID: 1657719776} + - component: {fileID: 1657719775} + - component: {fileID: 1657719774} + - component: {fileID: 1657719778} + - component: {fileID: 1657719777} + m_Layer: 0 + m_Name: Cube (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1657719773 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1657719774 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1657719775 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1657719776 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1657719777 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1657719778 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1657719772} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1702096972 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1702096973} + - component: {fileID: 1702096976} + - component: {fileID: 1702096975} + - component: {fileID: 1702096974} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1702096973 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1702096974 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1702096975 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1702096976 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1702096972} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1744811460 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1744811461} + - component: {fileID: 1744811464} + - component: {fileID: 1744811463} + - component: {fileID: 1744811462} + - component: {fileID: 1744811466} + - component: {fileID: 1744811465} + m_Layer: 0 + m_Name: Cube (6) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1744811461 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: 1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1744811462 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1744811463 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1744811464 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1744811465 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1744811466 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1744811460} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1840087110 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1840087111} + - component: {fileID: 1840087114} + - component: {fileID: 1840087113} + - component: {fileID: 1840087112} + - component: {fileID: 1840087116} + - component: {fileID: 1840087115} + m_Layer: 0 + m_Name: Cube (15) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1840087111 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -1.25, z: -2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1840087112 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1840087113 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1840087114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1840087115 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1840087116 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1840087110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1908482354 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1908482355} + - component: {fileID: 1908482358} + - component: {fileID: 1908482357} + - component: {fileID: 1908482356} + - component: {fileID: 1908482360} + - component: {fileID: 1908482359} + m_Layer: 0 + m_Name: Cube (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1908482355 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1908482356 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1908482357 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1908482358 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1908482359 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1908482360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908482354} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &1925469567 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1925469568} + m_Layer: 0 + m_Name: Grabbables + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1925469568 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1925469567} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 452902407} + - {fileID: 1657719773} + - {fileID: 2013597838} + - {fileID: 2055358989} + - {fileID: 1908482355} + - {fileID: 1744811461} + - {fileID: 684017682} + - {fileID: 73524540} + - {fileID: 1500117050} + - {fileID: 857705793} + - {fileID: 224673156} + - {fileID: 206189565} + - {fileID: 1353144166} + - {fileID: 329624604} + - {fileID: 1840087111} + - {fileID: 575655891} + - {fileID: 1107310627} + - {fileID: 663437232} + - {fileID: 719105580} + - {fileID: 36454513} + - {fileID: 1380377874} + - {fileID: 2137937538} + - {fileID: 1206777513} + - {fileID: 1267950893} + - {fileID: 1967851989} + - {fileID: 358988760} + - {fileID: 943102111} + - {fileID: 1065364694} + - {fileID: 66877010} + - {fileID: 1525608982} + - {fileID: 568642234} + - {fileID: 617808498} + m_Father: {fileID: 346664030} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1931687996 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1931687997} + - component: {fileID: 1931688002} + - component: {fileID: 1931688001} + - component: {fileID: 1931688000} + m_Layer: 0 + m_Name: R Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1931687997 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1931687996} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.2, z: 0.3} + m_Children: [] + m_Father: {fileID: 2080101483} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1931688000 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1931687996} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1931688001 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1931687996} + m_Material: {fileID: 0} + m_IsTrigger: 1 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1931688002 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1931687996} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1962295110 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1962295111} + - component: {fileID: 1962295114} + - component: {fileID: 1962295113} + - component: {fileID: 1962295112} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1962295111 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -2, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 166120575} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1962295112 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1962295113 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1962295114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1962295110} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1967851988 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1967851989} + - component: {fileID: 1967851992} + - component: {fileID: 1967851991} + - component: {fileID: 1967851990} + - component: {fileID: 1967851994} + - component: {fileID: 1967851993} + m_Layer: 0 + m_Name: Cube (25) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1967851989 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 24 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1967851990 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1967851991 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1967851992 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &1967851993 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &1967851994 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1967851988} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &2013597837 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2013597838} + - component: {fileID: 2013597841} + - component: {fileID: 2013597840} + - component: {fileID: 2013597839} + - component: {fileID: 2013597843} + - component: {fileID: 2013597842} + m_Layer: 0 + m_Name: Cube (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2013597838 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -1.25, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2013597839 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2013597840 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2013597841 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &2013597842 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &2013597843 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2013597837} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1 &2026317946 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2026317950} + - component: {fileID: 2026317949} + - component: {fileID: 2026317948} + - component: {fileID: 2026317947} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &2026317947 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2026317948 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2026317949 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &2026317950 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -5, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2050042247 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2050042248} + - component: {fileID: 2050042253} + - component: {fileID: 2050042252} + - component: {fileID: 2050042251} + m_Layer: 0 + m_Name: L Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2050042248 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2050042247} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.2, z: 0.3} + m_Children: [] + m_Father: {fileID: 2080101484} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2050042251 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2050042247} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2050042252 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2050042247} + m_Material: {fileID: 0} + m_IsTrigger: 1 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2050042253 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2050042247} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2055358988 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2055358989} + - component: {fileID: 2055358992} + - component: {fileID: 2055358991} + - component: {fileID: 2055358990} + - component: {fileID: 2055358994} + - component: {fileID: 2055358993} + m_Layer: 0 + m_Name: Cube (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2055358989 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2, y: -1.25, z: -1} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2055358990 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2055358991 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2055358992 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &2055358993 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &2055358994 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2055358988} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] +--- !u!1001 &2080101472 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11400010, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: useProfileData + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400008, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400002, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.y + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &2080101473 stripped +GameObject: + m_PrefabParentObject: {fileID: 100014, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!1 &2080101474 stripped +GameObject: + m_PrefabParentObject: {fileID: 100010, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!20 &2080101475 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101473} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 2 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!20 &2080101476 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101474} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 1 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!1 &2080101477 stripped +GameObject: + m_PrefabParentObject: {fileID: 134650, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!1 &2080101478 stripped +GameObject: + m_PrefabParentObject: {fileID: 168962, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!114 &2080101479 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101477} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fd425c2d06f39bf4899d07c05d0f10eb, type: 3} + m_Name: + m_EditorClassIdentifier: + grabBegin: 0.55 + grabEnd: 0.35 + m_parentHeldObject: 0 + m_moveHandPosition: 0 + m_gripTransform: {fileID: 1931687997} + m_grabVolumes: + - {fileID: 1931688001} + m_controller: 2 + m_parentTransform: {fileID: 2080101483} + m_player: {fileID: 2080101485} +--- !u!54 &2080101480 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101477} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &2080101481 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101478} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fd425c2d06f39bf4899d07c05d0f10eb, type: 3} + m_Name: + m_EditorClassIdentifier: + grabBegin: 0.55 + grabEnd: 0.35 + m_parentHeldObject: 0 + m_moveHandPosition: 0 + m_gripTransform: {fileID: 2050042248} + m_grabVolumes: + - {fileID: 2050042252} + m_controller: 1 + m_parentTransform: {fileID: 2080101484} + m_player: {fileID: 2080101485} +--- !u!54 &2080101482 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101478} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!4 &2080101483 stripped +Transform: + m_PrefabParentObject: {fileID: 481164, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!4 &2080101484 stripped +Transform: + m_PrefabParentObject: {fileID: 477154, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!1 &2080101485 stripped +GameObject: + m_PrefabParentObject: {fileID: 100008, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!1 &2137937537 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2137937538} + - component: {fileID: 2137937541} + - component: {fileID: 2137937540} + - component: {fileID: 2137937539} + - component: {fileID: 2137937543} + - component: {fileID: 2137937542} + m_Layer: 0 + m_Name: Cube (22) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2137937538 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -0.75, z: 2} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: [] + m_Father: {fileID: 1925469568} + m_RootOrder: 21 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2137937539 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2137937540 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2137937541 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &2137937542 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &2137937543 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137937537} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02d61468f8b77ae4b92c344bc9a600fb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_allowOffhandGrab: 1 + m_snapPosition: 0 + m_snapOrientation: 0 + m_snapOffset: {fileID: 0} + m_grabPoints: [] diff --git a/Assets/Oculus/VR/Scenes/Room.unity.meta b/Assets/Oculus/VR/Scenes/Room.unity.meta new file mode 100644 index 0000000..9ed7782 --- /dev/null +++ b/Assets/Oculus/VR/Scenes/Room.unity.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 54445976c1dbf1c49bb38ba7eba558e8 +DefaultImporter: + userData: + assetBundleName: diff --git a/Assets/Oculus/VR/Scenes/Trivial.unity b/Assets/Oculus/VR/Scenes/Trivial.unity new file mode 100644 index 0000000..5588612 --- /dev/null +++ b/Assets/Oculus/VR/Scenes/Trivial.unity @@ -0,0 +1,306 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +SceneSettings: + m_ObjectHideFlags: 0 + m_PVSData: + m_PVSObjectsArray: [] + m_PVSPortalsArray: [] + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: .25 + backfaceThreshold: 100 +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 6 + m_Fog: 0 + m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogMode: 3 + m_FogDensity: .00999999978 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: .211999997, g: .226999998, b: .259000003, a: 1} + m_AmbientEquatorColor: {r: .114, g: .125, b: .133000001, a: 1} + m_AmbientGroundColor: {r: .0469999984, g: .0430000015, b: .0350000001, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: .5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} +--- !u!127 &3 +LevelGameManager: + m_ObjectHideFlags: 0 +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_GIWorkflowMode: 0 + m_LightmapsMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 3 + m_Resolution: 2 + m_BakeResolution: 40 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AOMaxDistance: 1 + m_Padding: 2 + m_CompAOExponent: 0 + m_LightmapParameters: {fileID: 0} + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherRayCount: 1024 + m_LightmapSnapshot: {fileID: 0} + m_RuntimeCPUUsage: 25 +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentRadius: .5 + agentHeight: 2 + agentSlope: 45 + agentClimb: .400000006 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + accuratePlacement: 0 + minRegionArea: 2 + cellSize: .166666672 + manualCellSize: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &97357214 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 97357218} + - 33: {fileID: 97357217} + - 65: {fileID: 97357216} + - 23: {fileID: 97357215} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &97357215 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 97357214} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 1 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!65 &97357216 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 97357214} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &97357217 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 97357214} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &97357218 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 97357214} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -8} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 +--- !u!1 &1437328436 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1437328441} + - 20: {fileID: 1437328440} + - 92: {fileID: 1437328439} + - 124: {fileID: 1437328438} + - 81: {fileID: 1437328437} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1437328437 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1437328436} + m_Enabled: 1 +--- !u!124 &1437328438 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1437328436} + m_Enabled: 1 +--- !u!92 &1437328439 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1437328436} + m_Enabled: 1 +--- !u!20 &1437328440 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1437328436} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: .192156866, g: .301960796, b: .474509805, a: .0196078438} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: .300000012 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_HDR: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: .0219999999 +--- !u!4 &1437328441 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1437328436} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 +--- !u!1 &1781452261 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1781452263} + - 108: {fileID: 1781452262} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1781452262 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1781452261} + m_Enabled: 1 + serializedVersion: 6 + m_Type: 1 + m_Color: {r: 1, g: .956862748, b: .839215696, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_Strength: 1 + m_Bias: .0500000007 + m_NormalBias: .400000006 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_BounceIntensity: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_AreaSize: {x: 1, y: 1} +--- !u!4 &1781452263 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1781452261} + m_LocalRotation: {x: .408217937, y: -.234569728, z: .109381676, w: .875426054} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 diff --git a/Assets/Oculus/VR/Scenes/Trivial.unity.meta b/Assets/Oculus/VR/Scenes/Trivial.unity.meta new file mode 100644 index 0000000..e1d29ed --- /dev/null +++ b/Assets/Oculus/VR/Scenes/Trivial.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d8d21f2460d13554780e4af04a9e0d6e +timeCreated: 1427350486 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scenes/UI.unity b/Assets/Oculus/VR/Scenes/UI.unity new file mode 100644 index 0000000..49c5154 --- /dev/null +++ b/Assets/Oculus/VR/Scenes/UI.unity @@ -0,0 +1,2798 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientEquatorColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 1 + m_BakeResolution: 1 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 0 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &84518579 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1410866495189614, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 84518580} + - component: {fileID: 84518582} + - component: {fileID: 84518581} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &84518580 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224012455983107908, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 84518579} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 666710796} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &84518581 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114149122066085498, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 84518579} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &84518582 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222168602258099800, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 84518579} +--- !u!1 &107656903 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 107656907} + - component: {fileID: 107656906} + - component: {fileID: 107656905} + - component: {fileID: 107656904} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &107656904 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &107656905 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &107656906 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &107656907 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 107656903} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 5} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &117158919 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1633363760512892, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 117158920} + - component: {fileID: 117158922} + - component: {fileID: 117158921} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &117158920 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224912351142567644, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 117158919} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1272495786} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &117158921 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114738334104451478, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 117158919} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &117158922 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222743391956064958, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 117158919} +--- !u!1 &154823736 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1793122948231964, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 154823737} + - component: {fileID: 154823739} + - component: {fileID: 154823738} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &154823737 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224627209805141530, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 154823736} + m_LocalRotation: {x: 0, y: 0.00000016048051, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.99972576, y: 0.99972415, z: 1} + m_Children: + - {fileID: 1484568472} + m_Father: {fileID: 314378549} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -51, y: 40} + m_SizeDelta: {x: 235.85, y: 69.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &154823738 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114237797550994276, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 154823736} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Strength +--- !u!222 &154823739 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222149160881046440, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 154823736} +--- !u!1 &204679842 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 204679846} + - component: {fileID: 204679845} + - component: {fileID: 204679844} + - component: {fileID: 204679843} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &204679843 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &204679844 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &204679845 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &204679846 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 204679842} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -5, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &210993500 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 210993504} + - component: {fileID: 210993503} + - component: {fileID: 210993502} + - component: {fileID: 210993501} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &210993501 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &210993502 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &210993503 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &210993504 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 210993500} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &232759347 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1951251448566104, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 232759348} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &232759348 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224877946070035678, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 232759347} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 308838376} + m_Father: {fileID: 1484568472} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: -5, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &308838375 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1631452936649066, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 308838376} + - component: {fileID: 308838378} + - component: {fileID: 308838377} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &308838376 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224844702304561420, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 308838375} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 232759348} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &308838377 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114443175932622302, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 308838375} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &308838378 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222379095727919406, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 308838375} +--- !u!1 &314378541 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1286466568756620, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 314378549} + - component: {fileID: 314378548} + - component: {fileID: 314378547} + - component: {fileID: 314378546} + - component: {fileID: 314378544} + - component: {fileID: 314378543} + - component: {fileID: 314378542} + m_Layer: 5 + m_Name: LightCanvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &314378542 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114221050636851762, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 314378541} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &314378543 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222790953300702258, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 314378541} +--- !u!114 &314378544 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114079784262412058, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 314378541} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1200242548, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &314378546 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114055190907109370, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 314378541} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7aaf960227867044282d921171d2d7ac, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 3 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 + pointer: {fileID: 0} + sortOrder: 0 +--- !u!114 &314378547 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114564601936112134, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 314378541} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 10 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &314378548 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 223854308403297298, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 314378541} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 2080101476} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: -100 + m_TargetDisplay: 0 +--- !u!224 &314378549 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224936707579750852, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 314378541} + m_LocalRotation: {x: 0.30626857, y: 0, z: 0, w: 0.9519452} + m_LocalPosition: {x: 0, y: 0, z: 1.674} + m_LocalScale: {x: 0.0017944947, y: 0.0017944948, z: 2.0564146} + m_Children: + - {fileID: 1529239508} + - {fileID: 154823737} + - {fileID: 596084221} + - {fileID: 1211057214} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 35.669003, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0.4466219, y: -1.272} + m_SizeDelta: {x: 820.557, y: 350.614} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &346664029 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 346664030} + m_Layer: 0 + m_Name: Environment + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &346664030 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 346664029} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 537728712} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &383999543 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 383999547} + - component: {fileID: 383999546} + - component: {fileID: 383999545} + - component: {fileID: 383999544} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &383999544 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &383999545 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &383999546 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &383999547 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 383999543} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 5, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &467809853 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 467809857} + - component: {fileID: 467809856} + - component: {fileID: 467809855} + - component: {fileID: 467809854} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &467809854 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &467809855 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &467809856 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &467809857 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 467809853} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -5} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &529157269 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1851142746248022, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 529157270} + - component: {fileID: 529157272} + - component: {fileID: 529157271} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &529157270 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224250314531179288, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 529157269} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1365315845} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &529157271 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114866530499855602, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 529157269} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &529157272 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222738096033492602, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 529157269} +--- !u!1 &537728711 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 537728712} + m_Layer: 0 + m_Name: Room + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &537728712 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 537728711} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 204679846} + - {fileID: 383999547} + - {fileID: 107656907} + - {fileID: 2026317950} + - {fileID: 210993504} + - {fileID: 467809857} + m_Father: {fileID: 346664030} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &596084220 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1827637041739792, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 596084221} + - component: {fileID: 596084223} + - component: {fileID: 596084222} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &596084221 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224956884596539380, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 596084220} + m_LocalRotation: {x: 0, y: 0.00000016048051, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.99972576, y: 0.99972415, z: 1} + m_Children: + - {fileID: 1365315845} + m_Father: {fileID: 314378549} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -51, y: -10} + m_SizeDelta: {x: 235.85, y: 69.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &596084222 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114717215169091202, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 596084220} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Size +--- !u!222 &596084223 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222227348137726606, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 596084220} +--- !u!1 &666710795 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1702945931632494, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 666710796} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &666710796 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224699324860666886, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 666710795} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 84518580} + m_Father: {fileID: 1365315845} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &671274187 stripped +GameObject: + m_PrefabParentObject: {fileID: 100004, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!114 &671274191 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 671274187} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f8e7ff1cdf4c4e74db00c3684108bc9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EventMask: + serializedVersion: 2 + m_Bits: 32 + sortOrder: 20 +--- !u!1 &746191968 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 168498, guid: b0528537cb83e274c845cae208d6f145, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 746191969} + - component: {fileID: 746191971} + - component: {fileID: 746191970} + - component: {fileID: 746191973} + m_Layer: 5 + m_Name: GazeIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &746191969 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 468498, guid: b0528537cb83e274c845cae208d6f145, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 746191968} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 3.5486445, y: 3.5486465, z: 3.5486465} + m_Children: [] + m_Father: {fileID: 851230874} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &746191970 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2368498, guid: b0528537cb83e274c845cae208d6f145, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 746191968} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 3fac3b9744290eb4c89b0e4ffd5fe085, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &746191971 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3368498, guid: b0528537cb83e274c845cae208d6f145, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 746191968} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!114 &746191973 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 746191968} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4444ce35d262aa648ad0c425a559b931, type: 3} + m_Name: + m_EditorClassIdentifier: + currentOverlayType: 2 + isDynamic: 0 + isProtectedContent: 0 + isExternalSurface: 0 + externalSurfaceWidth: 0 + externalSurfaceHeight: 0 + compositionDepth: 0 + noDepthBufferTesting: 0 + currentOverlayShape: 0 + textures: + - {fileID: 0} + - {fileID: 0} +--- !u!1 &851230871 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 168500, guid: b0528537cb83e274c845cae208d6f145, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 851230874} + - component: {fileID: 851230872} + m_Layer: 5 + m_Name: OVRGazePointer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &851230872 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11454254, guid: b0528537cb83e274c845cae208d6f145, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 851230871} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30530ad0e40d0a64ea26d753ee4996ea, type: 3} + m_Name: + m_EditorClassIdentifier: + hideByDefault: 1 + showTimeoutPeriod: 1 + hideTimeoutPeriod: 0.1 + dimOnHideRequest: 1 + depthScaleMultiplier: 0.03 + matchNormalOnPhysicsColliders: 0 + rayTransform: {fileID: 2080101479} +--- !u!4 &851230874 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 468500, guid: b0528537cb83e274c845cae208d6f145, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 851230871} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: + - {fileID: 746191969} + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &867158171 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1453575399696200, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 867158172} + - component: {fileID: 867158174} + - component: {fileID: 867158173} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &867158172 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224434444875997346, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 867158171} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.000000011789} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1211057214} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 23.4, y: -0.000056601} + m_SizeDelta: {x: -46.8, y: -0.000038147} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &867158173 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114327799110482470, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 867158171} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 27 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Enabled +--- !u!222 &867158174 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222319640404033962, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 867158171} +--- !u!1 &1035984978 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1211042071873416, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1035984979} + - component: {fileID: 1035984981} + - component: {fileID: 1035984980} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1035984979 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224934722846214142, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1035984978} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.000000039858} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1410257691} + m_Father: {fileID: 1211057214} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 17.5, y: -16.8} + m_SizeDelta: {x: 35, y: 33.6} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1035984980 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114950584601116014, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1035984978} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1035984981 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222146609727379898, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1035984978} +--- !u!1 &1211057213 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1425299501438858, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1211057214} + - component: {fileID: 1211057215} + m_Layer: 5 + m_Name: Toggle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1211057214 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224921434058215820, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1211057213} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.0000000057843} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1035984979} + - {fileID: 867158172} + m_Father: {fileID: 314378549} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 30.4, y: -70.5} + m_SizeDelta: {x: 204, y: 33.6} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1211057215 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114002572975853784, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1211057213} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 2109663825, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1035984980} + toggleTransition: 1 + graphic: {fileID: 1410257692} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1335849532} + m_MethodName: set_enabled + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Toggle+ToggleEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null + m_IsOn: 1 +--- !u!1 &1272495785 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1292208530939496, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1272495786} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1272495786 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224955942719613166, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1272495785} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 117158920} + m_Father: {fileID: 1484568472} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1281705319 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1869557937274144, guid: 50d41190501b1584a932188c446c4e52, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1281705320} + - component: {fileID: 1281705323} + - component: {fileID: 1281705322} + - component: {fileID: 1281705321} + m_Layer: 0 + m_Name: Cylinder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1281705320 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4798649009198828, guid: 50d41190501b1584a932188c446c4e52, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1281705319} + m_LocalRotation: {x: 0.7071065, y: -0.00000018956948, z: -0.000000086186304, w: 0.7071072} + m_LocalPosition: {x: -0, y: -0, z: -0.28399992} + m_LocalScale: {x: 0.18982275, y: 0.18982278, z: 0.18982276} + m_Children: [] + m_Father: {fileID: 1335849533} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1281705321 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 23864222582684130, guid: 50d41190501b1584a932188c446c4e52, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1281705319} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 10302, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!136 &1281705322 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 136812717881118166, guid: 50d41190501b1584a932188c446c4e52, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1281705319} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1281705323 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 33104462263267660, guid: 50d41190501b1584a932188c446c4e52, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1281705319} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1335849531 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1502986616194404, guid: 50d41190501b1584a932188c446c4e52, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1335849533} + - component: {fileID: 1335849532} + m_Layer: 0 + m_Name: Spotlight + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1335849532 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 108874713582670172, guid: 50d41190501b1584a932188c446c4e52, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1335849531} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 3.4098544 + m_Range: 6.54 + m_SpotAngle: 45 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1335849533 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4853273549456900, guid: 50d41190501b1584a932188c446c4e52, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1335849531} + m_LocalRotation: {x: -0.085366644, y: -0.35873595, z: -0.032966625, w: 0.92894256} + m_LocalPosition: {x: 0.712, y: -0.37, z: -0.879} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1281705320} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: -10.501, y: -42.231003, z: 0} +--- !u!1 &1365315844 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1467887161863668, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1365315845} + - component: {fileID: 1365315846} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1365315845 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224991194268729776, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1365315844} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0} + m_LocalScale: {x: 1, y: 1, z: 2.5706496} + m_Children: + - {fileID: 529157270} + - {fileID: 1476285672} + - {fileID: 666710796} + m_Father: {fileID: 596084221} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 113, y: 9} + m_SizeDelta: {x: 215.3, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1365315846 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114974080304098144, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1365315844} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -113659843, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 84518581} + m_FillRect: {fileID: 1698888415} + m_HandleRect: {fileID: 84518580} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 180 + m_WholeNumbers: 0 + m_Value: 45 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1335849532} + m_MethodName: set_spotAngle + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Slider+SliderEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!1 &1410257690 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1400426440437290, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1410257691} + - component: {fileID: 1410257693} + - component: {fileID: 1410257692} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1410257691 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224368407954141310, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1410257690} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1035984979} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 50, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1410257692 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114351293870195126, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1410257690} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1410257693 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222538107062299344, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1410257690} +--- !u!1 &1449092611 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1719239795085386, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1449092612} + - component: {fileID: 1449092614} + - component: {fileID: 1449092613} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1449092612 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224905620587183002, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1449092611} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1484568472} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1449092613 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114620956305824076, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1449092611} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1449092614 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222059916167625686, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1449092611} +--- !u!1 &1470509161 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1470509163} + - component: {fileID: 1470509162} + m_Layer: 0 + m_Name: Directional light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1470509162 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1470509161} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 2 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 1 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1470509163 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1470509161} + m_LocalRotation: {x: 0.40821794, y: -0.23456973, z: 0.10938166, w: 0.8754261} + m_LocalPosition: {x: 0.2, y: 0.61, z: 0.208} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1476285671 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1278096029339308, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1476285672} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1476285672 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224430737903737794, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1476285671} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1698888415} + m_Father: {fileID: 1365315845} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: -5, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1484568471 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1332706582247612, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1484568472} + - component: {fileID: 1484568473} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1484568472 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224015012170540542, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1484568471} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0} + m_LocalScale: {x: 1, y: 1, z: 2.5706496} + m_Children: + - {fileID: 1449092612} + - {fileID: 232759348} + - {fileID: 1272495786} + m_Father: {fileID: 154823737} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 113, y: 9} + m_SizeDelta: {x: 215.3, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1484568473 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114792581645112844, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1484568471} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -113659843, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 117158921} + m_FillRect: {fileID: 308838376} + m_HandleRect: {fileID: 117158920} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 8 + m_WholeNumbers: 0 + m_Value: 0.5 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1335849532} + m_MethodName: set_intensity + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0.5 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Slider+SliderEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!1 &1529239507 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1297614045655638, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1529239508} + - component: {fileID: 1529239510} + - component: {fileID: 1529239509} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1529239508 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224040488474665906, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1529239507} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 314378549} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1529239509 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114857836229995698, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1529239507} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: a26663690a6580440963aa46e582c35b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1529239510 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222447602114667058, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1529239507} +--- !u!1 &1698888414 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1165463738221572, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1698888415} + - component: {fileID: 1698888417} + - component: {fileID: 1698888416} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1698888415 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 224512758831307302, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1698888414} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1476285672} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1698888416 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114871144349642598, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1698888414} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1698888417 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 222546118480493458, guid: c2f8d110e56579842ac6367b607a04c1, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1698888414} +--- !u!1 &1764992132 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1764992135} + - component: {fileID: 1764992134} + - component: {fileID: 1764992133} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1764992133 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1764992132} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1a9a1d119a5944aacfb87d1ec283a2, type: 3} + m_Name: + m_EditorClassIdentifier: + rayTransform: {fileID: 2080101479} + m_Cursor: {fileID: 851230872} + joyPadClickButton: 1 + gazeClickKey: 32 + performSphereCastForGazepointer: 1 + useRightStickScroll: 1 + rightStickDeadZone: 0.15 + useSwipeScroll: 1 + swipeDragThreshold: 1 + swipeDragScale: 1 + InvertSwipeXAxis: 1 + angleDragThreshold: 1 + m_SpherecastRadius: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_AllowActivationOnMobileDevice: 1 +--- !u!114 &1764992134 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1764992132} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 0 + m_DragThreshold: 5 +--- !u!4 &1764992135 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1764992132} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.0750911, y: 0.6187066, z: -1.8188953} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2026317946 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2026317950} + - component: {fileID: 2026317949} + - component: {fileID: 2026317948} + - component: {fileID: 2026317947} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &2026317947 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 62db2d638434d5a488dfb1e789e34b37, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2026317948 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2026317949 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &2026317950 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026317946} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -5, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 537728712} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &2080101472 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400006, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11400010, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: useProfileData + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400008, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400002, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + propertyPath: m_LocalPosition.y + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &2080101473 stripped +GameObject: + m_PrefabParentObject: {fileID: 100014, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!1 &2080101474 stripped +GameObject: + m_PrefabParentObject: {fileID: 100010, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!20 &2080101475 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101473} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 2 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!20 &2080101476 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101474} + m_Enabled: 0 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 1 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!1 &2080101477 stripped +GameObject: + m_PrefabParentObject: {fileID: 134650, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!1 &2080101478 stripped +GameObject: + m_PrefabParentObject: {fileID: 168962, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!4 &2080101479 stripped +Transform: + m_PrefabParentObject: {fileID: 400012, guid: ce816f2e6abb0504092c23ed9b970dfd, type: 2} + m_PrefabInternal: {fileID: 2080101472} +--- !u!54 &2080101480 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101477} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!54 &2080101482 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2080101478} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/Assets/Oculus/VR/Scenes/UI.unity.meta b/Assets/Oculus/VR/Scenes/UI.unity.meta new file mode 100644 index 0000000..6ee77c3 --- /dev/null +++ b/Assets/Oculus/VR/Scenes/UI.unity.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 1f4d3ae64a10d434db219de8b14348e1 +DefaultImporter: + userData: + assetBundleName: diff --git a/Assets/Oculus/VR/Scripts.meta b/Assets/Oculus/VR/Scripts.meta new file mode 100644 index 0000000..a99edcf --- /dev/null +++ b/Assets/Oculus/VR/Scripts.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 859d6d3fcffe1bb41ac06f93d267fc9d +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Oculus/VR/Scripts/Composition.meta b/Assets/Oculus/VR/Scripts/Composition.meta new file mode 100644 index 0000000..f9f5b16 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1f92828e69374384b8cb197653871a6e +folderAsset: yes +timeCreated: 1502989983 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRCameraComposition.cs b/Assets/Oculus/VR/Scripts/Composition/OVRCameraComposition.cs new file mode 100644 index 0000000..a35bd7c --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRCameraComposition.cs @@ -0,0 +1,306 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections; + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN + +public abstract class OVRCameraComposition : OVRComposition { + protected GameObject cameraFramePlaneObject = null; + protected float cameraFramePlaneDistance; + + protected readonly bool hasCameraDeviceOpened = false; + protected readonly bool useDynamicLighting = false; + + internal readonly OVRPlugin.CameraDevice cameraDevice = OVRPlugin.CameraDevice.WebCamera0; + + private Mesh boundaryMesh = null; + private float boundaryMeshTopY = 0.0f; + private float boundaryMeshBottomY = 0.0f; + private OVRManager.VirtualGreenScreenType boundaryMeshType = OVRManager.VirtualGreenScreenType.Off; + + protected OVRCameraComposition(GameObject parentObject, Camera mainCamera, OVRManager.CameraDevice inCameraDevice, bool inUseDynamicLighting, OVRManager.DepthQuality depthQuality) + : base(parentObject, mainCamera) + { + cameraDevice = OVRCompositionUtil.ConvertCameraDevice(inCameraDevice); + + Debug.Assert(!hasCameraDeviceOpened); + Debug.Assert(!OVRPlugin.IsCameraDeviceAvailable(cameraDevice) || !OVRPlugin.HasCameraDeviceOpened(cameraDevice)); + hasCameraDeviceOpened = false; + useDynamicLighting = inUseDynamicLighting; + + bool cameraSupportsDepth = OVRPlugin.DoesCameraDeviceSupportDepth(cameraDevice); + if (useDynamicLighting && !cameraSupportsDepth) + { + Debug.LogWarning("The camera device doesn't support depth. The result of dynamic lighting might not be correct"); + } + + if (OVRPlugin.IsCameraDeviceAvailable(cameraDevice)) + { + OVRPlugin.CameraExtrinsics extrinsics; + OVRPlugin.CameraIntrinsics intrinsics; + OVRPlugin.Posef calibrationRawPose; + if (OVRPlugin.GetExternalCameraCount() > 0 && OVRPlugin.GetMixedRealityCameraInfo(0, out extrinsics, out intrinsics, out calibrationRawPose)) + { + OVRPlugin.SetCameraDevicePreferredColorFrameSize(cameraDevice, intrinsics.ImageSensorPixelResolution.w, intrinsics.ImageSensorPixelResolution.h); + } + + if (useDynamicLighting) + { + OVRPlugin.SetCameraDeviceDepthSensingMode(cameraDevice, OVRPlugin.CameraDeviceDepthSensingMode.Fill); + OVRPlugin.CameraDeviceDepthQuality quality = OVRPlugin.CameraDeviceDepthQuality.Medium; + if (depthQuality == OVRManager.DepthQuality.Low) + { + quality = OVRPlugin.CameraDeviceDepthQuality.Low; + } + else if (depthQuality == OVRManager.DepthQuality.Medium) + { + quality = OVRPlugin.CameraDeviceDepthQuality.Medium; + } + else if (depthQuality == OVRManager.DepthQuality.High) + { + quality = OVRPlugin.CameraDeviceDepthQuality.High; + } + else + { + Debug.LogWarning("Unknown depth quality"); + } + OVRPlugin.SetCameraDevicePreferredDepthQuality(cameraDevice, quality); + } + + Debug.LogFormat("Opening camera device {0}", cameraDevice); + OVRPlugin.OpenCameraDevice(cameraDevice); + if (OVRPlugin.HasCameraDeviceOpened(cameraDevice)) + { + Debug.LogFormat("Opened camera device {0}", cameraDevice); + hasCameraDeviceOpened = true; + } + } + } + + public override void Cleanup() + { + OVRCompositionUtil.SafeDestroy(ref cameraFramePlaneObject); + if (hasCameraDeviceOpened) + { + Debug.LogFormat("Close camera device {0}", cameraDevice); + OVRPlugin.CloseCameraDevice(cameraDevice); + } + } + + public override void RecenterPose() + { + boundaryMesh = null; + } + + protected void RefreshCameraFramePlaneObject(GameObject parentObject, Camera mixedRealityCamera, bool useDynamicLighting) + { + OVRCompositionUtil.SafeDestroy(ref cameraFramePlaneObject); + + Debug.Assert(cameraFramePlaneObject == null); + cameraFramePlaneObject = GameObject.CreatePrimitive(PrimitiveType.Quad); + cameraFramePlaneObject.name = "OculusMRC_CameraFrame"; + cameraFramePlaneObject.transform.parent = cameraInTrackingSpace ? cameraRig.trackingSpace : parentObject.transform; + cameraFramePlaneObject.GetComponent().enabled = false; + cameraFramePlaneObject.GetComponent().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; + Material cameraFrameMaterial = new Material(Shader.Find(useDynamicLighting ? "Oculus/OVRMRCameraFrameLit" : "Oculus/OVRMRCameraFrame")); + cameraFramePlaneObject.GetComponent().material = cameraFrameMaterial; + cameraFrameMaterial.SetColor("_Color", Color.white); + cameraFrameMaterial.SetFloat("_Visible", 0.0f); + cameraFramePlaneObject.transform.localScale = new Vector3(4, 4, 4); + cameraFramePlaneObject.SetActive(true); + OVRCameraFrameCompositionManager cameraFrameCompositionManager = mixedRealityCamera.gameObject.AddComponent(); + cameraFrameCompositionManager.cameraFrameGameObj = cameraFramePlaneObject; + cameraFrameCompositionManager.composition = this; + } + + private bool nullcameraRigWarningDisplayed = false; + protected void UpdateCameraFramePlaneObject(Camera mainCamera, Camera mixedRealityCamera, RenderTexture boundaryMeshMaskTexture) + { + bool hasError = false; + Material cameraFrameMaterial = cameraFramePlaneObject.GetComponent().material; + Texture2D colorTexture = Texture2D.blackTexture; + Texture2D depthTexture = Texture2D.whiteTexture; + if (OVRPlugin.IsCameraDeviceColorFrameAvailable(cameraDevice)) + { + colorTexture = OVRPlugin.GetCameraDeviceColorFrameTexture(cameraDevice); + } + else + { + Debug.LogWarning("Camera: color frame not ready"); + hasError = true; + } + bool cameraSupportsDepth = OVRPlugin.DoesCameraDeviceSupportDepth(cameraDevice); + if (useDynamicLighting && cameraSupportsDepth) + { + if (OVRPlugin.IsCameraDeviceDepthFrameAvailable(cameraDevice)) + { + depthTexture = OVRPlugin.GetCameraDeviceDepthFrameTexture(cameraDevice); + } + else + { + Debug.LogWarning("Camera: depth frame not ready"); + hasError = true; + } + } + if (!hasError) + { + Vector3 offset = mainCamera.transform.position - mixedRealityCamera.transform.position; + float distance = Vector3.Dot(mixedRealityCamera.transform.forward, offset); + cameraFramePlaneDistance = distance; + + cameraFramePlaneObject.transform.position = mixedRealityCamera.transform.position + mixedRealityCamera.transform.forward * distance; + cameraFramePlaneObject.transform.rotation = mixedRealityCamera.transform.rotation; + + float tanFov = Mathf.Tan(mixedRealityCamera.fieldOfView * Mathf.Deg2Rad * 0.5f); + cameraFramePlaneObject.transform.localScale = new Vector3(distance * mixedRealityCamera.aspect * tanFov * 2.0f, distance * tanFov * 2.0f, 1.0f); + + float worldHeight = distance * tanFov * 2.0f; + float worldWidth = worldHeight * mixedRealityCamera.aspect; + + float cullingDistance = float.MaxValue; + + if (OVRManager.instance.virtualGreenScreenType != OVRManager.VirtualGreenScreenType.Off) + { + RefreshBoundaryMesh(mixedRealityCamera, out cullingDistance); + } + + cameraFrameMaterial.mainTexture = colorTexture; + cameraFrameMaterial.SetTexture("_DepthTex", depthTexture); + cameraFrameMaterial.SetVector("_FlipParams", new Vector4((OVRManager.instance.flipCameraFrameHorizontally ? 1.0f : 0.0f), (OVRManager.instance.flipCameraFrameVertically ? 1.0f : 0.0f), 0.0f, 0.0f)); + cameraFrameMaterial.SetColor("_ChromaKeyColor", OVRManager.instance.chromaKeyColor); + cameraFrameMaterial.SetFloat("_ChromaKeySimilarity", OVRManager.instance.chromaKeySimilarity); + cameraFrameMaterial.SetFloat("_ChromaKeySmoothRange", OVRManager.instance.chromaKeySmoothRange); + cameraFrameMaterial.SetFloat("_ChromaKeySpillRange", OVRManager.instance.chromaKeySpillRange); + cameraFrameMaterial.SetVector("_TextureDimension", new Vector4(colorTexture.width, colorTexture.height, 1.0f / colorTexture.width, 1.0f / colorTexture.height)); + cameraFrameMaterial.SetVector("_TextureWorldSize", new Vector4(worldWidth, worldHeight, 0, 0)); + cameraFrameMaterial.SetFloat("_SmoothFactor", OVRManager.instance.dynamicLightingSmoothFactor); + cameraFrameMaterial.SetFloat("_DepthVariationClamp", OVRManager.instance.dynamicLightingDepthVariationClampingValue); + cameraFrameMaterial.SetFloat("_CullingDistance", cullingDistance); + if (OVRManager.instance.virtualGreenScreenType == OVRManager.VirtualGreenScreenType.Off || boundaryMesh == null || boundaryMeshMaskTexture == null) + { + cameraFrameMaterial.SetTexture("_MaskTex", Texture2D.whiteTexture); + } + else + { + if (cameraRig == null) + { + if (!nullcameraRigWarningDisplayed) + { + Debug.LogWarning("Could not find the OVRCameraRig/CenterEyeAnchor object. Please check if the OVRCameraRig has been setup properly. The virtual green screen has been temporarily disabled"); + nullcameraRigWarningDisplayed = true; + } + + cameraFrameMaterial.SetTexture("_MaskTex", Texture2D.whiteTexture); + } + else + { + if (nullcameraRigWarningDisplayed) + { + Debug.Log("OVRCameraRig/CenterEyeAnchor object found. Virtual green screen is activated"); + nullcameraRigWarningDisplayed = false; + } + + cameraFrameMaterial.SetTexture("_MaskTex", boundaryMeshMaskTexture); + } + } + } + } + + protected void RefreshBoundaryMesh(Camera camera, out float cullingDistance) + { + float depthTolerance = OVRManager.instance.virtualGreenScreenApplyDepthCulling ? OVRManager.instance.virtualGreenScreenDepthTolerance : float.PositiveInfinity; + cullingDistance = OVRCompositionUtil.GetMaximumBoundaryDistance(camera, OVRCompositionUtil.ToBoundaryType(OVRManager.instance.virtualGreenScreenType)) + depthTolerance; + if (boundaryMesh == null || boundaryMeshType != OVRManager.instance.virtualGreenScreenType || boundaryMeshTopY != OVRManager.instance.virtualGreenScreenTopY || boundaryMeshBottomY != OVRManager.instance.virtualGreenScreenBottomY) + { + boundaryMeshTopY = OVRManager.instance.virtualGreenScreenTopY; + boundaryMeshBottomY = OVRManager.instance.virtualGreenScreenBottomY; + boundaryMesh = OVRCompositionUtil.BuildBoundaryMesh(OVRCompositionUtil.ToBoundaryType(OVRManager.instance.virtualGreenScreenType), boundaryMeshTopY, boundaryMeshBottomY); + boundaryMeshType = OVRManager.instance.virtualGreenScreenType; + + // Creating GameObject for testing purpose only + //GameObject boundaryMeshObject = new GameObject("BoundaryMeshObject"); + //boundaryMeshObject.AddComponent().mesh = boundaryMesh; + //boundaryMeshObject.AddComponent(); + } + } + + public class OVRCameraFrameCompositionManager : MonoBehaviour + { + public GameObject cameraFrameGameObj; + public OVRCameraComposition composition; + public RenderTexture boundaryMeshMaskTexture; + private Material cameraFrameMaterial; + private Material whiteMaterial; + + void Start() + { + Shader shader = Shader.Find("Oculus/Unlit"); + if (!shader) + { + Debug.LogError("Oculus/Unlit shader does not exist"); + return; + } + whiteMaterial = new Material(shader); + whiteMaterial.color = Color.white; + } + + void OnPreRender() + { + if (OVRManager.instance.virtualGreenScreenType != OVRManager.VirtualGreenScreenType.Off && boundaryMeshMaskTexture != null && composition.boundaryMesh != null) + { + RenderTexture oldRT = RenderTexture.active; + RenderTexture.active = boundaryMeshMaskTexture; + + // The camera matrices haven't been setup when OnPreRender() is executed. Load the projection manually + GL.PushMatrix(); + GL.LoadProjectionMatrix(GetComponent().projectionMatrix); + + GL.Clear(false, true, Color.black); + + for (int i = 0; i < whiteMaterial.passCount; ++i) + { + if (whiteMaterial.SetPass(i)) + { + Graphics.DrawMeshNow(composition.boundaryMesh, composition.cameraRig.ComputeTrackReferenceMatrix()); + } + } + + GL.PopMatrix(); + RenderTexture.active = oldRT; + } + + if (cameraFrameGameObj) + { + if (cameraFrameMaterial == null) + cameraFrameMaterial = cameraFrameGameObj.GetComponent().material; + cameraFrameMaterial.SetFloat("_Visible", 1.0f); + } + } + void OnPostRender() + { + if (cameraFrameGameObj) + { + Debug.Assert(cameraFrameMaterial); + cameraFrameMaterial.SetFloat("_Visible", 0.0f); + } + } + } + +} + +#endif diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRCameraComposition.cs.meta b/Assets/Oculus/VR/Scripts/Composition/OVRCameraComposition.cs.meta new file mode 100644 index 0000000..ef6b7e7 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRCameraComposition.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 70818bad1fe6859439b190a61dfb6eb8 +timeCreated: 1503089686 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRComposition.cs b/Assets/Oculus/VR/Scripts/Composition/OVRComposition.cs new file mode 100644 index 0000000..e2b265e --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRComposition.cs @@ -0,0 +1,105 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +#if UNITY_ANDROID && !UNITY_EDITOR +#define OVR_ANDROID_MRC +#endif + +using UnityEngine; +using System.Collections; + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID + +public abstract class OVRComposition { + + public bool cameraInTrackingSpace = false; + public OVRCameraRig cameraRig = null; + + protected OVRComposition(GameObject parentObject, Camera mainCamera) + { + RefreshCameraRig(parentObject, mainCamera); + } + + public abstract OVRManager.CompositionMethod CompositionMethod(); + + public abstract void Update(GameObject gameObject, Camera mainCamera); + public abstract void Cleanup(); + + public virtual void RecenterPose() { } + + protected bool usingLastAttachedNodePose = false; + protected OVRPose lastAttachedNodePose = new OVRPose(); // Sometimes the attach node pose is not readable (lose tracking, low battery, etc.) Use the last pose instead when it happens + + public void RefreshCameraRig(GameObject parentObject, Camera mainCamera) + { + OVRCameraRig cameraRig = mainCamera.GetComponentInParent(); + if (cameraRig == null) + { + cameraRig = parentObject.GetComponent(); + } + cameraInTrackingSpace = (cameraRig != null && cameraRig.trackingSpace != null); + this.cameraRig = cameraRig; + Debug.Log(cameraRig == null ? "[OVRComposition] CameraRig not found" : "[OVRComposition] CameraRig found"); + } + + public OVRPose ComputeCameraWorldSpacePose(OVRPlugin.CameraExtrinsics extrinsics, OVRPlugin.Posef calibrationRawPose) + { + OVRPose trackingSpacePose = ComputeCameraTrackingSpacePose(extrinsics, calibrationRawPose); + OVRPose worldSpacePose = OVRExtensions.ToWorldSpacePose(trackingSpacePose); + return worldSpacePose; + } + + public OVRPose ComputeCameraTrackingSpacePose(OVRPlugin.CameraExtrinsics extrinsics, OVRPlugin.Posef calibrationRawPose) + { + OVRPose trackingSpacePose = new OVRPose(); + + OVRPose cameraTrackingSpacePose = extrinsics.RelativePose.ToOVRPose(); +#if OVR_ANDROID_MRC + OVRPose rawPose = OVRPlugin.GetTrackingTransformRawPose().ToOVRPose(); + cameraTrackingSpacePose = rawPose * (calibrationRawPose.ToOVRPose().Inverse() * cameraTrackingSpacePose); +#endif + trackingSpacePose = cameraTrackingSpacePose; + + if (extrinsics.AttachedToNode != OVRPlugin.Node.None && OVRPlugin.GetNodePresent(extrinsics.AttachedToNode)) + { + if (usingLastAttachedNodePose) + { + Debug.Log("The camera attached node get tracked"); + usingLastAttachedNodePose = false; + } + OVRPose attachedNodePose = OVRPlugin.GetNodePose(extrinsics.AttachedToNode, OVRPlugin.Step.Render).ToOVRPose(); + lastAttachedNodePose = attachedNodePose; + trackingSpacePose = attachedNodePose * trackingSpacePose; + } + else + { + if (extrinsics.AttachedToNode != OVRPlugin.Node.None) + { + if (!usingLastAttachedNodePose) + { + Debug.LogWarning("The camera attached node could not be tracked, using the last pose"); + usingLastAttachedNodePose = true; + } + trackingSpacePose = lastAttachedNodePose * trackingSpacePose; + } + } + + return trackingSpacePose; + } + +} + +#endif diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRComposition.cs.meta b/Assets/Oculus/VR/Scripts/Composition/OVRComposition.cs.meta new file mode 100644 index 0000000..995ff5d --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRComposition.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 829a382f3380d4b46ad9670463232a0b +timeCreated: 1502990005 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRCompositionUtil.cs b/Assets/Oculus/VR/Scripts/Composition/OVRCompositionUtil.cs new file mode 100644 index 0000000..e5ca057 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRCompositionUtil.cs @@ -0,0 +1,168 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections.Generic; + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID + +internal class OVRCompositionUtil { + + public static void SafeDestroy(GameObject obj) + { + if (Application.isPlaying) + { + GameObject.Destroy(obj); + } + else + { + GameObject.DestroyImmediate(obj); + } + } + + public static void SafeDestroy(ref GameObject obj) + { + if (obj != null) + { + SafeDestroy(obj); + obj = null; + } + } + + public static OVRPlugin.CameraDevice ConvertCameraDevice(OVRManager.CameraDevice cameraDevice) + { + if (cameraDevice == OVRManager.CameraDevice.WebCamera0) + { + return OVRPlugin.CameraDevice.WebCamera0; + } + else if (cameraDevice == OVRManager.CameraDevice.WebCamera1) + { + return OVRPlugin.CameraDevice.WebCamera1; + } + else if (cameraDevice == OVRManager.CameraDevice.ZEDCamera) + { + return OVRPlugin.CameraDevice.ZEDCamera; + } + else + { + return OVRPlugin.CameraDevice.None; + } + } + + public static OVRBoundary.BoundaryType ToBoundaryType(OVRManager.VirtualGreenScreenType type) + { + if (type == OVRManager.VirtualGreenScreenType.OuterBoundary) + { + return OVRBoundary.BoundaryType.OuterBoundary; + } + else if (type == OVRManager.VirtualGreenScreenType.PlayArea) + { + return OVRBoundary.BoundaryType.PlayArea; + } + else + { + Debug.LogWarning("Unmatched VirtualGreenScreenType"); + return OVRBoundary.BoundaryType.OuterBoundary; + } + } + + public static Vector3 GetWorldPosition(Vector3 trackingSpacePosition) + { + OVRPose tsPose; + tsPose.position = trackingSpacePosition; + tsPose.orientation = Quaternion.identity; + OVRPose wsPose = OVRExtensions.ToWorldSpacePose(tsPose); + Vector3 pos = wsPose.position; + return pos; + } + + public static float GetMaximumBoundaryDistance(Camera camera, OVRBoundary.BoundaryType boundaryType) + { + if (!OVRManager.boundary.GetConfigured()) + { + return float.MaxValue; + } + + Vector3[] geometry = OVRManager.boundary.GetGeometry(boundaryType); + if (geometry.Length == 0) + { + return float.MaxValue; + } + + float maxDistance = -float.MaxValue; + foreach (Vector3 v in geometry) + { + Vector3 pos = GetWorldPosition(v); + float distance = Vector3.Dot(camera.transform.forward, pos); + if (maxDistance < distance) + { + maxDistance = distance; + } + } + return maxDistance; + } + + public static Mesh BuildBoundaryMesh(OVRBoundary.BoundaryType boundaryType, float topY, float bottomY) + { + if (!OVRManager.boundary.GetConfigured()) + { + return null; + } + + List geometry = new List(OVRManager.boundary.GetGeometry(boundaryType)); + if (geometry.Count == 0) + { + return null; + } + + geometry.Add(geometry[0]); + int numPoints = geometry.Count; + + Vector3[] vertices = new Vector3[numPoints * 2]; + Vector2[] uvs = new Vector2[numPoints * 2]; + for (int i = 0; i < numPoints; ++i) + { + Vector3 v = geometry[i]; + vertices[i] = new Vector3(v.x, bottomY, v.z); + vertices[i + numPoints] = new Vector3(v.x, topY, v.z); + uvs[i] = new Vector2((float)i / (numPoints - 1), 0.0f); + uvs[i + numPoints] = new Vector2(uvs[i].x, 1.0f); + } + + int[] triangles = new int[(numPoints - 1) * 2 * 3]; + for (int i = 0; i < numPoints - 1; ++i) + { + // the geometry is built clockwised. only the back faces should be rendered in the camera frame mask + + triangles[i * 6 + 0] = i; + triangles[i * 6 + 1] = i + numPoints; + triangles[i * 6 + 2] = i + 1 + numPoints; + + triangles[i * 6 + 3] = i; + triangles[i * 6 + 4] = i + 1 + numPoints; + triangles[i * 6 + 5] = i + 1; + } + + Mesh mesh = new Mesh(); + mesh.vertices = vertices; + mesh.uv = uvs; + mesh.triangles = triangles; + return mesh; + } + +} + +#endif diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRCompositionUtil.cs.meta b/Assets/Oculus/VR/Scripts/Composition/OVRCompositionUtil.cs.meta new file mode 100644 index 0000000..f0a3975 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRCompositionUtil.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 43bf91d46b2eb874a842be95aee2cc9a +timeCreated: 1502992822 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRDirectComposition.cs b/Assets/Oculus/VR/Scripts/Composition/OVRDirectComposition.cs new file mode 100644 index 0000000..19b39fb --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRDirectComposition.cs @@ -0,0 +1,172 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections; + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN + +public class OVRDirectComposition : OVRCameraComposition +{ + private GameObject previousMainCameraObject = null; + public GameObject directCompositionCameraGameObject = null; + public Camera directCompositionCamera = null; + public RenderTexture boundaryMeshMaskTexture = null; + + public override OVRManager.CompositionMethod CompositionMethod() { return OVRManager.CompositionMethod.Direct; } + + public OVRDirectComposition(GameObject parentObject, Camera mainCamera, OVRManager.CameraDevice cameraDevice, bool useDynamicLighting, OVRManager.DepthQuality depthQuality) + : base(parentObject, mainCamera, cameraDevice, useDynamicLighting, depthQuality) + { + RefreshCameraObjects(parentObject, mainCamera); + } + + private void RefreshCameraObjects(GameObject parentObject, Camera mainCamera) + { + if (!hasCameraDeviceOpened) + { + Debug.LogWarning("[OVRDirectComposition] RefreshCameraObjects(): Unable to open camera device " + cameraDevice); + return; + } + + if (mainCamera.gameObject != previousMainCameraObject) + { + Debug.LogFormat("[OVRDirectComposition] Camera refreshed. Rebind camera to {0}", mainCamera.gameObject.name); + + OVRCompositionUtil.SafeDestroy(ref directCompositionCameraGameObject); + directCompositionCamera = null; + + RefreshCameraRig(parentObject, mainCamera); + + Debug.Assert(directCompositionCameraGameObject == null); + directCompositionCameraGameObject = Object.Instantiate(mainCamera.gameObject); + directCompositionCameraGameObject.name = "OculusMRC_DirectCompositionCamera"; + directCompositionCameraGameObject.transform.parent = cameraInTrackingSpace ? cameraRig.trackingSpace : parentObject.transform; + if (directCompositionCameraGameObject.GetComponent()) + { + Object.Destroy(directCompositionCameraGameObject.GetComponent()); + } + if (directCompositionCameraGameObject.GetComponent()) + { + Object.Destroy(directCompositionCameraGameObject.GetComponent()); + } + directCompositionCamera = directCompositionCameraGameObject.GetComponent(); + directCompositionCamera.stereoTargetEye = StereoTargetEyeMask.None; + directCompositionCamera.depth = float.MaxValue; + directCompositionCamera.rect = new Rect(0.0f, 0.0f, 1.0f, 1.0f); + directCompositionCamera.cullingMask = mainCamera.cullingMask & (~OVRManager.instance.extraHiddenLayers); + + Debug.Log("DirectComposition activated : useDynamicLighting " + (useDynamicLighting ? "ON" : "OFF")); + RefreshCameraFramePlaneObject(parentObject, directCompositionCamera, useDynamicLighting); + + previousMainCameraObject = mainCamera.gameObject; + } + } + + public override void Update(GameObject gameObject, Camera mainCamera) + { + if (!hasCameraDeviceOpened) + { + return; + } + + RefreshCameraObjects(gameObject, mainCamera); + + if (!OVRPlugin.SetHandNodePoseStateLatency(OVRManager.instance.handPoseStateLatency)) + { + Debug.LogWarning("HandPoseStateLatency is invalid. Expect a value between 0.0 to 0.5, get " + OVRManager.instance.handPoseStateLatency); + } + + directCompositionCamera.clearFlags = mainCamera.clearFlags; + directCompositionCamera.backgroundColor = mainCamera.backgroundColor; + directCompositionCamera.cullingMask = mainCamera.cullingMask & (~OVRManager.instance.extraHiddenLayers); + directCompositionCamera.nearClipPlane = mainCamera.nearClipPlane; + directCompositionCamera.farClipPlane = mainCamera.farClipPlane; + + if (OVRMixedReality.useFakeExternalCamera || OVRPlugin.GetExternalCameraCount() == 0) + { + OVRPose trackingSpacePose = new OVRPose(); + trackingSpacePose.position = OVRManager.instance.trackingOriginType == OVRManager.TrackingOrigin.EyeLevel ? + OVRMixedReality.fakeCameraEyeLevelPosition : + OVRMixedReality.fakeCameraFloorLevelPosition; + trackingSpacePose.orientation = OVRMixedReality.fakeCameraRotation; + directCompositionCamera.fieldOfView = OVRMixedReality.fakeCameraFov; + directCompositionCamera.aspect = OVRMixedReality.fakeCameraAspect; + if (cameraInTrackingSpace) + { + directCompositionCamera.transform.FromOVRPose(trackingSpacePose, true); + } + else + { + OVRPose worldSpacePose = new OVRPose(); + worldSpacePose = OVRExtensions.ToWorldSpacePose(trackingSpacePose); + directCompositionCamera.transform.FromOVRPose(worldSpacePose); + } + } + else + { + OVRPlugin.CameraExtrinsics extrinsics; + OVRPlugin.CameraIntrinsics intrinsics; + OVRPlugin.Posef calibrationRawPose; + + // So far, only support 1 camera for MR and always use camera index 0 + if (OVRPlugin.GetMixedRealityCameraInfo(0, out extrinsics, out intrinsics, out calibrationRawPose)) + { + float fovY = Mathf.Atan(intrinsics.FOVPort.UpTan) * Mathf.Rad2Deg * 2; + float aspect = intrinsics.FOVPort.LeftTan / intrinsics.FOVPort.UpTan; + directCompositionCamera.fieldOfView = fovY; + directCompositionCamera.aspect = aspect; + if (cameraInTrackingSpace) + { + OVRPose trackingSpacePose = ComputeCameraTrackingSpacePose(extrinsics, calibrationRawPose); + directCompositionCamera.transform.FromOVRPose(trackingSpacePose, true); + } + else + { + OVRPose worldSpacePose = ComputeCameraWorldSpacePose(extrinsics, calibrationRawPose); + directCompositionCamera.transform.FromOVRPose(worldSpacePose); + } + } + else + { + Debug.LogWarning("Failed to get external camera information"); + } + } + + if (hasCameraDeviceOpened) + { + if (boundaryMeshMaskTexture == null || boundaryMeshMaskTexture.width != Screen.width || boundaryMeshMaskTexture.height != Screen.height) + { + boundaryMeshMaskTexture = new RenderTexture(Screen.width, Screen.height, 0, RenderTextureFormat.R8); + boundaryMeshMaskTexture.Create(); + } + UpdateCameraFramePlaneObject(mainCamera, directCompositionCamera, boundaryMeshMaskTexture); + directCompositionCamera.GetComponent().boundaryMeshMaskTexture = boundaryMeshMaskTexture; + } + } + + public override void Cleanup() + { + base.Cleanup(); + + OVRCompositionUtil.SafeDestroy(ref directCompositionCameraGameObject); + directCompositionCamera = null; + + Debug.Log("DirectComposition deactivated"); + } +} + +#endif diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRDirectComposition.cs.meta b/Assets/Oculus/VR/Scripts/Composition/OVRDirectComposition.cs.meta new file mode 100644 index 0000000..bb3e3f6 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRDirectComposition.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8e9d1c62d6c68c7429ce265558cfd2b2 +timeCreated: 1502990248 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRExternalComposition.cs b/Assets/Oculus/VR/Scripts/Composition/OVRExternalComposition.cs new file mode 100644 index 0000000..9b5b05e --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRExternalComposition.cs @@ -0,0 +1,484 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +#if UNITY_ANDROID && !UNITY_EDITOR +#define OVR_ANDROID_MRC +#endif + +using UnityEngine; +using System.Collections.Generic; +using System.Threading; + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID + +public class OVRExternalComposition : OVRComposition +{ + private GameObject previousMainCameraObject = null; + public GameObject foregroundCameraGameObject = null; + public Camera foregroundCamera = null; + public GameObject backgroundCameraGameObject = null; + public Camera backgroundCamera = null; + public GameObject cameraProxyPlane = null; +#if OVR_ANDROID_MRC + public AudioListener audioListener; + public OVRMRAudioFilter audioFilter; + public RenderTexture[] mrcRenderTextureArray = new RenderTexture[2]; + public int frameIndex; + public int lastMrcEncodeFrameSyncId; +#endif + + public override OVRManager.CompositionMethod CompositionMethod() { return OVRManager.CompositionMethod.External; } + + public OVRExternalComposition(GameObject parentObject, Camera mainCamera) + : base(parentObject, mainCamera) + { +#if OVR_ANDROID_MRC + int frameWidth; + int frameHeight; + OVRPlugin.Media.GetMrcFrameSize(out frameWidth, out frameHeight); + Debug.LogFormat("[OVRExternalComposition] Create render texture {0}, {1}", frameWidth, frameHeight); + for (int i=0; i<2; ++i) + { + mrcRenderTextureArray[i] = new RenderTexture(frameWidth, frameHeight, 24, RenderTextureFormat.ARGB32); + mrcRenderTextureArray[i].Create(); + } + + frameIndex = 0; + lastMrcEncodeFrameSyncId = -1; +#endif + RefreshCameraObjects(parentObject, mainCamera); + } + + private void RefreshCameraObjects(GameObject parentObject, Camera mainCamera) + { + if (mainCamera.gameObject != previousMainCameraObject) + { + Debug.LogFormat("[OVRExternalComposition] Camera refreshed. Rebind camera to {0}", mainCamera.gameObject.name); + + OVRCompositionUtil.SafeDestroy(ref backgroundCameraGameObject); + backgroundCamera = null; + OVRCompositionUtil.SafeDestroy(ref foregroundCameraGameObject); + foregroundCamera = null; + OVRCompositionUtil.SafeDestroy(ref cameraProxyPlane); + + RefreshCameraRig(parentObject, mainCamera); + + Debug.Assert(backgroundCameraGameObject == null); + backgroundCameraGameObject = Object.Instantiate(mainCamera.gameObject); + backgroundCameraGameObject.name = "OculusMRC_BackgroundCamera"; + backgroundCameraGameObject.transform.parent = cameraInTrackingSpace ? cameraRig.trackingSpace : parentObject.transform; + if (backgroundCameraGameObject.GetComponent()) + { + Object.Destroy(backgroundCameraGameObject.GetComponent()); + } + if (backgroundCameraGameObject.GetComponent()) + { + Object.Destroy(backgroundCameraGameObject.GetComponent()); + } + backgroundCamera = backgroundCameraGameObject.GetComponent(); + backgroundCamera.tag = "Untagged"; + backgroundCamera.stereoTargetEye = StereoTargetEyeMask.None; + backgroundCamera.depth = 99990.0f; + backgroundCamera.rect = new Rect(0.0f, 0.0f, 0.5f, 1.0f); + backgroundCamera.cullingMask = mainCamera.cullingMask & (~OVRManager.instance.extraHiddenLayers); +#if OVR_ANDROID_MRC + backgroundCamera.targetTexture = mrcRenderTextureArray[0]; +#endif + + Debug.Assert(foregroundCameraGameObject == null); + foregroundCameraGameObject = Object.Instantiate(mainCamera.gameObject); + foregroundCameraGameObject.name = "OculusMRC_ForgroundCamera"; + foregroundCameraGameObject.transform.parent = cameraInTrackingSpace ? cameraRig.trackingSpace : parentObject.transform; + if (foregroundCameraGameObject.GetComponent()) + { + Object.Destroy(foregroundCameraGameObject.GetComponent()); + } + if (foregroundCameraGameObject.GetComponent()) + { + Object.Destroy(foregroundCameraGameObject.GetComponent()); + } + foregroundCamera = foregroundCameraGameObject.GetComponent(); + foregroundCamera.tag = "Untagged"; + foregroundCamera.stereoTargetEye = StereoTargetEyeMask.None; + foregroundCamera.depth = backgroundCamera.depth + 1.0f; // enforce the forground be rendered after the background + foregroundCamera.rect = new Rect(0.5f, 0.0f, 0.5f, 1.0f); + foregroundCamera.clearFlags = CameraClearFlags.Color; +#if OVR_ANDROID_MRC + foregroundCamera.backgroundColor = OVRManager.instance.externalCompositionBackdropColorQuest; +#else + foregroundCamera.backgroundColor = OVRManager.instance.externalCompositionBackdropColorRift; +#endif + foregroundCamera.cullingMask = mainCamera.cullingMask & (~OVRManager.instance.extraHiddenLayers); +#if OVR_ANDROID_MRC + foregroundCamera.targetTexture = mrcRenderTextureArray[0]; +#endif + + // Create cameraProxyPlane for clipping + Debug.Assert(cameraProxyPlane == null); + cameraProxyPlane = GameObject.CreatePrimitive(PrimitiveType.Quad); + cameraProxyPlane.name = "OculusMRC_ProxyClipPlane"; + cameraProxyPlane.transform.parent = cameraInTrackingSpace ? cameraRig.trackingSpace : parentObject.transform; + cameraProxyPlane.GetComponent().enabled = false; + cameraProxyPlane.GetComponent().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; + Material clipMaterial = new Material(Shader.Find("Oculus/OVRMRClipPlane")); + cameraProxyPlane.GetComponent().material = clipMaterial; +#if OVR_ANDROID_MRC + clipMaterial.SetColor("_Color", OVRManager.instance.externalCompositionBackdropColorQuest); +#else + clipMaterial.SetColor("_Color", OVRManager.instance.externalCompositionBackdropColorRift); +#endif + clipMaterial.SetFloat("_Visible", 0.0f); + cameraProxyPlane.transform.localScale = new Vector3(1000, 1000, 1000); + cameraProxyPlane.SetActive(true); + OVRMRForegroundCameraManager foregroundCameraManager = foregroundCameraGameObject.AddComponent(); + foregroundCameraManager.composition = this; + foregroundCameraManager.clipPlaneGameObj = cameraProxyPlane; + + previousMainCameraObject = mainCamera.gameObject; + } + } + +#if OVR_ANDROID_MRC + private void RefreshAudioFilter() + { + if (cameraRig != null && (audioListener == null || !audioListener.enabled || !audioListener.gameObject.activeInHierarchy)) + { + CleanupAudioFilter(); + + AudioListener tmpAudioListener = cameraRig.centerEyeAnchor.gameObject.activeInHierarchy ? cameraRig.centerEyeAnchor.GetComponent() : null; + if (tmpAudioListener != null && !tmpAudioListener.enabled) tmpAudioListener = null; + if (tmpAudioListener == null) + { + if (Camera.main != null && Camera.main.gameObject.activeInHierarchy) + { + tmpAudioListener = Camera.main.GetComponent(); + if (tmpAudioListener != null && !tmpAudioListener.enabled) tmpAudioListener = null; + } + } + if (tmpAudioListener == null) + { + Object[] allListeners = Object.FindObjectsOfType(); + foreach (var l in allListeners) + { + AudioListener al = l as AudioListener; + if (al != null && al.enabled && al.gameObject.activeInHierarchy) + { + tmpAudioListener = al; + break; + } + } + } + if (tmpAudioListener == null) + { + Debug.LogWarning("[OVRExternalComposition] No AudioListener in scene"); + } + else + { + Debug.LogFormat("[OVRExternalComposition] AudioListener found, obj {0}", tmpAudioListener.gameObject.name); + } + audioListener = tmpAudioListener; + + audioFilter = audioListener.gameObject.AddComponent(); + audioFilter.composition = this; + Debug.LogFormat("OVRMRAudioFilter added"); + } + } + + private float[] cachedAudioDataArray = null; + + private int CastMrcFrame(int castTextureIndex) + { + int audioFrames; + int audioChannels; + GetAndResetAudioData(ref cachedAudioDataArray, out audioFrames, out audioChannels); + + int syncId = -1; + //Debug.Log("EncodeFrameThreadObject EncodeMrcFrame"); + bool ret = false; + if (OVRPlugin.Media.GetMrcInputVideoBufferType() == OVRPlugin.Media.InputVideoBufferType.TextureHandle) + { + ret = OVRPlugin.Media.EncodeMrcFrame(mrcRenderTextureArray[castTextureIndex].GetNativeTexturePtr(), cachedAudioDataArray, audioFrames, audioChannels, AudioSettings.dspTime, ref syncId); + } + else + { + ret = OVRPlugin.Media.EncodeMrcFrame(mrcRenderTextureArray[castTextureIndex], cachedAudioDataArray, audioFrames, audioChannels, AudioSettings.dspTime, ref syncId); + } + + if (!ret) + { + Debug.LogWarning("EncodeMrcFrame failed. Likely caused by OBS plugin disconnection"); + return -1; + } + + return syncId; + } + + private void SetCameraTargetTexture(int drawTextureIndex) + { + RenderTexture texture = mrcRenderTextureArray[drawTextureIndex]; + if (backgroundCamera.targetTexture != texture) + { + backgroundCamera.targetTexture = texture; + } + if (foregroundCamera.targetTexture != texture) + { + foregroundCamera.targetTexture = texture; + } + } +#endif + + + public override void Update(GameObject gameObject, Camera mainCamera) + { + RefreshCameraObjects(gameObject, mainCamera); + + OVRPlugin.SetHandNodePoseStateLatency(0.0); // the HandNodePoseStateLatency doesn't apply to the external composition. Always enforce it to 0.0 + +#if OVR_ANDROID_MRC + RefreshAudioFilter(); + + int drawTextureIndex = (frameIndex / 2) % 2; + int castTextureIndex = 1 - drawTextureIndex; + + backgroundCamera.enabled = (frameIndex % 2) == 0; + foregroundCamera.enabled = (frameIndex % 2) == 1; + + if (frameIndex % 2 == 0) + { + if (lastMrcEncodeFrameSyncId != -1) + { + OVRPlugin.Media.SyncMrcFrame(lastMrcEncodeFrameSyncId); + lastMrcEncodeFrameSyncId = -1; + } + lastMrcEncodeFrameSyncId = CastMrcFrame(castTextureIndex); + SetCameraTargetTexture(drawTextureIndex); + } + + ++ frameIndex; +#endif + + backgroundCamera.clearFlags = mainCamera.clearFlags; + backgroundCamera.backgroundColor = mainCamera.backgroundColor; + backgroundCamera.cullingMask = mainCamera.cullingMask & (~OVRManager.instance.extraHiddenLayers); + backgroundCamera.nearClipPlane = mainCamera.nearClipPlane; + backgroundCamera.farClipPlane = mainCamera.farClipPlane; + + foregroundCamera.cullingMask = mainCamera.cullingMask & (~OVRManager.instance.extraHiddenLayers); + foregroundCamera.nearClipPlane = mainCamera.nearClipPlane; + foregroundCamera.farClipPlane = mainCamera.farClipPlane; + + if (OVRMixedReality.useFakeExternalCamera || OVRPlugin.GetExternalCameraCount() == 0) + { + OVRPose worldSpacePose = new OVRPose(); + OVRPose trackingSpacePose = new OVRPose(); + trackingSpacePose.position = OVRManager.instance.trackingOriginType == OVRManager.TrackingOrigin.EyeLevel ? + OVRMixedReality.fakeCameraEyeLevelPosition : + OVRMixedReality.fakeCameraFloorLevelPosition; + trackingSpacePose.orientation = OVRMixedReality.fakeCameraRotation; + worldSpacePose = OVRExtensions.ToWorldSpacePose(trackingSpacePose); + + backgroundCamera.fieldOfView = OVRMixedReality.fakeCameraFov; + backgroundCamera.aspect = OVRMixedReality.fakeCameraAspect; + foregroundCamera.fieldOfView = OVRMixedReality.fakeCameraFov; + foregroundCamera.aspect = OVRMixedReality.fakeCameraAspect; + + if (cameraInTrackingSpace) + { + backgroundCamera.transform.FromOVRPose(trackingSpacePose, true); + foregroundCamera.transform.FromOVRPose(trackingSpacePose, true); + } + else + { + backgroundCamera.transform.FromOVRPose(worldSpacePose); + foregroundCamera.transform.FromOVRPose(worldSpacePose); + } + } + else + { + OVRPlugin.CameraExtrinsics extrinsics; + OVRPlugin.CameraIntrinsics intrinsics; + OVRPlugin.Posef calibrationRawPose; + + // So far, only support 1 camera for MR and always use camera index 0 + if (OVRPlugin.GetMixedRealityCameraInfo(0, out extrinsics, out intrinsics, out calibrationRawPose)) + { + float fovY = Mathf.Atan(intrinsics.FOVPort.UpTan) * Mathf.Rad2Deg * 2; + float aspect = intrinsics.FOVPort.LeftTan / intrinsics.FOVPort.UpTan; + backgroundCamera.fieldOfView = fovY; + backgroundCamera.aspect = aspect; + foregroundCamera.fieldOfView = fovY; + foregroundCamera.aspect = intrinsics.FOVPort.LeftTan / intrinsics.FOVPort.UpTan; + + if (cameraInTrackingSpace) + { + OVRPose trackingSpacePose = ComputeCameraTrackingSpacePose(extrinsics, calibrationRawPose); + backgroundCamera.transform.FromOVRPose(trackingSpacePose, true); + foregroundCamera.transform.FromOVRPose(trackingSpacePose, true); + } + else + { + OVRPose worldSpacePose = ComputeCameraWorldSpacePose(extrinsics, calibrationRawPose); + backgroundCamera.transform.FromOVRPose(worldSpacePose); + foregroundCamera.transform.FromOVRPose(worldSpacePose); + } + } + else + { + Debug.LogError("Failed to get external camera information"); + return; + } + } + + // Assume player always standing straightly + Vector3 externalCameraToHeadXZ = mainCamera.transform.position - foregroundCamera.transform.position; + externalCameraToHeadXZ.y = 0; + cameraProxyPlane.transform.position = mainCamera.transform.position; + cameraProxyPlane.transform.LookAt(cameraProxyPlane.transform.position + externalCameraToHeadXZ); + } + +#if OVR_ANDROID_MRC + private void CleanupAudioFilter() + { + if (audioFilter) + { + audioFilter.composition = null; + Object.Destroy(audioFilter); + Debug.LogFormat("OVRMRAudioFilter destroyed"); + audioFilter = null; + } + + } +#endif + + public override void Cleanup() + { + OVRCompositionUtil.SafeDestroy(ref backgroundCameraGameObject); + backgroundCamera = null; + OVRCompositionUtil.SafeDestroy(ref foregroundCameraGameObject); + foregroundCamera = null; + OVRCompositionUtil.SafeDestroy(ref cameraProxyPlane); + Debug.Log("ExternalComposition deactivated"); + +#if OVR_ANDROID_MRC + if (lastMrcEncodeFrameSyncId != -1) + { + OVRPlugin.Media.SyncMrcFrame(lastMrcEncodeFrameSyncId); + lastMrcEncodeFrameSyncId = -1; + } + + CleanupAudioFilter(); + + for (int i=0; i<2; ++i) + { + mrcRenderTextureArray[i].Release(); + mrcRenderTextureArray[i] = null; + } + + frameIndex = 0; +#endif + } + + private readonly object audioDataLock = new object(); + private List cachedAudioData = new List(16384); + private int cachedChannels = 0; + + public void CacheAudioData(float[] data, int channels) + { + lock(audioDataLock) + { + if (channels != cachedChannels) + { + cachedAudioData.Clear(); + } + cachedChannels = channels; + cachedAudioData.AddRange(data); + //Debug.LogFormat("[CacheAudioData] dspTime {0} indata {1} channels {2} accu_len {3}", AudioSettings.dspTime, data.Length, channels, cachedAudioData.Count); + } + } + + public void GetAndResetAudioData(ref float[] audioData, out int audioFrames, out int channels) + { + lock(audioDataLock) + { + //Debug.LogFormat("[GetAndResetAudioData] dspTime {0} accu_len {1}", AudioSettings.dspTime, cachedAudioData.Count); + if (audioData == null || audioData.Length < cachedAudioData.Count) + { + audioData = new float[cachedAudioData.Capacity]; + } + cachedAudioData.CopyTo(audioData); + audioFrames = cachedAudioData.Count; + channels = cachedChannels; + cachedAudioData.Clear(); + } + } + +} + +/// +/// Helper internal class for foregroundCamera, don't call it outside +/// +internal class OVRMRForegroundCameraManager : MonoBehaviour +{ + public OVRExternalComposition composition; + public GameObject clipPlaneGameObj; + private Material clipPlaneMaterial; + void OnPreRender() + { + // the clipPlaneGameObj should be only visible to foreground camera + if (clipPlaneGameObj) + { + if (clipPlaneMaterial == null) + clipPlaneMaterial = clipPlaneGameObj.GetComponent().material; + clipPlaneGameObj.GetComponent().material.SetFloat("_Visible", 1.0f); + } + } + void OnPostRender() + { + if (clipPlaneGameObj) + { + Debug.Assert(clipPlaneMaterial); + clipPlaneGameObj.GetComponent().material.SetFloat("_Visible", 0.0f); + } + } +} + +#if OVR_ANDROID_MRC + +public class OVRMRAudioFilter : MonoBehaviour +{ + private bool running = false; + + public OVRExternalComposition composition; + + void Start() + { + running = true; + } + + void OnAudioFilterRead(float[] data, int channels) + { + if (!running) + return; + + if (composition != null) + { + composition.CacheAudioData(data, channels); + } + } +} +#endif + +#endif diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRExternalComposition.cs.meta b/Assets/Oculus/VR/Scripts/Composition/OVRExternalComposition.cs.meta new file mode 100644 index 0000000..1ac1f11 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRExternalComposition.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2c109ff55176f71418ec2c06d1b5d28e +timeCreated: 1502990231 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRSandwichComposition.cs b/Assets/Oculus/VR/Scripts/Composition/OVRSandwichComposition.cs new file mode 100644 index 0000000..822fdab --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRSandwichComposition.cs @@ -0,0 +1,4 @@ +public class OVRSandwichComposition +{ + // deprecated since SDK 1.41 +} diff --git a/Assets/Oculus/VR/Scripts/Composition/OVRSandwichComposition.cs.meta b/Assets/Oculus/VR/Scripts/Composition/OVRSandwichComposition.cs.meta new file mode 100644 index 0000000..bb8858f --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Composition/OVRSandwichComposition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c02efcdd3fb2aa4e9c641b0c2a54b9a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Editor.meta b/Assets/Oculus/VR/Scripts/Editor.meta new file mode 100644 index 0000000..52491d8 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e87d4bbdfc8d17445b4a41760b401026 +folderAsset: yes +timeCreated: 1510282190 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Editor/OVRManagerEditor.cs b/Assets/Oculus/VR/Scripts/Editor/OVRManagerEditor.cs new file mode 100644 index 0000000..fa340bd --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Editor/OVRManagerEditor.cs @@ -0,0 +1,315 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Reflection; + +[CustomEditor(typeof(OVRManager))] +public class OVRManagerEditor : Editor +{ + override public void OnInspectorGUI() + { +#if UNITY_ANDROID + OVRProjectConfig projectConfig = OVRProjectConfig.GetProjectConfig(); + bool hasModified = false; + + // Target Devices + EditorGUILayout.LabelField("Target Devices"); + EditorGUI.indentLevel++; + List oldTargetDeviceTypes = projectConfig.targetDeviceTypes; + List targetDeviceTypes = new List(oldTargetDeviceTypes); + int newCount = Mathf.Max(0, EditorGUILayout.IntField("Size", targetDeviceTypes.Count)); + while (newCount < targetDeviceTypes.Count) + { + targetDeviceTypes.RemoveAt(targetDeviceTypes.Count - 1); + hasModified = true; + } + while (newCount > targetDeviceTypes.Count) + { + targetDeviceTypes.Add(OVRProjectConfig.DeviceType.Quest); + hasModified = true; + } + for (int i = 0; i < targetDeviceTypes.Count; i++) + { + var deviceType = (OVRProjectConfig.DeviceType)EditorGUILayout.EnumPopup(string.Format("Element {0}", i), targetDeviceTypes[i]); + if (deviceType != targetDeviceTypes[i]) + { + targetDeviceTypes[i] = deviceType; + hasModified = true; + } + } + if (hasModified) + { + projectConfig.targetDeviceTypes = targetDeviceTypes; + } + EditorGUI.indentLevel--; + + EditorGUILayout.Space(); + + // Hand Tracking Support + EditorGUI.BeginDisabledGroup(!targetDeviceTypes.Contains(OVRProjectConfig.DeviceType.Quest)); + EditorGUILayout.LabelField("Input", EditorStyles.boldLabel); + OVRProjectConfig.HandTrackingSupport oldHandTrackingSupport = projectConfig.handTrackingSupport; + OVRProjectConfig.HandTrackingSupport newHandTrackingSupport = (OVRProjectConfig.HandTrackingSupport)EditorGUILayout.EnumPopup( + "Hand Tracking Support", oldHandTrackingSupport); + if (newHandTrackingSupport != oldHandTrackingSupport) + { + projectConfig.handTrackingSupport = newHandTrackingSupport; + hasModified = true; + } + EditorGUILayout.Space(); + EditorGUI.EndDisabledGroup(); + + // apply any pending changes to project config + if (hasModified) + { + OVRProjectConfig.CommitProjectConfig(projectConfig); + } +#endif + + DrawDefaultInspector(); + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID + OVRManager manager = (OVRManager)target; +#endif + +#if UNITY_ANDROID + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Security", EditorStyles.boldLabel); + EditorGUI.BeginChangeCheck(); + + bool disableBackups = projectConfig.disableBackups; + bool enableNSCConfig = projectConfig.enableNSCConfig; + SetupBoolField("Disable Backups", ref disableBackups); + SetupBoolField("Enable NSC Configuration", ref enableNSCConfig); + + if(EditorGUI.EndChangeCheck()) + { + projectConfig.disableBackups = disableBackups; + projectConfig.enableNSCConfig = enableNSCConfig; + OVRProjectConfig.CommitProjectConfig(projectConfig); + } + + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Mixed Reality Capture for Quest (experimental)", EditorStyles.boldLabel); + EditorGUI.indentLevel++; + SetupMrcActivationModeField("ActivationMode", ref manager.mrcActivationMode); + EditorGUI.indentLevel--; +#endif + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Mixed Reality Capture", EditorStyles.boldLabel); + SetupBoolField("Show Properties", ref manager.expandMixedRealityCapturePropertySheet); + if (manager.expandMixedRealityCapturePropertySheet) + { + string[] layerMaskOptions = new string[32]; + for (int i=0; i<32; ++i) + { + layerMaskOptions[i] = LayerMask.LayerToName(i); + if (layerMaskOptions[i].Length == 0) + { + layerMaskOptions[i] = ""; + } + } + + EditorGUI.indentLevel++; + + EditorGUILayout.Space(); + SetupBoolField("enableMixedReality", ref manager.enableMixedReality); + SetupCompositoinMethodField("compositionMethod", ref manager.compositionMethod); + SetupLayerMaskField("extraHiddenLayers", ref manager.extraHiddenLayers, layerMaskOptions); + + if (manager.compositionMethod == OVRManager.CompositionMethod.External) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("External Composition", EditorStyles.boldLabel); + EditorGUI.indentLevel++; + + SetupColorField("backdropColor (Rift)", ref manager.externalCompositionBackdropColorRift); + SetupColorField("backdropColor (Quest)", ref manager.externalCompositionBackdropColorQuest); + } + + if (manager.compositionMethod == OVRManager.CompositionMethod.Direct) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Direct Composition", EditorStyles.boldLabel); + EditorGUI.indentLevel++; + + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Camera", EditorStyles.boldLabel); + SetupCameraDeviceField("capturingCameraDevice", ref manager.capturingCameraDevice); + SetupBoolField("flipCameraFrameHorizontally", ref manager.flipCameraFrameHorizontally); + SetupBoolField("flipCameraFrameVertically", ref manager.flipCameraFrameVertically); + + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Chroma Key", EditorStyles.boldLabel); + SetupColorField("chromaKeyColor", ref manager.chromaKeyColor); + SetupFloatField("chromaKeySimilarity", ref manager.chromaKeySimilarity); + SetupFloatField("chromaKeySmoothRange", ref manager.chromaKeySmoothRange); + SetupFloatField("chromaKeySpillRange", ref manager.chromaKeySpillRange); + + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Dynamic Lighting", EditorStyles.boldLabel); + SetupBoolField("useDynamicLighting", ref manager.useDynamicLighting); + SetupDepthQualityField("depthQuality", ref manager.depthQuality); + SetupFloatField("dynamicLightingSmoothFactor", ref manager.dynamicLightingSmoothFactor); + SetupFloatField("dynamicLightingDepthVariationClampingValue", ref manager.dynamicLightingDepthVariationClampingValue); + + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Virtual Green Screen", EditorStyles.boldLabel); + SetupVirtualGreenTypeField("virtualGreenScreenType", ref manager.virtualGreenScreenType); + SetupFloatField("virtualGreenScreenTopY", ref manager.virtualGreenScreenTopY); + SetupFloatField("virtualGreenScreenBottomY", ref manager.virtualGreenScreenBottomY); + SetupBoolField("virtualGreenScreenApplyDepthCulling", ref manager.virtualGreenScreenApplyDepthCulling); + SetupFloatField("virtualGreenScreenDepthTolerance", ref manager.virtualGreenScreenDepthTolerance); + + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Latency Control", EditorStyles.boldLabel); + SetupFloatField("handPoseStateLatency", ref manager.handPoseStateLatency); + EditorGUI.indentLevel--; + } + + EditorGUI.indentLevel--; + } +#endif + } + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID + void SetupBoolField(string name, ref bool member) + { + EditorGUI.BeginChangeCheck(); + bool value = EditorGUILayout.Toggle(name, member); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Changed " + name); + member = value; + } + } + + void SetupIntField(string name, ref int member) + { + EditorGUI.BeginChangeCheck(); + int value = EditorGUILayout.IntField(name, member); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Changed " + name); + member = value; + } + } + + void SetupFloatField(string name, ref float member) + { + EditorGUI.BeginChangeCheck(); + float value = EditorGUILayout.FloatField(name, member); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Changed " + name); + member = value; + } + } + + void SetupDoubleField(string name, ref double member) + { + EditorGUI.BeginChangeCheck(); + double value = EditorGUILayout.DoubleField(name, member); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Changed " + name); + member = value; + } + } + void SetupColorField(string name, ref Color member) + { + EditorGUI.BeginChangeCheck(); + Color value = EditorGUILayout.ColorField(name, member); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Changed " + name); + member = value; + } + } + + void SetupLayerMaskField(string name, ref LayerMask layerMask, string[] layerMaskOptions) + { + EditorGUI.BeginChangeCheck(); + int value = EditorGUILayout.MaskField(name, layerMask, layerMaskOptions); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Changed " + name); + layerMask = value; + } + } + + void SetupCompositoinMethodField(string name, ref OVRManager.CompositionMethod method) + { + EditorGUI.BeginChangeCheck(); + OVRManager.CompositionMethod value = (OVRManager.CompositionMethod)EditorGUILayout.EnumPopup(name, method); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Changed " + name); + method = value; + } + } + + void SetupCameraDeviceField(string name, ref OVRManager.CameraDevice device) + { + EditorGUI.BeginChangeCheck(); + OVRManager.CameraDevice value = (OVRManager.CameraDevice)EditorGUILayout.EnumPopup(name, device); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Changed " + name); + device = value; + } + } + + void SetupDepthQualityField(string name, ref OVRManager.DepthQuality depthQuality) + { + EditorGUI.BeginChangeCheck(); + OVRManager.DepthQuality value = (OVRManager.DepthQuality)EditorGUILayout.EnumPopup(name, depthQuality); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Changed " + name); + depthQuality = value; + } + } + + void SetupVirtualGreenTypeField(string name, ref OVRManager.VirtualGreenScreenType virtualGreenScreenType) + { + EditorGUI.BeginChangeCheck(); + OVRManager.VirtualGreenScreenType value = (OVRManager.VirtualGreenScreenType)EditorGUILayout.EnumPopup(name, virtualGreenScreenType); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Changed " + name); + virtualGreenScreenType = value; + } + } + + void SetupMrcActivationModeField(string name, ref OVRManager.MrcActivationMode mrcActivationMode) + { + EditorGUI.BeginChangeCheck(); + OVRManager.MrcActivationMode value = (OVRManager.MrcActivationMode)EditorGUILayout.EnumPopup(name, mrcActivationMode); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(target, "Changed " + name); + mrcActivationMode = value; + } + } + +#endif +} diff --git a/Assets/Oculus/VR/Scripts/Editor/OVRManagerEditor.cs.meta b/Assets/Oculus/VR/Scripts/Editor/OVRManagerEditor.cs.meta new file mode 100644 index 0000000..b898ff7 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Editor/OVRManagerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9b07d18088099f94fa00fc15e64b2b17 +timeCreated: 1502747851 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Editor/OVROverlayDestRectEditor.shader b/Assets/Oculus/VR/Scripts/Editor/OVROverlayDestRectEditor.shader new file mode 100644 index 0000000..49bf2a1 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Editor/OVROverlayDestRectEditor.shader @@ -0,0 +1,162 @@ +Shader "Unlit/OVROverlayDestRectEditor" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + _SrcRectLeft("SrcRectLeft", Vector) = (0,0,1,1) + _SrcRectRight("SrcRectRight", Vector) = (0,0,1,1) + _DestRectLeft ("DestRectLeft", Vector) = (0,0,1,1) + _DestRectRight("DestRectRight", Vector) = (0,0,1,1) + _BackgroundColor("Background Color", Color) = (0.225, 0.225, 0.225, 1) + } + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + float4 leftDragX : TEXCOORD1; + float4 leftDragY : TEXCOORD2; + float4 rightDragX : TEXCOORD3; + float4 rightDragY : TEXCOORD4; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + + float4 _SrcRectLeft; + float4 _SrcRectRight; + float4 _DestRectLeft; + float4 _DestRectRight; + + fixed4 _BackgroundColor; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + // Add padding + o.uv = (o.uv - 0.5) * (256.0 + 8.0) / (256.0) + 0.5; + + // left + o.leftDragX.x = _DestRectLeft.x; + o.leftDragY.x = _DestRectLeft.y + _DestRectLeft.w * 0.5; + // right + o.leftDragX.y = _DestRectLeft.x + _DestRectLeft.z; + o.leftDragY.y = _DestRectLeft.y + _DestRectLeft.w * 0.5; + // top + o.leftDragX.z = _DestRectLeft.x + _DestRectLeft.z * 0.5; + o.leftDragY.z = _DestRectLeft.y; + // bottom + o.leftDragX.w = _DestRectLeft.x + _DestRectLeft.z * 0.5; + o.leftDragY.w = _DestRectLeft.y + _DestRectLeft.w; + // right + o.rightDragX.x = _DestRectRight.x; + o.rightDragY.x = _DestRectRight.y + _DestRectRight.w * 0.5; + // right + o.rightDragX.y = _DestRectRight.x + _DestRectRight.z; + o.rightDragY.y = _DestRectRight.y + _DestRectRight.w * 0.5; + // top + o.rightDragX.z = _DestRectRight.x + _DestRectRight.z * 0.5; + o.rightDragY.z = _DestRectRight.y; + // bottom + o.rightDragX.w = _DestRectRight.x + _DestRectRight.z * 0.5; + o.rightDragY.w = _DestRectRight.y + _DestRectRight.w; + + return o; + } + + float onDrag(float2 uv, float x, float y) + { + const float pixelSize = 6; + return abs(uv.x - x) < ((pixelSize / 2) / 128.0) && abs(uv.y - y) < ((pixelSize / 2) / 128.0); + } + + float onLine(float2 uv, float4 rect) + { + return + (abs(uv.x - rect.x) < (1 / 128.0) && uv.y >= rect.y && uv.y <= rect.y + rect.w) || + (abs(uv.x - rect.x - rect.z) < (1 / 128.0) && uv.y >= rect.y && uv.y <= rect.y + rect.w) || + (abs(uv.y - rect.y) < (1 / 128.0) && uv.x >= rect.x && uv.x <= rect.x + rect.z) || + (abs(uv.y - rect.y - rect.w) < (1 / 128.0) && uv.x >= rect.x && uv.x <= rect.x + rect.z); + } + + float checkerboard(float2 uv) + { + float x = floor(uv.x * (16 + 2)); + float y = floor(uv.y * 8); + + return 2 * ((x + y) / 2.0 - floor((x + y) / 2.0)); + } + + fixed4 frag (v2f i) : SV_Target + { + float isLeftEye = i.uv < 0.5; + float2 leftUV = float2(i.uv.x * (256.0 + 32.0) / 128.0, 1 - i.uv.y); + float2 rightUV = float2(1 - ((1 - i.uv.x) * (256.0 + 32.0) / 128.0), 1 - i.uv.y); + + float2 uv = i.uv; + float2 textureUV = i.uv; + if (isLeftEye) + { + uv = (leftUV - _DestRectLeft.xy) / _DestRectLeft.zw; + textureUV = uv * _SrcRectLeft.zw + _SrcRectLeft.xy; + } + else + { + uv = (rightUV - _DestRectRight.xy) / _DestRectRight.zw; + textureUV = uv * _SrcRectRight.zw + _SrcRectRight.xy; + } + + // sample the texture + fixed4 col = tex2D(_MainTex, float2(textureUV.x, 1 - textureUV.y)); + + if (uv.x < 0 || uv.x > 1 || uv.y < 0 || uv.y > 1) + { + col.a = 0; + } + + col.rgb = lerp(0.41 - 0.13 * checkerboard(i.uv), col.rgb, col.a); + + if (i.uv.x < 0 || i.uv.x > 1 || i.uv.y < 0 || i.uv.y > 1 || abs(i.uv.x - 0.5) < (14 / 256.0)) + { + col = _BackgroundColor; + } + + // now draw clipping objects + float left = isLeftEye && (onLine(leftUV, _DestRectLeft) || + onDrag(leftUV, i.leftDragX.x, i.leftDragY.x) || + onDrag(leftUV, i.leftDragX.y, i.leftDragY.y) || + onDrag(leftUV, i.leftDragX.z, i.leftDragY.z) || + onDrag(leftUV, i.leftDragX.w, i.leftDragY.w)); + + float right = (!isLeftEye) && (onLine(rightUV, _DestRectRight) || + onDrag(rightUV, i.rightDragX.x, i.rightDragY.x) || + onDrag(rightUV, i.rightDragX.y, i.rightDragY.y) || + onDrag(rightUV, i.rightDragX.z, i.rightDragY.z) || + onDrag(rightUV, i.rightDragX.w, i.rightDragY.w)); + + return lerp(col, fixed4(left, right, 0, 1), left || right); + } + ENDCG + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Editor/OVROverlayDestRectEditor.shader.meta b/Assets/Oculus/VR/Scripts/Editor/OVROverlayDestRectEditor.shader.meta new file mode 100644 index 0000000..5d8ba6d --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Editor/OVROverlayDestRectEditor.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7c52c9bacdbb59f4a973dd1849d03106 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Editor/OVROverlayEditor.cs b/Assets/Oculus/VR/Scripts/Editor/OVROverlayEditor.cs new file mode 100644 index 0000000..7be846f --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Editor/OVROverlayEditor.cs @@ -0,0 +1,524 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +[CustomEditor(typeof(OVROverlay))] +public class OVROverlayEditor : Editor +{ + + /// + /// Common Video Types, to ease source and dest rect creation + /// + public enum StereoType + { + Custom = 0, + Mono = 1, + Stereo = 2, + StereoLeftRight = 3, + StereoTopBottom = 4, + } + + public enum DisplayType + { + Custom = 0, + Full = 1, + Half = 2 + } + + private bool sourceRectsVisible = false; + private bool destRectsVisible = false; + + private Material _SrcRectMaterial; + protected Material SrcRectMaterial + { + get + { + if (_SrcRectMaterial == null) + { + string[] shaders = AssetDatabase.FindAssets("OVROverlaySrcRectEditor"); + + if (shaders.Length > 0) + { + Shader shader = (Shader)AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(shaders[0]), typeof(Shader)); + + if (shader != null) + { + _SrcRectMaterial = new Material(shader); + } + } + } + return _SrcRectMaterial; + } + } + + private Material _DestRectMaterial; + protected Material DestRectMaterial + { + get + { + if (_DestRectMaterial == null) + { + string[] shaders = AssetDatabase.FindAssets("OVROverlayDestRectEditor"); + + if (shaders.Length > 0) + { + Shader shader = (Shader)AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(shaders[0]), typeof(Shader)); + + if (shader != null) + { + _DestRectMaterial = new Material(shader); + } + } + } + return _DestRectMaterial; + } + } + + private TextureRect _DraggingRect; + private Side _DraggingSide; + + enum TextureRect + { + None, + SrcLeft, + SrcRight, + DestLeft, + DestRight + } + + enum Side + { + Left, + Right, + Top, + Bottom + } + + public override void OnInspectorGUI() + { + OVROverlay overlay = (OVROverlay)target; + if (overlay == null) + { + return; + } + + EditorGUILayout.LabelField("Display Order", EditorStyles.boldLabel); + overlay.currentOverlayType = (OVROverlay.OverlayType)EditorGUILayout.EnumPopup(new GUIContent("Current Overlay Type", "Whether this overlay should layer behind the scene or in front of it"), overlay.currentOverlayType); + overlay.compositionDepth = EditorGUILayout.IntField(new GUIContent("Composition Depth", "Depth value used to sort OVROverlays in the scene, smaller value appears in front"), overlay.compositionDepth); + overlay.noDepthBufferTesting = EditorGUILayout.Toggle(new GUIContent("No Depth Buffer Testing", "The noDepthBufferTesting will stop layer's depth buffer compositing even if the engine has \"Shared Depth Buffer\" enabled"), overlay.noDepthBufferTesting); + EditorGUILayout.Space(); + + EditorGUILayout.LabelField(new GUIContent("Overlay Shape", "The shape of this overlay"), EditorStyles.boldLabel); + overlay.currentOverlayShape = (OVROverlay.OverlayShape)EditorGUILayout.EnumPopup(new GUIContent("Overlay Shape", "The shape of this overlay"), overlay.currentOverlayShape); + EditorGUILayout.Space(); + + EditorGUILayout.Separator(); + EditorGUILayout.LabelField("Textures", EditorStyles.boldLabel); + +#if UNITY_ANDROID + bool lastIsExternalSurface = overlay.isExternalSurface; + overlay.isExternalSurface = EditorGUILayout.Toggle(new GUIContent("Is External Surface", "On Android, retrieve an Android Surface object to render to (e.g., video playback)"), overlay.isExternalSurface); + + if (lastIsExternalSurface) + { + overlay.externalSurfaceWidth = EditorGUILayout.IntField("External Surface Width", overlay.externalSurfaceWidth); + overlay.externalSurfaceHeight = EditorGUILayout.IntField("External Surface Height", overlay.externalSurfaceHeight); + overlay.isProtectedContent = EditorGUILayout.Toggle(new GUIContent("Is Protected Content", "The external surface has L1 widevine protection."), overlay.isProtectedContent); + } + else +#endif + { + if (overlay.textures == null) + { + overlay.textures = new Texture[2]; + } + if (overlay.textures.Length < 2) + { + Texture[] tmp = new Texture[2]; + for (int i = 0; i < overlay.textures.Length; i++) + { + tmp[i] = overlay.textures[i]; + } + overlay.textures = tmp; + } + + var labelControlRect = EditorGUILayout.GetControlRect(); + EditorGUI.LabelField(new Rect(labelControlRect.x, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Left Texture", "Texture used for the left eye")); + EditorGUI.LabelField(new Rect(labelControlRect.x + labelControlRect.width / 2, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Right Texture", "Texture used for the right eye")); + + + var textureControlRect = EditorGUILayout.GetControlRect(GUILayout.Height(64)); + + overlay.textures[0] = (Texture)EditorGUI.ObjectField(new Rect(textureControlRect.x, textureControlRect.y, 64, textureControlRect.height), overlay.textures[0], typeof(Texture), true); + Texture right = (Texture)EditorGUI.ObjectField(new Rect(textureControlRect.x + textureControlRect.width / 2, textureControlRect.y, 64, textureControlRect.height), overlay.textures[1] != null ? overlay.textures[1] : overlay.textures[0], typeof(Texture), true); + if (right == overlay.textures[0]) + { + overlay.textures[1] = null; + } + else + { + overlay.textures[1] = right; + } + + overlay.isDynamic = EditorGUILayout.Toggle(new GUIContent("Dynamic Texture", "This texture will be updated dynamically at runtime (e.g., Video)"), overlay.isDynamic); +#if !UNITY_ANDROID + overlay.isProtectedContent = EditorGUILayout.Toggle(new GUIContent("Is Protected Content", "The texture has copy protection, e.g., HDCP"), overlay.isProtectedContent); +#endif + } + if (overlay.currentOverlayShape == OVROverlay.OverlayShape.Cylinder || overlay.currentOverlayShape == OVROverlay.OverlayShape.Equirect || overlay.currentOverlayShape == OVROverlay.OverlayShape.Quad) { + + EditorGUILayout.Separator(); + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Texture Rects", EditorStyles.boldLabel); + + bool lastOverrideTextureRectMatrix = overlay.overrideTextureRectMatrix; + overlay.overrideTextureRectMatrix = !EditorGUILayout.Toggle(new GUIContent("Use Default Rects", overlay.textures[1] == null ? "If you need to use a single texture as a stereo image, uncheck this box" : "Uncheck this box if you need to clip you textures or layer"), !overlay.overrideTextureRectMatrix); + + if (lastOverrideTextureRectMatrix) + { + sourceRectsVisible = EditorGUILayout.Foldout(sourceRectsVisible, new GUIContent("Source Rects", "What portion of the source texture will ultimately be shown in each eye.")); + + if (sourceRectsVisible) + { + var mat = SrcRectMaterial; + + if (mat != null) + { + Rect drawRect = EditorGUILayout.GetControlRect(GUILayout.Height(128 + 8)); + mat.SetVector("_SrcRectLeft", new Vector4(Mathf.Max(0.0f, overlay.srcRectLeft.x), Mathf.Max(0.0f, overlay.srcRectLeft.y), Mathf.Min(1.0f - overlay.srcRectLeft.x, overlay.srcRectLeft.width), Mathf.Min(1.0f - overlay.srcRectLeft.y, overlay.srcRectLeft.height))); + mat.SetVector("_SrcRectRight", new Vector4(Mathf.Max(0.0f, overlay.srcRectRight.x), Mathf.Max(0.0f, overlay.srcRectRight.y), Mathf.Min(1.0f - overlay.srcRectRight.x, overlay.srcRectRight.width), Mathf.Min(1.0f - overlay.srcRectRight.y, overlay.srcRectRight.height))); + // center our draw rect + var drawRectCentered = new Rect(drawRect.x + drawRect.width / 2 - 128 - 4, drawRect.y, 256 + 8, drawRect.height); + EditorGUI.DrawPreviewTexture(drawRectCentered, overlay.textures[0] ?? Texture2D.blackTexture, mat); + + var drawRectInset = new Rect(drawRectCentered.x + 4, drawRectCentered.y + 4, drawRectCentered.width - 8, drawRectCentered.height - 8); + UpdateRectDragging(drawRectInset, drawRectInset, TextureRect.SrcLeft, TextureRect.SrcRight, ref overlay.srcRectLeft, ref overlay.srcRectRight); + CreateCursorRects(drawRectInset, overlay.srcRectLeft); + CreateCursorRects(drawRectInset, overlay.srcRectRight); + } + + var labelControlRect = EditorGUILayout.GetControlRect(); + EditorGUI.LabelField(new Rect(labelControlRect.x, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Left Source Rect", "The rect in the source image that will be displayed on the left eye layer")); + EditorGUI.LabelField(new Rect(labelControlRect.x + labelControlRect.width / 2, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Right Source Rect", "The rect in the source image that will be displayed on the right eye layer")); + + var rectControlRect = EditorGUILayout.GetControlRect(GUILayout.Height(34)); + + overlay.srcRectLeft = Clamp01(EditorGUI.RectField(new Rect(rectControlRect.x, rectControlRect.y, rectControlRect.width / 2 - 20, rectControlRect.height), overlay.srcRectLeft)); + overlay.srcRectRight = Clamp01(EditorGUI.RectField(new Rect(rectControlRect.x + rectControlRect.width / 2, rectControlRect.y, rectControlRect.width / 2 - 20, rectControlRect.height), overlay.srcRectRight)); + + + EditorGUILayout.BeginHorizontal(); + if (overlay.textures[1] != null) + { + if (GUILayout.Button(new GUIContent("Reset To Default", "Reset Source Rects to default"))) + { + SetRectsByVideoType(overlay, StereoType.Stereo, DisplayType.Custom); + } + } + else + { + if (GUILayout.Button(new GUIContent("Monoscopic", "Display the full Texture in both eyes"))) + { + SetRectsByVideoType(overlay, StereoType.Mono, DisplayType.Custom); + } + if (GUILayout.Button(new GUIContent("Stereo Left/Right", "The left half of the texture is displayed in the left eye, and the right half in the right eye"))) + { + SetRectsByVideoType(overlay, StereoType.StereoLeftRight, DisplayType.Custom); + } + if (GUILayout.Button(new GUIContent("Stereo Top/Bottom", "The top half of the texture is displayed in the left eye, and the bottom half in the right eye"))) + { + SetRectsByVideoType(overlay, StereoType.StereoTopBottom, DisplayType.Custom); + } + } + EditorGUILayout.EndHorizontal(); + + } + destRectsVisible = EditorGUILayout.Foldout(destRectsVisible, new GUIContent("Destination Rects", "What portion of the destination texture that the source will be rendered into.")); + if (destRectsVisible) + { + + var mat = DestRectMaterial; + + if (mat != null) + { + Rect drawRect = EditorGUILayout.GetControlRect(GUILayout.Height(128 + 8)); + mat.SetVector("_SrcRectLeft", new Vector4(Mathf.Max(0.0f, overlay.srcRectLeft.x), Mathf.Max(0.0f, overlay.srcRectLeft.y), Mathf.Min(1.0f - overlay.srcRectLeft.x, overlay.srcRectLeft.width), Mathf.Min(1.0f - overlay.srcRectLeft.y, overlay.srcRectLeft.height))); + mat.SetVector("_SrcRectRight", new Vector4(Mathf.Max(0.0f, overlay.srcRectRight.x), Mathf.Max(0.0f, overlay.srcRectRight.y), Mathf.Min(1.0f - overlay.srcRectRight.x, overlay.srcRectRight.width), Mathf.Min(1.0f - overlay.srcRectRight.y, overlay.srcRectRight.height))); + mat.SetVector("_DestRectLeft", new Vector4(Mathf.Max(0.0f, overlay.destRectLeft.x), Mathf.Max(0.0f, overlay.destRectLeft.y), Mathf.Min(1.0f - overlay.destRectLeft.x, overlay.destRectLeft.width), Mathf.Min(1.0f - overlay.destRectLeft.y, overlay.destRectLeft.height))); + mat.SetVector("_DestRectRight", new Vector4(Mathf.Max(0.0f, overlay.destRectRight.x), Mathf.Max(0.0f, overlay.destRectRight.y), Mathf.Min(1.0f - overlay.destRectRight.x, overlay.destRectRight.width), Mathf.Min(1.0f - overlay.destRectRight.y, overlay.destRectRight.height))); + mat.SetColor("_BackgroundColor", EditorGUIUtility.isProSkin ? (Color)new Color32(56, 56, 56, 255) : (Color)new Color32(194, 194, 194, 255)); + + var drawRectCentered = new Rect(drawRect.x + drawRect.width / 2 - 128 - 16 - 4, drawRect.y, 256 + 32 + 8, drawRect.height); + // center our draw rect + EditorGUI.DrawPreviewTexture(drawRectCentered, overlay.textures[0] ?? Texture2D.blackTexture, mat); + + var drawRectInsetLeft = new Rect(drawRectCentered.x + 4, drawRectCentered.y + 4, drawRectCentered.width / 2 - 20, drawRectCentered.height - 8); + var drawRectInsetRight = new Rect(drawRectCentered.x + drawRectCentered.width / 2 + 16, drawRectCentered.y + 4, drawRectCentered.width / 2 - 20, drawRectCentered.height - 8); + UpdateRectDragging(drawRectInsetLeft, drawRectInsetRight, TextureRect.DestLeft, TextureRect.DestRight, ref overlay.destRectLeft, ref overlay.destRectRight); + + CreateCursorRects(drawRectInsetLeft, overlay.destRectLeft); + CreateCursorRects(drawRectInsetRight, overlay.destRectRight); + + } + + var labelControlRect = EditorGUILayout.GetControlRect(); + EditorGUI.LabelField(new Rect(labelControlRect.x, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Left Destination Rect", "The rect in the destination layer the left eye will display to")); + EditorGUI.LabelField(new Rect(labelControlRect.x + labelControlRect.width / 2, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Right Destination Rect", "The rect in the destination layer the right eye will display to")); + + var rectControlRect = EditorGUILayout.GetControlRect(GUILayout.Height(34)); + + overlay.destRectLeft = Clamp01(EditorGUI.RectField(new Rect(rectControlRect.x, rectControlRect.y, rectControlRect.width / 2 - 20, rectControlRect.height), overlay.destRectLeft)); + overlay.destRectRight = Clamp01(EditorGUI.RectField(new Rect(rectControlRect.x + rectControlRect.width / 2, rectControlRect.y, rectControlRect.width / 2 - 20, rectControlRect.height), overlay.destRectRight)); + + + if (overlay.currentOverlayShape == OVROverlay.OverlayShape.Equirect) + { + EditorGUILayout.BeginHorizontal(); + if (GUILayout.Button(new GUIContent("360 Video", "Display the full 360 layer"))) + { + SetRectsByVideoType(overlay, StereoType.Custom, DisplayType.Full); + } + if (GUILayout.Button(new GUIContent("180 Video", "Display the front 180 layer"))) + { + SetRectsByVideoType(overlay, StereoType.Custom, DisplayType.Half); + } + EditorGUILayout.EndHorizontal(); + } + else + { + if (GUILayout.Button(new GUIContent("Reset To Default", "Reset Source Rects to default"))) + { + SetRectsByVideoType(overlay, StereoType.Custom, DisplayType.Full); + } + } + } + } + } + EditorGUILayout.Separator(); + EditorGUILayout.LabelField("Color Scale", EditorStyles.boldLabel); + EditorGUILayout.Space(); + overlay.overridePerLayerColorScaleAndOffset = EditorGUILayout.Toggle(new GUIContent("Override Color Scale", "Manually set color scale and offset of this layer, regardless of what the global values are from OVRManager.SetColorScaleAndOffset()."), overlay.overridePerLayerColorScaleAndOffset); + if (overlay.overridePerLayerColorScaleAndOffset) + { + Vector4 colorScale = EditorGUILayout.Vector4Field(new GUIContent("Color Scale", "Scale that the color values for this overlay will be multiplied by."), overlay.colorScale); + Vector4 colorOffset = EditorGUILayout.Vector4Field(new GUIContent("Color Offset", "Offset that the color values for this overlay will be added to."), overlay.colorOffset); + overlay.SetPerLayerColorScaleAndOffset(colorScale, colorOffset); + } + + EditorUtility.SetDirty(overlay); + } + + private Rect Clamp01(Rect rect) + { + rect.x = Mathf.Clamp01(rect.x); + rect.y = Mathf.Clamp01(rect.y); + rect.width = Mathf.Clamp01(rect.width); + rect.height = Mathf.Clamp01(rect.height); + return rect; + } + + private bool IsUnitRect(Rect rect) + { + return IsRect(rect, 0, 0, 1, 1); + } + + private bool IsRect(Rect rect, float x, float y, float w, float h) + { + return rect.x == x && rect.y == y && rect.width == w && rect.height == h; + } + + private StereoType GetStereoType(OVROverlay overlay) + { + if (overlay.textures[0] != null && overlay.textures[1] != null) + { + if (IsUnitRect(overlay.srcRectLeft) && IsUnitRect(overlay.srcRectRight)) + { + return StereoType.Stereo; + } + else + { + return StereoType.Custom; + } + } + else if (overlay.textures[0] != null) + { + if (IsUnitRect(overlay.srcRectLeft) && IsUnitRect(overlay.srcRectRight)) + { + return StereoType.Mono; + } + else if (IsRect(overlay.srcRectLeft, 0, 0, 0.5f, 1f) && IsRect(overlay.srcRectRight, 0.5f, 0, 0.5f, 1f)) + { + return StereoType.StereoLeftRight; + } + else if (IsRect(overlay.srcRectLeft, 0, 0, 1f, 0.5f) && IsRect(overlay.srcRectRight, 0f, 0.5f, 1f, 0.5f)) + { + return StereoType.StereoTopBottom; + } + else + { + return StereoType.Custom; + } + } + else + { + return StereoType.Mono; + } + } + + private void SetRectsByVideoType(OVROverlay overlay, StereoType stereoType, DisplayType displayType) + { + Rect srcRectLeft, srcRectRight, destRectLeft, destRectRight; + + switch (displayType) + { + case DisplayType.Full: + destRectLeft = destRectRight = new Rect(0, 0, 1, 1); + break; + + case DisplayType.Half: + destRectLeft = destRectRight = new Rect(0.25f, 0, 0.5f, 1); + break; + default: + destRectLeft = overlay.destRectLeft; + destRectRight = overlay.destRectRight; + break; + } + + switch (stereoType) + { + case StereoType.Mono: + case StereoType.Stereo: + srcRectLeft = srcRectRight = new Rect(0, 0, 1, 1); + break; + + case StereoType.StereoTopBottom: + srcRectLeft = new Rect(0, 0, 1, 0.5f); + srcRectRight = new Rect(0, 0.5f, 1, 0.5f); + break; + + case StereoType.StereoLeftRight: + srcRectLeft = new Rect(0, 0, 0.5f, 1); + srcRectRight = new Rect(0.5f, 0, 0.5f, 1); + break; + default: + srcRectLeft = overlay.srcRectLeft; + srcRectRight = overlay.srcRectRight; + break; + } + overlay.SetSrcDestRects(srcRectLeft, srcRectRight, destRectLeft, destRectRight); + } + + private void GetCursorPoints(Rect drawRect, Rect selectRect, out Vector2 leftPos, out Vector2 rightPos, out Vector2 topPos, out Vector2 bottomPos) + { + leftPos = new Vector2(drawRect.x + selectRect.x * drawRect.width, drawRect.y + (selectRect.y + selectRect.height / 2) * drawRect.height); + rightPos = new Vector2(drawRect.x + (selectRect.x + selectRect.width) * drawRect.width, drawRect.y + (selectRect.y + selectRect.height / 2) * drawRect.height); + topPos = new Vector2(drawRect.x + (selectRect.x + selectRect.width / 2) * drawRect.width, drawRect.y + (selectRect.y) * drawRect.height); + bottomPos = new Vector2(drawRect.x + (selectRect.x + selectRect.width / 2) * drawRect.width, drawRect.y + (selectRect.y + selectRect.height) * drawRect.height); + } + + private void CreateCursorRects(Rect drawRect, Rect selectRect) + { + Vector2 leftPos, rightPos, topPos, bottomPos; + GetCursorPoints(drawRect, selectRect, out leftPos, out rightPos, out topPos, out bottomPos); + + EditorGUIUtility.AddCursorRect(new Rect(leftPos - 5 * Vector2.one, 10 * Vector2.one), MouseCursor.ResizeHorizontal); + EditorGUIUtility.AddCursorRect(new Rect(rightPos - 5 * Vector2.one, 10 * Vector2.one), MouseCursor.ResizeHorizontal); + EditorGUIUtility.AddCursorRect(new Rect(topPos - 5 * Vector2.one, 10 * Vector2.one), MouseCursor.ResizeVertical); + EditorGUIUtility.AddCursorRect(new Rect(bottomPos - 5 * Vector2.one, 10 * Vector2.one), MouseCursor.ResizeVertical); + } + + private bool IsOverRectControls(Rect drawRect, Vector2 mousePos, Rect selectRect, ref Side side) + { + Vector2 leftPos, rightPos, topPos, bottomPos; + GetCursorPoints(drawRect, selectRect, out leftPos, out rightPos, out topPos, out bottomPos); + + if ((leftPos - mousePos).sqrMagnitude <= 25) + { + side = Side.Left; + return true; + } + if ((rightPos - mousePos).sqrMagnitude <= 25) + { + side = Side.Right; + return true; + } + if ((topPos - mousePos).sqrMagnitude <= 25) + { + side = Side.Top; + return true; + } + if ((bottomPos - mousePos).sqrMagnitude <= 25) + { + side = Side.Bottom; + return true; + } + return false; + } + + private void UpdateRectDragging(Rect drawingRectLeft, Rect drawingRectRight, TextureRect rectLeftType, TextureRect rectRightType, ref Rect rectLeft, ref Rect rectRight) + { + if (!Event.current.isMouse || Event.current.button != 0) + { + return; + } + + if (Event.current.type == EventType.MouseUp) + { + _DraggingRect = TextureRect.None; + return; + } + + Vector2 mousePos = Event.current.mousePosition; + if (_DraggingRect == TextureRect.None && Event.current.type == EventType.MouseDown) + { + if (IsOverRectControls(drawingRectLeft, mousePos, rectLeft, ref _DraggingSide)) + { + _DraggingRect = rectLeftType; + } + if (_DraggingRect == TextureRect.None || Event.current.shift) + { + if (IsOverRectControls(drawingRectRight, mousePos, rectRight, ref _DraggingSide)) + { + _DraggingRect = rectRightType; + } + } + } + + if (_DraggingRect == rectLeftType) + { + SetRectSideValue(drawingRectLeft, mousePos, _DraggingSide, ref rectLeft); + } + if (_DraggingRect == rectRightType) + { + SetRectSideValue(drawingRectRight, mousePos, _DraggingSide, ref rectRight); + } + } + + private void SetRectSideValue(Rect drawingRect, Vector2 mousePos, Side side, ref Rect rect) + { + // quantize to 1/32 + float x = Mathf.Clamp01(Mathf.Round(((mousePos.x - drawingRect.x) / drawingRect.width) * 32) / 32.0f); + float y = Mathf.Clamp01(Mathf.Round(((mousePos.y - drawingRect.y) / drawingRect.height) * 32) / 32.0f); + + switch (side) + { + case Side.Left: + float xMax = rect.xMax; + rect.x = Mathf.Min(x, xMax); + rect.width = xMax - rect.x; + break; + case Side.Right: + rect.width = Mathf.Max(0, x - rect.x); + break; + case Side.Top: + float yMax = rect.yMax; + rect.y = Mathf.Min(y, yMax); + rect.height = yMax - rect.y; + break; + case Side.Bottom: + rect.height = Mathf.Max(0, y - rect.y); + break; + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Editor/OVROverlayEditor.cs.meta b/Assets/Oculus/VR/Scripts/Editor/OVROverlayEditor.cs.meta new file mode 100644 index 0000000..d9c9ab2 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Editor/OVROverlayEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fde3aeb28643f6c48a48f926ac7207e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Editor/OVROverlaySrcRectEditor.shader b/Assets/Oculus/VR/Scripts/Editor/OVROverlaySrcRectEditor.shader new file mode 100644 index 0000000..96fc293 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Editor/OVROverlaySrcRectEditor.shader @@ -0,0 +1,138 @@ +Shader "Unlit/OVROverlaySrcRectEditor" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + _SrcRectLeft ("SrcRectLeft", Vector) = (0,0,1,1) + _SrcRectRight("SrcRectRight", Vector) = (0,0,1,1) + _BackgroundColor("Background Color", Color) = (0.225, 0.225, 0.225, 1) + } + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + float4 leftDragX : TEXCOORD1; + float4 leftDragY : TEXCOORD2; + float4 rightDragX : TEXCOORD3; + float4 rightDragY : TEXCOORD4; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + + float4 _SrcRectLeft; + float4 _SrcRectRight; + + fixed4 _BackgroundColor; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + // Add padding + o.uv = (o.uv - 0.5) * (256.0 + 8.0) / (256.0) + 0.5; + + // left + o.leftDragX.x = _SrcRectLeft.x; + o.leftDragY.x = _SrcRectLeft.y + _SrcRectLeft.w * 0.5; + // right + o.leftDragX.y = _SrcRectLeft.x + _SrcRectLeft.z; + o.leftDragY.y = _SrcRectLeft.y + _SrcRectLeft.w * 0.5; + // top + o.leftDragX.z = _SrcRectLeft.x + _SrcRectLeft.z * 0.5; + o.leftDragY.z = _SrcRectLeft.y; + // bottom + o.leftDragX.w = _SrcRectLeft.x + _SrcRectLeft.z * 0.5; + o.leftDragY.w = _SrcRectLeft.y + _SrcRectLeft.w; + // right + o.rightDragX.x = _SrcRectRight.x; + o.rightDragY.x = _SrcRectRight.y + _SrcRectRight.w * 0.5; + // right + o.rightDragX.y = _SrcRectRight.x + _SrcRectRight.z; + o.rightDragY.y = _SrcRectRight.y + _SrcRectRight.w * 0.5; + // top + o.rightDragX.z = _SrcRectRight.x + _SrcRectRight.z * 0.5; + o.rightDragY.z = _SrcRectRight.y; + // bottom + o.rightDragX.w = _SrcRectRight.x + _SrcRectRight.z * 0.5; + o.rightDragY.w = _SrcRectRight.y + _SrcRectRight.w; + + return o; + } + + float onDrag(float2 uv, float x, float y) + { + const float pixelSize = 6; + return abs(uv.x - x) < ((pixelSize / 2) / 256.0) && abs(uv.y - y) < ((pixelSize / 2) / 128.0); + } + + float onLine(float2 uv, float4 rect) + { + return + (abs(uv.x - rect.x) < (1 / 256.0) && uv.y >= rect.y && uv.y <= rect.y + rect.w) || + (abs(uv.x - rect.x - rect.z) < (1 / 256.0) && uv.y >= rect.y && uv.y <= rect.y + rect.w) || + (abs(uv.y - rect.y) < (1 / 128.0) && uv.x >= rect.x && uv.x <= rect.x + rect.z) || + (abs(uv.y - rect.y - rect.w) < (1 / 128.0) && uv.x >= rect.x && uv.x <= rect.x + rect.z); + } + + float checkerboard(float2 uv) + { + float x = floor(uv.x * (16)); + float y = floor(uv.y * 8); + + return 2 * ((x + y) / 2.0 - floor((x + y) / 2.0)); + } + + fixed4 frag (v2f i) : SV_Target + { + // sample the texture + fixed4 col = tex2D(_MainTex, i.uv); + + col.rgb = lerp(0.41 - 0.13 * checkerboard(i.uv), col.rgb, col.a); + + if (i.uv.x < 0 || i.uv.x > 1 || i.uv.y < 0 || i.uv.y > 1) + { + col = _BackgroundColor; + } + + float2 uv = float2(i.uv.x, 1 - i.uv.y); + + // now draw clipping objects + float left = onLine(uv, _SrcRectLeft) || + onDrag(uv, i.leftDragX.x, i.leftDragY.x) || + onDrag(uv, i.leftDragX.y, i.leftDragY.y) || + onDrag(uv, i.leftDragX.z, i.leftDragY.z) || + onDrag(uv, i.leftDragX.w, i.leftDragY.w); + + float right = onLine(uv, _SrcRectRight) || + onDrag(uv, i.rightDragX.x, i.rightDragY.x) || + onDrag(uv, i.rightDragX.y, i.rightDragY.y) || + onDrag(uv, i.rightDragX.z, i.rightDragY.z) || + onDrag(uv, i.rightDragX.w, i.rightDragY.w); + + return lerp(col, fixed4(left, right, 0, 1), left || right); + } + ENDCG + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Editor/OVROverlaySrcRectEditor.shader.meta b/Assets/Oculus/VR/Scripts/Editor/OVROverlaySrcRectEditor.shader.meta new file mode 100644 index 0000000..019de65 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Editor/OVROverlaySrcRectEditor.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 589b36d0aa66c7349bcff8750b670434 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Editor/Oculus.VR.Scripts.Editor.asmdef b/Assets/Oculus/VR/Scripts/Editor/Oculus.VR.Scripts.Editor.asmdef new file mode 100644 index 0000000..4aa87b5 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Editor/Oculus.VR.Scripts.Editor.asmdef @@ -0,0 +1,17 @@ +{ + "name": "Oculus.VR.Scripts.Editor", + "references": [ + "Oculus.VR", + "Oculus.VR.Editor" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Assets/Oculus/VR/Scripts/Editor/Oculus.VR.Scripts.Editor.asmdef.meta b/Assets/Oculus/VR/Scripts/Editor/Oculus.VR.Scripts.Editor.asmdef.meta new file mode 100644 index 0000000..98bc1e9 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Editor/Oculus.VR.Scripts.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7305c54a43f3814439df347c7519653e +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/OVRBoundary.cs b/Assets/Oculus/VR/Scripts/OVRBoundary.cs new file mode 100644 index 0000000..9c24c28 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRBoundary.cs @@ -0,0 +1,231 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + + +using System; +using System.Collections.Generic; +using UnityEngine; +using VR = UnityEngine.VR; +using System.Runtime.InteropServices; +#if UNITY_2017_2_OR_NEWER +using Boundary = UnityEngine.Experimental.XR.Boundary; +#elif UNITY_2017_1_OR_NEWER +using Boundary = UnityEngine.Experimental.VR.Boundary; +#endif + +/// +/// Provides access to the Oculus boundary system. +/// +public class OVRBoundary +{ + /// + /// Specifies a tracked node that can be queried through the boundary system. + /// + public enum Node + { + HandLeft = OVRPlugin.Node.HandLeft, ///< Tracks the left hand node. + HandRight = OVRPlugin.Node.HandRight, ///< Tracks the right hand node. + Head = OVRPlugin.Node.Head, ///< Tracks the head node. + } + + /// + /// Specifies a boundary type surface. + /// + public enum BoundaryType + { + OuterBoundary = OVRPlugin.BoundaryType.OuterBoundary, ///< Outer boundary that closely matches the user's configured walls. + PlayArea = OVRPlugin.BoundaryType.PlayArea, ///< Smaller convex area inset within the outer boundary. + } + + /// + /// Provides test results of boundary system queries. + /// + public struct BoundaryTestResult + { + public bool IsTriggering; ///< Returns true if the queried test would violate and/or trigger the tested boundary types. + public float ClosestDistance; ///< Returns the distance between the queried test object and the closest tested boundary type. + public Vector3 ClosestPoint; ///< Returns the closest point to the queried test object. + public Vector3 ClosestPointNormal; ///< Returns the normal of the closest point to the queried test object. + } + + /// + /// Returns true if the boundary system is currently configured with valid boundary data. + /// + public bool GetConfigured() + { + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + return OVRPlugin.GetBoundaryConfigured(); + else + { +#if UNITY_2017_1_OR_NEWER + return Boundary.configured; +#else + return false; +#endif + } + } + + /// + /// Returns the results of testing a tracked node against the specified boundary type. + /// All points are returned in local tracking space shared by tracked nodes and accessible through OVRCameraRig's trackingSpace anchor. + /// + public OVRBoundary.BoundaryTestResult TestNode(OVRBoundary.Node node, OVRBoundary.BoundaryType boundaryType) + { + OVRPlugin.BoundaryTestResult ovrpRes = OVRPlugin.TestBoundaryNode((OVRPlugin.Node)node, (OVRPlugin.BoundaryType)boundaryType); + + OVRBoundary.BoundaryTestResult res = new OVRBoundary.BoundaryTestResult() + { + IsTriggering = (ovrpRes.IsTriggering == OVRPlugin.Bool.True), + ClosestDistance = ovrpRes.ClosestDistance, + ClosestPoint = ovrpRes.ClosestPoint.FromFlippedZVector3f(), + ClosestPointNormal = ovrpRes.ClosestPointNormal.FromFlippedZVector3f(), + }; + + return res; + } + + /// + /// Returns the results of testing a 3d point against the specified boundary type. + /// The test point is expected in local tracking space. + /// All points are returned in local tracking space shared by tracked nodes and accessible through OVRCameraRig's trackingSpace anchor. + /// + public OVRBoundary.BoundaryTestResult TestPoint(Vector3 point, OVRBoundary.BoundaryType boundaryType) + { + OVRPlugin.BoundaryTestResult ovrpRes = OVRPlugin.TestBoundaryPoint(point.ToFlippedZVector3f(), (OVRPlugin.BoundaryType)boundaryType); + + OVRBoundary.BoundaryTestResult res = new OVRBoundary.BoundaryTestResult() + { + IsTriggering = (ovrpRes.IsTriggering == OVRPlugin.Bool.True), + ClosestDistance = ovrpRes.ClosestDistance, + ClosestPoint = ovrpRes.ClosestPoint.FromFlippedZVector3f(), + ClosestPointNormal = ovrpRes.ClosestPointNormal.FromFlippedZVector3f(), + }; + + return res; + } + + private static int cachedVector3fSize = Marshal.SizeOf(typeof(OVRPlugin.Vector3f)); + private static OVRNativeBuffer cachedGeometryNativeBuffer = new OVRNativeBuffer(0); + private static float[] cachedGeometryManagedBuffer = new float[0]; + private List cachedGeometryList = new List(); + /// + /// Returns an array of 3d points (in clockwise order) that define the specified boundary type. + /// All points are returned in local tracking space shared by tracked nodes and accessible through OVRCameraRig's trackingSpace anchor. + /// + public Vector3[] GetGeometry(OVRBoundary.BoundaryType boundaryType) + { + if (OVRManager.loadedXRDevice != OVRManager.XRDevice.Oculus) + { +#if UNITY_2017_1_OR_NEWER + if (Boundary.TryGetGeometry(cachedGeometryList, (boundaryType == BoundaryType.PlayArea) ? Boundary.Type.PlayArea : Boundary.Type.TrackedArea)) + { + Vector3[] arr = cachedGeometryList.ToArray(); + return arr; + } +#endif + Debug.LogError("This functionality is not supported in your current version of Unity."); + return null; + } + + int pointsCount = 0; + if (OVRPlugin.GetBoundaryGeometry2((OVRPlugin.BoundaryType)boundaryType, IntPtr.Zero, ref pointsCount)) + { + if (pointsCount > 0) + { + int requiredNativeBufferCapacity = pointsCount * cachedVector3fSize; + if (cachedGeometryNativeBuffer.GetCapacity() < requiredNativeBufferCapacity) + cachedGeometryNativeBuffer.Reset(requiredNativeBufferCapacity); + + int requiredManagedBufferCapacity = pointsCount * 3; + if (cachedGeometryManagedBuffer.Length < requiredManagedBufferCapacity) + cachedGeometryManagedBuffer = new float[requiredManagedBufferCapacity]; + + if (OVRPlugin.GetBoundaryGeometry2((OVRPlugin.BoundaryType)boundaryType, cachedGeometryNativeBuffer.GetPointer(), ref pointsCount)) + { + Marshal.Copy(cachedGeometryNativeBuffer.GetPointer(), cachedGeometryManagedBuffer, 0, requiredManagedBufferCapacity); + + Vector3[] points = new Vector3[pointsCount]; + + for (int i = 0; i < pointsCount; i++) + { + points[i] = new OVRPlugin.Vector3f() + { + x = cachedGeometryManagedBuffer[3 * i + 0], + y = cachedGeometryManagedBuffer[3 * i + 1], + z = cachedGeometryManagedBuffer[3 * i + 2], + }.FromFlippedZVector3f(); + } + + return points; + } + } + } + + return new Vector3[0]; + } + + /// + /// Returns a vector that indicates the spatial dimensions of the specified boundary type. (x = width, y = height, z = depth) + /// + public Vector3 GetDimensions(OVRBoundary.BoundaryType boundaryType) + { + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + return OVRPlugin.GetBoundaryDimensions((OVRPlugin.BoundaryType)boundaryType).FromVector3f(); + + else + { +#if UNITY_2017_1_OR_NEWER + Vector3 dimensions; + if (Boundary.TryGetDimensions(out dimensions, (boundaryType == BoundaryType.PlayArea) ? Boundary.Type.PlayArea : Boundary.Type.TrackedArea)) + return dimensions; +#endif + return Vector3.zero; + } + } + + /// + /// Returns true if the boundary system is currently visible. + /// + public bool GetVisible() + { + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + return OVRPlugin.GetBoundaryVisible(); + else + { +#if UNITY_2017_1_OR_NEWER + return Boundary.visible; +#else + return false; +#endif + } + } + + /// + /// Requests that the boundary system visibility be set to the specified value. + /// The actual visibility can be overridden by the system (i.e., proximity trigger) or by the user (boundary system disabled) + /// + public void SetVisible(bool value) + { + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + OVRPlugin.SetBoundaryVisible(value); + else + { +#if UNITY_2017_1_OR_NEWER + Boundary.visible = value; +#endif + } + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRBoundary.cs.meta b/Assets/Oculus/VR/Scripts/OVRBoundary.cs.meta new file mode 100644 index 0000000..37722c6 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRBoundary.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 332b8e08854932543ba356eec601c0ef +timeCreated: 1470352252 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/OVRCameraRig.cs b/Assets/Oculus/VR/Scripts/OVRCameraRig.cs new file mode 100644 index 0000000..ef84a9b --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRCameraRig.cs @@ -0,0 +1,451 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +#if USING_XR_MANAGEMENT && USING_XR_SDK_OCULUS +#define USING_XR_SDK +#endif + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +#if UNITY_2017_2_OR_NEWER +using InputTracking = UnityEngine.XR.InputTracking; +using Node = UnityEngine.XR.XRNode; +#else +using InputTracking = UnityEngine.VR.InputTracking; +using Node = UnityEngine.VR.VRNode; +#endif + +/// +/// A head-tracked stereoscopic virtual reality camera rig. +/// +[ExecuteInEditMode] +public class OVRCameraRig : MonoBehaviour +{ + /// + /// The left eye camera. + /// + public Camera leftEyeCamera { get { return (usePerEyeCameras) ? _leftEyeCamera : _centerEyeCamera; } } + /// + /// The right eye camera. + /// + public Camera rightEyeCamera { get { return (usePerEyeCameras) ? _rightEyeCamera : _centerEyeCamera; } } + /// + /// Provides a root transform for all anchors in tracking space. + /// + public Transform trackingSpace { get; private set; } + /// + /// Always coincides with the pose of the left eye. + /// + public Transform leftEyeAnchor { get; private set; } + /// + /// Always coincides with average of the left and right eye poses. + /// + public Transform centerEyeAnchor { get; private set; } + /// + /// Always coincides with the pose of the right eye. + /// + public Transform rightEyeAnchor { get; private set; } + /// + /// Always coincides with the pose of the left hand. + /// + public Transform leftHandAnchor { get; private set; } + /// + /// Always coincides with the pose of the right hand. + /// + public Transform rightHandAnchor { get; private set; } + /// + /// Anchors controller pose to fix offset issues for the left hand. + /// + public Transform leftControllerAnchor { get; private set; } + /// + /// Anchors controller pose to fix offset issues for the right hand. + /// + public Transform rightControllerAnchor { get; private set; } + /// + /// Always coincides with the pose of the sensor. + /// + public Transform trackerAnchor { get; private set; } + /// + /// Occurs when the eye pose anchors have been set. + /// + public event System.Action UpdatedAnchors; + /// + /// If true, separate cameras will be used for the left and right eyes. + /// + public bool usePerEyeCameras = false; + /// + /// If true, all tracked anchors are updated in FixedUpdate instead of Update to favor physics fidelity. + /// \note: If the fixed update rate doesn't match the rendering framerate (OVRManager.display.appFramerate), the anchors will visibly judder. + /// + public bool useFixedUpdateForTracking = false; + /// + /// If true, the cameras on the eyeAnchors will be disabled. + /// \note: The main camera of the game will be used to provide VR rendering. And the tracking space anchors will still be updated to provide reference poses. + /// + public bool disableEyeAnchorCameras = false; + + + protected bool _skipUpdate = false; + protected readonly string trackingSpaceName = "TrackingSpace"; + protected readonly string trackerAnchorName = "TrackerAnchor"; + protected readonly string leftEyeAnchorName = "LeftEyeAnchor"; + protected readonly string centerEyeAnchorName = "CenterEyeAnchor"; + protected readonly string rightEyeAnchorName = "RightEyeAnchor"; + protected readonly string leftHandAnchorName = "LeftHandAnchor"; + protected readonly string rightHandAnchorName = "RightHandAnchor"; + protected readonly string leftControllerAnchorName = "LeftControllerAnchor"; + protected readonly string rightControllerAnchorName = "RightControllerAnchor"; + protected Camera _centerEyeCamera; + protected Camera _leftEyeCamera; + protected Camera _rightEyeCamera; + +#region Unity Messages + protected virtual void Awake() + { + _skipUpdate = true; + EnsureGameObjectIntegrity(); + } + + protected virtual void Start() + { + UpdateAnchors(true, true); + Application.onBeforeRender += OnBeforeRenderCallback; + } + + protected virtual void FixedUpdate() + { + if (useFixedUpdateForTracking) + UpdateAnchors(true, true); + } + + protected virtual void Update() + { + _skipUpdate = false; + + if (!useFixedUpdateForTracking) + UpdateAnchors(true, true); + } + + protected virtual void OnDestroy() + { + Application.onBeforeRender -= OnBeforeRenderCallback; + } +#endregion + + protected virtual void UpdateAnchors(bool updateEyeAnchors, bool updateHandAnchors) + { + if (!OVRManager.OVRManagerinitialized) + return; + + EnsureGameObjectIntegrity(); + + if (!Application.isPlaying) + return; + + if (_skipUpdate) + { + centerEyeAnchor.FromOVRPose(OVRPose.identity, true); + leftEyeAnchor.FromOVRPose(OVRPose.identity, true); + rightEyeAnchor.FromOVRPose(OVRPose.identity, true); + + return; + } + + bool monoscopic = OVRManager.instance.monoscopic; + bool hmdPresent = OVRNodeStateProperties.IsHmdPresent(); + + OVRPose tracker = OVRManager.tracker.GetPose(); + + trackerAnchor.localRotation = tracker.orientation; + + Quaternion emulatedRotation = Quaternion.Euler(-OVRManager.instance.headPoseRelativeOffsetRotation.x, -OVRManager.instance.headPoseRelativeOffsetRotation.y, OVRManager.instance.headPoseRelativeOffsetRotation.z); + + //Note: in the below code, when using UnityEngine's API, we only update anchor transforms if we have a new, fresh value this frame. + //If we don't, it could mean that tracking is lost, etc. so the pose should not change in the virtual world. + //This can be thought of as similar to calling InputTracking GetLocalPosition and Rotation, but only for doing so when the pose is valid. + //If false is returned for any of these calls, then a new pose is not valid and thus should not be updated. + if (updateEyeAnchors) + { + if (hmdPresent) + { + Vector3 centerEyePosition = Vector3.zero; + Quaternion centerEyeRotation = Quaternion.identity; + + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.CenterEye, NodeStatePropertyType.Position, OVRPlugin.Node.EyeCenter, OVRPlugin.Step.Render, out centerEyePosition)) + centerEyeAnchor.localPosition = centerEyePosition; + if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.CenterEye, NodeStatePropertyType.Orientation, OVRPlugin.Node.EyeCenter, OVRPlugin.Step.Render, out centerEyeRotation)) + centerEyeAnchor.localRotation = centerEyeRotation; + } + else + { + centerEyeAnchor.localRotation = emulatedRotation; + centerEyeAnchor.localPosition = OVRManager.instance.headPoseRelativeOffsetTranslation; + } + + if (!hmdPresent || monoscopic) + { + leftEyeAnchor.localPosition = centerEyeAnchor.localPosition; + rightEyeAnchor.localPosition = centerEyeAnchor.localPosition; + leftEyeAnchor.localRotation = centerEyeAnchor.localRotation; + rightEyeAnchor.localRotation = centerEyeAnchor.localRotation; + } + else + { + Vector3 leftEyePosition = Vector3.zero; + Vector3 rightEyePosition = Vector3.zero; + Quaternion leftEyeRotation = Quaternion.identity; + Quaternion rightEyeRotation = Quaternion.identity; + + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftEye, NodeStatePropertyType.Position, OVRPlugin.Node.EyeLeft, OVRPlugin.Step.Render, out leftEyePosition)) + leftEyeAnchor.localPosition = leftEyePosition; + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightEye, NodeStatePropertyType.Position, OVRPlugin.Node.EyeRight, OVRPlugin.Step.Render, out rightEyePosition)) + rightEyeAnchor.localPosition = rightEyePosition; + if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.LeftEye, NodeStatePropertyType.Orientation, OVRPlugin.Node.EyeLeft, OVRPlugin.Step.Render, out leftEyeRotation)) + leftEyeAnchor.localRotation = leftEyeRotation; + if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.RightEye, NodeStatePropertyType.Orientation, OVRPlugin.Node.EyeRight, OVRPlugin.Step.Render, out rightEyeRotation)) + rightEyeAnchor.localRotation = rightEyeRotation; + } + } + + if (updateHandAnchors) + { + //Need this for controller offset because if we're on OpenVR, we want to set the local poses as specified by Unity, but if we're not, OVRInput local position is the right anchor + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + { + Vector3 leftPos = Vector3.zero; + Vector3 rightPos = Vector3.zero; + Quaternion leftQuat = Quaternion.identity; + Quaternion rightQuat = Quaternion.identity; + + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftHand, NodeStatePropertyType.Position, OVRPlugin.Node.HandLeft, OVRPlugin.Step.Render, out leftPos)) + leftHandAnchor.localPosition = leftPos; + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightHand, NodeStatePropertyType.Position, OVRPlugin.Node.HandRight, OVRPlugin.Step.Render, out rightPos)) + rightHandAnchor.localPosition = rightPos; + if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.LeftHand, NodeStatePropertyType.Orientation, OVRPlugin.Node.HandLeft, OVRPlugin.Step.Render, out leftQuat)) + leftHandAnchor.localRotation = leftQuat; + if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.RightHand, NodeStatePropertyType.Orientation, OVRPlugin.Node.HandRight, OVRPlugin.Step.Render, out rightQuat)) + rightHandAnchor.localRotation = rightQuat; + + } + else + { + leftHandAnchor.localPosition = OVRInput.GetLocalControllerPosition(OVRInput.Controller.LTouch); + rightHandAnchor.localPosition = OVRInput.GetLocalControllerPosition(OVRInput.Controller.RTouch); + leftHandAnchor.localRotation = OVRInput.GetLocalControllerRotation(OVRInput.Controller.LTouch); + rightHandAnchor.localRotation = OVRInput.GetLocalControllerRotation(OVRInput.Controller.RTouch); + } + + trackerAnchor.localPosition = tracker.position; + + OVRPose leftOffsetPose = OVRPose.identity; + OVRPose rightOffsetPose = OVRPose.identity; + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + { + leftOffsetPose = OVRManager.GetOpenVRControllerOffset(Node.LeftHand); + rightOffsetPose = OVRManager.GetOpenVRControllerOffset(Node.RightHand); + + //Sets poses of left and right nodes, local to the tracking space. + OVRManager.SetOpenVRLocalPose(trackingSpace.InverseTransformPoint(leftControllerAnchor.position), + trackingSpace.InverseTransformPoint(rightControllerAnchor.position), + Quaternion.Inverse(trackingSpace.rotation) * leftControllerAnchor.rotation, + Quaternion.Inverse(trackingSpace.rotation) * rightControllerAnchor.rotation); + } + rightControllerAnchor.localPosition = rightOffsetPose.position; + rightControllerAnchor.localRotation = rightOffsetPose.orientation; + leftControllerAnchor.localPosition = leftOffsetPose.position; + leftControllerAnchor.localRotation = leftOffsetPose.orientation; + } + + RaiseUpdatedAnchorsEvent(); + } + + protected virtual void OnBeforeRenderCallback() + { + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) //Restrict late-update to only Oculus devices + { + bool controllersNeedUpdate = OVRManager.instance.LateControllerUpdate; +#if USING_XR_SDK + //For the XR SDK, we need to late update head pose, not just the controllers, because the functionality + //is no longer built-in to the Engine. Under legacy, late camera update is done by default. In the XR SDK, you must use + //Tracked Pose Driver to get this by default, which we do not use. So, we have to manually late update camera poses. + UpdateAnchors(true, controllersNeedUpdate); +#else + if (controllersNeedUpdate) + UpdateAnchors(false, true); +#endif + } + } + + protected virtual void RaiseUpdatedAnchorsEvent() + { + if (UpdatedAnchors != null) + { + UpdatedAnchors(this); + } + } + + public virtual void EnsureGameObjectIntegrity() + { + bool monoscopic = OVRManager.instance != null ? OVRManager.instance.monoscopic : false; + + if (trackingSpace == null) + trackingSpace = ConfigureAnchor(null, trackingSpaceName); + + if (leftEyeAnchor == null) + leftEyeAnchor = ConfigureAnchor(trackingSpace, leftEyeAnchorName); + + if (centerEyeAnchor == null) + centerEyeAnchor = ConfigureAnchor(trackingSpace, centerEyeAnchorName); + + if (rightEyeAnchor == null) + rightEyeAnchor = ConfigureAnchor(trackingSpace, rightEyeAnchorName); + + if (leftHandAnchor == null) + leftHandAnchor = ConfigureAnchor(trackingSpace, leftHandAnchorName); + + if (rightHandAnchor == null) + rightHandAnchor = ConfigureAnchor(trackingSpace, rightHandAnchorName); + + if (trackerAnchor == null) + trackerAnchor = ConfigureAnchor(trackingSpace, trackerAnchorName); + + if (leftControllerAnchor == null) + leftControllerAnchor = ConfigureAnchor(leftHandAnchor, leftControllerAnchorName); + + if (rightControllerAnchor == null) + rightControllerAnchor = ConfigureAnchor(rightHandAnchor, rightControllerAnchorName); + + if (_centerEyeCamera == null || _leftEyeCamera == null || _rightEyeCamera == null) + { + _centerEyeCamera = centerEyeAnchor.GetComponent(); + _leftEyeCamera = leftEyeAnchor.GetComponent(); + _rightEyeCamera = rightEyeAnchor.GetComponent(); + + if (_centerEyeCamera == null) + { + _centerEyeCamera = centerEyeAnchor.gameObject.AddComponent(); + _centerEyeCamera.tag = "MainCamera"; + } + + if (_leftEyeCamera == null) + { + _leftEyeCamera = leftEyeAnchor.gameObject.AddComponent(); + _leftEyeCamera.tag = "MainCamera"; + } + + if (_rightEyeCamera == null) + { + _rightEyeCamera = rightEyeAnchor.gameObject.AddComponent(); + _rightEyeCamera.tag = "MainCamera"; + } + + _centerEyeCamera.stereoTargetEye = StereoTargetEyeMask.Both; + _leftEyeCamera.stereoTargetEye = StereoTargetEyeMask.Left; + _rightEyeCamera.stereoTargetEye = StereoTargetEyeMask.Right; + } + + if (monoscopic && !OVRPlugin.EyeTextureArrayEnabled) + { + // Output to left eye only when in monoscopic mode + if (_centerEyeCamera.stereoTargetEye != StereoTargetEyeMask.Left) + { + _centerEyeCamera.stereoTargetEye = StereoTargetEyeMask.Left; + } + } + else + { + if (_centerEyeCamera.stereoTargetEye != StereoTargetEyeMask.Both) + { + _centerEyeCamera.stereoTargetEye = StereoTargetEyeMask.Both; + } + } + + if (disableEyeAnchorCameras) + { + _centerEyeCamera.enabled = false; + _leftEyeCamera.enabled = false; + _rightEyeCamera.enabled = false; + } + else + { + // disable the right eye camera when in monoscopic mode + if (_centerEyeCamera.enabled == usePerEyeCameras || + _leftEyeCamera.enabled == !usePerEyeCameras || + _rightEyeCamera.enabled == !(usePerEyeCameras && (!monoscopic || OVRPlugin.EyeTextureArrayEnabled))) + { + _skipUpdate = true; + } + + _centerEyeCamera.enabled = !usePerEyeCameras; + _leftEyeCamera.enabled = usePerEyeCameras; + _rightEyeCamera.enabled = (usePerEyeCameras && (!monoscopic || OVRPlugin.EyeTextureArrayEnabled)); + + } + } + + protected virtual Transform ConfigureAnchor(Transform root, string name) + { + Transform anchor = (root != null) ? root.Find(name) : null; + + if (anchor == null) + { + anchor = transform.Find(name); + } + + if (anchor == null) + { + anchor = new GameObject(name).transform; + } + + anchor.name = name; + anchor.parent = (root != null) ? root : transform; + anchor.localScale = Vector3.one; + anchor.localPosition = Vector3.zero; + anchor.localRotation = Quaternion.identity; + + return anchor; + } + + public virtual Matrix4x4 ComputeTrackReferenceMatrix() + { + if (centerEyeAnchor == null) + { + Debug.LogError("centerEyeAnchor is required"); + return Matrix4x4.identity; + } + + // The ideal approach would be using UnityEngine.VR.VRNode.TrackingReference, then we would not have to depend on the OVRCameraRig. Unfortunately, it is not available in Unity 5.4.3 + + OVRPose headPose = OVRPose.identity; + + Vector3 pos; + Quaternion rot; + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.Head, NodeStatePropertyType.Position, OVRPlugin.Node.Head, OVRPlugin.Step.Render, out pos)) + headPose.position = pos; + if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.Head, NodeStatePropertyType.Orientation, OVRPlugin.Node.Head, OVRPlugin.Step.Render, out rot)) + headPose.orientation = rot; + + OVRPose invHeadPose = headPose.Inverse(); + Matrix4x4 invHeadMatrix = Matrix4x4.TRS(invHeadPose.position, invHeadPose.orientation, Vector3.one); + + Matrix4x4 ret = centerEyeAnchor.localToWorldMatrix * invHeadMatrix; + + return ret; + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRCameraRig.cs.meta b/Assets/Oculus/VR/Scripts/OVRCameraRig.cs.meta new file mode 100644 index 0000000..0f3217c --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRCameraRig.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: df9f338034892c44ebb62d97894772f1 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/OVRCommon.cs b/Assets/Oculus/VR/Scripts/OVRCommon.cs new file mode 100644 index 0000000..87cc4b5 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRCommon.cs @@ -0,0 +1,661 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +#if USING_XR_MANAGEMENT && USING_XR_SDK_OCULUS +#define USING_XR_SDK +#endif + +using UnityEngine; +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +#if USING_XR_SDK +using UnityEngine.XR; +using UnityEngine.Experimental.XR; +#endif + +#if UNITY_2017_2_OR_NEWER +using InputTracking = UnityEngine.XR.InputTracking; +using Node = UnityEngine.XR.XRNode; +using NodeState = UnityEngine.XR.XRNodeState; +using Device = UnityEngine.XR.XRDevice; +#elif UNITY_2017_1_OR_NEWER +using InputTracking = UnityEngine.VR.InputTracking; +using Node = UnityEngine.VR.VRNode; +using NodeState = UnityEngine.VR.VRNodeState; +using Device = UnityEngine.VR.VRDevice; +#else +using InputTracking = UnityEngine.VR.InputTracking; +using Node = UnityEngine.VR.VRNode; +using Device = UnityEngine.VR.VRDevice; +#endif + +/// +/// Miscellaneous extension methods that any script can use. +/// +public static class OVRExtensions +{ + /// + /// Converts the given world-space transform to an OVRPose in tracking space. + /// + public static OVRPose ToTrackingSpacePose(this Transform transform, Camera camera) + { + //Initializing to identity, but for all Oculus headsets, down below the pose will be initialized to the runtime's pose value, so identity will never be returned. + OVRPose headPose = OVRPose.identity; + + Vector3 pos; + Quaternion rot; + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.Head, NodeStatePropertyType.Position, OVRPlugin.Node.Head, OVRPlugin.Step.Render, out pos)) + headPose.position = pos; + if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.Head, NodeStatePropertyType.Orientation, OVRPlugin.Node.Head, OVRPlugin.Step.Render, out rot)) + headPose.orientation = rot; + + var ret = headPose * transform.ToHeadSpacePose(camera); + + return ret; + } + + + /// + /// Converts the given pose from tracking-space to world-space. + /// + public static OVRPose ToWorldSpacePose(OVRPose trackingSpacePose) + { + OVRPose headPose = OVRPose.identity; + + Vector3 pos; + Quaternion rot; + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.Head, NodeStatePropertyType.Position, OVRPlugin.Node.Head, OVRPlugin.Step.Render, out pos)) + headPose.position = pos; + if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.Head, NodeStatePropertyType.Orientation, OVRPlugin.Node.Head, OVRPlugin.Step.Render, out rot)) + headPose.orientation = rot; + + // Transform from tracking-Space to head-Space + OVRPose poseInHeadSpace = headPose.Inverse() * trackingSpacePose; + + // Transform from head space to world space + OVRPose ret = Camera.main.transform.ToOVRPose() * poseInHeadSpace; + + return ret; + } + + /// + /// Converts the given world-space transform to an OVRPose in head space. + /// + public static OVRPose ToHeadSpacePose(this Transform transform, Camera camera) + { + return camera.transform.ToOVRPose().Inverse() * transform.ToOVRPose(); + } + + public static OVRPose ToOVRPose(this Transform t, bool isLocal = false) + { + OVRPose pose; + pose.orientation = (isLocal) ? t.localRotation : t.rotation; + pose.position = (isLocal) ? t.localPosition : t.position; + return pose; + } + + public static void FromOVRPose(this Transform t, OVRPose pose, bool isLocal = false) + { + if (isLocal) + { + t.localRotation = pose.orientation; + t.localPosition = pose.position; + } + else + { + t.rotation = pose.orientation; + t.position = pose.position; + } + } + + public static OVRPose ToOVRPose(this OVRPlugin.Posef p) + { + return new OVRPose() + { + position = new Vector3(p.Position.x, p.Position.y, -p.Position.z), + orientation = new Quaternion(-p.Orientation.x, -p.Orientation.y, p.Orientation.z, p.Orientation.w) + }; + } + + public static OVRTracker.Frustum ToFrustum(this OVRPlugin.Frustumf f) + { + return new OVRTracker.Frustum() + { + nearZ = f.zNear, + farZ = f.zFar, + + fov = new Vector2() + { + x = Mathf.Rad2Deg * f.fovX, + y = Mathf.Rad2Deg * f.fovY + } + }; + } + + public static Color FromColorf(this OVRPlugin.Colorf c) + { + return new Color() { r = c.r, g = c.g, b = c.b, a = c.a }; + } + + public static OVRPlugin.Colorf ToColorf(this Color c) + { + return new OVRPlugin.Colorf() { r = c.r, g = c.g, b = c.b, a = c.a }; + } + + public static Vector3 FromVector3f(this OVRPlugin.Vector3f v) + { + return new Vector3() { x = v.x, y = v.y, z = v.z }; + } + + public static Vector3 FromFlippedZVector3f(this OVRPlugin.Vector3f v) + { + return new Vector3() { x = v.x, y = v.y, z = -v.z }; + } + + public static OVRPlugin.Vector3f ToVector3f(this Vector3 v) + { + return new OVRPlugin.Vector3f() { x = v.x, y = v.y, z = v.z }; + } + + public static OVRPlugin.Vector3f ToFlippedZVector3f(this Vector3 v) + { + return new OVRPlugin.Vector3f() { x = v.x, y = v.y, z = -v.z }; + } + + public static Quaternion FromQuatf(this OVRPlugin.Quatf q) + { + return new Quaternion() { x = q.x, y = q.y, z = q.z, w = q.w }; + } + + public static Quaternion FromFlippedZQuatf(this OVRPlugin.Quatf q) + { + return new Quaternion() { x = -q.x, y = -q.y, z = q.z, w = q.w }; + } + + public static OVRPlugin.Quatf ToQuatf(this Quaternion q) + { + return new OVRPlugin.Quatf() { x = q.x, y = q.y, z = q.z, w = q.w }; + } + + public static OVRPlugin.Quatf ToFlippedZQuatf(this Quaternion q) + { + return new OVRPlugin.Quatf() { x = -q.x, y = -q.y, z = q.z, w = q.w }; + } + + public static OVR.OpenVR.HmdMatrix34_t ConvertToHMDMatrix34(this Matrix4x4 m) + { + OVR.OpenVR.HmdMatrix34_t pose = new OVR.OpenVR.HmdMatrix34_t(); + + pose.m0 = m[0, 0]; + pose.m1 = m[0, 1]; + pose.m2 = -m[0, 2]; + pose.m3 = m[0, 3]; + + pose.m4 = m[1, 0]; + pose.m5 = m[1, 1]; + pose.m6 = -m[1, 2]; + pose.m7 = m[1, 3]; + + pose.m8 = -m[2, 0]; + pose.m9 = -m[2, 1]; + pose.m10 = m[2, 2]; + pose.m11 = -m[2, 3]; + + return pose; + } + +} + +//4 types of node state properties that can be queried with UnityEngine.XR +public enum NodeStatePropertyType +{ + Acceleration, + AngularAcceleration, + Velocity, + AngularVelocity, + Position, + Orientation +} + +public static class OVRNodeStateProperties +{ +#if UNITY_2017_1_OR_NEWER + private static List nodeStateList = new List(); +#endif + + public static bool IsHmdPresent() + { + if (OVRManager.OVRManagerinitialized && OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + return OVRPlugin.hmdPresent; +#if USING_XR_SDK + XRDisplaySubsystem currentDisplaySubsystem = OVRManager.GetCurrentDisplaySubsystem(); + if (currentDisplaySubsystem != null) + return currentDisplaySubsystem.running; //In 2019.3, this should be changed to currentDisplaySubsystem.isConnected, but this is a fine placeholder for now. + return false; +#else + return Device.isPresent; +#endif + } + + public static bool GetNodeStatePropertyVector3(Node nodeType, NodeStatePropertyType propertyType, OVRPlugin.Node ovrpNodeType, OVRPlugin.Step stepType, out Vector3 retVec) + { + retVec = Vector3.zero; + switch (propertyType) + { + case NodeStatePropertyType.Acceleration: + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + { + retVec = OVRPlugin.GetNodeAcceleration(ovrpNodeType, stepType).FromFlippedZVector3f(); + return true; + } +#if UNITY_2017_1_OR_NEWER + if (GetUnityXRNodeStateVector3(nodeType, NodeStatePropertyType.Acceleration, out retVec)) + return true; +#endif + break; + + case NodeStatePropertyType.AngularAcceleration: + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + { + retVec = OVRPlugin.GetNodeAngularAcceleration(ovrpNodeType, stepType).FromFlippedZVector3f(); + return true; + } +#if UNITY_2017_2_OR_NEWER + if (GetUnityXRNodeStateVector3(nodeType, NodeStatePropertyType.AngularAcceleration, out retVec)) + return true; +#endif + break; + + case NodeStatePropertyType.Velocity: + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + { + retVec = OVRPlugin.GetNodeVelocity(ovrpNodeType, stepType).FromFlippedZVector3f(); + return true; + } +#if UNITY_2017_1_OR_NEWER + if (GetUnityXRNodeStateVector3(nodeType, NodeStatePropertyType.Velocity, out retVec)) + return true; +#endif + break; + + case NodeStatePropertyType.AngularVelocity: + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + { + retVec = OVRPlugin.GetNodeAngularVelocity(ovrpNodeType, stepType).FromFlippedZVector3f(); + return true; + } +#if UNITY_2017_2_OR_NEWER + if (GetUnityXRNodeStateVector3(nodeType, NodeStatePropertyType.AngularVelocity, out retVec)) + return true; +#endif + break; + + case NodeStatePropertyType.Position: + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + { + retVec = OVRPlugin.GetNodePose(ovrpNodeType, stepType).ToOVRPose().position; + return true; + } +#if UNITY_2017_1_OR_NEWER + if (GetUnityXRNodeStateVector3(nodeType, NodeStatePropertyType.Position, out retVec)) + return true; +#endif + break; + } + + return false; + } + + public static bool GetNodeStatePropertyQuaternion(Node nodeType, NodeStatePropertyType propertyType, OVRPlugin.Node ovrpNodeType, OVRPlugin.Step stepType, out Quaternion retQuat) + { + retQuat = Quaternion.identity; + switch (propertyType) + { + case NodeStatePropertyType.Orientation: + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + { + retQuat = OVRPlugin.GetNodePose(ovrpNodeType, stepType).ToOVRPose().orientation; + return true; + } +#if UNITY_2017_1_OR_NEWER + if (GetUnityXRNodeStateQuaternion(nodeType, NodeStatePropertyType.Orientation, out retQuat)) + return true; +#endif + break; + } + return false; + } + +#if UNITY_2017_1_OR_NEWER + private static bool ValidateProperty(Node nodeType, ref NodeState requestedNodeState) + { + InputTracking.GetNodeStates(nodeStateList); + + if (nodeStateList.Count == 0) + return false; + + bool nodeStateFound = false; + requestedNodeState = nodeStateList[0]; + + for (int i = 0; i < nodeStateList.Count; i++) + { + if (nodeStateList[i].nodeType == nodeType) + { + requestedNodeState = nodeStateList[i]; + nodeStateFound = true; + break; + } + } + + return nodeStateFound; + } +#endif + +#if UNITY_2017_1_OR_NEWER + private static bool GetUnityXRNodeStateVector3(Node nodeType, NodeStatePropertyType propertyType, out Vector3 retVec) + { + retVec = Vector3.zero; + + NodeState requestedNodeState = default(NodeState); + + if (!ValidateProperty(nodeType, ref requestedNodeState)) + return false; + + if (propertyType == NodeStatePropertyType.Acceleration) + { + if (requestedNodeState.TryGetAcceleration(out retVec)) + { + return true; + } + } + else if (propertyType == NodeStatePropertyType.AngularAcceleration) + { +#if UNITY_2017_2_OR_NEWER + if (requestedNodeState.TryGetAngularAcceleration(out retVec)) + { + return true; + } +#endif + } + else if (propertyType == NodeStatePropertyType.Velocity) + { + if (requestedNodeState.TryGetVelocity(out retVec)) + { + return true; + } + } + else if (propertyType == NodeStatePropertyType.AngularVelocity) + { +#if UNITY_2017_2_OR_NEWER + if (requestedNodeState.TryGetAngularVelocity(out retVec)) + { + return true; + } +#endif + } + else if (propertyType == NodeStatePropertyType.Position) + { + if (requestedNodeState.TryGetPosition(out retVec)) + { + return true; + } + } + + return false; + } +#endif + +#if UNITY_2017_1_OR_NEWER + private static bool GetUnityXRNodeStateQuaternion(Node nodeType, NodeStatePropertyType propertyType, out Quaternion retQuat) + { + retQuat = Quaternion.identity; + + NodeState requestedNodeState = default(NodeState); + + if (!ValidateProperty(nodeType, ref requestedNodeState)) + return false; + + if (propertyType == NodeStatePropertyType.Orientation) + { + if (requestedNodeState.TryGetRotation(out retQuat)) + { + return true; + } + } + + return false; + } +#endif + +} + +/// +/// An affine transformation built from a Unity position and orientation. +/// +[System.Serializable] +public struct OVRPose +{ + /// + /// A pose with no translation or rotation. + /// + public static OVRPose identity + { + get { + return new OVRPose() + { + position = Vector3.zero, + orientation = Quaternion.identity + }; + } + } + + public override bool Equals(System.Object obj) + { + return obj is OVRPose && this == (OVRPose)obj; + } + + public override int GetHashCode() + { + return position.GetHashCode() ^ orientation.GetHashCode(); + } + + public static bool operator ==(OVRPose x, OVRPose y) + { + return x.position == y.position && x.orientation == y.orientation; + } + + public static bool operator !=(OVRPose x, OVRPose y) + { + return !(x == y); + } + + /// + /// The position. + /// + public Vector3 position; + + /// + /// The orientation. + /// + public Quaternion orientation; + + /// + /// Multiplies two poses. + /// + public static OVRPose operator*(OVRPose lhs, OVRPose rhs) + { + var ret = new OVRPose(); + ret.position = lhs.position + lhs.orientation * rhs.position; + ret.orientation = lhs.orientation * rhs.orientation; + return ret; + } + + /// + /// Computes the inverse of the given pose. + /// + public OVRPose Inverse() + { + OVRPose ret; + ret.orientation = Quaternion.Inverse(orientation); + ret.position = ret.orientation * -position; + return ret; + } + + /// + /// Converts the pose from left- to right-handed or vice-versa. + /// + public OVRPose flipZ() + { + var ret = this; + ret.position.z = -ret.position.z; + ret.orientation.z = -ret.orientation.z; + ret.orientation.w = -ret.orientation.w; + return ret; + } + + // Warning: this function is not a strict reverse of OVRPlugin.Posef.ToOVRPose(), even after flipZ() + public OVRPlugin.Posef ToPosef_Legacy() + { + return new OVRPlugin.Posef() + { + Position = position.ToVector3f(), + Orientation = orientation.ToQuatf() + }; + } + + public OVRPlugin.Posef ToPosef() + { + OVRPlugin.Posef result = new OVRPlugin.Posef(); + result.Position.x = position.x; + result.Position.y = position.y; + result.Position.z = -position.z; + result.Orientation.x = -orientation.x; + result.Orientation.y = -orientation.y; + result.Orientation.z = orientation.z; + result.Orientation.w = orientation.w; + return result; + } +} + +/// +/// Encapsulates an 8-byte-aligned of unmanaged memory. +/// +public class OVRNativeBuffer : IDisposable +{ + private bool disposed = false; + private int m_numBytes = 0; + private IntPtr m_ptr = IntPtr.Zero; + + /// + /// Creates a buffer of the specified size. + /// + public OVRNativeBuffer(int numBytes) + { + Reallocate(numBytes); + } + + /// + /// Releases unmanaged resources and performs other cleanup operations before the is + /// reclaimed by garbage collection. + /// + ~OVRNativeBuffer() + { + Dispose(false); + } + + /// + /// Reallocates the buffer with the specified new size. + /// + public void Reset(int numBytes) + { + Reallocate(numBytes); + } + + /// + /// The current number of bytes in the buffer. + /// + public int GetCapacity() + { + return m_numBytes; + } + + /// + /// A pointer to the unmanaged memory in the buffer, starting at the given offset in bytes. + /// + public IntPtr GetPointer(int byteOffset = 0) + { + if (byteOffset < 0 || byteOffset >= m_numBytes) + return IntPtr.Zero; + return (byteOffset == 0) ? m_ptr : new IntPtr(m_ptr.ToInt64() + byteOffset); + } + + /// + /// Releases all resource used by the object. + /// + /// Call when you are finished using the . The + /// method leaves the in an unusable state. After calling , you must + /// release all references to the so the garbage collector can reclaim the memory that + /// the was occupying. + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (disposed) + return; + + if (disposing) + { + // dispose managed resources + } + + // dispose unmanaged resources + Release(); + + disposed = true; + } + + private void Reallocate(int numBytes) + { + Release(); + + if (numBytes > 0) + { + m_ptr = Marshal.AllocHGlobal(numBytes); + m_numBytes = numBytes; + } + else + { + m_ptr = IntPtr.Zero; + m_numBytes = 0; + } + } + + private void Release() + { + if (m_ptr != IntPtr.Zero) + { + Marshal.FreeHGlobal(m_ptr); + m_ptr = IntPtr.Zero; + m_numBytes = 0; + } + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRCommon.cs.meta b/Assets/Oculus/VR/Scripts/OVRCommon.cs.meta new file mode 100644 index 0000000..94d3e50 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRCommon.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 176f8d665b1d78048b1e87956698df6b +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/OVRDebugHeadController.cs b/Assets/Oculus/VR/Scripts/OVRDebugHeadController.cs new file mode 100644 index 0000000..0b39f23 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRDebugHeadController.cs @@ -0,0 +1,119 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections; + +/// +/// This is a simple behavior that can be attached to a parent of the CameraRig in order +/// to provide movement via the gamepad. This is useful when testing an application in +/// the Unity editor without the HMD. +/// To use it, create a game object in your scene and drag your CameraRig to be a child +/// of the game object. Then, add the OVRDebugHeadController behavior to the game object. +/// Alternatively, this behavior can be placed directly on the OVRCameraRig object, but +/// that is not guaranteed to work if OVRCameraRig functionality changes in the future. +/// In the parent case, the object with OVRDebugHeadController can be thougt of as a +/// platform that your camera is attached to. When the platform moves or rotates, the +/// camera moves or rotates, but the camera can still move independently while "on" the +/// platform. +/// In general, this behavior should be disabled when not debugging. +/// +public class OVRDebugHeadController : MonoBehaviour +{ + [SerializeField] + public bool AllowPitchLook = false; + [SerializeField] + public bool AllowYawLook = true; + [SerializeField] + public bool InvertPitch = false; + [SerializeField] + public float GamePad_PitchDegreesPerSec = 90.0f; + [SerializeField] + public float GamePad_YawDegreesPerSec = 90.0f; + [SerializeField] + public bool AllowMovement = false; + [SerializeField] + public float ForwardSpeed = 2.0f; + [SerializeField] + public float StrafeSpeed = 2.0f; + + protected OVRCameraRig CameraRig = null; + + void Awake() + { + // locate the camera rig so we can use it to get the current camera transform each frame + OVRCameraRig[] CameraRigs = gameObject.GetComponentsInChildren(); + + if( CameraRigs.Length == 0 ) + Debug.LogWarning("OVRCamParent: No OVRCameraRig attached."); + else if (CameraRigs.Length > 1) + Debug.LogWarning("OVRCamParent: More then 1 OVRCameraRig attached."); + else + CameraRig = CameraRigs[0]; + } + + // Use this for initialization + void Start () + { + + } + + // Update is called once per frame + void Update () + { + if ( AllowMovement ) + { + float gamePad_FwdAxis = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick).y; + float gamePad_StrafeAxis = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick).x; + + Vector3 fwdMove = ( CameraRig.centerEyeAnchor.rotation * Vector3.forward ) * gamePad_FwdAxis * Time.deltaTime * ForwardSpeed; + Vector3 strafeMove = ( CameraRig.centerEyeAnchor.rotation * Vector3.right ) * gamePad_StrafeAxis * Time.deltaTime * StrafeSpeed; + transform.position += fwdMove + strafeMove; + } + +#if UNITY_2017_2_OR_NEWER + if ( !UnityEngine.XR.XRDevice.isPresent && ( AllowYawLook || AllowPitchLook ) ) +#else + if ( !UnityEngine.VR.VRDevice.isPresent && ( AllowYawLook || AllowPitchLook ) ) +#endif + { + Quaternion r = transform.rotation; + if ( AllowYawLook ) + { + float gamePadYaw = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick).x; + float yawAmount = gamePadYaw * Time.deltaTime * GamePad_YawDegreesPerSec; + Quaternion yawRot = Quaternion.AngleAxis( yawAmount, Vector3.up ); + r = yawRot * r; + } + if ( AllowPitchLook ) + { + float gamePadPitch = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick).y; + if ( Mathf.Abs( gamePadPitch ) > 0.0001f ) + { + if ( InvertPitch ) + { + gamePadPitch *= -1.0f; + } + float pitchAmount = gamePadPitch * Time.deltaTime * GamePad_PitchDegreesPerSec; + Quaternion pitchRot = Quaternion.AngleAxis( pitchAmount, Vector3.left ); + r = r * pitchRot; + } + } + + transform.rotation = r; + } + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRDebugHeadController.cs.meta b/Assets/Oculus/VR/Scripts/OVRDebugHeadController.cs.meta new file mode 100644 index 0000000..983493f --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRDebugHeadController.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 563681618daa71b4c89f979b1fd7170b +timeCreated: 1433450365 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/OVRDisplay.cs b/Assets/Oculus/VR/Scripts/OVRDisplay.cs new file mode 100644 index 0000000..1481f44 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRDisplay.cs @@ -0,0 +1,400 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using UnityEngine; +using System.Collections.Generic; + +#if UNITY_2017_2_OR_NEWER +using InputTracking = UnityEngine.XR.InputTracking; +using Node = UnityEngine.XR.XRNode; +using NodeState = UnityEngine.XR.XRNodeState; +using Settings = UnityEngine.XR.XRSettings; +#elif UNITY_2017_1_OR_NEWER +using InputTracking = UnityEngine.VR.InputTracking; +using Node = UnityEngine.VR.VRNode; +using NodeState = UnityEngine.VR.VRNodeState; +using Settings = UnityEngine.VR.VRSettings; +#else +using Node = UnityEngine.VR.VRNode; +using Settings = UnityEngine.VR.VRSettings; +#endif + +/// +/// Manages an Oculus Rift head-mounted display (HMD). +/// +public class OVRDisplay +{ + /// + /// Contains full fov information per eye + /// Under Symmetric Fov mode, UpFov == DownFov and LeftFov == RightFov. + /// + public struct EyeFov + { + public float UpFov; + public float DownFov; + public float LeftFov; + public float RightFov; + } + + /// + /// Specifies the size and field-of-view for one eye texture. + /// + public struct EyeRenderDesc + { + /// + /// The horizontal and vertical size of the texture. + /// + public Vector2 resolution; + + /// + /// The angle of the horizontal and vertical field of view in degrees. + /// For Symmetric FOV interface compatibility + /// Note this includes the fov angle from both sides + /// + public Vector2 fov; + + /// + /// The full information of field of view in degrees. + /// When Asymmetric FOV isn't enabled, this returns the maximum fov angle + /// + public EyeFov fullFov; + } + + /// + /// Contains latency measurements for a single frame of rendering. + /// + public struct LatencyData + { + /// + /// The time it took to render both eyes in seconds. + /// + public float render; + + /// + /// The time it took to perform TimeWarp in seconds. + /// + public float timeWarp; + + /// + /// The time between the end of TimeWarp and scan-out in seconds. + /// + public float postPresent; + public float renderError; + public float timeWarpError; + } + + private bool needsConfigureTexture; + private EyeRenderDesc[] eyeDescs = new EyeRenderDesc[2]; + private bool recenterRequested = false; + private int recenterRequestedFrameCount = int.MaxValue; + private OVRPose previousRelativeTrackingSpacePose; + private OVRManager.TrackingOrigin previousTrackingOrigin; + + /// + /// Creates an instance of OVRDisplay. Called by OVRManager. + /// + public OVRDisplay() + { + UpdateTextures(); + if (OVRPlugin.GetSystemHeadsetType() == OVRPlugin.SystemHeadset.Oculus_Quest) + { + previousTrackingOrigin = OVRManager.instance.trackingOriginType; + OVRManager.TrackingOrigin relativeOrigin = (previousTrackingOrigin != OVRManager.TrackingOrigin.Stage) ? OVRManager.TrackingOrigin.Stage : OVRManager.TrackingOrigin.EyeLevel; + previousRelativeTrackingSpacePose = OVRPlugin.GetTrackingTransformRelativePose((OVRPlugin.TrackingOrigin)relativeOrigin).ToOVRPose(); + } + } + + /// + /// Updates the internal state of the OVRDisplay. Called by OVRManager. + /// + public void Update() + { + UpdateTextures(); + + if (recenterRequested && Time.frameCount > recenterRequestedFrameCount) + { + if (RecenteredPose != null) + { + RecenteredPose(); + } + recenterRequested = false; + recenterRequestedFrameCount = int.MaxValue; + } + if (OVRPlugin.GetSystemHeadsetType() == OVRPlugin.SystemHeadset.Oculus_Quest) + { + OVRManager.TrackingOrigin relativeOrigin = (OVRManager.instance.trackingOriginType != OVRManager.TrackingOrigin.Stage) ? OVRManager.TrackingOrigin.Stage : OVRManager.TrackingOrigin.EyeLevel; + OVRPose relativeTrackingSpacePose = OVRPlugin.GetTrackingTransformRelativePose((OVRPlugin.TrackingOrigin)relativeOrigin).ToOVRPose(); + //If the tracking origin type hasn't switched and the relative pose changes, a recenter occurred. + if (previousTrackingOrigin == OVRManager.instance.trackingOriginType && previousRelativeTrackingSpacePose != relativeTrackingSpacePose && RecenteredPose != null) + { + RecenteredPose(); + } + previousRelativeTrackingSpacePose = relativeTrackingSpacePose; + previousTrackingOrigin = OVRManager.instance.trackingOriginType; + } + } + + /// + /// Occurs when the head pose is reset. + /// + public event System.Action RecenteredPose; + + /// + /// Recenters the head pose. + /// + public void RecenterPose() + { +#if UNITY_2017_2_OR_NEWER + UnityEngine.XR.InputTracking.Recenter(); +#else + UnityEngine.VR.InputTracking.Recenter(); +#endif + + // The current poses are cached for the current frame and won't be updated immediately + // after UnityEngine.VR.InputTracking.Recenter(). So we need to wait until next frame + // to trigger the RecenteredPose delegate. The application could expect the correct pose + // when the RecenteredPose delegate get called. + recenterRequested = true; + recenterRequestedFrameCount = Time.frameCount; + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN + OVRMixedReality.RecenterPose(); +#endif + } + + /// + /// Gets the current linear acceleration of the head. + /// + public Vector3 acceleration + { + get { + if (!OVRManager.isHmdPresent) + return Vector3.zero; + + Vector3 retVec = Vector3.zero; + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.Head, NodeStatePropertyType.Acceleration, OVRPlugin.Node.Head, OVRPlugin.Step.Render, out retVec)) + return retVec; + return Vector3.zero; + } + } + + /// + /// Gets the current angular acceleration of the head in radians per second per second about each axis. + /// + public Vector3 angularAcceleration + { + get + { + if (!OVRManager.isHmdPresent) + return Vector3.zero; + + Vector3 retVec = Vector3.zero; + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.Head, NodeStatePropertyType.AngularAcceleration, OVRPlugin.Node.Head, OVRPlugin.Step.Render, out retVec)) + return retVec; + return Vector3.zero; + + } + } + + /// + /// Gets the current linear velocity of the head in meters per second. + /// + public Vector3 velocity + { + get + { + if (!OVRManager.isHmdPresent) + return Vector3.zero; + + Vector3 retVec = Vector3.zero; + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.Head, NodeStatePropertyType.Velocity, OVRPlugin.Node.Head, OVRPlugin.Step.Render, out retVec)) + return retVec; + return Vector3.zero; + } + } + + /// + /// Gets the current angular velocity of the head in radians per second about each axis. + /// + public Vector3 angularVelocity + { + get { + if (!OVRManager.isHmdPresent) + return Vector3.zero; + + Vector3 retVec = Vector3.zero; + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.Head, NodeStatePropertyType.AngularVelocity, OVRPlugin.Node.Head, OVRPlugin.Step.Render, out retVec)) + return retVec; + return Vector3.zero; + } + } + + /// + /// Gets the resolution and field of view for the given eye. + /// +#if UNITY_2017_2_OR_NEWER + public EyeRenderDesc GetEyeRenderDesc(UnityEngine.XR.XRNode eye) +#else + public EyeRenderDesc GetEyeRenderDesc(UnityEngine.VR.VRNode eye) +#endif + { + return eyeDescs[(int)eye]; + } + + /// + /// Gets the current measured latency values. + /// + public LatencyData latency + { + get { + if (!OVRManager.isHmdPresent) + return new LatencyData(); + + string latency = OVRPlugin.latency; + + var r = new Regex("Render: ([0-9]+[.][0-9]+)ms, TimeWarp: ([0-9]+[.][0-9]+)ms, PostPresent: ([0-9]+[.][0-9]+)ms", RegexOptions.None); + + var ret = new LatencyData(); + + Match match = r.Match(latency); + if (match.Success) + { + ret.render = float.Parse(match.Groups[1].Value); + ret.timeWarp = float.Parse(match.Groups[2].Value); + ret.postPresent = float.Parse(match.Groups[3].Value); + } + + return ret; + } + } + + /// + /// Gets application's frame rate reported by oculus plugin + /// + public float appFramerate + { + get + { + if (!OVRManager.isHmdPresent) + return 0; + + return OVRPlugin.GetAppFramerate(); + } + } + + /// + /// Gets the recommended MSAA level for optimal quality/performance the current device. + /// + public int recommendedMSAALevel + { + get + { + int result = OVRPlugin.recommendedMSAALevel; + + if (result == 1) + result = 0; + + return result; + } + } + + /// + /// Gets the list of available display frequencies supported by this hardware. + /// + public float[] displayFrequenciesAvailable + { + get { return OVRPlugin.systemDisplayFrequenciesAvailable; } + } + + /// + /// Gets and sets the current display frequency. + /// + public float displayFrequency + { + get + { + return OVRPlugin.systemDisplayFrequency; + } + set + { + OVRPlugin.systemDisplayFrequency = value; + } + } + + private void UpdateTextures() + { +#if UNITY_2017_2_OR_NEWER + ConfigureEyeDesc(UnityEngine.XR.XRNode.LeftEye); + ConfigureEyeDesc(UnityEngine.XR.XRNode.RightEye); +#else + ConfigureEyeDesc(UnityEngine.VR.VRNode.LeftEye); + ConfigureEyeDesc(UnityEngine.VR.VRNode.RightEye); +#endif + } + +#if UNITY_2017_2_OR_NEWER + private void ConfigureEyeDesc(UnityEngine.XR.XRNode eye) +#else + private void ConfigureEyeDesc(UnityEngine.VR.VRNode eye) +#endif + { + if (!OVRManager.isHmdPresent) + return; + + int eyeTextureWidth = Settings.eyeTextureWidth; + int eyeTextureHeight = Settings.eyeTextureHeight; + + eyeDescs[(int)eye] = new EyeRenderDesc(); + eyeDescs[(int)eye].resolution = new Vector2(eyeTextureWidth, eyeTextureHeight); + + OVRPlugin.Frustumf2 frust; + if (OVRPlugin.GetNodeFrustum2((OVRPlugin.Node)eye, out frust)) + { + eyeDescs[(int)eye].fullFov.LeftFov = Mathf.Rad2Deg * Mathf.Atan(frust.Fov.LeftTan); + eyeDescs[(int)eye].fullFov.RightFov = Mathf.Rad2Deg * Mathf.Atan(frust.Fov.RightTan); + eyeDescs[(int)eye].fullFov.UpFov = Mathf.Rad2Deg * Mathf.Atan(frust.Fov.UpTan); + eyeDescs[(int)eye].fullFov.DownFov = Mathf.Rad2Deg * Mathf.Atan(frust.Fov.DownTan); + } + else + { + OVRPlugin.Frustumf frustOld = OVRPlugin.GetEyeFrustum((OVRPlugin.Eye)eye); + eyeDescs[(int)eye].fullFov.LeftFov = Mathf.Rad2Deg * frustOld.fovX * 0.5f; + eyeDescs[(int)eye].fullFov.RightFov = Mathf.Rad2Deg * frustOld.fovX * 0.5f; + eyeDescs[(int)eye].fullFov.UpFov = Mathf.Rad2Deg * frustOld.fovY * 0.5f; + eyeDescs[(int)eye].fullFov.DownFov = Mathf.Rad2Deg * frustOld.fovY * 0.5f; + } + + // Symmetric Fov uses the maximum fov angle + float maxFovX = Mathf.Max(eyeDescs[(int)eye].fullFov.LeftFov, eyeDescs[(int)eye].fullFov.RightFov); + float maxFovY = Mathf.Max(eyeDescs[(int)eye].fullFov.UpFov, eyeDescs[(int)eye].fullFov.DownFov); + eyeDescs[(int)eye].fov.x = maxFovX * 2.0f; + eyeDescs[(int)eye].fov.y = maxFovY * 2.0f; + + if (!OVRPlugin.AsymmetricFovEnabled) + { + eyeDescs[(int)eye].fullFov.LeftFov = maxFovX; + eyeDescs[(int)eye].fullFov.RightFov = maxFovX; + + eyeDescs[(int)eye].fullFov.UpFov = maxFovY; + eyeDescs[(int)eye].fullFov.DownFov = maxFovY; + } + + + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRDisplay.cs.meta b/Assets/Oculus/VR/Scripts/OVRDisplay.cs.meta new file mode 100644 index 0000000..d987173 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRDisplay.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bb365ebe8e821fc4e81e9dca9d704357 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/OVRHaptics.cs b/Assets/Oculus/VR/Scripts/OVRHaptics.cs new file mode 100644 index 0000000..f7305da --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRHaptics.cs @@ -0,0 +1,388 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +/// +/// Plays tactile effects on a tracked VR controller. +/// +public static class OVRHaptics +{ + public readonly static OVRHapticsChannel[] Channels; + public readonly static OVRHapticsChannel LeftChannel; + public readonly static OVRHapticsChannel RightChannel; + + private readonly static OVRHapticsOutput[] m_outputs; + + static OVRHaptics() + { + Config.Load(); + + m_outputs = new OVRHapticsOutput[] + { + new OVRHapticsOutput((uint)OVRPlugin.Controller.LTouch), + new OVRHapticsOutput((uint)OVRPlugin.Controller.RTouch), + }; + + Channels = new OVRHapticsChannel[] + { + LeftChannel = new OVRHapticsChannel(0), + RightChannel = new OVRHapticsChannel(1), + }; + } + + /// + /// Determines the target format for haptics data on a specific device. + /// + public static class Config + { + public static int SampleRateHz { get; private set; } + public static int SampleSizeInBytes { get; private set; } + public static int MinimumSafeSamplesQueued { get; private set; } + public static int MinimumBufferSamplesCount { get; private set; } + public static int OptimalBufferSamplesCount { get; private set; } + public static int MaximumBufferSamplesCount { get; private set; } + + static Config() + { + Load(); + } + + public static void Load() + { + OVRPlugin.HapticsDesc desc = OVRPlugin.GetControllerHapticsDesc((uint)OVRPlugin.Controller.RTouch); + + SampleRateHz = desc.SampleRateHz; + SampleSizeInBytes = desc.SampleSizeInBytes; + MinimumSafeSamplesQueued = desc.MinimumSafeSamplesQueued; + MinimumBufferSamplesCount = desc.MinimumBufferSamplesCount; + OptimalBufferSamplesCount = desc.OptimalBufferSamplesCount; + MaximumBufferSamplesCount = desc.MaximumBufferSamplesCount; + } + } + + /// + /// A track of haptics data that can be mixed or sequenced with another track. + /// + public class OVRHapticsChannel + { + private OVRHapticsOutput m_output; + + /// + /// Constructs a channel targeting the specified output. + /// + public OVRHapticsChannel(uint outputIndex) + { + m_output = m_outputs[outputIndex]; + } + + /// + /// Cancels any currently-playing clips and immediatly plays the specified clip instead. + /// + public void Preempt(OVRHapticsClip clip) + { + m_output.Preempt(clip); + } + + /// + /// Enqueues the specified clip to play after any currently-playing clips finish. + /// + public void Queue(OVRHapticsClip clip) + { + m_output.Queue(clip); + } + + /// + /// Adds the specified clip to play simultaneously to the currently-playing clip(s). + /// + public void Mix(OVRHapticsClip clip) + { + m_output.Mix(clip); + } + + /// + /// Cancels any currently-playing clips. + /// + public void Clear() + { + m_output.Clear(); + } + } + + private class OVRHapticsOutput + { + private class ClipPlaybackTracker + { + public int ReadCount { get; set; } + public OVRHapticsClip Clip { get; set; } + + public ClipPlaybackTracker(OVRHapticsClip clip) + { + Clip = clip; + } + } + + private bool m_lowLatencyMode = true; + private bool m_paddingEnabled = true; + private int m_prevSamplesQueued = 0; + private float m_prevSamplesQueuedTime = 0; + private int m_numPredictionHits = 0; + private int m_numPredictionMisses = 0; + private int m_numUnderruns = 0; + private List m_pendingClips = new List(); + private uint m_controller = 0; + private OVRNativeBuffer m_nativeBuffer = new OVRNativeBuffer(OVRHaptics.Config.MaximumBufferSamplesCount * OVRHaptics.Config.SampleSizeInBytes); + private OVRHapticsClip m_paddingClip = new OVRHapticsClip(); + + public OVRHapticsOutput(uint controller) + { +#if UNITY_ANDROID + m_paddingEnabled = false; +#endif + m_controller = controller; + } + + /// + /// The system calls this each frame to update haptics playback. + /// + public void Process() + { + var hapticsState = OVRPlugin.GetControllerHapticsState(m_controller); + + float elapsedTime = Time.realtimeSinceStartup - m_prevSamplesQueuedTime; + if (m_prevSamplesQueued > 0) + { + int expectedSamples = m_prevSamplesQueued - (int)(elapsedTime * OVRHaptics.Config.SampleRateHz + 0.5f); + if (expectedSamples < 0) + expectedSamples = 0; + + if ((hapticsState.SamplesQueued - expectedSamples) == 0) + m_numPredictionHits++; + else + m_numPredictionMisses++; + + //Debug.Log(hapticsState.SamplesAvailable + "a " + hapticsState.SamplesQueued + "q " + expectedSamples + "e " + //+ "Prediction Accuracy: " + m_numPredictionHits / (float)(m_numPredictionMisses + m_numPredictionHits)); + + if ((expectedSamples > 0) && (hapticsState.SamplesQueued == 0)) + { + m_numUnderruns++; + //Debug.LogError("Samples Underrun (" + m_controller + " #" + m_numUnderruns + ") -" + // + " Expected: " + expectedSamples + // + " Actual: " + hapticsState.SamplesQueued); + } + + m_prevSamplesQueued = hapticsState.SamplesQueued; + m_prevSamplesQueuedTime = Time.realtimeSinceStartup; + } + + int desiredSamplesCount = OVRHaptics.Config.OptimalBufferSamplesCount; + if (m_lowLatencyMode) + { + float sampleRateMs = 1000.0f / (float)OVRHaptics.Config.SampleRateHz; + float elapsedMs = elapsedTime * 1000.0f; + int samplesNeededPerFrame = (int)Mathf.Ceil(elapsedMs / sampleRateMs); + int lowLatencySamplesCount = OVRHaptics.Config.MinimumSafeSamplesQueued + samplesNeededPerFrame; + + if (lowLatencySamplesCount < desiredSamplesCount) + desiredSamplesCount = lowLatencySamplesCount; + } + + if (hapticsState.SamplesQueued > desiredSamplesCount) + return; + + if (desiredSamplesCount > OVRHaptics.Config.MaximumBufferSamplesCount) + desiredSamplesCount = OVRHaptics.Config.MaximumBufferSamplesCount; + if (desiredSamplesCount > hapticsState.SamplesAvailable) + desiredSamplesCount = hapticsState.SamplesAvailable; + + int acquiredSamplesCount = 0; + int clipIndex = 0; + while(acquiredSamplesCount < desiredSamplesCount && clipIndex < m_pendingClips.Count) + { + int numSamplesToCopy = desiredSamplesCount - acquiredSamplesCount; + int remainingSamplesInClip = m_pendingClips[clipIndex].Clip.Count - m_pendingClips[clipIndex].ReadCount; + if (numSamplesToCopy > remainingSamplesInClip) + numSamplesToCopy = remainingSamplesInClip; + + if (numSamplesToCopy > 0) + { + int numBytes = numSamplesToCopy * OVRHaptics.Config.SampleSizeInBytes; + int dstOffset = acquiredSamplesCount * OVRHaptics.Config.SampleSizeInBytes; + int srcOffset = m_pendingClips[clipIndex].ReadCount * OVRHaptics.Config.SampleSizeInBytes; + Marshal.Copy(m_pendingClips[clipIndex].Clip.Samples, srcOffset, m_nativeBuffer.GetPointer(dstOffset), numBytes); + + m_pendingClips[clipIndex].ReadCount += numSamplesToCopy; + acquiredSamplesCount += numSamplesToCopy; + } + + clipIndex++; + } + + for (int i = m_pendingClips.Count - 1; i >= 0 && m_pendingClips.Count > 0; i--) + { + if (m_pendingClips[i].ReadCount >= m_pendingClips[i].Clip.Count) + m_pendingClips.RemoveAt(i); + } + + if (m_paddingEnabled) + { + int desiredPadding = desiredSamplesCount - (hapticsState.SamplesQueued + acquiredSamplesCount); + if (desiredPadding < (OVRHaptics.Config.MinimumBufferSamplesCount - acquiredSamplesCount)) + desiredPadding = (OVRHaptics.Config.MinimumBufferSamplesCount - acquiredSamplesCount); + if (desiredPadding > hapticsState.SamplesAvailable) + desiredPadding = hapticsState.SamplesAvailable; + + if (desiredPadding > 0) + { + int numBytes = desiredPadding * OVRHaptics.Config.SampleSizeInBytes; + int dstOffset = acquiredSamplesCount * OVRHaptics.Config.SampleSizeInBytes; + int srcOffset = 0; + Marshal.Copy(m_paddingClip.Samples, srcOffset, m_nativeBuffer.GetPointer(dstOffset), numBytes); + + acquiredSamplesCount += desiredPadding; + } + } + + if (acquiredSamplesCount > 0) + { + OVRPlugin.HapticsBuffer hapticsBuffer; + hapticsBuffer.Samples = m_nativeBuffer.GetPointer(); + hapticsBuffer.SamplesCount = acquiredSamplesCount; + + OVRPlugin.SetControllerHaptics(m_controller, hapticsBuffer); + + hapticsState = OVRPlugin.GetControllerHapticsState(m_controller); + m_prevSamplesQueued = hapticsState.SamplesQueued; + m_prevSamplesQueuedTime = Time.realtimeSinceStartup; + } + } + + /// + /// Immediately plays the specified clip without waiting for any currently-playing clip to finish. + /// + public void Preempt(OVRHapticsClip clip) + { + m_pendingClips.Clear(); + m_pendingClips.Add(new ClipPlaybackTracker(clip)); + } + + /// + /// Enqueues the specified clip to play after any currently-playing clip finishes. + /// + public void Queue(OVRHapticsClip clip) + { + m_pendingClips.Add(new ClipPlaybackTracker(clip)); + } + + /// + /// Adds the samples from the specified clip to the ones in the currently-playing clip(s). + /// + public void Mix(OVRHapticsClip clip) + { + int numClipsToMix = 0; + int numSamplesToMix = 0; + int numSamplesRemaining = clip.Count; + + while (numSamplesRemaining > 0 && numClipsToMix < m_pendingClips.Count) + { + int numSamplesRemainingInClip = m_pendingClips[numClipsToMix].Clip.Count - m_pendingClips[numClipsToMix].ReadCount; + numSamplesRemaining -= numSamplesRemainingInClip; + numSamplesToMix += numSamplesRemainingInClip; + numClipsToMix++; + } + + if (numSamplesRemaining > 0) + { + numSamplesToMix += numSamplesRemaining; + numSamplesRemaining = 0; + } + + if (numClipsToMix > 0) + { + OVRHapticsClip mixClip = new OVRHapticsClip(numSamplesToMix); + + OVRHapticsClip a = clip; + int aReadCount = 0; + + for (int i = 0; i < numClipsToMix; i++) + { + OVRHapticsClip b = m_pendingClips[i].Clip; + for(int bReadCount = m_pendingClips[i].ReadCount; bReadCount < b.Count; bReadCount++) + { + if (OVRHaptics.Config.SampleSizeInBytes == 1) + { + byte sample = 0; // TODO support multi-byte samples + if ((aReadCount < a.Count) && (bReadCount < b.Count)) + { + sample = (byte)(Mathf.Clamp(a.Samples[aReadCount] + b.Samples[bReadCount], 0, System.Byte.MaxValue)); // TODO support multi-byte samples + aReadCount++; + } + else if (bReadCount < b.Count) + { + sample = b.Samples[bReadCount]; // TODO support multi-byte samples + } + + mixClip.WriteSample(sample); // TODO support multi-byte samples + } + } + } + + while (aReadCount < a.Count) + { + if (OVRHaptics.Config.SampleSizeInBytes == 1) + { + mixClip.WriteSample(a.Samples[aReadCount]); // TODO support multi-byte samples + } + aReadCount++; + } + + m_pendingClips[0] = new ClipPlaybackTracker(mixClip); + for (int i = 1; i < numClipsToMix; i++) + { + m_pendingClips.RemoveAt(1); + } + } + else + { + m_pendingClips.Add(new ClipPlaybackTracker(clip)); + } + } + + public void Clear() + { + m_pendingClips.Clear(); + } + } + + /// + /// The system calls this each frame to update haptics playback. + /// + public static void Process() + { + Config.Load(); + + for (int i = 0; i < m_outputs.Length; i++) + { + m_outputs[i].Process(); + } + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRHaptics.cs.meta b/Assets/Oculus/VR/Scripts/OVRHaptics.cs.meta new file mode 100644 index 0000000..2b8dc5c --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRHaptics.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d3b22b858e27329498781f145fa42610 +timeCreated: 1463018541 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/OVRHapticsClip.cs b/Assets/Oculus/VR/Scripts/OVRHapticsClip.cs new file mode 100644 index 0000000..16854d5 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRHapticsClip.cs @@ -0,0 +1,164 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections; + +/// +/// A PCM buffer of data for a haptics effect. +/// +public class OVRHapticsClip +{ + /// + /// The current number of samples in the clip. + /// + public int Count { get; private set; } + + /// + /// The maximum number of samples the clip can store. + /// + public int Capacity { get; private set; } + + /// + /// The raw haptics data. + /// + public byte[] Samples { get; private set; } + + public OVRHapticsClip() + { + Capacity = OVRHaptics.Config.MaximumBufferSamplesCount; + Samples = new byte[Capacity * OVRHaptics.Config.SampleSizeInBytes]; + } + + /// + /// Creates a clip with the specified capacity. + /// + public OVRHapticsClip(int capacity) + { + Capacity = (capacity >= 0) ? capacity : 0; + Samples = new byte[Capacity * OVRHaptics.Config.SampleSizeInBytes]; + } + + /// + /// Creates a clip with the specified data. + /// + public OVRHapticsClip(byte[] samples, int samplesCount) + { + Samples = samples; + Capacity = Samples.Length / OVRHaptics.Config.SampleSizeInBytes; + Count = (samplesCount >= 0) ? samplesCount : 0; + } + + /// + /// Creates a clip by mixing the specified clips. + /// + public OVRHapticsClip(OVRHapticsClip a, OVRHapticsClip b) + { + int maxCount = a.Count; + if (b.Count > maxCount) + maxCount = b.Count; + + Capacity = maxCount; + Samples = new byte[Capacity * OVRHaptics.Config.SampleSizeInBytes]; + + for (int i = 0; i < a.Count || i < b.Count; i++) + { + if (OVRHaptics.Config.SampleSizeInBytes == 1) + { + byte sample = 0; // TODO support multi-byte samples + if ((i < a.Count) && (i < b.Count)) + sample = (byte)(Mathf.Clamp(a.Samples[i] + b.Samples[i], 0, System.Byte.MaxValue)); // TODO support multi-byte samples + else if (i < a.Count) + sample = a.Samples[i]; // TODO support multi-byte samples + else if (i < b.Count) + sample = b.Samples[i]; // TODO support multi-byte samples + + WriteSample(sample); // TODO support multi-byte samples + } + } + } + + /// + /// Creates a haptics clip from the specified audio clip. + /// + public OVRHapticsClip(AudioClip audioClip, int channel = 0) + { + float[] audioData = new float[audioClip.samples * audioClip.channels]; + audioClip.GetData(audioData, 0); + + InitializeFromAudioFloatTrack(audioData, audioClip.frequency, audioClip.channels, channel); + } + + /// + /// Adds the specified sample to the end of the clip. + /// + public void WriteSample(byte sample) // TODO support multi-byte samples + { + if (Count >= Capacity) + { + //Debug.LogError("Attempted to write OVRHapticsClip sample out of range - Count:" + Count + " Capacity:" + Capacity); + return; + } + + if (OVRHaptics.Config.SampleSizeInBytes == 1) + { + Samples[Count * OVRHaptics.Config.SampleSizeInBytes] = sample; // TODO support multi-byte samples + } + + Count++; + } + + /// + /// Clears the clip and resets its size to 0. + /// + public void Reset() + { + Count = 0; + } + + private void InitializeFromAudioFloatTrack(float[] sourceData, double sourceFrequency, int sourceChannelCount, int sourceChannel) + { + double stepSizePrecise = (sourceFrequency + 1e-6) / OVRHaptics.Config.SampleRateHz; + + if (stepSizePrecise < 1.0) + return; + + int stepSize = (int)stepSizePrecise; + double stepSizeError = stepSizePrecise - stepSize; + double accumulatedStepSizeError = 0.0f; + int length = sourceData.Length; + + Count = 0; + Capacity = length / sourceChannelCount / stepSize + 1; + Samples = new byte[Capacity * OVRHaptics.Config.SampleSizeInBytes]; + + int i = sourceChannel % sourceChannelCount; + while (i < length) + { + if (OVRHaptics.Config.SampleSizeInBytes == 1) + { + WriteSample((byte)(Mathf.Clamp01(Mathf.Abs(sourceData[i])) * System.Byte.MaxValue)); // TODO support multi-byte samples + } + i+= stepSize * sourceChannelCount; + accumulatedStepSizeError += stepSizeError; + if ((int)accumulatedStepSizeError > 0) + { + i+= (int)accumulatedStepSizeError * sourceChannelCount; + accumulatedStepSizeError = accumulatedStepSizeError - (int)accumulatedStepSizeError; + } + } + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRHapticsClip.cs.meta b/Assets/Oculus/VR/Scripts/OVRHapticsClip.cs.meta new file mode 100644 index 0000000..0dbab4e --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRHapticsClip.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c123270a848515b458069b5242866451 +timeCreated: 1467575852 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/OVRHeadsetEmulator.cs b/Assets/Oculus/VR/Scripts/OVRHeadsetEmulator.cs new file mode 100644 index 0000000..8b87dac --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRHeadsetEmulator.cs @@ -0,0 +1,173 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class OVRHeadsetEmulator : MonoBehaviour { + public enum OpMode + { + Off, + EditorOnly, + AlwaysOn + } + + public OpMode opMode = OpMode.EditorOnly; + public bool resetHmdPoseOnRelease = true; + public bool resetHmdPoseByMiddleMouseButton = true; + + public KeyCode[] activateKeys = new KeyCode[] { KeyCode.LeftControl, KeyCode.RightControl }; + + public KeyCode[] pitchKeys = new KeyCode[] { KeyCode.LeftAlt, KeyCode.RightAlt }; + + OVRManager manager; + + const float MOUSE_SCALE_X = -2.0f; + const float MOUSE_SCALE_X_PITCH = -2.0f; + const float MOUSE_SCALE_Y = 2.0f; + const float MOUSE_SCALE_HEIGHT = 1.0f; + const float MAX_ROLL = 85.0f; + + private bool lastFrameEmulationActivated = false; + + private Vector3 recordedHeadPoseRelativeOffsetTranslation; + private Vector3 recordedHeadPoseRelativeOffsetRotation; + + private bool hasSentEvent = false; + private bool emulatorHasInitialized = false; + + // Use this for initialization + void Start () { + } + + // Update is called once per frame + void Update () { + if (!emulatorHasInitialized) + { + if (OVRManager.OVRManagerinitialized) + { + Cursor.lockState = CursorLockMode.None; + manager = OVRManager.instance; + recordedHeadPoseRelativeOffsetTranslation = manager.headPoseRelativeOffsetTranslation; + recordedHeadPoseRelativeOffsetRotation = manager.headPoseRelativeOffsetRotation; + emulatorHasInitialized = true; + } + else + return; + } + bool emulationActivated = IsEmulationActivated(); + if (emulationActivated) + { + Cursor.lockState = CursorLockMode.Locked; + + if (!lastFrameEmulationActivated && resetHmdPoseOnRelease) + { + manager.headPoseRelativeOffsetTranslation = recordedHeadPoseRelativeOffsetTranslation; + manager.headPoseRelativeOffsetRotation = recordedHeadPoseRelativeOffsetRotation; + } + + if (resetHmdPoseByMiddleMouseButton && Input.GetMouseButton(2)) + { + manager.headPoseRelativeOffsetTranslation = Vector3.zero; + manager.headPoseRelativeOffsetRotation = Vector3.zero; + } + else + { + Vector3 emulatedTranslation = manager.headPoseRelativeOffsetTranslation; + float deltaMouseScrollWheel = Input.GetAxis("Mouse ScrollWheel"); + float emulatedHeight = deltaMouseScrollWheel * MOUSE_SCALE_HEIGHT; + emulatedTranslation.y += emulatedHeight; + manager.headPoseRelativeOffsetTranslation = emulatedTranslation; + + float deltaX = Input.GetAxis("Mouse X"); + float deltaY = Input.GetAxis("Mouse Y"); + + Vector3 emulatedAngles = manager.headPoseRelativeOffsetRotation; + float emulatedRoll = emulatedAngles.x; + float emulatedYaw = emulatedAngles.y; + float emulatedPitch = emulatedAngles.z; + if (IsTweakingPitch()) + { + emulatedPitch += deltaX * MOUSE_SCALE_X_PITCH; + } + else + { + emulatedRoll += deltaY * MOUSE_SCALE_Y; + emulatedYaw += deltaX * MOUSE_SCALE_X; + } + + manager.headPoseRelativeOffsetRotation = new Vector3(emulatedRoll, emulatedYaw, emulatedPitch); + } + + if (!hasSentEvent) + { + OVRPlugin.SendEvent("headset_emulator", "activated"); + hasSentEvent = true; + } + } + else + { + Cursor.lockState = CursorLockMode.None; + if (lastFrameEmulationActivated) + { + recordedHeadPoseRelativeOffsetTranslation = manager.headPoseRelativeOffsetTranslation; + recordedHeadPoseRelativeOffsetRotation = manager.headPoseRelativeOffsetRotation; + + if (resetHmdPoseOnRelease) + { + manager.headPoseRelativeOffsetTranslation = Vector3.zero; + manager.headPoseRelativeOffsetRotation = Vector3.zero; + } + } + } + lastFrameEmulationActivated = emulationActivated; + } + + bool IsEmulationActivated() + { + if (opMode == OpMode.Off) + { + return false; + } + else if (opMode == OpMode.EditorOnly && !Application.isEditor) + { + return false; + } + + foreach (KeyCode key in activateKeys) + { + if (Input.GetKey(key)) + return true; + } + + return false; + } + + bool IsTweakingPitch() + { + if (!IsEmulationActivated()) + return false; + + foreach (KeyCode key in pitchKeys) + { + if (Input.GetKey(key)) + return true; + } + + return false; + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRHeadsetEmulator.cs.meta b/Assets/Oculus/VR/Scripts/OVRHeadsetEmulator.cs.meta new file mode 100644 index 0000000..56acace --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRHeadsetEmulator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5178bc8574ce2bf4388e787a2e2af326 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/OVRInput.cs b/Assets/Oculus/VR/Scripts/OVRInput.cs new file mode 100644 index 0000000..207ec34 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRInput.cs @@ -0,0 +1,3796 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using UnityEngine; + +#if UNITY_2017_2_OR_NEWER +using InputTracking = UnityEngine.XR.InputTracking; +using Node = UnityEngine.XR.XRNode; +using Settings = UnityEngine.XR.XRSettings; +#else +using InputTracking = UnityEngine.VR.InputTracking; +using Node = UnityEngine.VR.VRNode; +using Settings = UnityEngine.VR.VRSettings; +#endif + +/// +/// Provides a unified input system for Oculus controllers and gamepads. +/// +public static class OVRInput +{ + [Flags] + /// Virtual button mappings that allow the same input bindings to work across different controllers. + public enum Button + { + None = 0, ///< Maps to RawButton: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + One = 0x00000001, ///< Maps to RawButton: [Gamepad, Touch, RTouch: A], [LTouch: X], [LTrackedRemote: LTouchpad], [RTrackedRemote: RTouchpad], [Touchpad, Remote: Start] + Two = 0x00000002, ///< Maps to RawButton: [Gamepad, Touch, RTouch: B], [LTouch: Y], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: Back] + Three = 0x00000004, ///< Maps to RawButton: [Gamepad, Touch: X], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Four = 0x00000008, ///< Maps to RawButton: [Gamepad, Touch: Y], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Start = 0x00000100, ///< Maps to RawButton: [Gamepad: Start], [Touch, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: Start], [RTouch: None] + Back = 0x00000200, ///< Maps to RawButton: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: Back], [Touch, LTouch, RTouch: None] + PrimaryShoulder = 0x00001000, ///< Maps to RawButton: [Gamepad: LShoulder], [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryIndexTrigger = 0x00002000, ///< Maps to RawButton: [Gamepad, Touch, LTouch, LTrackedRemote: LIndexTrigger], [RTouch, RTrackedRemote: RIndexTrigger], [Touchpad, Remote: None] + PrimaryHandTrigger = 0x00004000, ///< Maps to RawButton: [Touch, LTouch: LHandTrigger], [RTouch: RHandTrigger], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryThumbstick = 0x00008000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstick], [RTouch: RThumbstick], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryThumbstickUp = 0x00010000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickUp], [RTouch: RThumbstickUp], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryThumbstickDown = 0x00020000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickDown], [RTouch: RThumbstickDown], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryThumbstickLeft = 0x00040000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickLeft], [RTouch: RThumbstickLeft], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryThumbstickRight = 0x00080000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickRight], [RTouch: RThumbstickRight], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryTouchpad = 0x00000400, ///< Maps to RawButton: [LTrackedRemote, Touchpad: LTouchpad], [RTrackedRemote: RTouchpad], [Gamepad, Touch, LTouch, RTouch, Remote: None] + SecondaryShoulder = 0x00100000, ///< Maps to RawButton: [Gamepad: RShoulder], [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryIndexTrigger = 0x00200000, ///< Maps to RawButton: [Gamepad, Touch: RIndexTrigger], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryHandTrigger = 0x00400000, ///< Maps to RawButton: [Touch: RHandTrigger], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryThumbstick = 0x00800000, ///< Maps to RawButton: [Gamepad, Touch: RThumbstick], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryThumbstickUp = 0x01000000, ///< Maps to RawButton: [Gamepad, Touch: RThumbstickUp], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryThumbstickDown = 0x02000000, ///< Maps to RawButton: [Gamepad, Touch: RThumbstickDown], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryThumbstickLeft = 0x04000000, ///< Maps to RawButton: [Gamepad, Touch: RThumbstickLeft], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryThumbstickRight = 0x08000000, ///< Maps to RawButton: [Gamepad, Touch: RThumbstickRight], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryTouchpad = 0x00000800, ///< Maps to RawButton: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + DpadUp = 0x00000010, ///< Maps to RawButton: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadUp], [Touch, LTouch, RTouch: None] + DpadDown = 0x00000020, ///< Maps to RawButton: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadDown], [Touch, LTouch, RTouch: None] + DpadLeft = 0x00000040, ///< Maps to RawButton: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadLeft], [Touch, LTouch, RTouch: None] + DpadRight = 0x00000080, ///< Maps to RawButton: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadRight], [Touch, LTouch, RTouch: None] + Up = 0x10000000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickUp], [RTouch: RThumbstickUp], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadUp] + Down = 0x20000000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickDown], [RTouch: RThumbstickDown], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadDown] + Left = 0x40000000, ///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickLeft], [RTouch: RThumbstickLeft], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadLeft] + Right = unchecked((int)0x80000000),///< Maps to RawButton: [Gamepad, Touch, LTouch: LThumbstickRight], [RTouch: RThumbstickRight], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadRight] + Any = ~None, ///< Maps to RawButton: [Gamepad, Touch, LTouch, RTouch: Any] + } + + [Flags] + /// Raw button mappings that can be used to directly query the state of a controller. + public enum RawButton + { + None = 0, ///< Maps to Physical Button: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + A = 0x00000001, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: A], [LTrackedRemote: LIndexTrigger], [RTrackedRemote: RIndexTrigger], [LTouch, Touchpad, Remote: None] + B = 0x00000002, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: B], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + X = 0x00000100, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: X], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Y = 0x00000200, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: Y], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Start = 0x00100000, ///< Maps to Physical Button: [Gamepad, Touch, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: Start], [RTouch: None] + Back = 0x00200000, ///< Maps to Physical Button: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: Back], [Touch, LTouch, RTouch: None] + LShoulder = 0x00000800, ///< Maps to Physical Button: [Gamepad: LShoulder], [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LIndexTrigger = 0x10000000, ///< Maps to Physical Button: [Gamepad, Touch, LTouch, LTrackedRemote: LIndexTrigger], [RTouch, RTrackedRemote, Touchpad, Remote: None] + LHandTrigger = 0x20000000, ///< Maps to Physical Button: [Touch, LTouch: LHandTrigger], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LThumbstick = 0x00000400, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: LThumbstick], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LThumbstickUp = 0x00000010, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: LThumbstickUp], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LThumbstickDown = 0x00000020, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: LThumbstickDown], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LThumbstickLeft = 0x00000040, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: LThumbstickLeft], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LThumbstickRight = 0x00000080, ///< Maps to Physical Button: [Gamepad, Touch, LTouch: LThumbstickRight], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LTouchpad = 0x40000000, ///< Maps to Physical Button: [LTrackedRemote: LTouchpad], [Gamepad, Touch, LTouch, RTouch, RTrackedRemote, Touchpad, Remote: None] + RShoulder = 0x00000008, ///< Maps to Physical Button: [Gamepad: RShoulder], [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RIndexTrigger = 0x04000000, ///< Maps to Physical Button: [Gamepad, Touch, RTouch, RTrackedRemote: RIndexTrigger], [LTouch, LTrackedRemote, Touchpad, Remote: None] + RHandTrigger = 0x08000000, ///< Maps to Physical Button: [Touch, RTouch: RHandTrigger], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RThumbstick = 0x00000004, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: RThumbstick], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RThumbstickUp = 0x00001000, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: RThumbstickUp], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RThumbstickDown = 0x00002000, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: RThumbstickDown], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RThumbstickLeft = 0x00004000, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: RThumbstickLeft], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RThumbstickRight = 0x00008000, ///< Maps to Physical Button: [Gamepad, Touch, RTouch: RThumbstickRight], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RTouchpad = unchecked((int)0x80000000),///< Maps to Physical Button: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + DpadUp = 0x00010000, ///< Maps to Physical Button: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadUp], [Touch, LTouch, RTouch: None] + DpadDown = 0x00020000, ///< Maps to Physical Button: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadDown], [Touch, LTouch, RTouch: None] + DpadLeft = 0x00040000, ///< Maps to Physical Button: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadLeft], [Touch, LTouch, RTouch: None] + DpadRight = 0x00080000, ///< Maps to Physical Button: [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: DpadRight], [Touch, LTouch, RTouch: None] + Any = ~None, ///< Maps to Physical Button: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: Any] + } + + [Flags] + /// Virtual capacitive touch mappings that allow the same input bindings to work across different controllers with capacitive touch support. + public enum Touch + { + None = 0, ///< Maps to RawTouch: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + One = Button.One, ///< Maps to RawTouch: [Touch, RTouch: A], [LTouch: X], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Two = Button.Two, ///< Maps to RawTouch: [Touch, RTouch: B], [LTouch: Y], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Three = Button.Three, ///< Maps to RawTouch: [Touch: X], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Four = Button.Four, ///< Maps to RawTouch: [Touch: Y], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryIndexTrigger = Button.PrimaryIndexTrigger, ///< Maps to RawTouch: [Touch, LTouch: LIndexTrigger], [RTouch: RIndexTrigger], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryThumbstick = Button.PrimaryThumbstick, ///< Maps to RawTouch: [Touch, LTouch: LThumbstick], [RTouch: RThumbstick], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryThumbRest = 0x00001000, ///< Maps to RawTouch: [Touch, LTouch: LThumbRest], [RTouch: RThumbRest], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryTouchpad = Button.PrimaryTouchpad, ///< Maps to RawTouch: [LTrackedRemote, Touchpad: LTouchpad], [RTrackedRemote: RTouchpad], [Gamepad, Touch, LTouch, RTouch, Remote: None] + SecondaryIndexTrigger = Button.SecondaryIndexTrigger, ///< Maps to RawTouch: [Touch: RIndexTrigger], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryThumbstick = Button.SecondaryThumbstick, ///< Maps to RawTouch: [Touch: RThumbstick], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryThumbRest = 0x00100000, ///< Maps to RawTouch: [Touch: RThumbRest], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryTouchpad = Button.SecondaryTouchpad, ///< Maps to RawTouch: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Any = ~None, ///< Maps to RawTouch: [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad: Any], [Gamepad, Remote: None] + } + + [Flags] + /// Raw capacitive touch mappings that can be used to directly query the state of a controller. + public enum RawTouch + { + None = 0, ///< Maps to Physical Touch: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + A = RawButton.A, ///< Maps to Physical Touch: [Touch, RTouch: A], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + B = RawButton.B, ///< Maps to Physical Touch: [Touch, RTouch: B], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + X = RawButton.X, ///< Maps to Physical Touch: [Touch, LTouch: X], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Y = RawButton.Y, ///< Maps to Physical Touch: [Touch, LTouch: Y], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LIndexTrigger = 0x00001000, ///< Maps to Physical Touch: [Touch, LTouch: LIndexTrigger], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LThumbstick = RawButton.LThumbstick, ///< Maps to Physical Touch: [Touch, LTouch: LThumbstick], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LThumbRest = 0x00000800, ///< Maps to Physical Touch: [Touch, LTouch: LThumbRest], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LTouchpad = RawButton.LTouchpad, ///< Maps to Physical Touch: [LTrackedRemote, Touchpad: LTouchpad], [Gamepad, Touch, LTouch, RTouch, RTrackedRemote, Remote: None] + RIndexTrigger = 0x00000010, ///< Maps to Physical Touch: [Touch, RTouch: RIndexTrigger], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RThumbstick = RawButton.RThumbstick, ///< Maps to Physical Touch: [Touch, RTouch: RThumbstick], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RThumbRest = 0x00000008, ///< Maps to Physical Touch: [Touch, RTouch: RThumbRest], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RTouchpad = RawButton.RTouchpad, ///< Maps to Physical Touch: [RTrackedRemote: RTouchpad], [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, Touchpad, Remote: None] + Any = ~None, ///< Maps to Physical Touch: [Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad: Any], [Gamepad, Remote: None] + } + + [Flags] + /// Virtual near touch mappings that allow the same input bindings to work across different controllers with near touch support. + /// A near touch uses the capacitive touch sensors of a controller to detect approximate finger proximity prior to a full touch being reported. + public enum NearTouch + { + None = 0, ///< Maps to RawNearTouch: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryIndexTrigger = 0x00000001, ///< Maps to RawNearTouch: [Touch, LTouch: LIndexTrigger], [RTouch: RIndexTrigger], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryThumbButtons = 0x00000002, ///< Maps to RawNearTouch: [Touch, LTouch: LThumbButtons], [RTouch: RThumbButtons], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryIndexTrigger = 0x00000004, ///< Maps to RawNearTouch: [Touch: RIndexTrigger], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryThumbButtons = 0x00000008, ///< Maps to RawNearTouch: [Touch: RThumbButtons], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Any = ~None, ///< Maps to RawNearTouch: [Touch, LTouch, RTouch: Any], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + } + + [Flags] + /// Raw near touch mappings that can be used to directly query the state of a controller. + public enum RawNearTouch + { + None = 0, ///< Maps to Physical NearTouch: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LIndexTrigger = 0x00000001, ///< Maps to Physical NearTouch: [Touch, LTouch: Implies finger is in close proximity to LIndexTrigger.], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LThumbButtons = 0x00000002, ///< Maps to Physical NearTouch: [Touch, LTouch: Implies thumb is in close proximity to LThumbstick OR X/Y buttons.], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RIndexTrigger = 0x00000004, ///< Maps to Physical NearTouch: [Touch, RTouch: Implies finger is in close proximity to RIndexTrigger.], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RThumbButtons = 0x00000008, ///< Maps to Physical NearTouch: [Touch, RTouch: Implies thumb is in close proximity to RThumbstick OR A/B buttons.], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Any = ~None, ///< Maps to Physical NearTouch: [Touch, LTouch, RTouch: Any], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + } + + [Flags] + /// Virtual 1-dimensional axis (float) mappings that allow the same input bindings to work across different controllers. + public enum Axis1D + { + None = 0, ///< Maps to RawAxis1D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryIndexTrigger = 0x01, ///< Maps to RawAxis1D: [Gamepad, Touch, LTouch: LIndexTrigger], [RTouch: RIndexTrigger], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryHandTrigger = 0x04, ///< Maps to RawAxis1D: [Touch, LTouch: LHandTrigger], [RTouch: RHandTrigger], [Gamepad, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryIndexTrigger = 0x02, ///< Maps to RawAxis1D: [Gamepad, Touch: RIndexTrigger], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryHandTrigger = 0x08, ///< Maps to RawAxis1D: [Touch: RHandTrigger], [Gamepad, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Any = ~None, ///< Maps to RawAxis1D: [Gamepad, Touch, LTouch, RTouch: Any], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + } + + [Flags] + /// Raw 1-dimensional axis (float) mappings that can be used to directly query the state of a controller. + public enum RawAxis1D + { + None = 0, ///< Maps to Physical Axis1D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LIndexTrigger = 0x01, ///< Maps to Physical Axis1D: [Gamepad, Touch, LTouch: LIndexTrigger], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LHandTrigger = 0x04, ///< Maps to Physical Axis1D: [Touch, LTouch: LHandTrigger], [Gamepad, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RIndexTrigger = 0x02, ///< Maps to Physical Axis1D: [Gamepad, Touch, RTouch: RIndexTrigger], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RHandTrigger = 0x08, ///< Maps to Physical Axis1D: [Touch, RTouch: RHandTrigger], [Gamepad, LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Any = ~None, ///< Maps to Physical Axis1D: [Gamepad, Touch, LTouch, RTouch: Any], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + } + + [Flags] + /// Virtual 2-dimensional axis (Vector2) mappings that allow the same input bindings to work across different controllers. + public enum Axis2D + { + None = 0, ///< Maps to RawAxis2D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryThumbstick = 0x01, ///< Maps to RawAxis2D: [Gamepad, Touch, LTouch: LThumbstick], [RTouch: RThumbstick], [LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + PrimaryTouchpad = 0x04, ///< Maps to RawAxis2D: [LTrackedRemote, Touchpad: LTouchpad], RTrackedRemote: RTouchpad], [Gamepad, Touch, LTouch, RTouch, Remote: None] + SecondaryThumbstick = 0x02, ///< Maps to RawAxis2D: [Gamepad, Touch: RThumbstick], [LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + SecondaryTouchpad = 0x08, ///< Maps to RawAxis2D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + Any = ~None, ///< Maps to RawAxis2D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad: Any], [Remote: None] + } + + [Flags] + /// Raw 2-dimensional axis (Vector2) mappings that can be used to directly query the state of a controller. + public enum RawAxis2D + { + None = 0, ///< Maps to Physical Axis2D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LThumbstick = 0x01, ///< Maps to Physical Axis2D: [Gamepad, Touch, LTouch: LThumbstick], [RTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + LTouchpad = 0x04, ///< Maps to Physical Axis2D: [LTrackedRemote, Touchpad: LTouchpad], [Gamepad, Touch, LTouch, RTouch, RTrackedRemote, Remote: None] + RThumbstick = 0x02, ///< Maps to Physical Axis2D: [Gamepad, Touch, RTouch: RThumbstick], [LTouch, LTrackedRemote, RTrackedRemote, Touchpad, Remote: None] + RTouchpad = 0x08, ///< Maps to Physical Axis2D: [RTrackedRemote: RTouchpad], [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, Touchpad, Remote: None] + Any = ~None, ///< Maps to Physical Axis2D: [Gamepad, Touch, LTouch, RTouch, LTrackedRemote, RTrackedRemote: Any], [Touchpad, Remote: None] + } + + [Flags] + /// OpenVR Controller State Enum + public enum OpenVRButton : ulong + { + None = 0, + Two = 0x0002, + Thumbstick = 0x100000000, + Grip = 0x0004, + } + + [Flags] + /// Identifies a controller which can be used to query the virtual or raw input state. + public enum Controller + { + None = OVRPlugin.Controller.None, ///< Null controller. + LTouch = OVRPlugin.Controller.LTouch, ///< Left Oculus Touch controller. Virtual input mapping differs from the combined L/R Touch mapping. + RTouch = OVRPlugin.Controller.RTouch, ///< Right Oculus Touch controller. Virtual input mapping differs from the combined L/R Touch mapping. + Touch = OVRPlugin.Controller.Touch, ///< Combined Left/Right pair of Oculus Touch controllers. + Remote = OVRPlugin.Controller.Remote, ///< Oculus Remote controller. + Gamepad = OVRPlugin.Controller.Gamepad, ///< Xbox 360 or Xbox One gamepad on PC. Generic gamepad on Android. + Hands = OVRPlugin.Controller.Hands, ///< Left Hand provided by hand-tracking. + LHand = OVRPlugin.Controller.LHand, ///< Left Hand provided by hand-tracking. + RHand = OVRPlugin.Controller.RHand, ///< Right Hand provided by hand-tracking. + Touchpad = OVRPlugin.Controller.Touchpad, ///< GearVR touchpad on Android. + LTrackedRemote = OVRPlugin.Controller.LTrackedRemote, ///< Left GearVR tracked remote on Android. + RTrackedRemote = OVRPlugin.Controller.RTrackedRemote, ///< Right GearVR tracked remote on Android. + Active = OVRPlugin.Controller.Active, ///< Default controller. Represents the controller that most recently registered a button press from the user. + All = OVRPlugin.Controller.All, ///< Represents the logical OR of all controllers. + } + + public enum Handedness + { + Unsupported = OVRPlugin.Handedness.Unsupported, + LeftHanded = OVRPlugin.Handedness.LeftHanded, + RightHanded = OVRPlugin.Handedness.RightHanded, + } + + private static readonly float AXIS_AS_BUTTON_THRESHOLD = 0.5f; + private static readonly float AXIS_DEADZONE_THRESHOLD = 0.2f; + private static List controllers; + private static Controller activeControllerType = Controller.None; + private static Controller connectedControllerTypes = Controller.None; + private static OVRPlugin.Step stepType = OVRPlugin.Step.Render; + private static int fixedUpdateCount = 0; + + + private static bool _pluginSupportsActiveController = false; + private static bool _pluginSupportsActiveControllerCached = false; + private static System.Version _pluginSupportsActiveControllerMinVersion = new System.Version(1, 9, 0); + private static bool pluginSupportsActiveController + { + get + { + if (!_pluginSupportsActiveControllerCached) + { + bool isSupportedPlatform = true; +#if (UNITY_ANDROID && !UNITY_EDITOR) || UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX + isSupportedPlatform = false; +#endif + _pluginSupportsActiveController = isSupportedPlatform && (OVRPlugin.version >= _pluginSupportsActiveControllerMinVersion); + _pluginSupportsActiveControllerCached = true; + } + + return _pluginSupportsActiveController; + } + } + + /// + /// Creates an instance of OVRInput. + /// + static OVRInput() + { + controllers = new List + { +#if UNITY_ANDROID && !UNITY_EDITOR + new OVRControllerGamepadAndroid(), + new OVRControllerTouchpad(), + new OVRControllerLTrackedRemote(), + new OVRControllerRTrackedRemote(), + new OVRControllerTouch(), + new OVRControllerLTouch(), + new OVRControllerRTouch(), + new OVRControllerHands(), + new OVRControllerLHand(), + new OVRControllerRHand(), +#elif UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX + new OVRControllerGamepadMac(), +#else + new OVRControllerGamepadPC(), + new OVRControllerTouch(), + new OVRControllerLTouch(), + new OVRControllerRTouch(), + new OVRControllerRemote(), +#endif + }; + + InitHapticInfo(); + } + + /// + /// Updates the internal state of OVRInput. Must be called manually if used independently from OVRManager. + /// + public static void Update() + { + connectedControllerTypes = Controller.None; + stepType = OVRPlugin.Step.Render; + fixedUpdateCount = 0; + + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + { + UpdateXRControllerNodeIds(); + UpdateXRControllerHaptics(); + } + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + connectedControllerTypes |= controller.Update(); + + if ((connectedControllerTypes & controller.controllerType) != 0) + { + RawButton rawButtonMask = RawButton.Any; + RawTouch rawTouchMask = RawTouch.Any; + + if (Get(rawButtonMask, controller.controllerType) + || Get(rawTouchMask, controller.controllerType)) + { + activeControllerType = controller.controllerType; + } + } + } + + if ((activeControllerType == Controller.LTouch) || (activeControllerType == Controller.RTouch)) + { + if ((connectedControllerTypes & Controller.Touch) == Controller.Touch) + { + // If either Touch controller is Active and both Touch controllers are connected, set both to Active. + activeControllerType = Controller.Touch; + } + } + + if ((activeControllerType == Controller.LHand) || (activeControllerType == Controller.RHand)) + { + if ((connectedControllerTypes & Controller.Hands) == Controller.Hands) + { + // If either Hand controller is Active and both Hand controllers are connected, set both to Active. + activeControllerType = Controller.Hands; + } + } + + if ((connectedControllerTypes & activeControllerType) == 0) + { + activeControllerType = Controller.None; + } + + // Promote TrackedRemote to Active if one is connected and no other controller is active + if (activeControllerType == Controller.None) + { + if ((connectedControllerTypes & Controller.RTrackedRemote) != 0) + { + activeControllerType = Controller.RTrackedRemote; + } + else if ((connectedControllerTypes & Controller.LTrackedRemote) != 0) + { + activeControllerType = Controller.LTrackedRemote; + } + } + + if ( OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus && pluginSupportsActiveController) + { + // override locally derived active and connected controllers if plugin provides more accurate data + connectedControllerTypes = (OVRInput.Controller)OVRPlugin.GetConnectedControllers(); + activeControllerType = (OVRInput.Controller)OVRPlugin.GetActiveController(); + } + else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + { + activeControllerType = connectedControllerTypes; + } + } + + /// + /// Updates the internal physics state of OVRInput. Must be called manually if used independently from OVRManager. + /// + public static void FixedUpdate() + { + stepType = OVRPlugin.Step.Physics; + + double predictionSeconds = (double)fixedUpdateCount * Time.fixedDeltaTime / Mathf.Max(Time.timeScale, 1e-6f); + fixedUpdateCount++; + + OVRPlugin.UpdateNodePhysicsPoses(0, predictionSeconds); + } + + /// + /// Returns true if the given Controller's orientation is currently tracked. + /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return false. + /// + public static bool GetControllerOrientationTracked(OVRInput.Controller controllerType) + { + switch (controllerType) + { + case Controller.LTouch: + case Controller.LTrackedRemote: + case Controller.LHand: + return OVRPlugin.GetNodeOrientationTracked(OVRPlugin.Node.HandLeft); + case Controller.RTouch: + case Controller.RTrackedRemote: + case Controller.RHand: + return OVRPlugin.GetNodeOrientationTracked(OVRPlugin.Node.HandRight); + default: + return false; + } + } + + /// + /// Returns true if the given Controller's orientation is currently valid. + /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return false. + /// + public static bool GetControllerOrientationValid(OVRInput.Controller controllerType) + { + switch (controllerType) + { + case Controller.LTouch: + case Controller.LTrackedRemote: + case Controller.LHand: + return OVRPlugin.GetNodeOrientationValid(OVRPlugin.Node.HandLeft); + case Controller.RTouch: + case Controller.RTrackedRemote: + case Controller.RHand: + return OVRPlugin.GetNodeOrientationValid(OVRPlugin.Node.HandRight); + default: + return false; + } + } + + + /// + /// Returns true if the given Controller's position is currently tracked. + /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return false. + /// + public static bool GetControllerPositionTracked(OVRInput.Controller controllerType) + { + switch (controllerType) + { + case Controller.LTouch: + case Controller.LTrackedRemote: + case Controller.LHand: + return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.HandLeft); + case Controller.RTouch: + case Controller.RTrackedRemote: + case Controller.RHand: + return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.HandRight); + default: + return false; + } + } + + /// + /// Returns true if the given Controller's position is currently valid. + /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return false. + /// + public static bool GetControllerPositionValid(OVRInput.Controller controllerType) + { + switch (controllerType) + { + case Controller.LTouch: + case Controller.LTrackedRemote: + case Controller.LHand: + return OVRPlugin.GetNodePositionValid(OVRPlugin.Node.HandLeft); + case Controller.RTouch: + case Controller.RTrackedRemote: + case Controller.RHand: + return OVRPlugin.GetNodePositionValid(OVRPlugin.Node.HandRight); + default: + return false; + } + } + + /// + /// Gets the position of the given Controller local to its tracking space. + /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Vector3.zero. + /// + public static Vector3 GetLocalControllerPosition(OVRInput.Controller controllerType) + { + switch (controllerType) + { + case Controller.LTouch: + case Controller.LTrackedRemote: + case Controller.LHand: + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + return OVRPlugin.GetNodePose(OVRPlugin.Node.HandLeft, stepType).ToOVRPose().position; + else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + return openVRControllerDetails[0].localPosition; + else + { + Vector3 retVec; + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftHand, NodeStatePropertyType.Position, OVRPlugin.Node.HandLeft, stepType, out retVec)) + return retVec; + return Vector3.zero; //Will never be hit, but is a final fallback. + } + case Controller.RTouch: + case Controller.RTrackedRemote: + case Controller.RHand: + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + return OVRPlugin.GetNodePose(OVRPlugin.Node.HandRight, stepType).ToOVRPose().position; + else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + return openVRControllerDetails[1].localPosition; + else + { + Vector3 retVec; + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightHand, NodeStatePropertyType.Position, OVRPlugin.Node.HandRight, stepType, out retVec)) + return retVec; + return Vector3.zero; + } + default: + return Vector3.zero; + } + } + + /// + /// Gets the linear velocity of the given Controller local to its tracking space. + /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Vector3.zero. + /// + public static Vector3 GetLocalControllerVelocity(OVRInput.Controller controllerType) + { + Vector3 velocity = Vector3.zero; + + switch (controllerType) + { + case Controller.LTouch: + case Controller.LTrackedRemote: + case Controller.LHand: + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftHand, NodeStatePropertyType.Velocity, OVRPlugin.Node.HandLeft, stepType, out velocity)) + { + return velocity; + } + else + { + return Vector3.zero; + } + case Controller.RTouch: + case Controller.RTrackedRemote: + case Controller.RHand: + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightHand, NodeStatePropertyType.Velocity, OVRPlugin.Node.HandRight, stepType, out velocity)) + { + return velocity; + } + else + { + return Vector3.zero; + } + default: + return Vector3.zero; + } + } + + /// + /// Gets the linear acceleration of the given Controller local to its tracking space. + /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Vector3.zero. + /// + public static Vector3 GetLocalControllerAcceleration(OVRInput.Controller controllerType) + { + Vector3 accel = Vector3.zero; + + switch (controllerType) + { + case Controller.LTouch: + case Controller.LTrackedRemote: + case Controller.LHand: + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftHand, NodeStatePropertyType.Acceleration, OVRPlugin.Node.HandLeft, stepType, out accel)) + { + return accel; + } + else + { + return Vector3.zero; + } + case Controller.RTouch: + case Controller.RTrackedRemote: + case Controller.RHand: + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightHand, NodeStatePropertyType.Acceleration, OVRPlugin.Node.HandRight, stepType, out accel)) + { + return accel; + } + else + { + return Vector3.zero; + } + default: + return Vector3.zero; + } + } + + /// + /// Gets the rotation of the given Controller local to its tracking space. + /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Quaternion.identity. + /// + public static Quaternion GetLocalControllerRotation(OVRInput.Controller controllerType) + { + switch (controllerType) + { + case Controller.LTouch: + case Controller.LTrackedRemote: + case Controller.LHand: + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + return OVRPlugin.GetNodePose(OVRPlugin.Node.HandLeft, stepType).ToOVRPose().orientation; + else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + return openVRControllerDetails[0].localOrientation; + else + { + Quaternion retQuat; + if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.LeftHand, NodeStatePropertyType.Orientation, OVRPlugin.Node.HandLeft, stepType, out retQuat)) + return retQuat; + return Quaternion.identity; + } + case Controller.RTouch: + case Controller.RTrackedRemote: + case Controller.RHand: + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + return OVRPlugin.GetNodePose(OVRPlugin.Node.HandRight, stepType).ToOVRPose().orientation; + else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + return openVRControllerDetails[1].localOrientation; + else + { + Quaternion retQuat; + if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.RightHand, NodeStatePropertyType.Orientation, OVRPlugin.Node.HandRight, stepType, out retQuat)) + return retQuat; + return Quaternion.identity; + } + default: + return Quaternion.identity; + } + } + + /// + /// Gets the angular velocity of the given Controller local to its tracking space in radians per second around each axis. + /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Vector3.zero. + /// + public static Vector3 GetLocalControllerAngularVelocity(OVRInput.Controller controllerType) + { + Vector3 velocity = Vector3.zero; + + switch (controllerType) + { + case Controller.LTouch: + case Controller.LTrackedRemote: + case Controller.LHand: + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftHand, NodeStatePropertyType.AngularVelocity, OVRPlugin.Node.HandLeft, stepType, out velocity)) + { + return velocity; + } + else + { + return Vector3.zero; + } + case Controller.RTouch: + case Controller.RTrackedRemote: + case Controller.RHand: + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightHand, NodeStatePropertyType.AngularVelocity, OVRPlugin.Node.HandRight, stepType, out velocity)) + { + return velocity; + } + else + { + return Vector3.zero; + } + default: + return Vector3.zero; + } + } + + /// + /// Gets the angular acceleration of the given Controller local to its tracking space in radians per second per second around each axis. + /// Only supported for Oculus LTouch and RTouch controllers. Non-tracked controllers will return Vector3.zero. + /// + public static Vector3 GetLocalControllerAngularAcceleration(OVRInput.Controller controllerType) + { + Vector3 accel = Vector3.zero; + + switch (controllerType) + { + case Controller.LTouch: + case Controller.LTrackedRemote: + case Controller.LHand: + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftHand, NodeStatePropertyType.AngularAcceleration, OVRPlugin.Node.HandLeft, stepType, out accel)) + { + return accel; + } + else + { + return Vector3.zero; + } + case Controller.RTouch: + case Controller.RTrackedRemote: + case Controller.RHand: + if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightHand, NodeStatePropertyType.AngularAcceleration, OVRPlugin.Node.HandRight, stepType, out accel)) + { + return accel; + } + else + { + return Vector3.zero; + } + default: + return Vector3.zero; + } + } + + /// + /// Gets the dominant hand that the user has specified in settings, for mobile devices. + /// + public static Handedness GetDominantHand() + { + return (Handedness) OVRPlugin.GetDominantHand(); + } + + /// + /// Gets the current state of the given virtual button mask with the given controller mask. + /// Returns true if any masked button is down on any masked controller. + /// + public static bool Get(Button virtualMask, Controller controllerMask = Controller.Active) + { + return GetResolvedButton(virtualMask, RawButton.None, controllerMask); + } + + /// + /// Gets the current state of the given raw button mask with the given controller mask. + /// Returns true if any masked button is down on any masked controllers. + /// + public static bool Get(RawButton rawMask, Controller controllerMask = Controller.Active) + { + return GetResolvedButton(Button.None, rawMask, controllerMask); + } + + private static bool GetResolvedButton(Button virtualMask, RawButton rawMask, Controller controllerMask) + { + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + RawButton resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask); + + if (((RawButton)controller.currentState.Buttons & resolvedMask) != 0) + { + return true; + } + } + } + + return false; + } + + /// + /// Gets the current down state of the given virtual button mask with the given controller mask. + /// Returns true if any masked button was pressed this frame on any masked controller and no masked button was previously down last frame. + /// + public static bool GetDown(Button virtualMask, Controller controllerMask = Controller.Active) + { + return GetResolvedButtonDown(virtualMask, RawButton.None, controllerMask); + } + + /// + /// Gets the current down state of the given raw button mask with the given controller mask. + /// Returns true if any masked button was pressed this frame on any masked controller and no masked button was previously down last frame. + /// + public static bool GetDown(RawButton rawMask, Controller controllerMask = Controller.Active) + { + return GetResolvedButtonDown(Button.None, rawMask, controllerMask); + } + + private static bool GetResolvedButtonDown(Button virtualMask, RawButton rawMask, Controller controllerMask) + { + bool down = false; + + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + RawButton resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask); + + if (((RawButton)controller.previousState.Buttons & resolvedMask) != 0) + { + return false; + } + + if ((((RawButton)controller.currentState.Buttons & resolvedMask) != 0) + && (((RawButton)controller.previousState.Buttons & resolvedMask) == 0)) + { + down = true; + } + } + } + + return down; + } + + /// + /// Gets the current up state of the given virtual button mask with the given controller mask. + /// Returns true if any masked button was released this frame on any masked controller and no other masked button is still down this frame. + /// + public static bool GetUp(Button virtualMask, Controller controllerMask = Controller.Active) + { + return GetResolvedButtonUp(virtualMask, RawButton.None, controllerMask); + } + + /// + /// Gets the current up state of the given raw button mask with the given controller mask. + /// Returns true if any masked button was released this frame on any masked controller and no other masked button is still down this frame. + /// + public static bool GetUp(RawButton rawMask, Controller controllerMask = Controller.Active) + { + return GetResolvedButtonUp(Button.None, rawMask, controllerMask); + } + + private static bool GetResolvedButtonUp(Button virtualMask, RawButton rawMask, Controller controllerMask) + { + bool up = false; + + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + RawButton resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask); + + if (((RawButton)controller.currentState.Buttons & resolvedMask) != 0) + { + return false; + } + + if ((((RawButton)controller.currentState.Buttons & resolvedMask) == 0) + && (((RawButton)controller.previousState.Buttons & resolvedMask) != 0)) + { + up = true; + } + } + } + + return up; + } + + /// + /// Gets the current state of the given virtual touch mask with the given controller mask. + /// Returns true if any masked touch is down on any masked controller. + /// + public static bool Get(Touch virtualMask, Controller controllerMask = Controller.Active) + { + return GetResolvedTouch(virtualMask, RawTouch.None, controllerMask); + } + + /// + /// Gets the current state of the given raw touch mask with the given controller mask. + /// Returns true if any masked touch is down on any masked controllers. + /// + public static bool Get(RawTouch rawMask, Controller controllerMask = Controller.Active) + { + return GetResolvedTouch(Touch.None, rawMask, controllerMask); + } + + private static bool GetResolvedTouch(Touch virtualMask, RawTouch rawMask, Controller controllerMask) + { + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + RawTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask); + + if (((RawTouch)controller.currentState.Touches & resolvedMask) != 0) + { + return true; + } + } + } + + return false; + } + + /// + /// Gets the current down state of the given virtual touch mask with the given controller mask. + /// Returns true if any masked touch was pressed this frame on any masked controller and no masked touch was previously down last frame. + /// + public static bool GetDown(Touch virtualMask, Controller controllerMask = Controller.Active) + { + return GetResolvedTouchDown(virtualMask, RawTouch.None, controllerMask); + } + + /// + /// Gets the current down state of the given raw touch mask with the given controller mask. + /// Returns true if any masked touch was pressed this frame on any masked controller and no masked touch was previously down last frame. + /// + public static bool GetDown(RawTouch rawMask, Controller controllerMask = Controller.Active) + { + return GetResolvedTouchDown(Touch.None, rawMask, controllerMask); + } + + private static bool GetResolvedTouchDown(Touch virtualMask, RawTouch rawMask, Controller controllerMask) + { + bool down = false; + + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + RawTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask); + + if (((RawTouch)controller.previousState.Touches & resolvedMask) != 0) + { + return false; + } + + if ((((RawTouch)controller.currentState.Touches & resolvedMask) != 0) + && (((RawTouch)controller.previousState.Touches & resolvedMask) == 0)) + { + down = true; + } + } + } + + return down; + } + + /// + /// Gets the current up state of the given virtual touch mask with the given controller mask. + /// Returns true if any masked touch was released this frame on any masked controller and no other masked touch is still down this frame. + /// + public static bool GetUp(Touch virtualMask, Controller controllerMask = Controller.Active) + { + return GetResolvedTouchUp(virtualMask, RawTouch.None, controllerMask); + } + + /// + /// Gets the current up state of the given raw touch mask with the given controller mask. + /// Returns true if any masked touch was released this frame on any masked controller and no other masked touch is still down this frame. + /// + public static bool GetUp(RawTouch rawMask, Controller controllerMask = Controller.Active) + { + return GetResolvedTouchUp(Touch.None, rawMask, controllerMask); + } + + private static bool GetResolvedTouchUp(Touch virtualMask, RawTouch rawMask, Controller controllerMask) + { + bool up = false; + + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + RawTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask); + + if (((RawTouch)controller.currentState.Touches & resolvedMask) != 0) + { + return false; + } + + if ((((RawTouch)controller.currentState.Touches & resolvedMask) == 0) + && (((RawTouch)controller.previousState.Touches & resolvedMask) != 0)) + { + up = true; + } + } + } + + return up; + } + + /// + /// Gets the current state of the given virtual near touch mask with the given controller mask. + /// Returns true if any masked near touch is down on any masked controller. + /// + public static bool Get(NearTouch virtualMask, Controller controllerMask = Controller.Active) + { + return GetResolvedNearTouch(virtualMask, RawNearTouch.None, controllerMask); + } + + /// + /// Gets the current state of the given raw near touch mask with the given controller mask. + /// Returns true if any masked near touch is down on any masked controllers. + /// + public static bool Get(RawNearTouch rawMask, Controller controllerMask = Controller.Active) + { + return GetResolvedNearTouch(NearTouch.None, rawMask, controllerMask); + } + + private static bool GetResolvedNearTouch(NearTouch virtualMask, RawNearTouch rawMask, Controller controllerMask) + { + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + RawNearTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask); + + if (((RawNearTouch)controller.currentState.NearTouches & resolvedMask) != 0) + { + return true; + } + } + } + + return false; + } + + /// + /// Gets the current down state of the given virtual near touch mask with the given controller mask. + /// Returns true if any masked near touch was pressed this frame on any masked controller and no masked near touch was previously down last frame. + /// + public static bool GetDown(NearTouch virtualMask, Controller controllerMask = Controller.Active) + { + return GetResolvedNearTouchDown(virtualMask, RawNearTouch.None, controllerMask); + } + + /// + /// Gets the current down state of the given raw near touch mask with the given controller mask. + /// Returns true if any masked near touch was pressed this frame on any masked controller and no masked near touch was previously down last frame. + /// + public static bool GetDown(RawNearTouch rawMask, Controller controllerMask = Controller.Active) + { + return GetResolvedNearTouchDown(NearTouch.None, rawMask, controllerMask); + } + + private static bool GetResolvedNearTouchDown(NearTouch virtualMask, RawNearTouch rawMask, Controller controllerMask) + { + bool down = false; + + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + RawNearTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask); + + if (((RawNearTouch)controller.previousState.NearTouches & resolvedMask) != 0) + { + return false; + } + + if ((((RawNearTouch)controller.currentState.NearTouches & resolvedMask) != 0) + && (((RawNearTouch)controller.previousState.NearTouches & resolvedMask) == 0)) + { + down = true; + } + } + } + + return down; + } + + /// + /// Gets the current up state of the given virtual near touch mask with the given controller mask. + /// Returns true if any masked near touch was released this frame on any masked controller and no other masked near touch is still down this frame. + /// + public static bool GetUp(NearTouch virtualMask, Controller controllerMask = Controller.Active) + { + return GetResolvedNearTouchUp(virtualMask, RawNearTouch.None, controllerMask); + } + + /// + /// Gets the current up state of the given raw near touch mask with the given controller mask. + /// Returns true if any masked near touch was released this frame on any masked controller and no other masked near touch is still down this frame. + /// + public static bool GetUp(RawNearTouch rawMask, Controller controllerMask = Controller.Active) + { + return GetResolvedNearTouchUp(NearTouch.None, rawMask, controllerMask); + } + + private static bool GetResolvedNearTouchUp(NearTouch virtualMask, RawNearTouch rawMask, Controller controllerMask) + { + bool up = false; + + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + RawNearTouch resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask); + + if (((RawNearTouch)controller.currentState.NearTouches & resolvedMask) != 0) + { + return false; + } + + if ((((RawNearTouch)controller.currentState.NearTouches & resolvedMask) == 0) + && (((RawNearTouch)controller.previousState.NearTouches & resolvedMask) != 0)) + { + up = true; + } + } + } + + return up; + } + + /// + /// Gets the current state of the given virtual 1-dimensional axis mask on the given controller mask. + /// Returns the value of the largest masked axis across all masked controllers. Values range from 0 to 1. + /// + public static float Get(Axis1D virtualMask, Controller controllerMask = Controller.Active) + { + return GetResolvedAxis1D(virtualMask, RawAxis1D.None, controllerMask); + } + + /// + /// Gets the current state of the given raw 1-dimensional axis mask on the given controller mask. + /// Returns the value of the largest masked axis across all masked controllers. Values range from 0 to 1. + /// + public static float Get(RawAxis1D rawMask, Controller controllerMask = Controller.Active) + { + return GetResolvedAxis1D(Axis1D.None, rawMask, controllerMask); + } + + private static float GetResolvedAxis1D(Axis1D virtualMask, RawAxis1D rawMask, Controller controllerMask) + { + float maxAxis = 0.0f; + + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (OVRManager.loadedXRDevice != OVRManager.XRDevice.Oculus) + controller.shouldApplyDeadzone = false; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + RawAxis1D resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask); + + if ((RawAxis1D.LIndexTrigger & resolvedMask) != 0) + { + float axis = controller.currentState.LIndexTrigger; + + if (controller.shouldApplyDeadzone) + axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD); + + maxAxis = CalculateAbsMax(maxAxis, axis); + } + if ((RawAxis1D.RIndexTrigger & resolvedMask) != 0) + { + float axis = controller.currentState.RIndexTrigger; + + if (controller.shouldApplyDeadzone) + axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD); + + maxAxis = CalculateAbsMax(maxAxis, axis); + } + if ((RawAxis1D.LHandTrigger & resolvedMask) != 0) + { + float axis = controller.currentState.LHandTrigger; + + if (controller.shouldApplyDeadzone) + axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD); + + maxAxis = CalculateAbsMax(maxAxis, axis); + } + if ((RawAxis1D.RHandTrigger & resolvedMask) != 0) + { + float axis = controller.currentState.RHandTrigger; + + if (controller.shouldApplyDeadzone) + axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD); + + maxAxis = CalculateAbsMax(maxAxis, axis); + } + } + } + + return maxAxis; + } + + /// + /// Gets the current state of the given virtual 2-dimensional axis mask on the given controller mask. + /// Returns the vector of the largest masked axis across all masked controllers. Values range from -1 to 1. + /// + public static Vector2 Get(Axis2D virtualMask, Controller controllerMask = Controller.Active) + { + return GetResolvedAxis2D(virtualMask, RawAxis2D.None, controllerMask); + } + + /// + /// Gets the current state of the given raw 2-dimensional axis mask on the given controller mask. + /// Returns the vector of the largest masked axis across all masked controllers. Values range from -1 to 1. + /// + public static Vector2 Get(RawAxis2D rawMask, Controller controllerMask = Controller.Active) + { + return GetResolvedAxis2D(Axis2D.None, rawMask, controllerMask); + } + + private static Vector2 GetResolvedAxis2D(Axis2D virtualMask, RawAxis2D rawMask, Controller controllerMask) + { + Vector2 maxAxis = Vector2.zero; + + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (OVRManager.loadedXRDevice != OVRManager.XRDevice.Oculus) + controller.shouldApplyDeadzone = false; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + RawAxis2D resolvedMask = rawMask | controller.ResolveToRawMask(virtualMask); + + if ((RawAxis2D.LThumbstick & resolvedMask) != 0) + { + Vector2 axis = new Vector2( + controller.currentState.LThumbstick.x, + controller.currentState.LThumbstick.y); + + if (controller.shouldApplyDeadzone) + axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD); + + maxAxis = CalculateAbsMax(maxAxis, axis); + } + if ((RawAxis2D.LTouchpad & resolvedMask) != 0) + { + Vector2 axis = new Vector2( + controller.currentState.LTouchpad.x, + controller.currentState.LTouchpad.y); + + //if (controller.shouldApplyDeadzone) + // axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD); + + maxAxis = CalculateAbsMax(maxAxis, axis); + } + if ((RawAxis2D.RThumbstick & resolvedMask) != 0) + { + Vector2 axis = new Vector2( + controller.currentState.RThumbstick.x, + controller.currentState.RThumbstick.y); + + if (controller.shouldApplyDeadzone) + axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD); + + maxAxis = CalculateAbsMax(maxAxis, axis); + } + if ((RawAxis2D.RTouchpad & resolvedMask) != 0) + { + Vector2 axis = new Vector2( + controller.currentState.RTouchpad.x, + controller.currentState.RTouchpad.y); + + //if (controller.shouldApplyDeadzone) + // axis = CalculateDeadzone(axis, AXIS_DEADZONE_THRESHOLD); + + maxAxis = CalculateAbsMax(maxAxis, axis); + } + } + } + + return maxAxis; + } + + /// + /// Returns a mask of all currently connected controller types. + /// + public static Controller GetConnectedControllers() + { + return connectedControllerTypes; + } + + /// + /// Returns true if the specified controller type is currently connected. + /// + public static bool IsControllerConnected(Controller controller) + { + return (connectedControllerTypes & controller) == controller; + } + + /// + /// Returns the current active controller type. + /// + public static Controller GetActiveController() + { + return activeControllerType; + } + + private static void StartVibration(float amplitude, float duration, Node controllerNode) + { + int index = (controllerNode == Node.LeftHand) ? 0 : 1; + hapticInfos[index].hapticsDurationPlayed = 0.0f; + hapticInfos[index].hapticAmplitude = amplitude; + hapticInfos[index].hapticsDuration = duration; + hapticInfos[index].playingHaptics = (amplitude != 0.0f); + hapticInfos[index].node = controllerNode; + if (amplitude <= 0.0f || duration <= 0.0f) + { + hapticInfos[index].playingHaptics = false; + } + } + + private static int NUM_HAPTIC_CHANNELS = 2; + private static HapticInfo[] hapticInfos; + + private static float OPENVR_MAX_HAPTIC_AMPLITUDE = 4000.0f; + private static float HAPTIC_VIBRATION_DURATION_SECONDS = 2.0f; + private static String OPENVR_TOUCH_NAME = "oculus_touch"; + private static String OPENVR_VIVE_CONTROLLER_NAME = "vive_controller"; + private static String OPENVR_WINDOWSMR_CONTROLLER_NAME = "holographic_controller"; + + [Flags] + /// OpenVR Controller Enum + public enum OpenVRController : ulong + { + Unknown = 0, + OculusTouch = 1, + ViveController = 2, + WindowsMRController = 3 + } + + [StructLayout(LayoutKind.Sequential)] + public struct OpenVRControllerDetails + { + public OVR.OpenVR.VRControllerState_t state; + public OpenVRController controllerType; + public uint deviceID; + public Vector3 localPosition; //Position relative to Tracking Space + public Quaternion localOrientation; //Orientation relative to Tracking Space + } + + public static OpenVRControllerDetails[] openVRControllerDetails = new OpenVRControllerDetails[2]; + + private class HapticInfo + { + public bool playingHaptics; + public float hapticsDurationPlayed; + public float hapticsDuration; + public float hapticAmplitude; + public Node node; + } + + /// + /// Sets OpenVR left and right controller poses local to tracking space + /// + public static void SetOpenVRLocalPose(Vector3 leftPos, Vector3 rightPos, Quaternion leftRot, Quaternion rightRot) + { + openVRControllerDetails[0].localPosition = leftPos; + openVRControllerDetails[0].localOrientation = leftRot; + openVRControllerDetails[1].localPosition = rightPos; + openVRControllerDetails[1].localOrientation = rightRot; + } + + /// + /// Accesses OpenVR properties about a given deviceID. Especially useful for differentiating per type of OpenVR device (i.e. Oculus, Vive) + /// + public static string GetOpenVRStringProperty(OVR.OpenVR.ETrackedDeviceProperty prop, uint deviceId = OVR.OpenVR.OpenVR.k_unTrackedDeviceIndex_Hmd) + { + + OVR.OpenVR.ETrackedPropertyError error = OVR.OpenVR.ETrackedPropertyError.TrackedProp_Success; + OVR.OpenVR.CVRSystem system = OVR.OpenVR.OpenVR.System; + if (system != null) + { + uint capacity = system.GetStringTrackedDeviceProperty(deviceId, prop, null, 0, ref error); + if (capacity > 1) + { + var result = new System.Text.StringBuilder((int)capacity); + system.GetStringTrackedDeviceProperty(deviceId, prop, result, capacity, ref error); + return result.ToString(); + } + return (error != OVR.OpenVR.ETrackedPropertyError.TrackedProp_Success) ? error.ToString() : ""; + } + return ""; + } + + /// + /// Associates OpenVR device IDs with left and right motion controllers, for later haptic playback. + /// + private static void UpdateXRControllerNodeIds() + { + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + { + openVRControllerDetails[0].deviceID = OVR.OpenVR.OpenVR.k_unMaxTrackedDeviceCount; + openVRControllerDetails[1].deviceID = OVR.OpenVR.OpenVR.k_unMaxTrackedDeviceCount; + + OVR.OpenVR.CVRSystem system = OVR.OpenVR.OpenVR.System; + + if (system != null) + { + for (uint id = 0; id < OVR.OpenVR.OpenVR.k_unMaxTrackedDeviceCount; id++) + { + OVR.OpenVR.ETrackedDeviceClass deviceClass = system.GetTrackedDeviceClass(id); + if (deviceClass == OVR.OpenVR.ETrackedDeviceClass.Controller && system.IsTrackedDeviceConnected(id)) + { + OpenVRController controllerType; + String controllerName = GetOpenVRStringProperty(OVR.OpenVR.ETrackedDeviceProperty.Prop_ControllerType_String, id); + if (controllerName == OPENVR_TOUCH_NAME) + controllerType = OpenVRController.OculusTouch; + else if (controllerName == OPENVR_VIVE_CONTROLLER_NAME) + controllerType = OpenVRController.ViveController; + else if (controllerName == OPENVR_WINDOWSMR_CONTROLLER_NAME) + controllerType = OpenVRController.WindowsMRController; + else + controllerType = OpenVRController.Unknown; + + OVR.OpenVR.ETrackedControllerRole role = system.GetControllerRoleForTrackedDeviceIndex(id); + if (role == OVR.OpenVR.ETrackedControllerRole.LeftHand) + { + system.GetControllerState(id, ref openVRControllerDetails[0].state, (uint)Marshal.SizeOf(typeof(OVR.OpenVR.VRControllerState_t))); + openVRControllerDetails[0].deviceID = id; + openVRControllerDetails[0].controllerType = controllerType; + connectedControllerTypes |= Controller.LTouch; + } + else if (role == OVR.OpenVR.ETrackedControllerRole.RightHand) + { + system.GetControllerState(id, ref openVRControllerDetails[1].state, (uint)Marshal.SizeOf(typeof(OVR.OpenVR.VRControllerState_t))); + openVRControllerDetails[1].deviceID = id; + openVRControllerDetails[1].controllerType = controllerType; + connectedControllerTypes |= Controller.RTouch; + } + } + } + } + } + } + + /// + /// Runs once a frame to update cross-platform haptic playback + /// + private static void UpdateXRControllerHaptics() + { + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + { + for (int i = 0; i < NUM_HAPTIC_CHANNELS; i++) + { + if (hapticInfos[i].playingHaptics) + { + hapticInfos[i].hapticsDurationPlayed += Time.deltaTime; + + PlayHapticImpulse(hapticInfos[i].hapticAmplitude, hapticInfos[i].node); + + if (hapticInfos[i].hapticsDurationPlayed >= hapticInfos[i].hapticsDuration) + { + hapticInfos[i].playingHaptics = false; + } + } + } + + } + } + + private static void InitHapticInfo() + { + hapticInfos = new HapticInfo[NUM_HAPTIC_CHANNELS]; + for (int i = 0; i < NUM_HAPTIC_CHANNELS; i++) + { + hapticInfos[i] = new HapticInfo(); + } + } + + private static void PlayHapticImpulse(float amplitude, Node deviceNode) + { + OVR.OpenVR.CVRSystem system = OVR.OpenVR.OpenVR.System; + if (system != null && amplitude != 0.0f) + { + uint controllerId = (deviceNode == Node.LeftHand) ? openVRControllerDetails[0].deviceID : openVRControllerDetails[1].deviceID; + + if (IsValidOpenVRDevice(controllerId)) + system.TriggerHapticPulse(controllerId, 0, (char)(OPENVR_MAX_HAPTIC_AMPLITUDE * amplitude)); + } + } + + private static bool IsValidOpenVRDevice(uint deviceId) + { + return (deviceId >= 0 && deviceId < OVR.OpenVR.OpenVR.k_unMaxTrackedDeviceCount); + } + + /// + /// Activates vibration with the given frequency and amplitude with the given controller mask. + /// Ignored on controllers that do not support vibration. Expected values range from 0 to 1. + /// + public static void SetControllerVibration(float frequency, float amplitude, Controller controllerMask = Controller.Active) + { + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + { + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + controller.SetControllerVibration(frequency, amplitude); + } + } + } + else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + { + if (controllerMask == Controller.LTouch || controllerMask == Controller.RTouch) + { + Node controllerNode = (controllerMask == Controller.LTouch) ? Node.LeftHand : Node.RightHand; + StartVibration(amplitude, HAPTIC_VIBRATION_DURATION_SECONDS, controllerNode); + } + } + } + + /// + /// Triggers a recenter to realign the specified controller's virtual pose with the user's real-world pose. + /// Only applicable to controllers that require recentering, such as the GearVR Controller. + /// Ignored for controllers that do not require recentering. + /// + public static void RecenterController(Controller controllerMask = Controller.Active) + { + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + controller.RecenterController(); + } + } + } + + /// + /// Returns true if the specified controller was recentered this frame. + /// Only applicable to controllers that require recentering, such as the GearVR Controller. + /// Returns false for controllers that do not require recentering. + /// + public static bool GetControllerWasRecentered(Controller controllerMask = Controller.Active) + { + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + bool wasRecentered = false; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + wasRecentered |= controller.WasRecentered(); + } + } + + return wasRecentered; + } + + /// + /// Returns the number of times the controller has been recentered this session. + /// Useful for detecting recenter events and resetting state such as arm model simulations, etc. + /// Wraps around to 0 after 255. + /// Only applicable to controllers that require recentering, such as the GearVR Controller. + /// Returns 0 for controllers that do not require recentering. + /// + public static byte GetControllerRecenterCount(Controller controllerMask = Controller.Active) + { + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + byte recenterCount = 0; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + recenterCount = controller.GetRecenterCount(); + break; + } + } + + return recenterCount; + } + + /// + /// Returns the battery percentage remaining for the specified controller. Values range from 0 to 100. + /// Only applicable to controllers that report battery level, such as the GearVR Controller. + /// Returns 0 for controllers that do not report battery level. + /// + public static byte GetControllerBatteryPercentRemaining(Controller controllerMask = Controller.Active) + { + if ((controllerMask & Controller.Active) != 0) + controllerMask |= activeControllerType; + + byte battery = 0; + + for (int i = 0; i < controllers.Count; i++) + { + OVRControllerBase controller = controllers[i]; + + if (ShouldResolveController(controller.controllerType, controllerMask)) + { + battery = controller.GetBatteryPercentRemaining(); + break; + } + } + + return battery; + } + + private static Vector2 CalculateAbsMax(Vector2 a, Vector2 b) + { + float absA = a.sqrMagnitude; + float absB = b.sqrMagnitude; + + if (absA >= absB) + return a; + return b; + } + + private static float CalculateAbsMax(float a, float b) + { + float absA = (a >= 0) ? a : -a; + float absB = (b >= 0) ? b : -b; + + if (absA >= absB) + return a; + return b; + } + + private static Vector2 CalculateDeadzone(Vector2 a, float deadzone) + { + if (a.sqrMagnitude <= (deadzone * deadzone)) + return Vector2.zero; + + a *= ((a.magnitude - deadzone) / (1.0f - deadzone)); + + if (a.sqrMagnitude > 1.0f) + return a.normalized; + return a; + } + + private static float CalculateDeadzone(float a, float deadzone) + { + float mag = (a >= 0) ? a : -a; + + if (mag <= deadzone) + return 0.0f; + + a *= (mag - deadzone) / (1.0f - deadzone); + + if ((a * a) > 1.0f) + return (a >= 0) ? 1.0f : -1.0f; + return a; + } + + private static bool ShouldResolveController(Controller controllerType, Controller controllerMask) + { + bool isValid = false; + + if ((controllerType & controllerMask) == controllerType) + { + isValid = true; + } + + // If the mask requests both Touch controllers, reject the individual touch controllers. + if (((controllerMask & Controller.Touch) == Controller.Touch) + && ((controllerType & Controller.Touch) != 0) + && ((controllerType & Controller.Touch) != Controller.Touch)) + { + isValid = false; + } + + // If the mask requests both Hands, reject the individual hands. + if (((controllerMask & Controller.Hands) == Controller.Hands) + && ((controllerType & Controller.Hands) != 0) + && ((controllerType & Controller.Hands) != Controller.Hands)) + { + isValid = false; + } + + return isValid; + } + + private abstract class OVRControllerBase + { + public class VirtualButtonMap + { + public RawButton None = RawButton.None; + public RawButton One = RawButton.None; + public RawButton Two = RawButton.None; + public RawButton Three = RawButton.None; + public RawButton Four = RawButton.None; + public RawButton Start = RawButton.None; + public RawButton Back = RawButton.None; + public RawButton PrimaryShoulder = RawButton.None; + public RawButton PrimaryIndexTrigger = RawButton.None; + public RawButton PrimaryHandTrigger = RawButton.None; + public RawButton PrimaryThumbstick = RawButton.None; + public RawButton PrimaryThumbstickUp = RawButton.None; + public RawButton PrimaryThumbstickDown = RawButton.None; + public RawButton PrimaryThumbstickLeft = RawButton.None; + public RawButton PrimaryThumbstickRight = RawButton.None; + public RawButton PrimaryTouchpad = RawButton.None; + public RawButton SecondaryShoulder = RawButton.None; + public RawButton SecondaryIndexTrigger = RawButton.None; + public RawButton SecondaryHandTrigger = RawButton.None; + public RawButton SecondaryThumbstick = RawButton.None; + public RawButton SecondaryThumbstickUp = RawButton.None; + public RawButton SecondaryThumbstickDown = RawButton.None; + public RawButton SecondaryThumbstickLeft = RawButton.None; + public RawButton SecondaryThumbstickRight = RawButton.None; + public RawButton SecondaryTouchpad = RawButton.None; + public RawButton DpadUp = RawButton.None; + public RawButton DpadDown = RawButton.None; + public RawButton DpadLeft = RawButton.None; + public RawButton DpadRight = RawButton.None; + public RawButton Up = RawButton.None; + public RawButton Down = RawButton.None; + public RawButton Left = RawButton.None; + public RawButton Right = RawButton.None; + + public RawButton ToRawMask(Button virtualMask) + { + RawButton rawMask = 0; + + if (virtualMask == Button.None) + return RawButton.None; + + if ((virtualMask & Button.One) != 0) + rawMask |= One; + if ((virtualMask & Button.Two) != 0) + rawMask |= Two; + if ((virtualMask & Button.Three) != 0) + rawMask |= Three; + if ((virtualMask & Button.Four) != 0) + rawMask |= Four; + if ((virtualMask & Button.Start) != 0) + rawMask |= Start; + if ((virtualMask & Button.Back) != 0) + rawMask |= Back; + if ((virtualMask & Button.PrimaryShoulder) != 0) + rawMask |= PrimaryShoulder; + if ((virtualMask & Button.PrimaryIndexTrigger) != 0) + rawMask |= PrimaryIndexTrigger; + if ((virtualMask & Button.PrimaryHandTrigger) != 0) + rawMask |= PrimaryHandTrigger; + if ((virtualMask & Button.PrimaryThumbstick) != 0) + rawMask |= PrimaryThumbstick; + if ((virtualMask & Button.PrimaryThumbstickUp) != 0) + rawMask |= PrimaryThumbstickUp; + if ((virtualMask & Button.PrimaryThumbstickDown) != 0) + rawMask |= PrimaryThumbstickDown; + if ((virtualMask & Button.PrimaryThumbstickLeft) != 0) + rawMask |= PrimaryThumbstickLeft; + if ((virtualMask & Button.PrimaryThumbstickRight) != 0) + rawMask |= PrimaryThumbstickRight; + if ((virtualMask & Button.PrimaryTouchpad) != 0) + rawMask |= PrimaryTouchpad; + if ((virtualMask & Button.SecondaryShoulder) != 0) + rawMask |= SecondaryShoulder; + if ((virtualMask & Button.SecondaryIndexTrigger) != 0) + rawMask |= SecondaryIndexTrigger; + if ((virtualMask & Button.SecondaryHandTrigger) != 0) + rawMask |= SecondaryHandTrigger; + if ((virtualMask & Button.SecondaryThumbstick) != 0) + rawMask |= SecondaryThumbstick; + if ((virtualMask & Button.SecondaryThumbstickUp) != 0) + rawMask |= SecondaryThumbstickUp; + if ((virtualMask & Button.SecondaryThumbstickDown) != 0) + rawMask |= SecondaryThumbstickDown; + if ((virtualMask & Button.SecondaryThumbstickLeft) != 0) + rawMask |= SecondaryThumbstickLeft; + if ((virtualMask & Button.SecondaryThumbstickRight) != 0) + rawMask |= SecondaryThumbstickRight; + if ((virtualMask & Button.SecondaryTouchpad) != 0) + rawMask |= SecondaryTouchpad; + if ((virtualMask & Button.DpadUp) != 0) + rawMask |= DpadUp; + if ((virtualMask & Button.DpadDown) != 0) + rawMask |= DpadDown; + if ((virtualMask & Button.DpadLeft) != 0) + rawMask |= DpadLeft; + if ((virtualMask & Button.DpadRight) != 0) + rawMask |= DpadRight; + if ((virtualMask & Button.Up) != 0) + rawMask |= Up; + if ((virtualMask & Button.Down) != 0) + rawMask |= Down; + if ((virtualMask & Button.Left) != 0) + rawMask |= Left; + if ((virtualMask & Button.Right) != 0) + rawMask |= Right; + + return rawMask; + } + } + + public class VirtualTouchMap + { + public RawTouch None = RawTouch.None; + public RawTouch One = RawTouch.None; + public RawTouch Two = RawTouch.None; + public RawTouch Three = RawTouch.None; + public RawTouch Four = RawTouch.None; + public RawTouch PrimaryIndexTrigger = RawTouch.None; + public RawTouch PrimaryThumbstick = RawTouch.None; + public RawTouch PrimaryThumbRest = RawTouch.None; + public RawTouch PrimaryTouchpad = RawTouch.None; + public RawTouch SecondaryIndexTrigger = RawTouch.None; + public RawTouch SecondaryThumbstick = RawTouch.None; + public RawTouch SecondaryThumbRest = RawTouch.None; + public RawTouch SecondaryTouchpad = RawTouch.None; + + public RawTouch ToRawMask(Touch virtualMask) + { + RawTouch rawMask = 0; + + if (virtualMask == Touch.None) + return RawTouch.None; + + if ((virtualMask & Touch.One) != 0) + rawMask |= One; + if ((virtualMask & Touch.Two) != 0) + rawMask |= Two; + if ((virtualMask & Touch.Three) != 0) + rawMask |= Three; + if ((virtualMask & Touch.Four) != 0) + rawMask |= Four; + if ((virtualMask & Touch.PrimaryIndexTrigger) != 0) + rawMask |= PrimaryIndexTrigger; + if ((virtualMask & Touch.PrimaryThumbstick) != 0) + rawMask |= PrimaryThumbstick; + if ((virtualMask & Touch.PrimaryThumbRest) != 0) + rawMask |= PrimaryThumbRest; + if ((virtualMask & Touch.PrimaryTouchpad) != 0) + rawMask |= PrimaryTouchpad; + if ((virtualMask & Touch.SecondaryIndexTrigger) != 0) + rawMask |= SecondaryIndexTrigger; + if ((virtualMask & Touch.SecondaryThumbstick) != 0) + rawMask |= SecondaryThumbstick; + if ((virtualMask & Touch.SecondaryThumbRest) != 0) + rawMask |= SecondaryThumbRest; + if ((virtualMask & Touch.SecondaryTouchpad) != 0) + rawMask |= SecondaryTouchpad; + + return rawMask; + } + } + + public class VirtualNearTouchMap + { + public RawNearTouch None = RawNearTouch.None; + public RawNearTouch PrimaryIndexTrigger = RawNearTouch.None; + public RawNearTouch PrimaryThumbButtons = RawNearTouch.None; + public RawNearTouch SecondaryIndexTrigger = RawNearTouch.None; + public RawNearTouch SecondaryThumbButtons = RawNearTouch.None; + + public RawNearTouch ToRawMask(NearTouch virtualMask) + { + RawNearTouch rawMask = 0; + + if (virtualMask == NearTouch.None) + return RawNearTouch.None; + + if ((virtualMask & NearTouch.PrimaryIndexTrigger) != 0) + rawMask |= PrimaryIndexTrigger; + if ((virtualMask & NearTouch.PrimaryThumbButtons) != 0) + rawMask |= PrimaryThumbButtons; + if ((virtualMask & NearTouch.SecondaryIndexTrigger) != 0) + rawMask |= SecondaryIndexTrigger; + if ((virtualMask & NearTouch.SecondaryThumbButtons) != 0) + rawMask |= SecondaryThumbButtons; + + return rawMask; + } + } + + public class VirtualAxis1DMap + { + public RawAxis1D None = RawAxis1D.None; + public RawAxis1D PrimaryIndexTrigger = RawAxis1D.None; + public RawAxis1D PrimaryHandTrigger = RawAxis1D.None; + public RawAxis1D SecondaryIndexTrigger = RawAxis1D.None; + public RawAxis1D SecondaryHandTrigger = RawAxis1D.None; + + public RawAxis1D ToRawMask(Axis1D virtualMask) + { + RawAxis1D rawMask = 0; + + if (virtualMask == Axis1D.None) + return RawAxis1D.None; + + if ((virtualMask & Axis1D.PrimaryIndexTrigger) != 0) + rawMask |= PrimaryIndexTrigger; + if ((virtualMask & Axis1D.PrimaryHandTrigger) != 0) + rawMask |= PrimaryHandTrigger; + if ((virtualMask & Axis1D.SecondaryIndexTrigger) != 0) + rawMask |= SecondaryIndexTrigger; + if ((virtualMask & Axis1D.SecondaryHandTrigger) != 0) + rawMask |= SecondaryHandTrigger; + + return rawMask; + } + } + + public class VirtualAxis2DMap + { + public RawAxis2D None = RawAxis2D.None; + public RawAxis2D PrimaryThumbstick = RawAxis2D.None; + public RawAxis2D PrimaryTouchpad = RawAxis2D.None; + public RawAxis2D SecondaryThumbstick = RawAxis2D.None; + public RawAxis2D SecondaryTouchpad = RawAxis2D.None; + + public RawAxis2D ToRawMask(Axis2D virtualMask) + { + RawAxis2D rawMask = 0; + + if (virtualMask == Axis2D.None) + return RawAxis2D.None; + + if ((virtualMask & Axis2D.PrimaryThumbstick) != 0) + rawMask |= PrimaryThumbstick; + if ((virtualMask & Axis2D.PrimaryTouchpad) != 0) + rawMask |= PrimaryTouchpad; + if ((virtualMask & Axis2D.SecondaryThumbstick) != 0) + rawMask |= SecondaryThumbstick; + if ((virtualMask & Axis2D.SecondaryTouchpad) != 0) + rawMask |= SecondaryTouchpad; + + return rawMask; + } + } + + public Controller controllerType = Controller.None; + public VirtualButtonMap buttonMap = new VirtualButtonMap(); + public VirtualTouchMap touchMap = new VirtualTouchMap(); + public VirtualNearTouchMap nearTouchMap = new VirtualNearTouchMap(); + public VirtualAxis1DMap axis1DMap = new VirtualAxis1DMap(); + public VirtualAxis2DMap axis2DMap = new VirtualAxis2DMap(); + public OVRPlugin.ControllerState4 previousState = new OVRPlugin.ControllerState4(); + public OVRPlugin.ControllerState4 currentState = new OVRPlugin.ControllerState4(); + public bool shouldApplyDeadzone = true; + + public OVRControllerBase() + { + ConfigureButtonMap(); + ConfigureTouchMap(); + ConfigureNearTouchMap(); + ConfigureAxis1DMap(); + ConfigureAxis2DMap(); + } + + public virtual Controller Update() + { + OVRPlugin.ControllerState4 state; + + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR && ( (controllerType & Controller.Touch) != 0) ) + state = GetOpenVRControllerState(controllerType); + else + state = OVRPlugin.GetControllerState4((uint)controllerType); + + if (state.LIndexTrigger >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LIndexTrigger; + if (state.LHandTrigger >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LHandTrigger; + if (state.LThumbstick.y >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LThumbstickUp; + if (state.LThumbstick.y <= -AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LThumbstickDown; + if (state.LThumbstick.x <= -AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LThumbstickLeft; + if (state.LThumbstick.x >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LThumbstickRight; + + if (state.RIndexTrigger >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RIndexTrigger; + if (state.RHandTrigger >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RHandTrigger; + if (state.RThumbstick.y >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RThumbstickUp; + if (state.RThumbstick.y <= -AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RThumbstickDown; + if (state.RThumbstick.x <= -AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RThumbstickLeft; + if (state.RThumbstick.x >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RThumbstickRight; + + previousState = currentState; + currentState = state; + + return ((Controller)currentState.ConnectedControllers & controllerType); + } + + private OVRPlugin.ControllerState4 GetOpenVRControllerState(Controller controllerType) + { + OVRPlugin.ControllerState4 state = new OVRPlugin.ControllerState4(); + + if ((controllerType & Controller.LTouch) == Controller.LTouch && IsValidOpenVRDevice(openVRControllerDetails[0].deviceID)) + { + OVR.OpenVR.VRControllerState_t leftControllerState = openVRControllerDetails[0].state; + if ((leftControllerState.ulButtonPressed & ((ulong)OpenVRButton.Two)) == (ulong)OpenVRButton.Two) + state.Buttons |= (uint)RawButton.Y; + if ((leftControllerState.ulButtonPressed & ((ulong)OpenVRButton.Thumbstick)) == (ulong)OpenVRButton.Thumbstick) + state.Buttons |= (uint)RawButton.LThumbstick; + + state.LIndexTrigger = leftControllerState.rAxis1.x; + + if (openVRControllerDetails[0].controllerType == OpenVRController.OculusTouch || openVRControllerDetails[0].controllerType == OpenVRController.ViveController) + { + state.LThumbstick.x = leftControllerState.rAxis0.x; + state.LThumbstick.y = leftControllerState.rAxis0.y; + } + else if (openVRControllerDetails[0].controllerType == OpenVRController.WindowsMRController) + { + state.LThumbstick.x = leftControllerState.rAxis2.x; + state.LThumbstick.y = leftControllerState.rAxis2.y; + } + + if (openVRControllerDetails[0].controllerType == OpenVRController.OculusTouch) + state.LHandTrigger = leftControllerState.rAxis2.x; + else if (openVRControllerDetails[0].controllerType == OpenVRController.ViveController || openVRControllerDetails[0].controllerType == OpenVRController.WindowsMRController) + state.LHandTrigger = ((leftControllerState.ulButtonPressed & ((ulong)OpenVRButton.Grip)) == ((ulong)OpenVRButton.Grip)) ? 1 : 0; + + } + + if ((controllerType & Controller.RTouch) == Controller.RTouch && IsValidOpenVRDevice(openVRControllerDetails[1].deviceID)) + { + OVR.OpenVR.VRControllerState_t rightControllerState = openVRControllerDetails[1].state; + if ((rightControllerState.ulButtonPressed & ((ulong)OpenVRButton.Two)) == (ulong)OpenVRButton.Two) + state.Buttons |= (uint)RawButton.B; + if ((rightControllerState.ulButtonPressed & ((ulong)OpenVRButton.Thumbstick)) == (ulong)OpenVRButton.Thumbstick) + state.Buttons |= (uint)RawButton.RThumbstick; + + state.RIndexTrigger = rightControllerState.rAxis1.x; + + if (openVRControllerDetails[1].controllerType == OpenVRController.OculusTouch || openVRControllerDetails[1].controllerType == OpenVRController.ViveController) + { + state.RThumbstick.x = rightControllerState.rAxis0.x; + state.RThumbstick.y = rightControllerState.rAxis0.y; + } + else if (openVRControllerDetails[1].controllerType == OpenVRController.WindowsMRController) + { + state.RThumbstick.x = rightControllerState.rAxis2.x; + state.RThumbstick.y = rightControllerState.rAxis2.y; + } + + if (openVRControllerDetails[1].controllerType == OpenVRController.OculusTouch) + state.RHandTrigger = rightControllerState.rAxis2.x; + else if (openVRControllerDetails[1].controllerType == OpenVRController.ViveController || openVRControllerDetails[1].controllerType == OpenVRController.WindowsMRController) + state.RHandTrigger = ((rightControllerState.ulButtonPressed & ((ulong)OpenVRButton.Grip)) == ((ulong)OpenVRButton.Grip)) ? 1 : 0; + + } + + return state; + } + + public virtual void SetControllerVibration(float frequency, float amplitude) + { + OVRPlugin.SetControllerVibration((uint)controllerType, frequency, amplitude); + } + + public virtual void RecenterController() + { + OVRPlugin.RecenterTrackingOrigin(OVRPlugin.RecenterFlags.Controllers); + } + + public virtual bool WasRecentered() + { + return false; + } + + public virtual byte GetRecenterCount() + { + return 0; + } + + public virtual byte GetBatteryPercentRemaining() + { + return 0; + } + + public abstract void ConfigureButtonMap(); + public abstract void ConfigureTouchMap(); + public abstract void ConfigureNearTouchMap(); + public abstract void ConfigureAxis1DMap(); + public abstract void ConfigureAxis2DMap(); + + public RawButton ResolveToRawMask(Button virtualMask) + { + return buttonMap.ToRawMask(virtualMask); + } + + public RawTouch ResolveToRawMask(Touch virtualMask) + { + return touchMap.ToRawMask(virtualMask); + } + + public RawNearTouch ResolveToRawMask(NearTouch virtualMask) + { + return nearTouchMap.ToRawMask(virtualMask); + } + + public RawAxis1D ResolveToRawMask(Axis1D virtualMask) + { + return axis1DMap.ToRawMask(virtualMask); + } + + public RawAxis2D ResolveToRawMask(Axis2D virtualMask) + { + return axis2DMap.ToRawMask(virtualMask); + } + } + + private class OVRControllerTouch : OVRControllerBase + { + public OVRControllerTouch() + { + controllerType = Controller.Touch; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.A; + buttonMap.Two = RawButton.B; + buttonMap.Three = RawButton.X; + buttonMap.Four = RawButton.Y; + buttonMap.Start = RawButton.Start; + buttonMap.Back = RawButton.None; + buttonMap.PrimaryShoulder = RawButton.None; + buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger; + buttonMap.PrimaryHandTrigger = RawButton.LHandTrigger; + buttonMap.PrimaryThumbstick = RawButton.LThumbstick; + buttonMap.PrimaryThumbstickUp = RawButton.LThumbstickUp; + buttonMap.PrimaryThumbstickDown = RawButton.LThumbstickDown; + buttonMap.PrimaryThumbstickLeft = RawButton.LThumbstickLeft; + buttonMap.PrimaryThumbstickRight = RawButton.LThumbstickRight; + buttonMap.PrimaryTouchpad = RawButton.None; + buttonMap.SecondaryShoulder = RawButton.None; + buttonMap.SecondaryIndexTrigger = RawButton.RIndexTrigger; + buttonMap.SecondaryHandTrigger = RawButton.RHandTrigger; + buttonMap.SecondaryThumbstick = RawButton.RThumbstick; + buttonMap.SecondaryThumbstickUp = RawButton.RThumbstickUp; + buttonMap.SecondaryThumbstickDown = RawButton.RThumbstickDown; + buttonMap.SecondaryThumbstickLeft = RawButton.RThumbstickLeft; + buttonMap.SecondaryThumbstickRight = RawButton.RThumbstickRight; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.None; + buttonMap.DpadDown = RawButton.None; + buttonMap.DpadLeft = RawButton.None; + buttonMap.DpadRight = RawButton.None; + buttonMap.Up = RawButton.LThumbstickUp; + buttonMap.Down = RawButton.LThumbstickDown; + buttonMap.Left = RawButton.LThumbstickLeft; + buttonMap.Right = RawButton.LThumbstickRight; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.A; + touchMap.Two = RawTouch.B; + touchMap.Three = RawTouch.X; + touchMap.Four = RawTouch.Y; + touchMap.PrimaryIndexTrigger = RawTouch.LIndexTrigger; + touchMap.PrimaryThumbstick = RawTouch.LThumbstick; + touchMap.PrimaryThumbRest = RawTouch.LThumbRest; + touchMap.PrimaryTouchpad = RawTouch.None; + touchMap.SecondaryIndexTrigger = RawTouch.RIndexTrigger; + touchMap.SecondaryThumbstick = RawTouch.RThumbstick; + touchMap.SecondaryThumbRest = RawTouch.RThumbRest; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.LIndexTrigger; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.LThumbButtons; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.RIndexTrigger; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.RThumbButtons; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger; + axis1DMap.PrimaryHandTrigger = RawAxis1D.LHandTrigger; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.RIndexTrigger; + axis1DMap.SecondaryHandTrigger = RawAxis1D.RHandTrigger; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.LThumbstick; + axis2DMap.PrimaryTouchpad = RawAxis2D.None; + axis2DMap.SecondaryThumbstick = RawAxis2D.RThumbstick; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + + public override bool WasRecentered() + { + return ((currentState.LRecenterCount + currentState.RRecenterCount) != (previousState.LRecenterCount + previousState.RRecenterCount)); + } + + public override byte GetRecenterCount() + { + return (byte)(currentState.LRecenterCount + currentState.RRecenterCount); + } + + public override byte GetBatteryPercentRemaining() + { + byte leftBattery = currentState.LBatteryPercentRemaining; + byte rightBattery = currentState.RBatteryPercentRemaining; + byte minBattery = (leftBattery <= rightBattery) ? leftBattery : rightBattery; + + return minBattery; + } + } + + private class OVRControllerLTouch : OVRControllerBase + { + public OVRControllerLTouch() + { + controllerType = Controller.LTouch; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.X; + buttonMap.Two = RawButton.Y; + buttonMap.Three = RawButton.None; + buttonMap.Four = RawButton.None; + buttonMap.Start = RawButton.Start; + buttonMap.Back = RawButton.None; + buttonMap.PrimaryShoulder = RawButton.None; + buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger; + buttonMap.PrimaryHandTrigger = RawButton.LHandTrigger; + buttonMap.PrimaryThumbstick = RawButton.LThumbstick; + buttonMap.PrimaryThumbstickUp = RawButton.LThumbstickUp; + buttonMap.PrimaryThumbstickDown = RawButton.LThumbstickDown; + buttonMap.PrimaryThumbstickLeft = RawButton.LThumbstickLeft; + buttonMap.PrimaryThumbstickRight = RawButton.LThumbstickRight; + buttonMap.PrimaryTouchpad = RawButton.None; + buttonMap.SecondaryShoulder = RawButton.None; + buttonMap.SecondaryIndexTrigger = RawButton.None; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.None; + buttonMap.SecondaryThumbstickUp = RawButton.None; + buttonMap.SecondaryThumbstickDown = RawButton.None; + buttonMap.SecondaryThumbstickLeft = RawButton.None; + buttonMap.SecondaryThumbstickRight = RawButton.None; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.None; + buttonMap.DpadDown = RawButton.None; + buttonMap.DpadLeft = RawButton.None; + buttonMap.DpadRight = RawButton.None; + buttonMap.Up = RawButton.LThumbstickUp; + buttonMap.Down = RawButton.LThumbstickDown; + buttonMap.Left = RawButton.LThumbstickLeft; + buttonMap.Right = RawButton.LThumbstickRight; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.X; + touchMap.Two = RawTouch.Y; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.LIndexTrigger; + touchMap.PrimaryThumbstick = RawTouch.LThumbstick; + touchMap.PrimaryThumbRest = RawTouch.LThumbRest; + touchMap.PrimaryTouchpad = RawTouch.None; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.LIndexTrigger; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.LThumbButtons; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger; + axis1DMap.PrimaryHandTrigger = RawAxis1D.LHandTrigger; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.None; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.LThumbstick; + axis2DMap.PrimaryTouchpad = RawAxis2D.None; + axis2DMap.SecondaryThumbstick = RawAxis2D.None; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + + public override bool WasRecentered() + { + return (currentState.LRecenterCount != previousState.LRecenterCount); + } + + public override byte GetRecenterCount() + { + return currentState.LRecenterCount; + } + + public override byte GetBatteryPercentRemaining() + { + return currentState.LBatteryPercentRemaining; + } + } + + private class OVRControllerRTouch : OVRControllerBase + { + public OVRControllerRTouch() + { + controllerType = Controller.RTouch; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.A; + buttonMap.Two = RawButton.B; + buttonMap.Three = RawButton.None; + buttonMap.Four = RawButton.None; + buttonMap.Start = RawButton.None; + buttonMap.Back = RawButton.None; + buttonMap.PrimaryShoulder = RawButton.None; + buttonMap.PrimaryIndexTrigger = RawButton.RIndexTrigger; + buttonMap.PrimaryHandTrigger = RawButton.RHandTrigger; + buttonMap.PrimaryThumbstick = RawButton.RThumbstick; + buttonMap.PrimaryThumbstickUp = RawButton.RThumbstickUp; + buttonMap.PrimaryThumbstickDown = RawButton.RThumbstickDown; + buttonMap.PrimaryThumbstickLeft = RawButton.RThumbstickLeft; + buttonMap.PrimaryThumbstickRight = RawButton.RThumbstickRight; + buttonMap.PrimaryTouchpad = RawButton.None; + buttonMap.SecondaryShoulder = RawButton.None; + buttonMap.SecondaryIndexTrigger = RawButton.None; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.None; + buttonMap.SecondaryThumbstickUp = RawButton.None; + buttonMap.SecondaryThumbstickDown = RawButton.None; + buttonMap.SecondaryThumbstickLeft = RawButton.None; + buttonMap.SecondaryThumbstickRight = RawButton.None; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.None; + buttonMap.DpadDown = RawButton.None; + buttonMap.DpadLeft = RawButton.None; + buttonMap.DpadRight = RawButton.None; + buttonMap.Up = RawButton.RThumbstickUp; + buttonMap.Down = RawButton.RThumbstickDown; + buttonMap.Left = RawButton.RThumbstickLeft; + buttonMap.Right = RawButton.RThumbstickRight; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.A; + touchMap.Two = RawTouch.B; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.RIndexTrigger; + touchMap.PrimaryThumbstick = RawTouch.RThumbstick; + touchMap.PrimaryThumbRest = RawTouch.RThumbRest; + touchMap.PrimaryTouchpad = RawTouch.None; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.RIndexTrigger; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.RThumbButtons; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.RIndexTrigger; + axis1DMap.PrimaryHandTrigger = RawAxis1D.RHandTrigger; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.None; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.RThumbstick; + axis2DMap.PrimaryTouchpad = RawAxis2D.None; + axis2DMap.SecondaryThumbstick = RawAxis2D.None; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + + public override bool WasRecentered() + { + return (currentState.RRecenterCount != previousState.RRecenterCount); + } + + public override byte GetRecenterCount() + { + return currentState.RRecenterCount; + } + + public override byte GetBatteryPercentRemaining() + { + return currentState.RBatteryPercentRemaining; + } + } + + private class OVRControllerHands : OVRControllerBase + { + public OVRControllerHands() + { + controllerType = Controller.Hands; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.A; + buttonMap.Two = RawButton.None; + buttonMap.Three = RawButton.X; + buttonMap.Four = RawButton.None; + buttonMap.Start = RawButton.None; + buttonMap.Back = RawButton.None; + buttonMap.PrimaryShoulder = RawButton.None; + buttonMap.PrimaryIndexTrigger = RawButton.None; + buttonMap.PrimaryHandTrigger = RawButton.None; + buttonMap.PrimaryThumbstick = RawButton.None; + buttonMap.PrimaryThumbstickUp = RawButton.None; + buttonMap.PrimaryThumbstickDown = RawButton.None; + buttonMap.PrimaryThumbstickLeft = RawButton.None; + buttonMap.PrimaryThumbstickRight = RawButton.None; + buttonMap.PrimaryTouchpad = RawButton.None; + buttonMap.SecondaryShoulder = RawButton.None; + buttonMap.SecondaryIndexTrigger = RawButton.None; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.None; + buttonMap.SecondaryThumbstickUp = RawButton.None; + buttonMap.SecondaryThumbstickDown = RawButton.None; + buttonMap.SecondaryThumbstickLeft = RawButton.None; + buttonMap.SecondaryThumbstickRight = RawButton.None; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.None; + buttonMap.DpadDown = RawButton.None; + buttonMap.DpadLeft = RawButton.None; + buttonMap.DpadRight = RawButton.None; + buttonMap.Up = RawButton.None; + buttonMap.Down = RawButton.None; + buttonMap.Left = RawButton.None; + buttonMap.Right = RawButton.None; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.None; + touchMap.Two = RawTouch.None; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.None; + touchMap.PrimaryThumbstick = RawTouch.None; + touchMap.PrimaryThumbRest = RawTouch.None; + touchMap.PrimaryTouchpad = RawTouch.None; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.None; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.None; + axis1DMap.PrimaryHandTrigger = RawAxis1D.None; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.None; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.None; + axis2DMap.PrimaryTouchpad = RawAxis2D.None; + axis2DMap.SecondaryThumbstick = RawAxis2D.None; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + + public override bool WasRecentered() + { + return ((currentState.LRecenterCount + currentState.RRecenterCount) != (previousState.LRecenterCount + previousState.RRecenterCount)); + } + + public override byte GetRecenterCount() + { + return (byte)(currentState.LRecenterCount + currentState.RRecenterCount); + } + + public override byte GetBatteryPercentRemaining() + { + byte leftBattery = currentState.LBatteryPercentRemaining; + byte rightBattery = currentState.RBatteryPercentRemaining; + byte minBattery = (leftBattery <= rightBattery) ? leftBattery : rightBattery; + + return minBattery; + } + } + + private class OVRControllerLHand : OVRControllerBase + { + public OVRControllerLHand() + { + controllerType = Controller.LHand; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.X; + buttonMap.Two = RawButton.None; + buttonMap.Three = RawButton.None; + buttonMap.Four = RawButton.None; + buttonMap.Start = RawButton.None; + buttonMap.Back = RawButton.None; + buttonMap.PrimaryShoulder = RawButton.None; + buttonMap.PrimaryIndexTrigger = RawButton.None; + buttonMap.PrimaryHandTrigger = RawButton.None; + buttonMap.PrimaryThumbstick = RawButton.None; + buttonMap.PrimaryThumbstickUp = RawButton.None; + buttonMap.PrimaryThumbstickDown = RawButton.None; + buttonMap.PrimaryThumbstickLeft = RawButton.None; + buttonMap.PrimaryThumbstickRight = RawButton.None; + buttonMap.PrimaryTouchpad = RawButton.None; + buttonMap.SecondaryShoulder = RawButton.None; + buttonMap.SecondaryIndexTrigger = RawButton.None; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.None; + buttonMap.SecondaryThumbstickUp = RawButton.None; + buttonMap.SecondaryThumbstickDown = RawButton.None; + buttonMap.SecondaryThumbstickLeft = RawButton.None; + buttonMap.SecondaryThumbstickRight = RawButton.None; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.None; + buttonMap.DpadDown = RawButton.None; + buttonMap.DpadLeft = RawButton.None; + buttonMap.DpadRight = RawButton.None; + buttonMap.Up = RawButton.None; + buttonMap.Down = RawButton.None; + buttonMap.Left = RawButton.None; + buttonMap.Right = RawButton.None; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.None; + touchMap.Two = RawTouch.None; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.None; + touchMap.PrimaryThumbstick = RawTouch.None; + touchMap.PrimaryThumbRest = RawTouch.None; + touchMap.PrimaryTouchpad = RawTouch.None; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.None; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.None; + axis1DMap.PrimaryHandTrigger = RawAxis1D.None; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.None; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.None; + axis2DMap.PrimaryTouchpad = RawAxis2D.None; + axis2DMap.SecondaryThumbstick = RawAxis2D.None; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + + public override bool WasRecentered() + { + return (currentState.LRecenterCount != previousState.LRecenterCount); + } + + public override byte GetRecenterCount() + { + return currentState.LRecenterCount; + } + + public override byte GetBatteryPercentRemaining() + { + return currentState.LBatteryPercentRemaining; + } + } + + private class OVRControllerRHand : OVRControllerBase + { + public OVRControllerRHand() + { + controllerType = Controller.RHand; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.A; + buttonMap.Two = RawButton.None; + buttonMap.Three = RawButton.None; + buttonMap.Four = RawButton.None; + buttonMap.Start = RawButton.None; + buttonMap.Back = RawButton.None; + buttonMap.PrimaryShoulder = RawButton.None; + buttonMap.PrimaryIndexTrigger = RawButton.None; + buttonMap.PrimaryHandTrigger = RawButton.None; + buttonMap.PrimaryThumbstick = RawButton.None; + buttonMap.PrimaryThumbstickUp = RawButton.None; + buttonMap.PrimaryThumbstickDown = RawButton.None; + buttonMap.PrimaryThumbstickLeft = RawButton.None; + buttonMap.PrimaryThumbstickRight = RawButton.None; + buttonMap.PrimaryTouchpad = RawButton.None; + buttonMap.SecondaryShoulder = RawButton.None; + buttonMap.SecondaryIndexTrigger = RawButton.None; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.None; + buttonMap.SecondaryThumbstickUp = RawButton.None; + buttonMap.SecondaryThumbstickDown = RawButton.None; + buttonMap.SecondaryThumbstickLeft = RawButton.None; + buttonMap.SecondaryThumbstickRight = RawButton.None; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.None; + buttonMap.DpadDown = RawButton.None; + buttonMap.DpadLeft = RawButton.None; + buttonMap.DpadRight = RawButton.None; + buttonMap.Up = RawButton.None; + buttonMap.Down = RawButton.None; + buttonMap.Left = RawButton.None; + buttonMap.Right = RawButton.None; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.None; + touchMap.Two = RawTouch.None; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.None; + touchMap.PrimaryThumbstick = RawTouch.None; + touchMap.PrimaryThumbRest = RawTouch.None; + touchMap.PrimaryTouchpad = RawTouch.None; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.None; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.None; + axis1DMap.PrimaryHandTrigger = RawAxis1D.None; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.None; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.None; + axis2DMap.PrimaryTouchpad = RawAxis2D.None; + axis2DMap.SecondaryThumbstick = RawAxis2D.None; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + + public override bool WasRecentered() + { + return (currentState.RRecenterCount != previousState.RRecenterCount); + } + + public override byte GetRecenterCount() + { + return currentState.RRecenterCount; + } + + public override byte GetBatteryPercentRemaining() + { + return currentState.RBatteryPercentRemaining; + } + } + + private class OVRControllerRemote : OVRControllerBase + { + public OVRControllerRemote() + { + controllerType = Controller.Remote; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.Start; + buttonMap.Two = RawButton.Back; + buttonMap.Three = RawButton.None; + buttonMap.Four = RawButton.None; + buttonMap.Start = RawButton.Start; + buttonMap.Back = RawButton.Back; + buttonMap.PrimaryShoulder = RawButton.None; + buttonMap.PrimaryIndexTrigger = RawButton.None; + buttonMap.PrimaryHandTrigger = RawButton.None; + buttonMap.PrimaryThumbstick = RawButton.None; + buttonMap.PrimaryThumbstickUp = RawButton.None; + buttonMap.PrimaryThumbstickDown = RawButton.None; + buttonMap.PrimaryThumbstickLeft = RawButton.None; + buttonMap.PrimaryThumbstickRight = RawButton.None; + buttonMap.PrimaryTouchpad = RawButton.None; + buttonMap.SecondaryShoulder = RawButton.None; + buttonMap.SecondaryIndexTrigger = RawButton.None; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.None; + buttonMap.SecondaryThumbstickUp = RawButton.None; + buttonMap.SecondaryThumbstickDown = RawButton.None; + buttonMap.SecondaryThumbstickLeft = RawButton.None; + buttonMap.SecondaryThumbstickRight = RawButton.None; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.DpadUp; + buttonMap.DpadDown = RawButton.DpadDown; + buttonMap.DpadLeft = RawButton.DpadLeft; + buttonMap.DpadRight = RawButton.DpadRight; + buttonMap.Up = RawButton.DpadUp; + buttonMap.Down = RawButton.DpadDown; + buttonMap.Left = RawButton.DpadLeft; + buttonMap.Right = RawButton.DpadRight; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.None; + touchMap.Two = RawTouch.None; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.None; + touchMap.PrimaryThumbstick = RawTouch.None; + touchMap.PrimaryThumbRest = RawTouch.None; + touchMap.PrimaryTouchpad = RawTouch.None; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.None; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.None; + axis1DMap.PrimaryHandTrigger = RawAxis1D.None; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.None; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.None; + axis2DMap.PrimaryTouchpad = RawAxis2D.None; + axis2DMap.SecondaryThumbstick = RawAxis2D.None; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + } + + private class OVRControllerGamepadPC : OVRControllerBase + { + public OVRControllerGamepadPC() + { + controllerType = Controller.Gamepad; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.A; + buttonMap.Two = RawButton.B; + buttonMap.Three = RawButton.X; + buttonMap.Four = RawButton.Y; + buttonMap.Start = RawButton.Start; + buttonMap.Back = RawButton.Back; + buttonMap.PrimaryShoulder = RawButton.LShoulder; + buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger; + buttonMap.PrimaryHandTrigger = RawButton.None; + buttonMap.PrimaryThumbstick = RawButton.LThumbstick; + buttonMap.PrimaryThumbstickUp = RawButton.LThumbstickUp; + buttonMap.PrimaryThumbstickDown = RawButton.LThumbstickDown; + buttonMap.PrimaryThumbstickLeft = RawButton.LThumbstickLeft; + buttonMap.PrimaryThumbstickRight = RawButton.LThumbstickRight; + buttonMap.PrimaryTouchpad = RawButton.None; + buttonMap.SecondaryShoulder = RawButton.RShoulder; + buttonMap.SecondaryIndexTrigger = RawButton.RIndexTrigger; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.RThumbstick; + buttonMap.SecondaryThumbstickUp = RawButton.RThumbstickUp; + buttonMap.SecondaryThumbstickDown = RawButton.RThumbstickDown; + buttonMap.SecondaryThumbstickLeft = RawButton.RThumbstickLeft; + buttonMap.SecondaryThumbstickRight = RawButton.RThumbstickRight; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.DpadUp; + buttonMap.DpadDown = RawButton.DpadDown; + buttonMap.DpadLeft = RawButton.DpadLeft; + buttonMap.DpadRight = RawButton.DpadRight; + buttonMap.Up = RawButton.LThumbstickUp; + buttonMap.Down = RawButton.LThumbstickDown; + buttonMap.Left = RawButton.LThumbstickLeft; + buttonMap.Right = RawButton.LThumbstickRight; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.None; + touchMap.Two = RawTouch.None; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.None; + touchMap.PrimaryThumbstick = RawTouch.None; + touchMap.PrimaryThumbRest = RawTouch.None; + touchMap.PrimaryTouchpad = RawTouch.None; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.None; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger; + axis1DMap.PrimaryHandTrigger = RawAxis1D.None; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.RIndexTrigger; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.LThumbstick; + axis2DMap.PrimaryTouchpad = RawAxis2D.None; + axis2DMap.SecondaryThumbstick = RawAxis2D.RThumbstick; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + } + + private class OVRControllerGamepadMac : OVRControllerBase + { + /// An axis on the gamepad. + private enum AxisGPC + { + None = -1, + LeftXAxis = 0, + LeftYAxis, + RightXAxis, + RightYAxis, + LeftTrigger, + RightTrigger, + DPad_X_Axis, + DPad_Y_Axis, + Max, + }; + + /// A button on the gamepad. + public enum ButtonGPC + { + None = -1, + A = 0, + B, + X, + Y, + Up, + Down, + Left, + Right, + Start, + Back, + LStick, + RStick, + LeftShoulder, + RightShoulder, + Max + }; + + private bool initialized = false; + + public OVRControllerGamepadMac() + { + controllerType = Controller.Gamepad; + + initialized = OVR_GamepadController_Initialize(); + } + + ~OVRControllerGamepadMac() + { + if (!initialized) + return; + + OVR_GamepadController_Destroy(); + } + + public override Controller Update() + { + if (!initialized) + { + return Controller.None; + } + + OVRPlugin.ControllerState4 state = new OVRPlugin.ControllerState4(); + + bool result = OVR_GamepadController_Update(); + + if (result) + state.ConnectedControllers = (uint)Controller.Gamepad; + + if (OVR_GamepadController_GetButton((int)ButtonGPC.A)) + state.Buttons |= (uint)RawButton.A; + if (OVR_GamepadController_GetButton((int)ButtonGPC.B)) + state.Buttons |= (uint)RawButton.B; + if (OVR_GamepadController_GetButton((int)ButtonGPC.X)) + state.Buttons |= (uint)RawButton.X; + if (OVR_GamepadController_GetButton((int)ButtonGPC.Y)) + state.Buttons |= (uint)RawButton.Y; + if (OVR_GamepadController_GetButton((int)ButtonGPC.Up)) + state.Buttons |= (uint)RawButton.DpadUp; + if (OVR_GamepadController_GetButton((int)ButtonGPC.Down)) + state.Buttons |= (uint)RawButton.DpadDown; + if (OVR_GamepadController_GetButton((int)ButtonGPC.Left)) + state.Buttons |= (uint)RawButton.DpadLeft; + if (OVR_GamepadController_GetButton((int)ButtonGPC.Right)) + state.Buttons |= (uint)RawButton.DpadRight; + if (OVR_GamepadController_GetButton((int)ButtonGPC.Start)) + state.Buttons |= (uint)RawButton.Start; + if (OVR_GamepadController_GetButton((int)ButtonGPC.Back)) + state.Buttons |= (uint)RawButton.Back; + if (OVR_GamepadController_GetButton((int)ButtonGPC.LStick)) + state.Buttons |= (uint)RawButton.LThumbstick; + if (OVR_GamepadController_GetButton((int)ButtonGPC.RStick)) + state.Buttons |= (uint)RawButton.RThumbstick; + if (OVR_GamepadController_GetButton((int)ButtonGPC.LeftShoulder)) + state.Buttons |= (uint)RawButton.LShoulder; + if (OVR_GamepadController_GetButton((int)ButtonGPC.RightShoulder)) + state.Buttons |= (uint)RawButton.RShoulder; + + state.LThumbstick.x = OVR_GamepadController_GetAxis((int)AxisGPC.LeftXAxis); + state.LThumbstick.y = OVR_GamepadController_GetAxis((int)AxisGPC.LeftYAxis); + state.RThumbstick.x = OVR_GamepadController_GetAxis((int)AxisGPC.RightXAxis); + state.RThumbstick.y = OVR_GamepadController_GetAxis((int)AxisGPC.RightYAxis); + state.LIndexTrigger = OVR_GamepadController_GetAxis((int)AxisGPC.LeftTrigger); + state.RIndexTrigger = OVR_GamepadController_GetAxis((int)AxisGPC.RightTrigger); + + if (state.LIndexTrigger >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LIndexTrigger; + if (state.LHandTrigger >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LHandTrigger; + if (state.LThumbstick.y >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LThumbstickUp; + if (state.LThumbstick.y <= -AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LThumbstickDown; + if (state.LThumbstick.x <= -AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LThumbstickLeft; + if (state.LThumbstick.x >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.LThumbstickRight; + + if (state.RIndexTrigger >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RIndexTrigger; + if (state.RHandTrigger >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RHandTrigger; + if (state.RThumbstick.y >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RThumbstickUp; + if (state.RThumbstick.y <= -AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RThumbstickDown; + if (state.RThumbstick.x <= -AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RThumbstickLeft; + if (state.RThumbstick.x >= AXIS_AS_BUTTON_THRESHOLD) + state.Buttons |= (uint)RawButton.RThumbstickRight; + + previousState = currentState; + currentState = state; + + return ((Controller)currentState.ConnectedControllers & controllerType); + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.A; + buttonMap.Two = RawButton.B; + buttonMap.Three = RawButton.X; + buttonMap.Four = RawButton.Y; + buttonMap.Start = RawButton.Start; + buttonMap.Back = RawButton.Back; + buttonMap.PrimaryShoulder = RawButton.LShoulder; + buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger; + buttonMap.PrimaryHandTrigger = RawButton.None; + buttonMap.PrimaryThumbstick = RawButton.LThumbstick; + buttonMap.PrimaryThumbstickUp = RawButton.LThumbstickUp; + buttonMap.PrimaryThumbstickDown = RawButton.LThumbstickDown; + buttonMap.PrimaryThumbstickLeft = RawButton.LThumbstickLeft; + buttonMap.PrimaryThumbstickRight = RawButton.LThumbstickRight; + buttonMap.PrimaryTouchpad = RawButton.None; + buttonMap.SecondaryShoulder = RawButton.RShoulder; + buttonMap.SecondaryIndexTrigger = RawButton.RIndexTrigger; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.RThumbstick; + buttonMap.SecondaryThumbstickUp = RawButton.RThumbstickUp; + buttonMap.SecondaryThumbstickDown = RawButton.RThumbstickDown; + buttonMap.SecondaryThumbstickLeft = RawButton.RThumbstickLeft; + buttonMap.SecondaryThumbstickRight = RawButton.RThumbstickRight; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.DpadUp; + buttonMap.DpadDown = RawButton.DpadDown; + buttonMap.DpadLeft = RawButton.DpadLeft; + buttonMap.DpadRight = RawButton.DpadRight; + buttonMap.Up = RawButton.LThumbstickUp; + buttonMap.Down = RawButton.LThumbstickDown; + buttonMap.Left = RawButton.LThumbstickLeft; + buttonMap.Right = RawButton.LThumbstickRight; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.None; + touchMap.Two = RawTouch.None; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.None; + touchMap.PrimaryThumbstick = RawTouch.None; + touchMap.PrimaryThumbRest = RawTouch.None; + touchMap.PrimaryTouchpad = RawTouch.None; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.None; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger; + axis1DMap.PrimaryHandTrigger = RawAxis1D.None; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.RIndexTrigger; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.LThumbstick; + axis2DMap.PrimaryTouchpad = RawAxis2D.None; + axis2DMap.SecondaryThumbstick = RawAxis2D.RThumbstick; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + + public override void SetControllerVibration(float frequency, float amplitude) + { + int gpcNode = 0; + float gpcFrequency = frequency * 200.0f; //Map frequency from 0-1 CAPI range to 0-200 GPC range + float gpcStrength = amplitude; + + OVR_GamepadController_SetVibration(gpcNode, gpcStrength, gpcFrequency); + } + + private const string DllName = "OVRGamepad"; + + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + private static extern bool OVR_GamepadController_Initialize(); + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + private static extern bool OVR_GamepadController_Destroy(); + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + private static extern bool OVR_GamepadController_Update(); + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + private static extern float OVR_GamepadController_GetAxis(int axis); + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + private static extern bool OVR_GamepadController_GetButton(int button); + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + private static extern bool OVR_GamepadController_SetVibration(int node, float strength, float frequency); + } + + private class OVRControllerGamepadAndroid : OVRControllerBase + { + public OVRControllerGamepadAndroid() + { + controllerType = Controller.Gamepad; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.A; + buttonMap.Two = RawButton.B; + buttonMap.Three = RawButton.X; + buttonMap.Four = RawButton.Y; + buttonMap.Start = RawButton.Start; + buttonMap.Back = RawButton.Back; + buttonMap.PrimaryShoulder = RawButton.LShoulder; + buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger; + buttonMap.PrimaryHandTrigger = RawButton.None; + buttonMap.PrimaryThumbstick = RawButton.LThumbstick; + buttonMap.PrimaryThumbstickUp = RawButton.LThumbstickUp; + buttonMap.PrimaryThumbstickDown = RawButton.LThumbstickDown; + buttonMap.PrimaryThumbstickLeft = RawButton.LThumbstickLeft; + buttonMap.PrimaryThumbstickRight = RawButton.LThumbstickRight; + buttonMap.PrimaryTouchpad = RawButton.None; + buttonMap.SecondaryShoulder = RawButton.RShoulder; + buttonMap.SecondaryIndexTrigger = RawButton.RIndexTrigger; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.RThumbstick; + buttonMap.SecondaryThumbstickUp = RawButton.RThumbstickUp; + buttonMap.SecondaryThumbstickDown = RawButton.RThumbstickDown; + buttonMap.SecondaryThumbstickLeft = RawButton.RThumbstickLeft; + buttonMap.SecondaryThumbstickRight = RawButton.RThumbstickRight; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.DpadUp; + buttonMap.DpadDown = RawButton.DpadDown; + buttonMap.DpadLeft = RawButton.DpadLeft; + buttonMap.DpadRight = RawButton.DpadRight; + buttonMap.Up = RawButton.LThumbstickUp; + buttonMap.Down = RawButton.LThumbstickDown; + buttonMap.Left = RawButton.LThumbstickLeft; + buttonMap.Right = RawButton.LThumbstickRight; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.None; + touchMap.Two = RawTouch.None; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.None; + touchMap.PrimaryThumbstick = RawTouch.None; + touchMap.PrimaryThumbRest = RawTouch.None; + touchMap.PrimaryTouchpad = RawTouch.None; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.None; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger; + axis1DMap.PrimaryHandTrigger = RawAxis1D.None; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.RIndexTrigger; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.LThumbstick; + axis2DMap.PrimaryTouchpad = RawAxis2D.None; + axis2DMap.SecondaryThumbstick = RawAxis2D.RThumbstick; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + } + + private class OVRControllerTouchpad : OVRControllerBase + { + private OVRPlugin.Vector2f moveAmount; + private float maxTapMagnitude = 0.1f; + private float minMoveMagnitude = 0.15f; + + public OVRControllerTouchpad() + { + controllerType = Controller.Touchpad; + } + + public override Controller Update() + { + Controller res = base.Update(); + + if (GetDown(RawTouch.LTouchpad, OVRInput.Controller.Touchpad)) + { + moveAmount = currentState.LTouchpad; + } + + if (GetUp(RawTouch.LTouchpad, OVRInput.Controller.Touchpad)) + { + moveAmount.x = previousState.LTouchpad.x - moveAmount.x; + moveAmount.y = previousState.LTouchpad.y - moveAmount.y; + + Vector2 move = new Vector2(moveAmount.x, moveAmount.y); + float moveMag = move.magnitude; + + if (moveMag < maxTapMagnitude) + { + // Emit Touchpad Tap + currentState.Buttons |= (uint)RawButton.Start; + currentState.Buttons |= (uint)RawButton.LTouchpad; + } + else if (moveMag >= minMoveMagnitude) + { + move.Normalize(); + + // Left/Right + if (Mathf.Abs(move.x) > Mathf.Abs(move.y)) + { + if (move.x < 0.0f) + { + currentState.Buttons |= (uint)RawButton.DpadLeft; + } + else + { + currentState.Buttons |= (uint)RawButton.DpadRight; + } + } + // Up/Down + else + { + if (move.y < 0.0f) + { + currentState.Buttons |= (uint)RawButton.DpadDown; + } + else + { + currentState.Buttons |= (uint)RawButton.DpadUp; + } + } + } + } + + return res; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.LTouchpad; + buttonMap.Two = RawButton.Back; + buttonMap.Three = RawButton.None; + buttonMap.Four = RawButton.None; + buttonMap.Start = RawButton.Start; + buttonMap.Back = RawButton.Back; + buttonMap.PrimaryShoulder = RawButton.None; + buttonMap.PrimaryIndexTrigger = RawButton.None; + buttonMap.PrimaryHandTrigger = RawButton.None; + buttonMap.PrimaryThumbstick = RawButton.None; + buttonMap.PrimaryThumbstickUp = RawButton.None; + buttonMap.PrimaryThumbstickDown = RawButton.None; + buttonMap.PrimaryThumbstickLeft = RawButton.None; + buttonMap.PrimaryThumbstickRight = RawButton.None; + buttonMap.PrimaryTouchpad = RawButton.LTouchpad; + buttonMap.SecondaryShoulder = RawButton.None; + buttonMap.SecondaryIndexTrigger = RawButton.None; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.None; + buttonMap.SecondaryThumbstickUp = RawButton.None; + buttonMap.SecondaryThumbstickDown = RawButton.None; + buttonMap.SecondaryThumbstickLeft = RawButton.None; + buttonMap.SecondaryThumbstickRight = RawButton.None; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.DpadUp; + buttonMap.DpadDown = RawButton.DpadDown; + buttonMap.DpadLeft = RawButton.DpadLeft; + buttonMap.DpadRight = RawButton.DpadRight; + buttonMap.Up = RawButton.DpadUp; + buttonMap.Down = RawButton.DpadDown; + buttonMap.Left = RawButton.DpadLeft; + buttonMap.Right = RawButton.DpadRight; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.LTouchpad; + touchMap.Two = RawTouch.None; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.None; + touchMap.PrimaryThumbstick = RawTouch.None; + touchMap.PrimaryThumbRest = RawTouch.None; + touchMap.PrimaryTouchpad = RawTouch.LTouchpad; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.None; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.None; + axis1DMap.PrimaryHandTrigger = RawAxis1D.None; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.None; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.None; + axis2DMap.PrimaryTouchpad = RawAxis2D.LTouchpad; + axis2DMap.SecondaryThumbstick = RawAxis2D.None; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + } + + private class OVRControllerLTrackedRemote : OVRControllerBase + { + private bool emitSwipe; + private OVRPlugin.Vector2f moveAmount; + private float minMoveMagnitude = 0.3f; + + public OVRControllerLTrackedRemote() + { + controllerType = Controller.LTrackedRemote; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.LTouchpad; + buttonMap.Two = RawButton.Back; + buttonMap.Three = RawButton.None; + buttonMap.Four = RawButton.None; + buttonMap.Start = RawButton.Start; + buttonMap.Back = RawButton.Back; + buttonMap.PrimaryShoulder = RawButton.None; + buttonMap.PrimaryIndexTrigger = RawButton.LIndexTrigger; + buttonMap.PrimaryHandTrigger = RawButton.LHandTrigger; + buttonMap.PrimaryThumbstick = RawButton.None; + buttonMap.PrimaryThumbstickUp = RawButton.None; + buttonMap.PrimaryThumbstickDown = RawButton.None; + buttonMap.PrimaryThumbstickLeft = RawButton.None; + buttonMap.PrimaryThumbstickRight = RawButton.None; + buttonMap.PrimaryTouchpad = RawButton.LTouchpad; + buttonMap.SecondaryShoulder = RawButton.None; + buttonMap.SecondaryIndexTrigger = RawButton.None; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.None; + buttonMap.SecondaryThumbstickUp = RawButton.None; + buttonMap.SecondaryThumbstickDown = RawButton.None; + buttonMap.SecondaryThumbstickLeft = RawButton.None; + buttonMap.SecondaryThumbstickRight = RawButton.None; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.DpadUp; + buttonMap.DpadDown = RawButton.DpadDown; + buttonMap.DpadLeft = RawButton.DpadLeft; + buttonMap.DpadRight = RawButton.DpadRight; + buttonMap.Up = RawButton.DpadUp; + buttonMap.Down = RawButton.DpadDown; + buttonMap.Left = RawButton.DpadLeft; + buttonMap.Right = RawButton.DpadRight; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.LTouchpad; + touchMap.Two = RawTouch.None; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.LIndexTrigger; + touchMap.PrimaryThumbstick = RawTouch.None; + touchMap.PrimaryThumbRest = RawTouch.None; + touchMap.PrimaryTouchpad = RawTouch.LTouchpad; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.None; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.LIndexTrigger; + axis1DMap.PrimaryHandTrigger = RawAxis1D.LHandTrigger; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.None; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.None; + axis2DMap.PrimaryTouchpad = RawAxis2D.LTouchpad; + axis2DMap.SecondaryThumbstick = RawAxis2D.None; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + + public override Controller Update() + { + Controller res = base.Update(); + + if (GetDown(RawTouch.LTouchpad, OVRInput.Controller.LTrackedRemote)) + { + emitSwipe = true; + moveAmount = currentState.LTouchpad; + } + + if (GetDown(RawButton.LTouchpad, OVRInput.Controller.LTrackedRemote)) + { + emitSwipe = false; + } + + if (GetUp(RawTouch.LTouchpad, OVRInput.Controller.LTrackedRemote) && emitSwipe) + { + emitSwipe = false; + + moveAmount.x = previousState.LTouchpad.x - moveAmount.x; + moveAmount.y = previousState.LTouchpad.y - moveAmount.y; + + Vector2 move = new Vector2(moveAmount.x, moveAmount.y); + + if (move.magnitude >= minMoveMagnitude) + { + move.Normalize(); + + // Left/Right + if (Mathf.Abs(move.x) > Mathf.Abs(move.y)) + { + if (move.x < 0.0f) + { + currentState.Buttons |= (uint)RawButton.DpadLeft; + } + else + { + currentState.Buttons |= (uint)RawButton.DpadRight; + } + } + // Up/Down + else + { + if (move.y < 0.0f) + { + currentState.Buttons |= (uint)RawButton.DpadDown; + } + else + { + currentState.Buttons |= (uint)RawButton.DpadUp; + } + } + } + } + + return res; + } + + public override bool WasRecentered() + { + return (currentState.LRecenterCount != previousState.LRecenterCount); + } + + public override byte GetRecenterCount() + { + return currentState.LRecenterCount; + } + + public override byte GetBatteryPercentRemaining() + { + return currentState.LBatteryPercentRemaining; + } + } + + private class OVRControllerRTrackedRemote : OVRControllerBase + { + private bool emitSwipe; + private OVRPlugin.Vector2f moveAmount; + private float minMoveMagnitude = 0.3f; + + public OVRControllerRTrackedRemote() + { + controllerType = Controller.RTrackedRemote; + } + + public override void ConfigureButtonMap() + { + buttonMap.None = RawButton.None; + buttonMap.One = RawButton.RTouchpad; + buttonMap.Two = RawButton.Back; + buttonMap.Three = RawButton.None; + buttonMap.Four = RawButton.None; + buttonMap.Start = RawButton.Start; + buttonMap.Back = RawButton.Back; + buttonMap.PrimaryShoulder = RawButton.None; + buttonMap.PrimaryIndexTrigger = RawButton.RIndexTrigger; + buttonMap.PrimaryHandTrigger = RawButton.RHandTrigger; + buttonMap.PrimaryThumbstick = RawButton.None; + buttonMap.PrimaryThumbstickUp = RawButton.None; + buttonMap.PrimaryThumbstickDown = RawButton.None; + buttonMap.PrimaryThumbstickLeft = RawButton.None; + buttonMap.PrimaryThumbstickRight = RawButton.None; + buttonMap.PrimaryTouchpad = RawButton.RTouchpad; + buttonMap.SecondaryShoulder = RawButton.None; + buttonMap.SecondaryIndexTrigger = RawButton.None; + buttonMap.SecondaryHandTrigger = RawButton.None; + buttonMap.SecondaryThumbstick = RawButton.None; + buttonMap.SecondaryThumbstickUp = RawButton.None; + buttonMap.SecondaryThumbstickDown = RawButton.None; + buttonMap.SecondaryThumbstickLeft = RawButton.None; + buttonMap.SecondaryThumbstickRight = RawButton.None; + buttonMap.SecondaryTouchpad = RawButton.None; + buttonMap.DpadUp = RawButton.DpadUp; + buttonMap.DpadDown = RawButton.DpadDown; + buttonMap.DpadLeft = RawButton.DpadLeft; + buttonMap.DpadRight = RawButton.DpadRight; + buttonMap.Up = RawButton.DpadUp; + buttonMap.Down = RawButton.DpadDown; + buttonMap.Left = RawButton.DpadLeft; + buttonMap.Right = RawButton.DpadRight; + } + + public override void ConfigureTouchMap() + { + touchMap.None = RawTouch.None; + touchMap.One = RawTouch.RTouchpad; + touchMap.Two = RawTouch.None; + touchMap.Three = RawTouch.None; + touchMap.Four = RawTouch.None; + touchMap.PrimaryIndexTrigger = RawTouch.RIndexTrigger; + touchMap.PrimaryThumbstick = RawTouch.None; + touchMap.PrimaryThumbRest = RawTouch.None; + touchMap.PrimaryTouchpad = RawTouch.RTouchpad; + touchMap.SecondaryIndexTrigger = RawTouch.None; + touchMap.SecondaryThumbstick = RawTouch.None; + touchMap.SecondaryThumbRest = RawTouch.None; + touchMap.SecondaryTouchpad = RawTouch.None; + } + + public override void ConfigureNearTouchMap() + { + nearTouchMap.None = RawNearTouch.None; + nearTouchMap.PrimaryIndexTrigger = RawNearTouch.None; + nearTouchMap.PrimaryThumbButtons = RawNearTouch.None; + nearTouchMap.SecondaryIndexTrigger = RawNearTouch.None; + nearTouchMap.SecondaryThumbButtons = RawNearTouch.None; + } + + public override void ConfigureAxis1DMap() + { + axis1DMap.None = RawAxis1D.None; + axis1DMap.PrimaryIndexTrigger = RawAxis1D.RIndexTrigger; + axis1DMap.PrimaryHandTrigger = RawAxis1D.RHandTrigger; + axis1DMap.SecondaryIndexTrigger = RawAxis1D.None; + axis1DMap.SecondaryHandTrigger = RawAxis1D.None; + } + + public override void ConfigureAxis2DMap() + { + axis2DMap.None = RawAxis2D.None; + axis2DMap.PrimaryThumbstick = RawAxis2D.None; + axis2DMap.PrimaryTouchpad = RawAxis2D.RTouchpad; + axis2DMap.SecondaryThumbstick = RawAxis2D.None; + axis2DMap.SecondaryTouchpad = RawAxis2D.None; + } + + public override Controller Update() + { + Controller res = base.Update(); + + if (GetDown(RawTouch.RTouchpad, OVRInput.Controller.RTrackedRemote)) + { + emitSwipe = true; + moveAmount = currentState.RTouchpad; + } + + if (GetDown(RawButton.RTouchpad, OVRInput.Controller.RTrackedRemote)) + { + emitSwipe = false; + } + + if (GetUp(RawTouch.RTouchpad, OVRInput.Controller.RTrackedRemote) && emitSwipe) + { + emitSwipe = false; + + moveAmount.x = previousState.RTouchpad.x - moveAmount.x; + moveAmount.y = previousState.RTouchpad.y - moveAmount.y; + + Vector2 move = new Vector2(moveAmount.x, moveAmount.y); + + if (move.magnitude >= minMoveMagnitude) + { + move.Normalize(); + + // Left/Right + if (Mathf.Abs(move.x) > Mathf.Abs(move.y)) + { + if (move.x < 0.0f) + { + currentState.Buttons |= (uint)RawButton.DpadLeft; + } + else + { + currentState.Buttons |= (uint)RawButton.DpadRight; + } + } + // Up/Down + else + { + if (move.y < 0.0f) + { + currentState.Buttons |= (uint)RawButton.DpadDown; + } + else + { + currentState.Buttons |= (uint)RawButton.DpadUp; + } + } + } + } + + return res; + } + + public override bool WasRecentered() + { + return (currentState.RRecenterCount != previousState.RRecenterCount); + } + + public override byte GetRecenterCount() + { + return currentState.RRecenterCount; + } + + public override byte GetBatteryPercentRemaining() + { + return currentState.RBatteryPercentRemaining; + } + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRInput.cs.meta b/Assets/Oculus/VR/Scripts/OVRInput.cs.meta new file mode 100644 index 0000000..b37ef64 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRInput.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d210caf8a50e1954c80690fa858572ad +timeCreated: 1438295094 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/OVRLayerAttribute.cs b/Assets/Oculus/VR/Scripts/OVRLayerAttribute.cs new file mode 100644 index 0000000..f20b149 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRLayerAttribute.cs @@ -0,0 +1,23 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; + +/// +/// Dummy subtype of PropertyAttribute for custom inspector to use. +/// +public class OVRLayerAttribute : PropertyAttribute { +} diff --git a/Assets/Oculus/VR/Scripts/OVRLayerAttribute.cs.meta b/Assets/Oculus/VR/Scripts/OVRLayerAttribute.cs.meta new file mode 100644 index 0000000..04c9133 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRLayerAttribute.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 701bfebb60063334f994e36546c103d6 +timeCreated: 1499749327 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/OVRManager.cs b/Assets/Oculus/VR/Scripts/OVRManager.cs new file mode 100644 index 0000000..4db7218 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRManager.cs @@ -0,0 +1,1992 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +#if USING_XR_MANAGEMENT && USING_XR_SDK_OCULUS +#define USING_XR_SDK +#endif + +#if UNITY_ANDROID && !UNITY_EDITOR +#define OVR_ANDROID_MRC +#endif + +#if !UNITY_5_6_OR_NEWER +#error Oculus Utilities require Unity 5.6 or higher. +#endif + +using System; +using System.Collections.Generic; +using UnityEngine; +#if UNITY_EDITOR +using UnityEditor; +#endif + +#if USING_XR_SDK +using UnityEngine.XR; +using UnityEngine.Experimental.XR; +#endif + +#if UNITY_2017_2_OR_NEWER +using Settings = UnityEngine.XR.XRSettings; +using Node = UnityEngine.XR.XRNode; +#else +using Settings = UnityEngine.VR.VRSettings; +using Node = UnityEngine.VR.VRNode; +#endif + +/// +/// Configuration data for Oculus virtual reality. +/// +public class OVRManager : MonoBehaviour +{ + public enum TrackingOrigin + { + EyeLevel = OVRPlugin.TrackingOrigin.EyeLevel, + FloorLevel = OVRPlugin.TrackingOrigin.FloorLevel, + Stage = OVRPlugin.TrackingOrigin.Stage, + } + + public enum EyeTextureFormat + { + Default = OVRPlugin.EyeTextureFormat.Default, + R16G16B16A16_FP = OVRPlugin.EyeTextureFormat.R16G16B16A16_FP, + R11G11B10_FP = OVRPlugin.EyeTextureFormat.R11G11B10_FP, + } + + public enum FixedFoveatedRenderingLevel + { + Off = OVRPlugin.FixedFoveatedRenderingLevel.Off, + Low = OVRPlugin.FixedFoveatedRenderingLevel.Low, + Medium = OVRPlugin.FixedFoveatedRenderingLevel.Medium, + High = OVRPlugin.FixedFoveatedRenderingLevel.High, + HighTop = OVRPlugin.FixedFoveatedRenderingLevel.HighTop, + } + + [Obsolete("Please use FixedFoveatedRenderingLevel instead")] + public enum TiledMultiResLevel + { + Off = OVRPlugin.TiledMultiResLevel.Off, + LMSLow = OVRPlugin.TiledMultiResLevel.LMSLow, + LMSMedium = OVRPlugin.TiledMultiResLevel.LMSMedium, + LMSHigh = OVRPlugin.TiledMultiResLevel.LMSHigh, + LMSHighTop = OVRPlugin.TiledMultiResLevel.LMSHighTop, + } + + public enum XRDevice + { + Unknown = 0, + Oculus = 1, + OpenVR = 2, + } + + /// + /// Gets the singleton instance. + /// + public static OVRManager instance { get; private set; } + + /// + /// Gets a reference to the active display. + /// + public static OVRDisplay display { get; private set; } + + /// + /// Gets a reference to the active sensor. + /// + public static OVRTracker tracker { get; private set; } + + /// + /// Gets a reference to the active boundary system. + /// + public static OVRBoundary boundary { get; private set; } + + private static OVRProfile _profile; + /// + /// Gets the current profile, which contains information about the user's settings and body dimensions. + /// + public static OVRProfile profile + { + get { + if (_profile == null) + _profile = new OVRProfile(); + + return _profile; + } + } + + private IEnumerable disabledCameras; + float prevTimeScale; + + /// + /// Occurs when an HMD attached. + /// + public static event Action HMDAcquired; + + /// + /// Occurs when an HMD detached. + /// + public static event Action HMDLost; + + /// + /// Occurs when an HMD is put on the user's head. + /// + public static event Action HMDMounted; + + /// + /// Occurs when an HMD is taken off the user's head. + /// + public static event Action HMDUnmounted; + + /// + /// Occurs when VR Focus is acquired. + /// + public static event Action VrFocusAcquired; + + /// + /// Occurs when VR Focus is lost. + /// + public static event Action VrFocusLost; + + /// + /// Occurs when Input Focus is acquired. + /// + public static event Action InputFocusAcquired; + + /// + /// Occurs when Input Focus is lost. + /// + public static event Action InputFocusLost; + + /// + /// Occurs when the active Audio Out device has changed and a restart is needed. + /// + public static event Action AudioOutChanged; + + /// + /// Occurs when the active Audio In device has changed and a restart is needed. + /// + public static event Action AudioInChanged; + + /// + /// Occurs when the sensor gained tracking. + /// + public static event Action TrackingAcquired; + + /// + /// Occurs when the sensor lost tracking. + /// + public static event Action TrackingLost; + + /// + /// Occurs when Health & Safety Warning is dismissed. + /// + //Disable the warning about it being unused. It's deprecated. + #pragma warning disable 0067 + [Obsolete] + public static event Action HSWDismissed; + #pragma warning restore + + private static bool _isHmdPresentCached = false; + private static bool _isHmdPresent = false; + private static bool _wasHmdPresent = false; + /// + /// If true, a head-mounted display is connected and present. + /// + public static bool isHmdPresent + { + get { + if (!_isHmdPresentCached) + { + _isHmdPresentCached = true; + _isHmdPresent = OVRNodeStateProperties.IsHmdPresent(); + } + + return _isHmdPresent; + } + + private set { + _isHmdPresentCached = true; + _isHmdPresent = value; + } + } + + /// + /// Gets the audio output device identifier. + /// + /// + /// On Windows, this is a string containing the GUID of the IMMDevice for the Windows audio endpoint to use. + /// + public static string audioOutId + { + get { return OVRPlugin.audioOutId; } + } + + /// + /// Gets the audio input device identifier. + /// + /// + /// On Windows, this is a string containing the GUID of the IMMDevice for the Windows audio endpoint to use. + /// + public static string audioInId + { + get { return OVRPlugin.audioInId; } + } + + private static bool _hasVrFocusCached = false; + private static bool _hasVrFocus = false; + private static bool _hadVrFocus = false; + /// + /// If true, the app has VR Focus. + /// + public static bool hasVrFocus + { + get { + if (!_hasVrFocusCached) + { + _hasVrFocusCached = true; + _hasVrFocus = OVRPlugin.hasVrFocus; + } + + return _hasVrFocus; + } + + private set { + _hasVrFocusCached = true; + _hasVrFocus = value; + } + } + + private static bool _hadInputFocus = true; + /// + /// If true, the app has Input Focus. + /// + public static bool hasInputFocus + { + get + { + return OVRPlugin.hasInputFocus; + } + } + + /// + /// If true, chromatic de-aberration will be applied, improving the image at the cost of texture bandwidth. + /// + public bool chromatic + { + get { + if (!isHmdPresent) + return false; + + return OVRPlugin.chromatic; + } + + set { + if (!isHmdPresent) + return; + + OVRPlugin.chromatic = value; + } + } + + [Header("Performance/Quality")] + /// + /// If true, distortion rendering work is submitted a quarter-frame early to avoid pipeline stalls and increase CPU-GPU parallelism. + /// + [Tooltip("If true, distortion rendering work is submitted a quarter-frame early to avoid pipeline stalls and increase CPU-GPU parallelism.")] + public bool queueAhead = true; + + /// + /// If true, Unity will use the optimal antialiasing level for quality/performance on the current hardware. + /// + [Tooltip("If true, Unity will use the optimal antialiasing level for quality/performance on the current hardware.")] + public bool useRecommendedMSAALevel = true; + + /// + /// If true, both eyes will see the same image, rendered from the center eye pose, saving performance. + /// + [SerializeField] + [Tooltip("If true, both eyes will see the same image, rendered from the center eye pose, saving performance.")] + private bool _monoscopic = false; + + public bool monoscopic + { + get + { + if (!isHmdPresent) + return _monoscopic; + + return OVRPlugin.monoscopic; + } + + set + { + if (!isHmdPresent) + return; + + OVRPlugin.monoscopic = value; + _monoscopic = value; + } + } + + /// + /// If true, dynamic resolution will be enabled + /// + [Tooltip("If true, dynamic resolution will be enabled On PC")] + public bool enableAdaptiveResolution = false; + + /// + /// Adaptive Resolution is based on Unity engine's renderViewportScale/eyeTextureResolutionScale feature + /// But renderViewportScale was broken in an array of Unity engines, this function help to filter out those broken engines + /// + public static bool IsAdaptiveResSupportedByEngine() + { +#if UNITY_2017_1_OR_NEWER + return Application.unityVersion != "2017.1.0f1"; +#else + return false; +#endif + } + + /// + /// Min RenderScale the app can reach under adaptive resolution mode ( enableAdaptiveResolution = true ); + /// + [RangeAttribute(0.5f, 2.0f)] + [Tooltip("Min RenderScale the app can reach under adaptive resolution mode")] + public float minRenderScale = 0.7f; + + /// + /// Max RenderScale the app can reach under adaptive resolution mode ( enableAdaptiveResolution = true ); + /// + [RangeAttribute(0.5f, 2.0f)] + [Tooltip("Max RenderScale the app can reach under adaptive resolution mode")] + public float maxRenderScale = 1.0f; + + /// + /// Set the relative offset rotation of head poses + /// + [SerializeField] + [Tooltip("Set the relative offset rotation of head poses")] + private Vector3 _headPoseRelativeOffsetRotation; + public Vector3 headPoseRelativeOffsetRotation + { + get + { + return _headPoseRelativeOffsetRotation; + } + set + { + OVRPlugin.Quatf rotation; + OVRPlugin.Vector3f translation; + if (OVRPlugin.GetHeadPoseModifier(out rotation, out translation)) + { + Quaternion finalRotation = Quaternion.Euler(value); + rotation = finalRotation.ToQuatf(); + OVRPlugin.SetHeadPoseModifier(ref rotation, ref translation); + } + _headPoseRelativeOffsetRotation = value; + } + } + + /// + /// Set the relative offset translation of head poses + /// + [SerializeField] + [Tooltip("Set the relative offset translation of head poses")] + private Vector3 _headPoseRelativeOffsetTranslation; + public Vector3 headPoseRelativeOffsetTranslation + { + get + { + return _headPoseRelativeOffsetTranslation; + } + set + { + OVRPlugin.Quatf rotation; + OVRPlugin.Vector3f translation; + if (OVRPlugin.GetHeadPoseModifier(out rotation, out translation)) + { + if (translation.FromFlippedZVector3f() != value) + { + translation = value.ToFlippedZVector3f(); + OVRPlugin.SetHeadPoseModifier(ref rotation, ref translation); + } + } + _headPoseRelativeOffsetTranslation = value; + } + } + + /// + /// The TCP listening port of Oculus Profiler Service, which will be activated in Debug/Developerment builds + /// When the app is running on editor or device, open "Tools/Oculus/Oculus Profiler Panel" to view the realtime system metrics + /// + public int profilerTcpPort = OVRSystemPerfMetrics.TcpListeningPort; + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID + /// + /// If true, the MixedRealityCapture properties will be displayed + /// + [HideInInspector] + public bool expandMixedRealityCapturePropertySheet = false; + + + /// + /// If true, Mixed Reality mode will be enabled + /// + [HideInInspector, Tooltip("If true, Mixed Reality mode will be enabled. It would be always set to false when the game is launching without editor")] + public bool enableMixedReality = false; + + public enum CompositionMethod + { + External, + Direct + } + + /// + /// Composition method + /// + [HideInInspector] + public CompositionMethod compositionMethod = CompositionMethod.External; + + /// + /// Extra hidden layers + /// + [HideInInspector, Tooltip("Extra hidden layers")] + public LayerMask extraHiddenLayers; + + /// + /// The backdrop color will be used when rendering the foreground frames (on Rift). It only applies to External Composition. + /// + [HideInInspector, Tooltip("Backdrop color for Rift (External Compositon)")] + public Color externalCompositionBackdropColorRift = Color.green; + + /// + /// The backdrop color will be used when rendering the foreground frames (on Quest). It only applies to External Composition. + /// + [HideInInspector, Tooltip("Backdrop color for Quest (External Compositon)")] + public Color externalCompositionBackdropColorQuest = Color.clear; + + /// + /// If true, Mixed Reality mode will use direct composition from the first web camera + /// + + public enum CameraDevice + { + WebCamera0, + WebCamera1, + ZEDCamera + } + + /// + /// The camera device for direct composition + /// + [HideInInspector, Tooltip("The camera device for direct composition")] + public CameraDevice capturingCameraDevice = CameraDevice.WebCamera0; + + /// + /// Flip the camera frame horizontally + /// + [HideInInspector, Tooltip("Flip the camera frame horizontally")] + public bool flipCameraFrameHorizontally = false; + + /// + /// Flip the camera frame vertically + /// + [HideInInspector, Tooltip("Flip the camera frame vertically")] + public bool flipCameraFrameVertically = false; + + /// + /// Delay the touch controller pose by a short duration (0 to 0.5 second) to match the physical camera latency + /// + [HideInInspector, Tooltip("Delay the touch controller pose by a short duration (0 to 0.5 second) to match the physical camera latency")] + public float handPoseStateLatency = 0.0f; + + /// + /// Delay the foreground / background image in the sandwich composition to match the physical camera latency. The maximum duration is sandwichCompositionBufferedFrames / {Game FPS} + /// + [HideInInspector, Tooltip("Delay the foreground / background image in the sandwich composition to match the physical camera latency. The maximum duration is sandwichCompositionBufferedFrames / {Game FPS}")] + public float sandwichCompositionRenderLatency = 0.0f; + + /// + /// The number of frames are buffered in the SandWich composition. The more buffered frames, the more memory it would consume. + /// + [HideInInspector, Tooltip("The number of frames are buffered in the SandWich composition. The more buffered frames, the more memory it would consume.")] + public int sandwichCompositionBufferedFrames = 8; + + + /// + /// Chroma Key Color + /// + [HideInInspector, Tooltip("Chroma Key Color")] + public Color chromaKeyColor = Color.green; + + /// + /// Chroma Key Similarity + /// + [HideInInspector, Tooltip("Chroma Key Similarity")] + public float chromaKeySimilarity = 0.60f; + + /// + /// Chroma Key Smooth Range + /// + [HideInInspector, Tooltip("Chroma Key Smooth Range")] + public float chromaKeySmoothRange = 0.03f; + + /// + /// Chroma Key Spill Range + /// + [HideInInspector, Tooltip("Chroma Key Spill Range")] + public float chromaKeySpillRange = 0.06f; + + /// + /// Use dynamic lighting (Depth sensor required) + /// + [HideInInspector, Tooltip("Use dynamic lighting (Depth sensor required)")] + public bool useDynamicLighting = false; + + public enum DepthQuality + { + Low, + Medium, + High + } + /// + /// The quality level of depth image. The lighting could be more smooth and accurate with high quality depth, but it would also be more costly in performance. + /// + [HideInInspector, Tooltip("The quality level of depth image. The lighting could be more smooth and accurate with high quality depth, but it would also be more costly in performance.")] + public DepthQuality depthQuality = DepthQuality.Medium; + + /// + /// Smooth factor in dynamic lighting. Larger is smoother + /// + [HideInInspector, Tooltip("Smooth factor in dynamic lighting. Larger is smoother")] + public float dynamicLightingSmoothFactor = 8.0f; + + /// + /// The maximum depth variation across the edges. Make it smaller to smooth the lighting on the edges. + /// + [HideInInspector, Tooltip("The maximum depth variation across the edges. Make it smaller to smooth the lighting on the edges.")] + public float dynamicLightingDepthVariationClampingValue = 0.001f; + + public enum VirtualGreenScreenType + { + Off, + OuterBoundary, + PlayArea + } + + /// + /// Set the current type of the virtual green screen + /// + [HideInInspector, Tooltip("Type of virutal green screen ")] + public VirtualGreenScreenType virtualGreenScreenType = VirtualGreenScreenType.Off; + + /// + /// Top Y of virtual screen + /// + [HideInInspector, Tooltip("Top Y of virtual green screen")] + public float virtualGreenScreenTopY = 10.0f; + + /// + /// Bottom Y of virtual screen + /// + [HideInInspector, Tooltip("Bottom Y of virtual green screen")] + public float virtualGreenScreenBottomY = -10.0f; + + /// + /// When using a depth camera (e.g. ZED), whether to use the depth in virtual green screen culling. + /// + [HideInInspector, Tooltip("When using a depth camera (e.g. ZED), whether to use the depth in virtual green screen culling.")] + public bool virtualGreenScreenApplyDepthCulling = false; + + /// + /// The tolerance value (in meter) when using the virtual green screen with a depth camera. Make it bigger if the foreground objects got culled incorrectly. + /// + [HideInInspector, Tooltip("The tolerance value (in meter) when using the virtual green screen with a depth camera. Make it bigger if the foreground objects got culled incorrectly.")] + public float virtualGreenScreenDepthTolerance = 0.2f; + + public enum MrcActivationMode + { + Automatic, + Disabled + } + + /// + /// (Quest-only) control if the mixed reality capture mode can be activated automatically through remote network connection. + /// + [HideInInspector, Tooltip("(Quest-only) control if the mixed reality capture mode can be activated automatically through remote network connection.")] + public MrcActivationMode mrcActivationMode; +#endif + + /// + /// The number of expected display frames per rendered frame. + /// + public int vsyncCount + { + get { + if (!isHmdPresent) + return 1; + + return OVRPlugin.vsyncCount; + } + + set { + if (!isHmdPresent) + return; + + OVRPlugin.vsyncCount = value; + } + } + + public static string OCULUS_UNITY_NAME_STR = "Oculus"; + public static string OPENVR_UNITY_NAME_STR = "OpenVR"; + + public static XRDevice loadedXRDevice; + + /// + /// Gets the current battery level. + /// + /// battery level in the range [0.0,1.0] + /// Battery level. + public static float batteryLevel + { + get { + if (!isHmdPresent) + return 1f; + + return OVRPlugin.batteryLevel; + } + } + + /// + /// Gets the current battery temperature. + /// + /// battery temperature in Celsius + /// Battery temperature. + public static float batteryTemperature + { + get { + if (!isHmdPresent) + return 0f; + + return OVRPlugin.batteryTemperature; + } + } + + /// + /// Gets the current battery status. + /// + /// battery status + /// Battery status. + public static int batteryStatus + { + get { + if (!isHmdPresent) + return -1; + + return (int)OVRPlugin.batteryStatus; + } + } + + /// + /// Gets the current volume level. + /// + /// volume level in the range [0,1]. + public static float volumeLevel + { + get { + if (!isHmdPresent) + return 0f; + + return OVRPlugin.systemVolume; + } + } + + /// + /// Gets or sets the current CPU performance level (0-2). Lower performance levels save more power. + /// + public static int cpuLevel + { + get { + if (!isHmdPresent) + return 2; + + return OVRPlugin.cpuLevel; + } + + set { + if (!isHmdPresent) + return; + + OVRPlugin.cpuLevel = value; + } + } + + /// + /// Gets or sets the current GPU performance level (0-2). Lower performance levels save more power. + /// + public static int gpuLevel + { + get { + if (!isHmdPresent) + return 2; + + return OVRPlugin.gpuLevel; + } + + set { + if (!isHmdPresent) + return; + + OVRPlugin.gpuLevel = value; + } + } + + /// + /// If true, the CPU and GPU are currently throttled to save power and/or reduce the temperature. + /// + public static bool isPowerSavingActive + { + get { + if (!isHmdPresent) + return false; + + return OVRPlugin.powerSaving; + } + } + + /// + /// Gets or sets the eye texture format. + /// + public static EyeTextureFormat eyeTextureFormat + { + get + { + return (OVRManager.EyeTextureFormat)OVRPlugin.GetDesiredEyeTextureFormat(); + } + + set + { + OVRPlugin.SetDesiredEyeTextureFormat((OVRPlugin.EyeTextureFormat)value); + } + } + + /// + /// Gets if tiled-based multi-resolution technique is supported + /// This feature is only supported on QCOMM-based Android devices + /// + public static bool fixedFoveatedRenderingSupported + { + get + { + return OVRPlugin.fixedFoveatedRenderingSupported; + } + } + + /// + /// Gets or sets the tiled-based multi-resolution level + /// This feature is only supported on QCOMM-based Android devices + /// + public static FixedFoveatedRenderingLevel fixedFoveatedRenderingLevel + { + get + { + if (!OVRPlugin.fixedFoveatedRenderingSupported) + { + Debug.LogWarning("Fixed Foveated Rendering feature is not supported"); + } + return (FixedFoveatedRenderingLevel)OVRPlugin.fixedFoveatedRenderingLevel; + } + set + { + if (!OVRPlugin.fixedFoveatedRenderingSupported) + { + Debug.LogWarning("Fixed Foveated Rendering feature is not supported"); + } + OVRPlugin.fixedFoveatedRenderingLevel = (OVRPlugin.FixedFoveatedRenderingLevel)value; + } + } + + [Obsolete("Please use fixedFoveatedRenderingSupported instead", false)] + public static bool tiledMultiResSupported + { + get + { + return OVRPlugin.tiledMultiResSupported; + } + } + + [Obsolete("Please use fixedFoveatedRenderingLevel instead", false)] + public static TiledMultiResLevel tiledMultiResLevel + { + get + { + if (!OVRPlugin.tiledMultiResSupported) + { + Debug.LogWarning("Tiled-based Multi-resolution feature is not supported"); + } + return (TiledMultiResLevel)OVRPlugin.tiledMultiResLevel; + } + set + { + if (!OVRPlugin.tiledMultiResSupported) + { + Debug.LogWarning("Tiled-based Multi-resolution feature is not supported"); + } + OVRPlugin.tiledMultiResLevel = (OVRPlugin.TiledMultiResLevel)value; + } + } + + /// + /// Gets if the GPU Utility is supported + /// This feature is only supported on QCOMM-based Android devices + /// + public static bool gpuUtilSupported + { + get + { + return OVRPlugin.gpuUtilSupported; + } + } + + /// + /// Gets the GPU Utilised Level (0.0 - 1.0) + /// This feature is only supported on QCOMM-based Android devices + /// + public static float gpuUtilLevel + { + get + { + if (!OVRPlugin.gpuUtilSupported) + { + Debug.LogWarning("GPU Util is not supported"); + } + return OVRPlugin.gpuUtilLevel; + } + } + + /// + /// Sets the Color Scale and Offset which is commonly used for effects like fade-to-black. + /// In our compositor, once a given frame is rendered, warped, and ready to be displayed, we then multiply + /// each pixel by colorScale and add it to colorOffset, whereby newPixel = oldPixel * colorScale + colorOffset. + /// Note that for mobile devices (Quest, Go, etc.), colorOffset is not supported, so colorScale is all that can + /// be used. A colorScale of (1, 1, 1, 1) and colorOffset of (0, 0, 0, 0) will lead to an identity multiplication + /// and have no effect. + /// + public static void SetColorScaleAndOffset(Vector4 colorScale, Vector4 colorOffset, bool applyToAllLayers) + { + OVRPlugin.SetColorScaleAndOffset(colorScale, colorOffset, applyToAllLayers); + } + + /// + /// Specifies OpenVR pose local to tracking space + /// + public static void SetOpenVRLocalPose(Vector3 leftPos, Vector3 rightPos, Quaternion leftRot, Quaternion rightRot) + { + if (loadedXRDevice == XRDevice.OpenVR) + OVRInput.SetOpenVRLocalPose(leftPos, rightPos, leftRot, rightRot); + } + + //Series of offsets that line up the virtual controllers to the phsyical world. + private static Vector3 OpenVRTouchRotationOffsetEulerLeft = new Vector3(40.0f, 0.0f, 0.0f); + private static Vector3 OpenVRTouchRotationOffsetEulerRight = new Vector3(40.0f, 0.0f, 0.0f); + private static Vector3 OpenVRTouchPositionOffsetLeft = new Vector3(0.0075f, -0.005f, -0.0525f); + private static Vector3 OpenVRTouchPositionOffsetRight = new Vector3(-0.0075f, -0.005f, -0.0525f); + + /// + /// Specifies the pose offset required to make an OpenVR controller's reported pose match the virtual pose. + /// Currently we only specify this offset for Oculus Touch on OpenVR. + /// + public static OVRPose GetOpenVRControllerOffset(Node hand) + { + OVRPose poseOffset = OVRPose.identity; + if ((hand == Node.LeftHand || hand == Node.RightHand) && loadedXRDevice == XRDevice.OpenVR) + { + int index = (hand == Node.LeftHand) ? 0 : 1; + if (OVRInput.openVRControllerDetails[index].controllerType == OVRInput.OpenVRController.OculusTouch) + { + Vector3 offsetOrientation = (hand == Node.LeftHand) ? OpenVRTouchRotationOffsetEulerLeft : OpenVRTouchRotationOffsetEulerRight; + poseOffset.orientation = Quaternion.Euler(offsetOrientation.x, offsetOrientation.y, offsetOrientation.z); + poseOffset.position = (hand == Node.LeftHand) ? OpenVRTouchPositionOffsetLeft : OpenVRTouchPositionOffsetRight; + } + } + return poseOffset; + } + + + [Header("Tracking")] + [SerializeField] + [Tooltip("Defines the current tracking origin type.")] + private OVRManager.TrackingOrigin _trackingOriginType = OVRManager.TrackingOrigin.EyeLevel; + /// + /// Defines the current tracking origin type. + /// + public OVRManager.TrackingOrigin trackingOriginType + { + get { + if (!isHmdPresent) + return _trackingOriginType; + + return (OVRManager.TrackingOrigin)OVRPlugin.GetTrackingOriginType(); + } + + set { + if (!isHmdPresent) + return; + + if (OVRPlugin.SetTrackingOriginType((OVRPlugin.TrackingOrigin)value)) + { + // Keep the field exposed in the Unity Editor synchronized with any changes. + _trackingOriginType = value; + } + } + } + + /// + /// If true, head tracking will affect the position of each OVRCameraRig's cameras. + /// + [Tooltip("If true, head tracking will affect the position of each OVRCameraRig's cameras.")] + public bool usePositionTracking = true; + + /// + /// If true, head tracking will affect the rotation of each OVRCameraRig's cameras. + /// + [HideInInspector] + public bool useRotationTracking = true; + + /// + /// If true, the distance between the user's eyes will affect the position of each OVRCameraRig's cameras. + /// + [Tooltip("If true, the distance between the user's eyes will affect the position of each OVRCameraRig's cameras.")] + public bool useIPDInPositionTracking = true; + + /// + /// If true, each scene load will cause the head pose to reset. + /// + [Tooltip("If true, each scene load will cause the head pose to reset.")] + public bool resetTrackerOnLoad = false; + + /// + /// If true, the Reset View in the universal menu will cause the pose to be reset. This should generally be + /// enabled for applications with a stationary position in the virtual world and will allow the View Reset + /// command to place the person back to a predefined location (such as a cockpit seat). + /// Set this to false if you have a locomotion system because resetting the view would effectively teleport + /// the player to potentially invalid locations. + /// + [Tooltip("If true, the Reset View in the universal menu will cause the pose to be reset. This should generally be enabled for applications with a stationary position in the virtual world and will allow the View Reset command to place the person back to a predefined location (such as a cockpit seat). Set this to false if you have a locomotion system because resetting the view would effectively teleport the player to potentially invalid locations.")] + public bool AllowRecenter = true; + + [SerializeField] + [Tooltip("Specifies HMD recentering behavior when controller recenter is performed. True recenters the HMD as well, false does not.")] + private bool _reorientHMDOnControllerRecenter = true; + /// + /// Defines the recentering mode specified in the tooltip above. + /// + public bool reorientHMDOnControllerRecenter + { + get + { + if (!isHmdPresent) + return false; + + return OVRPlugin.GetReorientHMDOnControllerRecenter(); + } + + set + { + if (!isHmdPresent) + return; + + OVRPlugin.SetReorientHMDOnControllerRecenter(value); + + } + } + + /// + /// If true, a lower-latency update will occur right before rendering. If false, the only controller pose update will occur at the start of simulation for a given frame. + /// Selecting this option lowers rendered latency for controllers and is often a net positive; however, it also creates a slight disconnect between rendered and simulated controller poses. + /// Visit online Oculus documentation to learn more. + /// + [Tooltip("If true, rendered controller latency is reduced by several ms, as the left/right controllers will have their positions updated right before rendering.")] + public bool LateControllerUpdate = true; + + /// + /// True if the current platform supports virtual reality. + /// + public bool isSupportedPlatform { get; private set; } + + private static bool _isUserPresentCached = false; + private static bool _isUserPresent = false; + private static bool _wasUserPresent = false; + /// + /// True if the user is currently wearing the display. + /// + public bool isUserPresent + { + get { + if (!_isUserPresentCached) + { + _isUserPresentCached = true; + _isUserPresent = OVRPlugin.userPresent; + } + + return _isUserPresent; + } + + private set { + _isUserPresentCached = true; + _isUserPresent = value; + } + } + + private static bool prevAudioOutIdIsCached = false; + private static bool prevAudioInIdIsCached = false; + private static string prevAudioOutId = string.Empty; + private static string prevAudioInId = string.Empty; + private static bool wasPositionTracked = false; + + public static System.Version utilitiesVersion + { + get { return OVRPlugin.wrapperVersion; } + } + + public static System.Version pluginVersion + { + get { return OVRPlugin.version; } + } + + public static System.Version sdkVersion + { + get { return OVRPlugin.nativeSDKVersion; } + } + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID + private static bool MixedRealityEnabledFromCmd() + { + var args = System.Environment.GetCommandLineArgs(); + for (int i = 0; i < args.Length; i++) + { + if (args[i].ToLower() == "-mixedreality") + return true; + } + return false; + } + + private static bool UseDirectCompositionFromCmd() + { + var args = System.Environment.GetCommandLineArgs(); + for (int i = 0; i < args.Length; i++) + { + if (args[i].ToLower() == "-directcomposition") + return true; + } + return false; + } + + private static bool UseExternalCompositionFromCmd() + { + var args = System.Environment.GetCommandLineArgs(); + for (int i = 0; i < args.Length; i++) + { + if (args[i].ToLower() == "-externalcomposition") + return true; + } + return false; + } + + private static bool CreateMixedRealityCaptureConfigurationFileFromCmd() + { + var args = System.Environment.GetCommandLineArgs(); + for (int i = 0; i < args.Length; i++) + { + if (args[i].ToLower() == "-create_mrc_config") + return true; + } + return false; + } + + private static bool LoadMixedRealityCaptureConfigurationFileFromCmd() + { + var args = System.Environment.GetCommandLineArgs(); + for (int i = 0; i < args.Length; i++) + { + if (args[i].ToLower() == "-load_mrc_config") + return true; + } + return false; + } +#endif + + public static bool IsUnityAlphaOrBetaVersion() + { + string ver = Application.unityVersion; + int pos = ver.Length - 1; + + while (pos >= 0 && ver[pos] >= '0' && ver[pos] <= '9') + { + --pos; + } + + if (pos >= 0 && (ver[pos] == 'a' || ver[pos] == 'b')) + return true; + + return false; + } + + public static string UnityAlphaOrBetaVersionWarningMessage = "WARNING: It's not recommended to use Unity alpha/beta release in Oculus development. Use a stable release if you encounter any issue."; + +#region Unity Messages + + public static bool OVRManagerinitialized = false; + private void InitOVRManager() + { + // Only allow one instance at runtime. + if (instance != null) + { + enabled = false; + DestroyImmediate(this); + return; + } + + instance = this; + + // uncomment the following line to disable the callstack printed to log + //Application.SetStackTraceLogType(LogType.Log, StackTraceLogType.None); // TEMPORARY + + Debug.Log("Unity v" + Application.unityVersion + ", " + + "Oculus Utilities v" + OVRPlugin.wrapperVersion + ", " + + "OVRPlugin v" + OVRPlugin.version + ", " + + "SDK v" + OVRPlugin.nativeSDKVersion + "."); + +#if !UNITY_EDITOR + if (IsUnityAlphaOrBetaVersion()) + { + Debug.LogWarning(UnityAlphaOrBetaVersionWarningMessage); + } +#endif + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN + var supportedTypes = + UnityEngine.Rendering.GraphicsDeviceType.Direct3D11.ToString() + ", " + + UnityEngine.Rendering.GraphicsDeviceType.Direct3D12.ToString(); + + if (!supportedTypes.Contains(SystemInfo.graphicsDeviceType.ToString())) + Debug.LogWarning("VR rendering requires one of the following device types: (" + supportedTypes + "). Your graphics device: " + SystemInfo.graphicsDeviceType.ToString()); +#endif + + // Detect whether this platform is a supported platform + RuntimePlatform currPlatform = Application.platform; + if (currPlatform == RuntimePlatform.Android || + // currPlatform == RuntimePlatform.LinuxPlayer || + currPlatform == RuntimePlatform.OSXEditor || + currPlatform == RuntimePlatform.OSXPlayer || + currPlatform == RuntimePlatform.WindowsEditor || + currPlatform == RuntimePlatform.WindowsPlayer) + { + isSupportedPlatform = true; + } + else + { + isSupportedPlatform = false; + } + if (!isSupportedPlatform) + { + Debug.LogWarning("This platform is unsupported"); + return; + } + +#if UNITY_ANDROID && !UNITY_EDITOR + // Turn off chromatic aberration by default to save texture bandwidth. + chromatic = false; +#endif + +#if (UNITY_STANDALONE_WIN || UNITY_ANDROID) && !UNITY_EDITOR + enableMixedReality = false; // we should never start the standalone game in MxR mode, unless the command-line parameter is provided +#endif + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN + if (!staticMixedRealityCaptureInitialized) + { + bool loadMrcConfig = LoadMixedRealityCaptureConfigurationFileFromCmd(); + bool createMrcConfig = CreateMixedRealityCaptureConfigurationFileFromCmd(); + + if (loadMrcConfig || createMrcConfig) + { + OVRMixedRealityCaptureSettings mrcSettings = ScriptableObject.CreateInstance(); + mrcSettings.ReadFrom(this); + if (loadMrcConfig) + { + mrcSettings.CombineWithConfigurationFile(); + mrcSettings.ApplyTo(this); + } + if (createMrcConfig) + { + mrcSettings.WriteToConfigurationFile(); + } + ScriptableObject.Destroy(mrcSettings); + } + + if (MixedRealityEnabledFromCmd()) + { + enableMixedReality = true; + } + + if (enableMixedReality) + { + Debug.Log("OVR: Mixed Reality mode enabled"); + if (UseDirectCompositionFromCmd()) + { + compositionMethod = CompositionMethod.Direct; + } + if (UseExternalCompositionFromCmd()) + { + compositionMethod = CompositionMethod.External; + } + Debug.Log("OVR: CompositionMethod : " + compositionMethod); + } + } +#endif + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC + StaticInitializeMixedRealityCapture(this); +#endif + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN + if (enableAdaptiveResolution && !OVRManager.IsAdaptiveResSupportedByEngine()) + { + enableAdaptiveResolution = false; + UnityEngine.Debug.LogError("Your current Unity Engine " + Application.unityVersion + " might have issues to support adaptive resolution, please disable it under OVRManager"); + } +#endif + + Initialize(); + + if (resetTrackerOnLoad) + display.RecenterPose(); + + if (Debug.isDebugBuild) + { + // Activate system metrics collection in Debug/Developerment build + if (GetComponent() == null) + { + gameObject.AddComponent(); + } + OVRSystemPerfMetrics.OVRSystemPerfMetricsTcpServer perfTcpServer = GetComponent(); + perfTcpServer.listeningPort = profilerTcpPort; + if (!perfTcpServer.enabled) + { + perfTcpServer.enabled = true; + } + OVRPlugin.SetDeveloperMode(OVRPlugin.Bool.True); + } + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN + // Force OcculusionMesh on all the time, you can change the value to false if you really need it be off for some reasons, + // be aware there are performance drops if you don't use occlusionMesh. + OVRPlugin.occlusionMesh = true; +#endif + OVRManagerinitialized = true; + + } + + private void Awake() + { +#if !USING_XR_SDK + //For legacy, we should initialize OVRManager in all cases. + //For now, in XR SDK, only initialize if OVRPlugin is initialized. + InitOVRManager(); +#else + if (OVRPlugin.initialized) + InitOVRManager(); +#endif + } + +#if UNITY_EDITOR + private static bool _scriptsReloaded; + + [UnityEditor.Callbacks.DidReloadScripts] + static void ScriptsReloaded() + { + _scriptsReloaded = true; + } +#endif + + void SetCurrentXRDevice() + { +#if USING_XR_SDK + XRDisplaySubsystem currentDisplaySubsystem = GetCurrentDisplaySubsystem(); + XRDisplaySubsystemDescriptor currentDisplaySubsystemDescriptor = GetCurrentDisplaySubsystemDescriptor(); +#endif + if (OVRPlugin.initialized) + { + loadedXRDevice = XRDevice.Oculus; + } +#if USING_XR_SDK + else if (currentDisplaySubsystem != null && currentDisplaySubsystemDescriptor != null && currentDisplaySubsystem.running) +#else + else if (Settings.enabled) +#endif + { +#if USING_XR_SDK + string loadedXRDeviceName = currentDisplaySubsystemDescriptor.id; +#else + string loadedXRDeviceName = Settings.loadedDeviceName; +#endif + if (loadedXRDeviceName == OPENVR_UNITY_NAME_STR) + loadedXRDevice = XRDevice.OpenVR; + else + loadedXRDevice = XRDevice.Unknown; + } + else + { + loadedXRDevice = XRDevice.Unknown; + } + } + +#if USING_XR_SDK + + public static XRDisplaySubsystem GetCurrentDisplaySubsystem() + { + List displaySubsystems = new List(); + SubsystemManager.GetInstances(displaySubsystems); + //Note: Here we are making the assumption that there will always be one valid display subsystem. If there is not, then submitFrame isn't being called, + //so for now this is a fine assumption to make. + if (displaySubsystems.Count > 0) + return displaySubsystems[0]; + return null; + } + + public static XRDisplaySubsystemDescriptor GetCurrentDisplaySubsystemDescriptor() + { + List displaySubsystemDescriptors = new List(); + SubsystemManager.GetSubsystemDescriptors(displaySubsystemDescriptors); + if (displaySubsystemDescriptors.Count > 0) + return displaySubsystemDescriptors[0]; + return null; + } +#endif + + + + + void Initialize() + { + if (display == null) + display = new OVRDisplay(); + if (tracker == null) + tracker = new OVRTracker(); + if (boundary == null) + boundary = new OVRBoundary(); + + reorientHMDOnControllerRecenter = _reorientHMDOnControllerRecenter; + SetCurrentXRDevice(); + + } + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC + private bool suppressDisableMixedRealityBecauseOfNoMainCameraWarning = false; +#endif + + private void Update() + { + //Only if we're using the XR SDK do we have to check if OVRManager isn't yet initialized, and init it. + //If we're on legacy, we know initialization occurred properly in Awake() +#if USING_XR_SDK + if (!OVRManagerinitialized) + { + XRDisplaySubsystem currentDisplaySubsystem = GetCurrentDisplaySubsystem(); + XRDisplaySubsystemDescriptor currentDisplaySubsystemDescriptor = GetCurrentDisplaySubsystemDescriptor(); + if (currentDisplaySubsystem == null || currentDisplaySubsystemDescriptor == null || !OVRPlugin.initialized) + return; + //If we're using the XR SDK and the display subsystem is present, and OVRPlugin is initialized, we can init OVRManager + InitOVRManager(); + } +#endif + +#if UNITY_EDITOR + if (_scriptsReloaded) + { + _scriptsReloaded = false; + instance = this; + Initialize(); + } +#endif + + SetCurrentXRDevice(); + + if (OVRPlugin.shouldQuit) + { + Debug.Log("[OVRManager] OVRPlugin.shouldQuit detected"); +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC + StaticShutdownMixedRealityCapture(instance); +#endif + Application.Quit(); + } + + if (AllowRecenter && OVRPlugin.shouldRecenter) + { + OVRManager.display.RecenterPose(); + } + + if (trackingOriginType != _trackingOriginType) + trackingOriginType = _trackingOriginType; + + tracker.isEnabled = usePositionTracking; + + OVRPlugin.rotation = useRotationTracking; + + OVRPlugin.useIPDInPositionTracking = useIPDInPositionTracking; + + // Dispatch HMD events. + + isHmdPresent = OVRNodeStateProperties.IsHmdPresent(); + + if (useRecommendedMSAALevel && QualitySettings.antiAliasing != display.recommendedMSAALevel) + { + Debug.Log("The current MSAA level is " + QualitySettings.antiAliasing + + ", but the recommended MSAA level is " + display.recommendedMSAALevel + + ". Switching to the recommended level."); + + QualitySettings.antiAliasing = display.recommendedMSAALevel; + } + + if (monoscopic != _monoscopic) + { + monoscopic = _monoscopic; + } + + if (headPoseRelativeOffsetRotation != _headPoseRelativeOffsetRotation) + { + headPoseRelativeOffsetRotation = _headPoseRelativeOffsetRotation; + } + + if (headPoseRelativeOffsetTranslation != _headPoseRelativeOffsetTranslation) + { + headPoseRelativeOffsetTranslation = _headPoseRelativeOffsetTranslation; + } + + if (_wasHmdPresent && !isHmdPresent) + { + try + { + Debug.Log("[OVRManager] HMDLost event"); + if (HMDLost != null) + HMDLost(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + } + + if (!_wasHmdPresent && isHmdPresent) + { + try + { + Debug.Log("[OVRManager] HMDAcquired event"); + if (HMDAcquired != null) + HMDAcquired(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + } + + _wasHmdPresent = isHmdPresent; + + // Dispatch HMD mounted events. + + isUserPresent = OVRPlugin.userPresent; + + if (_wasUserPresent && !isUserPresent) + { + try + { + Debug.Log("[OVRManager] HMDUnmounted event"); + if (HMDUnmounted != null) + HMDUnmounted(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + } + + if (!_wasUserPresent && isUserPresent) + { + try + { + Debug.Log("[OVRManager] HMDMounted event"); + if (HMDMounted != null) + HMDMounted(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + } + + _wasUserPresent = isUserPresent; + + // Dispatch VR Focus events. + + hasVrFocus = OVRPlugin.hasVrFocus; + + if (_hadVrFocus && !hasVrFocus) + { + try + { + Debug.Log("[OVRManager] VrFocusLost event"); + if (VrFocusLost != null) + VrFocusLost(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + } + + if (!_hadVrFocus && hasVrFocus) + { + try + { + Debug.Log("[OVRManager] VrFocusAcquired event"); + if (VrFocusAcquired != null) + VrFocusAcquired(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + } + + _hadVrFocus = hasVrFocus; + + // Dispatch VR Input events. + + bool hasInputFocus = OVRPlugin.hasInputFocus; + + if (_hadInputFocus && !hasInputFocus) + { + try + { + Debug.Log("[OVRManager] InputFocusLost event"); + if (InputFocusLost != null) + InputFocusLost(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + } + + if (!_hadInputFocus && hasInputFocus) + { + try + { + Debug.Log("[OVRManager] InputFocusAcquired event"); + if (InputFocusAcquired != null) + InputFocusAcquired(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + } + + _hadInputFocus = hasInputFocus; + + // Changing effective rendering resolution dynamically according performance +#if (UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN) + + if (enableAdaptiveResolution) + { +#if UNITY_2017_2_OR_NEWER + if (Settings.eyeTextureResolutionScale < maxRenderScale) + { + // Allocate renderScale to max to avoid re-allocation + Settings.eyeTextureResolutionScale = maxRenderScale; + } + else + { + // Adjusting maxRenderScale in case app started with a larger renderScale value + maxRenderScale = Mathf.Max(maxRenderScale, Settings.eyeTextureResolutionScale); + } + minRenderScale = Mathf.Min(minRenderScale, maxRenderScale); + float minViewportScale = minRenderScale / Settings.eyeTextureResolutionScale; + float recommendedViewportScale = Mathf.Clamp(Mathf.Sqrt(OVRPlugin.GetAdaptiveGPUPerformanceScale()) * Settings.eyeTextureResolutionScale * Settings.renderViewportScale, 0.5f, 2.0f); + recommendedViewportScale /= Settings.eyeTextureResolutionScale; + recommendedViewportScale = Mathf.Clamp(recommendedViewportScale, minViewportScale, 1.0f); + Settings.renderViewportScale = recommendedViewportScale; +#else + if (UnityEngine.VR.VRSettings.renderScale < maxRenderScale) + { + // Allocate renderScale to max to avoid re-allocation + UnityEngine.VR.VRSettings.renderScale = maxRenderScale; + } + else + { + // Adjusting maxRenderScale in case app started with a larger renderScale value + maxRenderScale = Mathf.Max(maxRenderScale, UnityEngine.VR.VRSettings.renderScale); + } + minRenderScale = Mathf.Min(minRenderScale, maxRenderScale); + float minViewportScale = minRenderScale / UnityEngine.VR.VRSettings.renderScale; + float recommendedViewportScale = OVRPlugin.GetEyeRecommendedResolutionScale() / UnityEngine.VR.VRSettings.renderScale; + recommendedViewportScale = Mathf.Clamp(recommendedViewportScale, minViewportScale, 1.0f); + UnityEngine.VR.VRSettings.renderViewportScale = recommendedViewportScale; +#endif + } +#endif + + // Dispatch Audio Device events. + + string audioOutId = OVRPlugin.audioOutId; + if (!prevAudioOutIdIsCached) + { + prevAudioOutId = audioOutId; + prevAudioOutIdIsCached = true; + } + else if (audioOutId != prevAudioOutId) + { + try + { + Debug.Log("[OVRManager] AudioOutChanged event"); + if (AudioOutChanged != null) + AudioOutChanged(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + + prevAudioOutId = audioOutId; + } + + string audioInId = OVRPlugin.audioInId; + if (!prevAudioInIdIsCached) + { + prevAudioInId = audioInId; + prevAudioInIdIsCached = true; + } + else if (audioInId != prevAudioInId) + { + try + { + Debug.Log("[OVRManager] AudioInChanged event"); + if (AudioInChanged != null) + AudioInChanged(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + + prevAudioInId = audioInId; + } + + // Dispatch tracking events. + + if (wasPositionTracked && !tracker.isPositionTracked) + { + try + { + Debug.Log("[OVRManager] TrackingLost event"); + if (TrackingLost != null) + TrackingLost(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + } + + if (!wasPositionTracked && tracker.isPositionTracked) + { + try + { + Debug.Log("[OVRManager] TrackingAcquired event"); + if (TrackingAcquired != null) + TrackingAcquired(); + } + catch (Exception e) + { + Debug.LogError("Caught Exception: " + e); + } + } + + wasPositionTracked = tracker.isPositionTracked; + + display.Update(); + OVRInput.Update(); + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC + StaticUpdateMixedRealityCapture(this); +#endif + } + + private bool multipleMainCameraWarningPresented = false; + private Camera lastFoundMainCamera = null; + private Camera FindMainCamera() + { + if (lastFoundMainCamera != null && lastFoundMainCamera.CompareTag("MainCamera")) + { + return lastFoundMainCamera; + } + + Camera result = null; + + GameObject[] objects = GameObject.FindGameObjectsWithTag("MainCamera"); + List cameras = new List(4); + foreach (GameObject obj in objects) + { + Camera camera = obj.GetComponent(); + if (camera != null && camera.enabled) + { + OVRCameraRig cameraRig = camera.GetComponentInParent(); + if (cameraRig != null && cameraRig.trackingSpace != null) + { + cameras.Add(camera); + } + } + } + if (cameras.Count == 0) + { + result = Camera.main; // pick one of the cameras which tagged as "MainCamera" + } + else if (cameras.Count == 1) + { + result = cameras[0]; + } + else + { + if (!multipleMainCameraWarningPresented) + { + Debug.LogWarning("Multiple MainCamera found. Assume the real MainCamera is the camera with the least depth"); + multipleMainCameraWarningPresented = true; + } + // return the camera with least depth + cameras.Sort((Camera c0, Camera c1) => { return c0.depth < c1.depth ? -1 : (c0.depth > c1.depth ? 1 : 0); }); + result = cameras[0]; + } + + if (result != null) + { + Debug.LogFormat("[OVRManager] mainCamera found for MRC: ", result.gameObject.name); + } + else + { + Debug.Log("[OVRManager] unable to find a vaild camera"); + } + lastFoundMainCamera = result; + return result; + } + + private void OnDisable() + { + OVRSystemPerfMetrics.OVRSystemPerfMetricsTcpServer perfTcpServer = GetComponent(); + if (perfTcpServer != null) + { + perfTcpServer.enabled = false; + } + } + + private void LateUpdate() + { + OVRHaptics.Process(); + } + + private void FixedUpdate() + { + OVRInput.FixedUpdate(); + } + + private void OnDestroy() + { + Debug.Log("[OVRManager] OnDestroy"); + OVRManagerinitialized = false; + } + + private void OnApplicationPause(bool pause) + { + if (pause) + { + Debug.Log("[OVRManager] OnApplicationPause(true)"); + } + else + { + Debug.Log("[OVRManager] OnApplicationPause(false)"); + } + } + + private void OnApplicationFocus(bool focus) + { + if (focus) + { + Debug.Log("[OVRManager] OnApplicationFocus(true)"); + } + else + { + Debug.Log("[OVRManager] OnApplicationFocus(false)"); + } + } + + private void OnApplicationQuit() + { + Debug.Log("[OVRManager] OnApplicationQuit"); + } + +#endregion // Unity Messages + + /// + /// Leaves the application/game and returns to the launcher/dashboard + /// + public void ReturnToLauncher() + { + // show the platform UI quit prompt + OVRManager.PlatformUIConfirmQuit(); + } + + public static void PlatformUIConfirmQuit() + { + if (!isHmdPresent) + return; + + OVRPlugin.ShowUI(OVRPlugin.PlatformUI.ConfirmQuit); + } + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC + + public static bool staticMixedRealityCaptureInitialized = false; + public static bool staticPrevEnableMixedRealityCapture = false; + public static OVRMixedRealityCaptureSettings staticMrcSettings = null; + + public static void StaticInitializeMixedRealityCapture(OVRManager instance) + { + if (!staticMixedRealityCaptureInitialized) + { + staticMrcSettings = ScriptableObject.CreateInstance(); + staticMrcSettings.ReadFrom(OVRManager.instance); + +#if OVR_ANDROID_MRC + bool mediaInitialized = OVRPlugin.Media.Initialize(); + Debug.Log(mediaInitialized ? "OVRPlugin.Media initialized" : "OVRPlugin.Media not initialized"); + if (mediaInitialized) + { + OVRPlugin.Media.SetMrcAudioSampleRate(AudioSettings.outputSampleRate); + Debug.LogFormat("[MRC] SetMrcAudioSampleRate({0})", AudioSettings.outputSampleRate); + OVRPlugin.Media.SetMrcInputVideoBufferType(OVRPlugin.Media.InputVideoBufferType.TextureHandle); + Debug.LogFormat("[MRC] Active InputVideoBufferType:{0}", OVRPlugin.Media.GetMrcInputVideoBufferType()); + if (instance.mrcActivationMode == MrcActivationMode.Automatic) + { + OVRPlugin.Media.SetMrcActivationMode(OVRPlugin.Media.MrcActivationMode.Automatic); + Debug.LogFormat("[MRC] ActivateMode: Automatic"); + } + else if (instance.mrcActivationMode == MrcActivationMode.Disabled) + { + OVRPlugin.Media.SetMrcActivationMode(OVRPlugin.Media.MrcActivationMode.Disabled); + Debug.LogFormat("[MRC] ActivateMode: Disabled"); + } + } +#endif + staticPrevEnableMixedRealityCapture = false; + + staticMixedRealityCaptureInitialized = true; + } + else + { + staticMrcSettings.ApplyTo(instance); + } + } + + public static void StaticUpdateMixedRealityCapture(OVRManager instance) + { + if (!staticMixedRealityCaptureInitialized) + { + return; + } + +#if OVR_ANDROID_MRC + instance.enableMixedReality = OVRPlugin.Media.GetInitialized() && OVRPlugin.Media.IsMrcActivated(); + instance.compositionMethod = CompositionMethod.External; // force external composition on Android MRC + + if (OVRPlugin.Media.GetInitialized()) + { + OVRPlugin.Media.Update(); + } +#endif + + if (instance.enableMixedReality && !staticPrevEnableMixedRealityCapture) + { + OVRPlugin.SendEvent("mixed_reality_capture", "activated"); + Debug.Log("MixedRealityCapture: activate"); + } + + if (!instance.enableMixedReality && staticPrevEnableMixedRealityCapture) + { + Debug.Log("MixedRealityCapture: deactivate"); + } + + if (instance.enableMixedReality || staticPrevEnableMixedRealityCapture) + { + Camera mainCamera = instance.FindMainCamera(); + if (Camera.main != null) + { + instance.suppressDisableMixedRealityBecauseOfNoMainCameraWarning = false; + + if (instance.enableMixedReality) + { + OVRMixedReality.Update(instance.gameObject, mainCamera, instance.compositionMethod, instance.useDynamicLighting, instance.capturingCameraDevice, instance.depthQuality); + } + + if (staticPrevEnableMixedRealityCapture && !instance.enableMixedReality) + { + OVRMixedReality.Cleanup(); + } + + staticPrevEnableMixedRealityCapture = instance.enableMixedReality; + } + else + { + if (!instance.suppressDisableMixedRealityBecauseOfNoMainCameraWarning) + { + Debug.LogWarning("Main Camera is not set, Mixed Reality disabled"); + instance.suppressDisableMixedRealityBecauseOfNoMainCameraWarning = true; + } + } + } + + staticMrcSettings.ReadFrom(OVRManager.instance); + } + + public static void StaticShutdownMixedRealityCapture(OVRManager instance) + { + if (staticMixedRealityCaptureInitialized) + { + ScriptableObject.Destroy(staticMrcSettings); + staticMrcSettings = null; + + OVRMixedReality.Cleanup(); + +#if OVR_ANDROID_MRC + if (OVRPlugin.Media.GetInitialized()) + { + OVRPlugin.Media.Shutdown(); + } +#endif + staticMixedRealityCaptureInitialized = false; + } + } + +#endif +} diff --git a/Assets/Oculus/VR/Scripts/OVRManager.cs.meta b/Assets/Oculus/VR/Scripts/OVRManager.cs.meta new file mode 100644 index 0000000..eabfdfd --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRManager.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e933e81d3c20c74ea6fdc708a67e3a5 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: -100 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/OVRMixedReality.cs b/Assets/Oculus/VR/Scripts/OVRMixedReality.cs new file mode 100644 index 0000000..8567aae --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRMixedReality.cs @@ -0,0 +1,142 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +#if UNITY_ANDROID && !UNITY_EDITOR +#define OVR_ANDROID_MRC +#endif + +using System; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using UnityEngine; + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID + +/// +/// Manages mix-reality elements +/// +internal static class OVRMixedReality +{ + /// + /// For Debugging purpose, we can use preset parameters to fake a camera when external camera is not available + /// + public static bool useFakeExternalCamera = false; + public static Vector3 fakeCameraFloorLevelPosition = new Vector3(0.0f, 2.0f, -0.5f); + public static Vector3 fakeCameraEyeLevelPosition = fakeCameraFloorLevelPosition - new Vector3(0.0f, 1.8f, 0.0f); + public static Quaternion fakeCameraRotation = Quaternion.LookRotation((new Vector3(0.0f, fakeCameraFloorLevelPosition.y, 0.0f) - fakeCameraFloorLevelPosition).normalized, Vector3.up); + public static float fakeCameraFov = 60.0f; + public static float fakeCameraAspect = 16.0f / 9.0f; + + /// + /// Composition object + /// + public static OVRComposition currentComposition = null; + + /// + /// Updates the internal state of the Mixed Reality Camera. Called by OVRManager. + /// + + public static void Update(GameObject parentObject, Camera mainCamera, OVRManager.CompositionMethod compositionMethod, bool useDynamicLighting, OVRManager.CameraDevice cameraDevice, OVRManager.DepthQuality depthQuality) + { + if (!OVRPlugin.initialized) + { + Debug.LogError("OVRPlugin not initialized"); + return; + } + + if (!OVRPlugin.IsMixedRealityInitialized()) + { + OVRPlugin.InitializeMixedReality(); + if (OVRPlugin.IsMixedRealityInitialized()) + { + Debug.Log("OVRPlugin_MixedReality initialized"); + } + else + { + Debug.LogError("Unable to initialize OVRPlugin_MixedReality"); + return; + } + } + + if (!OVRPlugin.IsMixedRealityInitialized()) + { + return; + } + + OVRPlugin.UpdateExternalCamera(); +#if !OVR_ANDROID_MRC + OVRPlugin.UpdateCameraDevices(); +#endif + +#if OVR_ANDROID_MRC + useFakeExternalCamera = OVRPlugin.Media.UseMrcDebugCamera(); +#endif + + if (currentComposition != null && currentComposition.CompositionMethod() != compositionMethod) + { + currentComposition.Cleanup(); + currentComposition = null; + } + + if (compositionMethod == OVRManager.CompositionMethod.External) + { + if (currentComposition == null) + { + currentComposition = new OVRExternalComposition(parentObject, mainCamera); + } + } +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN + else if (compositionMethod == OVRManager.CompositionMethod.Direct) + { + if (currentComposition == null) + { + currentComposition = new OVRDirectComposition(parentObject, mainCamera, cameraDevice, useDynamicLighting, depthQuality); + } + } +#endif + else + { + Debug.LogError("Unknown CompositionMethod : " + compositionMethod); + return; + } + currentComposition.Update(parentObject, mainCamera); + } + + public static void Cleanup() + { + if (currentComposition != null) + { + currentComposition.Cleanup(); + currentComposition = null; + } + if (OVRPlugin.IsMixedRealityInitialized()) + { + OVRPlugin.ShutdownMixedReality(); + } + } + + public static void RecenterPose() + { + if (currentComposition != null) + { + currentComposition.RecenterPose(); + } + } + +} + +#endif diff --git a/Assets/Oculus/VR/Scripts/OVRMixedReality.cs.meta b/Assets/Oculus/VR/Scripts/OVRMixedReality.cs.meta new file mode 100644 index 0000000..351690c --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRMixedReality.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5daf6258e951ab84bb8b3e3b03386396 +timeCreated: 1497574405 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/OVROnCompleteListener.cs b/Assets/Oculus/VR/Scripts/OVROnCompleteListener.cs new file mode 100644 index 0000000..8f6c6d2 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVROnCompleteListener.cs @@ -0,0 +1,33 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections; + +#if UNITY_ANDROID && !UNITY_EDITOR + +public abstract class OVROnCompleteListener : AndroidJavaProxy +{ + public OVROnCompleteListener() : base("com.oculus.svclib.OnCompleteListener") + { + } + + public abstract void onSuccess(); + + public abstract void onFailure(); +} + +#endif diff --git a/Assets/Oculus/VR/Scripts/OVROnCompleteListener.cs.meta b/Assets/Oculus/VR/Scripts/OVROnCompleteListener.cs.meta new file mode 100644 index 0000000..d9c3859 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVROnCompleteListener.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8730118d7f00f9b47b09be73f7e91d2b +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/OVROverlay.cs b/Assets/Oculus/VR/Scripts/OVROverlay.cs new file mode 100644 index 0000000..ea024b0 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVROverlay.cs @@ -0,0 +1,962 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System; +using System.Collections; +using System.Runtime.InteropServices; + +#if UNITY_2017_2_OR_NEWER +using Settings = UnityEngine.XR.XRSettings; +#else +using Settings = UnityEngine.VR.VRSettings; +#endif + +/// +/// Add OVROverlay script to an object with an optional mesh primitive +/// rendered as a TimeWarp overlay instead by drawing it into the eye buffer. +/// This will take full advantage of the display resolution and avoid double +/// resampling of the texture. +/// +/// We support 3 types of Overlay shapes right now +/// 1. Quad : This is most common overlay type , you render a quad in Timewarp space. +/// 2. Cylinder: [Mobile Only][Experimental], Display overlay as partial surface of a cylinder +/// * The cylinder's center will be your game object's center +/// * We encoded the cylinder's parameters in transform.scale, +/// **[scale.z] is the radius of the cylinder +/// **[scale.y] is the height of the cylinder +/// **[scale.x] is the length of the arc of cylinder +/// * Limitations +/// **Only the half of the cylinder can be displayed, which means the arc angle has to be smaller than 180 degree, [scale.x] / [scale.z] <= PI +/// **Your camera has to be inside of the inscribed sphere of the cylinder, the overlay will be faded out automatically when the camera is close to the inscribed sphere's surface. +/// **Translation only works correctly with vrDriver 1.04 or above +/// 3. Cubemap: Display overlay as a cube map +/// 4. OffcenterCubemap: [Mobile Only] Display overlay as a cube map with a texture coordinate offset +/// * The actually sampling will looks like [color = texture(cubeLayerSampler, normalize(direction) + offset)] instead of [color = texture( cubeLayerSampler, direction )] +/// * The extra center offset can be feed from transform.position +/// * Note: if transform.position's magnitude is greater than 1, which will cause some cube map pixel always invisible +/// Which is usually not what people wanted, we don't kill the ability for developer to do so here, but will warn out. +/// 5. Equirect: Display overlay as a 360-degree equirectangular skybox. +/// +public class OVROverlay : MonoBehaviour +{ +#region Interface + + /// + /// Determines the on-screen appearance of a layer. + /// + public enum OverlayShape + { + Quad = OVRPlugin.OverlayShape.Quad, + Cylinder = OVRPlugin.OverlayShape.Cylinder, + Cubemap = OVRPlugin.OverlayShape.Cubemap, + OffcenterCubemap = OVRPlugin.OverlayShape.OffcenterCubemap, + Equirect = OVRPlugin.OverlayShape.Equirect, + } + + /// + /// Whether the layer appears behind or infront of other content in the scene. + /// + public enum OverlayType + { + None, + Underlay, + Overlay, + }; + + /// + /// Specify overlay's type + /// + [Tooltip("Specify overlay's type")] + public OverlayType currentOverlayType = OverlayType.Overlay; + + /// + /// If true, the texture's content is copied to the compositor each frame. + /// + [Tooltip("If true, the texture's content is copied to the compositor each frame.")] + public bool isDynamic = false; + + /// + /// If true, the layer would be used to present protected content (e.g. HDCP). The flag is effective only on PC. + /// + [Tooltip("If true, the layer would be used to present protected content (e.g. HDCP). The flag is effective only on PC.")] + public bool isProtectedContent = false; + + //Source and dest rects + public Rect srcRectLeft = new Rect(); + public Rect srcRectRight = new Rect(); + public Rect destRectLeft = new Rect(); + public Rect destRectRight = new Rect(); + + private OVRPlugin.TextureRectMatrixf textureRectMatrix = OVRPlugin.TextureRectMatrixf.zero; + + public bool overrideTextureRectMatrix = false; + + public bool overridePerLayerColorScaleAndOffset = false; + + public Vector4 colorScale = Vector4.one; + + public Vector4 colorOffset = Vector4.zero; + + //Warning: Developers should only use this supersample setting if they absolutely have the budget and need for it. It is extremely expensive, and will not be relevant for most developers. + public bool useExpensiveSuperSample = false; + + //Property that can hide overlays when required. Should be false when present, true when hidden. + public bool hidden = false; + + /// + /// If true, the layer will be created as an external surface. externalSurfaceObject contains the Surface object. It's effective only on Android. + /// + [Tooltip("If true, the layer will be created as an external surface. externalSurfaceObject contains the Surface object. It's effective only on Android.")] + public bool isExternalSurface = false; + + /// + /// The width which will be used to create the external surface. It's effective only on Android. + /// + [Tooltip("The width which will be used to create the external surface. It's effective only on Android.")] + public int externalSurfaceWidth = 0; + + /// + /// The height which will be used to create the external surface. It's effective only on Android. + /// + [Tooltip("The height which will be used to create the external surface. It's effective only on Android.")] + public int externalSurfaceHeight = 0; + + /// + /// The compositionDepth defines the order of the OVROverlays in composition. The overlay/underlay with smaller compositionDepth would be composited in the front of the overlay/underlay with larger compositionDepth. + /// + [Tooltip("The compositionDepth defines the order of the OVROverlays in composition. The overlay/underlay with smaller compositionDepth would be composited in the front of the overlay/underlay with larger compositionDepth.")] + public int compositionDepth = 0; + + /// + /// The noDepthBufferTesting will stop layer's depth buffer compositing even if the engine has "Depth buffer sharing" enabled on Rift. + /// + [Tooltip("The noDepthBufferTesting will stop layer's depth buffer compositing even if the engine has \"Shared Depth Buffer\" enabled")] + public bool noDepthBufferTesting = false; + + /// + /// Specify overlay's shape + /// + [Tooltip("Specify overlay's shape")] + public OverlayShape currentOverlayShape = OverlayShape.Quad; + private OverlayShape prevOverlayShape = OverlayShape.Quad; + + /// + /// The left- and right-eye Textures to show in the layer. + /// \note If you need to change the texture on a per-frame basis, please use OverrideOverlayTextureInfo(..) to avoid caching issues. + /// + [Tooltip("The left- and right-eye Textures to show in the layer.")] + public Texture[] textures = new Texture[] { null, null }; + + protected IntPtr[] texturePtrs = new IntPtr[] { IntPtr.Zero, IntPtr.Zero }; + + /// + /// The Surface object (Android only). + /// + public System.IntPtr externalSurfaceObject; + + public delegate void ExternalSurfaceObjectCreated(); + /// + /// Will be triggered after externalSurfaceTextueObject get created. + /// + public ExternalSurfaceObjectCreated externalSurfaceObjectCreated; + + /// + /// Use this function to set texture and texNativePtr when app is running + /// GetNativeTexturePtr is a slow behavior, the value should be pre-cached + /// +#if UNITY_2017_2_OR_NEWER + public void OverrideOverlayTextureInfo(Texture srcTexture, IntPtr nativePtr, UnityEngine.XR.XRNode node) +#else + public void OverrideOverlayTextureInfo(Texture srcTexture, IntPtr nativePtr, UnityEngine.VR.VRNode node) +#endif + { +#if UNITY_2017_2_OR_NEWER + int index = (node == UnityEngine.XR.XRNode.RightEye) ? 1 : 0; +#else + int index = (node == UnityEngine.VR.VRNode.RightEye) ? 1 : 0; +#endif + + if (textures.Length <= index) + return; + + textures[index] = srcTexture; + texturePtrs[index] = nativePtr; + + isOverridePending = true; + } + + protected bool isOverridePending; + + internal const int maxInstances = 15; + public static OVROverlay[] instances = new OVROverlay[maxInstances]; + +#endregion + + private static Material tex2DMaterial; + private static Material cubeMaterial; + + private OVRPlugin.LayerLayout layout { + get { +#if UNITY_ANDROID && !UNITY_EDITOR + if (textures.Length == 2 && textures[1] != null) + return OVRPlugin.LayerLayout.Stereo; +#endif + return OVRPlugin.LayerLayout.Mono; + } + } + + private struct LayerTexture { + public Texture appTexture; + public IntPtr appTexturePtr; + public Texture[] swapChain; + public IntPtr[] swapChainPtr; + }; + private LayerTexture[] layerTextures; + + private OVRPlugin.LayerDesc layerDesc; + private int stageCount = -1; + + private int layerIndex = -1; // Controls the composition order based on wake-up time. + + private int layerId = 0; // The layer's internal handle in the compositor. + private GCHandle layerIdHandle; + private IntPtr layerIdPtr = IntPtr.Zero; + + private int frameIndex = 0; + private int prevFrameIndex = -1; + + private Renderer rend; + + private int texturesPerStage { get { return (layout == OVRPlugin.LayerLayout.Stereo) ? 2 : 1; } } + + private bool CreateLayer(int mipLevels, int sampleCount, OVRPlugin.EyeTextureFormat etFormat, int flags, OVRPlugin.Sizei size, OVRPlugin.OverlayShape shape) + { + if (!layerIdHandle.IsAllocated || layerIdPtr == IntPtr.Zero) + { + layerIdHandle = GCHandle.Alloc(layerId, GCHandleType.Pinned); + layerIdPtr = layerIdHandle.AddrOfPinnedObject(); + } + + if (layerIndex == -1) + { + for (int i = 0; i < maxInstances; ++i) + { + if (instances[i] == null || instances[i] == this) + { + layerIndex = i; + instances[i] = this; + break; + } + } + } + + bool needsSetup = ( + isOverridePending || + layerDesc.MipLevels != mipLevels || + layerDesc.SampleCount != sampleCount || + layerDesc.Format != etFormat || + layerDesc.Layout != layout || + layerDesc.LayerFlags != flags || + !layerDesc.TextureSize.Equals(size) || + layerDesc.Shape != shape); + + if (!needsSetup) + return false; + + OVRPlugin.LayerDesc desc = OVRPlugin.CalculateLayerDesc(shape, layout, size, mipLevels, sampleCount, etFormat, flags); + OVRPlugin.EnqueueSetupLayer(desc, compositionDepth, layerIdPtr); + layerId = (int)layerIdHandle.Target; + + if (layerId > 0) + { + layerDesc = desc; + if (isExternalSurface) + { + stageCount = 1; + } + else + { + stageCount = OVRPlugin.GetLayerTextureStageCount(layerId); + } + } + + isOverridePending = false; + + return true; + } + + private bool CreateLayerTextures(bool useMipmaps, OVRPlugin.Sizei size, bool isHdr) + { + if (isExternalSurface) + { + if (externalSurfaceObject == System.IntPtr.Zero) + { + externalSurfaceObject = OVRPlugin.GetLayerAndroidSurfaceObject(layerId); + if (externalSurfaceObject != System.IntPtr.Zero) + { + Debug.LogFormat("GetLayerAndroidSurfaceObject returns {0}", externalSurfaceObject); + if (externalSurfaceObjectCreated != null) + { + externalSurfaceObjectCreated(); + } + } + } + return false; + } + + bool needsCopy = false; + + if (stageCount <= 0) + return false; + + // For newer SDKs, blit directly to the surface that will be used in compositing. + + if (layerTextures == null) + layerTextures = new LayerTexture[texturesPerStage]; + + for (int eyeId = 0; eyeId < texturesPerStage; ++eyeId) + { + if (layerTextures[eyeId].swapChain == null) + layerTextures[eyeId].swapChain = new Texture[stageCount]; + + if (layerTextures[eyeId].swapChainPtr == null) + layerTextures[eyeId].swapChainPtr = new IntPtr[stageCount]; + + for (int stage = 0; stage < stageCount; ++stage) + { + Texture sc = layerTextures[eyeId].swapChain[stage]; + IntPtr scPtr = layerTextures[eyeId].swapChainPtr[stage]; + + if (sc != null && scPtr != IntPtr.Zero && size.w == sc.width && size.h == sc.height) + continue; + + if (scPtr == IntPtr.Zero) + scPtr = OVRPlugin.GetLayerTexture(layerId, stage, (OVRPlugin.Eye)eyeId); + + if (scPtr == IntPtr.Zero) + continue; + + var txFormat = (isHdr) ? TextureFormat.RGBAHalf : TextureFormat.RGBA32; + + if (currentOverlayShape != OverlayShape.Cubemap && currentOverlayShape != OverlayShape.OffcenterCubemap) + sc = Texture2D.CreateExternalTexture(size.w, size.h, txFormat, useMipmaps, true, scPtr); +#if UNITY_2017_1_OR_NEWER + else + sc = Cubemap.CreateExternalTexture(size.w, txFormat, useMipmaps, scPtr); +#endif + + layerTextures[eyeId].swapChain[stage] = sc; + layerTextures[eyeId].swapChainPtr[stage] = scPtr; + + needsCopy = true; + } + } + + return needsCopy; + } + + private void DestroyLayerTextures() + { + if (isExternalSurface) + { + return; + } + + for (int eyeId = 0; layerTextures != null && eyeId < texturesPerStage; ++eyeId) + { + if (layerTextures[eyeId].swapChain != null) + { + for (int stage = 0; stage < stageCount; ++stage) + DestroyImmediate(layerTextures[eyeId].swapChain[stage]); + } + } + + layerTextures = null; + } + + private void DestroyLayer() + { + if (layerIndex != -1) + { + // Turn off the overlay if it was on. + OVRPlugin.EnqueueSubmitLayer(true, false, false, IntPtr.Zero, IntPtr.Zero, -1, 0, OVRPose.identity.ToPosef_Legacy(), Vector3.one.ToVector3f(), layerIndex, (OVRPlugin.OverlayShape)prevOverlayShape); + instances[layerIndex] = null; + layerIndex = -1; + } + + if (layerIdPtr != IntPtr.Zero) + { + OVRPlugin.EnqueueDestroyLayer(layerIdPtr); + layerIdPtr = IntPtr.Zero; + layerIdHandle.Free(); + layerId = 0; + } + + layerDesc = new OVRPlugin.LayerDesc(); + + frameIndex = 0; + prevFrameIndex = -1; + } + + /// + /// Sets the source and dest rects for both eyes. Source explains what portion of the source texture is used, and + /// dest is what portion of the destination texture is rendered into. + /// + public void SetSrcDestRects(Rect srcLeft, Rect srcRight, Rect destLeft, Rect destRight) + { + srcRectLeft = srcLeft; + srcRectRight = srcRight; + destRectLeft = destLeft; + destRectRight = destRight; + } + + public void UpdateTextureRectMatrix() + { + Rect srcRectLeftConverted = new Rect(srcRectLeft.x, 1 - srcRectLeft.y - srcRectLeft.height, srcRectLeft.width, srcRectLeft.height); + Rect srcRectRightConverted = new Rect(srcRectRight.x, 1 - srcRectRight.y - srcRectRight.height, srcRectRight.width, srcRectRight.height); + textureRectMatrix.leftRect = srcRectLeftConverted; + textureRectMatrix.rightRect = srcRectRightConverted; + float leftWidthFactor = srcRectLeftConverted.width / destRectLeft.width; + float leftHeightFactor = srcRectLeftConverted.height / destRectLeft.height; + textureRectMatrix.leftScaleBias = new Vector4(leftWidthFactor, leftHeightFactor, srcRectLeftConverted.x - destRectLeft.x * leftWidthFactor, srcRectLeftConverted.y - destRectLeft.y * leftHeightFactor); + float rightWidthFactor = srcRectRightConverted.width / destRectRight.width; + float rightHeightFactor = srcRectRightConverted.height / destRectRight.height; + textureRectMatrix.rightScaleBias = new Vector4(rightWidthFactor, rightHeightFactor, srcRectRightConverted.x - destRectRight.x * rightWidthFactor, srcRectRightConverted.y - destRectRight.y * rightHeightFactor); + } + + public void SetPerLayerColorScaleAndOffset(Vector4 scale, Vector4 offset) + { + colorScale = scale; + colorOffset = offset; + } + + private bool LatchLayerTextures() + { + if (isExternalSurface) + { + return true; + } + + for (int i = 0; i < texturesPerStage; ++i) + { + if (textures[i] != layerTextures[i].appTexture || layerTextures[i].appTexturePtr == IntPtr.Zero) + { + if (textures[i] != null) + { +#if UNITY_EDITOR + var assetPath = UnityEditor.AssetDatabase.GetAssetPath(textures[i]); + var importer = (UnityEditor.TextureImporter)UnityEditor.TextureImporter.GetAtPath(assetPath); + if (importer && importer.textureType != UnityEditor.TextureImporterType.Default) + { + Debug.LogError("Need Default Texture Type for overlay"); + return false; + } +#endif + var rt = textures[i] as RenderTexture; + if (rt && !rt.IsCreated()) + rt.Create(); + + layerTextures[i].appTexturePtr = (texturePtrs[i] != IntPtr.Zero) ? texturePtrs[i] : textures[i].GetNativeTexturePtr(); + + if (layerTextures[i].appTexturePtr != IntPtr.Zero) + layerTextures[i].appTexture = textures[i]; + } + } + + if (currentOverlayShape == OverlayShape.Cubemap) + { + if (textures[i] as Cubemap == null) + { + Debug.LogError("Need Cubemap texture for cube map overlay"); + return false; + } + } + } + +#if !UNITY_ANDROID || UNITY_EDITOR + if (currentOverlayShape == OverlayShape.OffcenterCubemap) + { + Debug.LogWarning("Overlay shape " + currentOverlayShape + " is not supported on current platform"); + return false; + } +#endif + + if (layerTextures[0].appTexture == null || layerTextures[0].appTexturePtr == IntPtr.Zero) + return false; + + return true; + } + + private OVRPlugin.LayerDesc GetCurrentLayerDesc() + { + OVRPlugin.Sizei textureSize = new OVRPlugin.Sizei() { w = 0, h = 0 }; + + if (isExternalSurface) + { + textureSize.w = externalSurfaceWidth; + textureSize.h = externalSurfaceHeight; + } + else + { + if (textures[0] == null) + { + Debug.LogWarning("textures[0] hasn't been set"); + } + textureSize.w = textures[0] ? textures[0].width : 0; + textureSize.h = textures[0] ? textures[0].height : 0; + } + + OVRPlugin.LayerDesc newDesc = new OVRPlugin.LayerDesc() { + Format = OVRPlugin.EyeTextureFormat.R8G8B8A8_sRGB, + LayerFlags = isExternalSurface ? 0 : (int)OVRPlugin.LayerFlags.TextureOriginAtBottomLeft, + Layout = layout, + MipLevels = 1, + SampleCount = 1, + Shape = (OVRPlugin.OverlayShape)currentOverlayShape, + TextureSize = textureSize + }; + + var tex2D = textures[0] as Texture2D; + if (tex2D != null) + { + if (tex2D.format == TextureFormat.RGBAHalf || tex2D.format == TextureFormat.RGBAFloat) + newDesc.Format = OVRPlugin.EyeTextureFormat.R16G16B16A16_FP; + + newDesc.MipLevels = tex2D.mipmapCount; + } + + var texCube = textures[0] as Cubemap; + if (texCube != null) + { + if (texCube.format == TextureFormat.RGBAHalf || texCube.format == TextureFormat.RGBAFloat) + newDesc.Format = OVRPlugin.EyeTextureFormat.R16G16B16A16_FP; + + newDesc.MipLevels = texCube.mipmapCount; + } + + var rt = textures[0] as RenderTexture; + if (rt != null) + { + newDesc.SampleCount = rt.antiAliasing; + + if (rt.format == RenderTextureFormat.ARGBHalf || rt.format == RenderTextureFormat.ARGBFloat || rt.format == RenderTextureFormat.RGB111110Float) + newDesc.Format = OVRPlugin.EyeTextureFormat.R16G16B16A16_FP; + } + + if (isProtectedContent) + { + newDesc.LayerFlags |= (int)OVRPlugin.LayerFlags.ProtectedContent; + } + + if (isExternalSurface) + { + newDesc.LayerFlags |= (int)OVRPlugin.LayerFlags.AndroidSurfaceSwapChain; + } + + return newDesc; + } + + private bool PopulateLayer(int mipLevels, bool isHdr, OVRPlugin.Sizei size, int sampleCount, int stage) + { + if (isExternalSurface) + { + return true; + } + + bool ret = false; + + RenderTextureFormat rtFormat = (isHdr) ? RenderTextureFormat.ARGBHalf : RenderTextureFormat.ARGB32; + + for (int eyeId = 0; eyeId < texturesPerStage; ++eyeId) + { + Texture et = layerTextures[eyeId].swapChain[stage]; + if (et == null) + continue; + + for (int mip = 0; mip < mipLevels; ++mip) + { + int width = size.w >> mip; + if (width < 1) width = 1; + int height = size.h >> mip; + if (height < 1) height = 1; +#if UNITY_2017_1_1 || UNITY_2017_2_OR_NEWER + RenderTextureDescriptor descriptor = new RenderTextureDescriptor(width, height, rtFormat, 0); + descriptor.msaaSamples = sampleCount; + descriptor.useMipMap = true; + descriptor.autoGenerateMips = false; + descriptor.sRGB = false; + + var tempRTDst = RenderTexture.GetTemporary(descriptor); +#else + var tempRTDst = RenderTexture.GetTemporary(width, height, 0, rtFormat, RenderTextureReadWrite.Linear, sampleCount); +#endif + + if (!tempRTDst.IsCreated()) + tempRTDst.Create(); + + tempRTDst.DiscardContents(); + + bool dataIsLinear = isHdr || (QualitySettings.activeColorSpace == ColorSpace.Linear); + +#if !UNITY_2017_1_OR_NEWER + var rt = textures[eyeId] as RenderTexture; + dataIsLinear |= rt != null && rt.sRGB; //HACK: Unity 5.6 and earlier convert to linear on read from sRGB RenderTexture. +#endif +#if UNITY_ANDROID && !UNITY_EDITOR + dataIsLinear = true; //HACK: Graphics.CopyTexture causes linear->srgb conversion on target write with D3D but not GLES. +#endif + + if (currentOverlayShape != OverlayShape.Cubemap && currentOverlayShape != OverlayShape.OffcenterCubemap) + { + tex2DMaterial.SetInt("_linearToSrgb", (!isHdr && dataIsLinear) ? 1 : 0); + + //Resolve, decompress, swizzle, etc not handled by simple CopyTexture. +#if !UNITY_ANDROID || UNITY_EDITOR + // The PC compositor uses premultiplied alpha, so multiply it here. + tex2DMaterial.SetInt("_premultiply", 1); +#endif + Graphics.Blit(textures[eyeId], tempRTDst, tex2DMaterial); + Graphics.CopyTexture(tempRTDst, 0, 0, et, 0, mip); + } +#if UNITY_2017_1_OR_NEWER + else // Cubemap + { + for (int face = 0; face < 6; ++face) + { + cubeMaterial.SetInt("_linearToSrgb", (!isHdr && dataIsLinear) ? 1 : 0); + +#if !UNITY_ANDROID || UNITY_EDITOR + // The PC compositor uses premultiplied alpha, so multiply it here. + cubeMaterial.SetInt("_premultiply", 1); +#endif + cubeMaterial.SetInt("_face", face); + //Resolve, decompress, swizzle, etc not handled by simple CopyTexture. + Graphics.Blit(textures[eyeId], tempRTDst, cubeMaterial); + Graphics.CopyTexture(tempRTDst, 0, 0, et, face, mip); + } + } +#endif + RenderTexture.ReleaseTemporary(tempRTDst); + + ret = true; + } + } + + return ret; + } + + private bool SubmitLayer(bool overlay, bool headLocked, bool noDepthBufferTesting, OVRPose pose, Vector3 scale, int frameIndex) + { + int rightEyeIndex = (texturesPerStage >= 2) ? 1 : 0; + if (overrideTextureRectMatrix) + { + UpdateTextureRectMatrix(); + } + bool isOverlayVisible = OVRPlugin.EnqueueSubmitLayer(overlay, headLocked, noDepthBufferTesting, + isExternalSurface ? System.IntPtr.Zero : layerTextures[0].appTexturePtr, + isExternalSurface ? System.IntPtr.Zero : layerTextures[rightEyeIndex].appTexturePtr, + layerId, frameIndex, pose.flipZ().ToPosef_Legacy(), scale.ToVector3f(), layerIndex, (OVRPlugin.OverlayShape)currentOverlayShape, + overrideTextureRectMatrix, textureRectMatrix, overridePerLayerColorScaleAndOffset, colorScale, colorOffset, useExpensiveSuperSample, + hidden); + + prevOverlayShape = currentOverlayShape; + + return isOverlayVisible; + } + +#region Unity Messages + + void Awake() + { + Debug.Log("Overlay Awake"); + + if (tex2DMaterial == null) + tex2DMaterial = new Material(Shader.Find("Oculus/Texture2D Blit")); + + if (cubeMaterial == null) + cubeMaterial = new Material(Shader.Find("Oculus/Cubemap Blit")); + + rend = GetComponent(); + + if (textures.Length == 0) + textures = new Texture[] { null }; + + // Backward compatibility + if (rend != null && textures[0] == null) + textures[0] = rend.material.mainTexture; + } + + static public string OpenVROverlayKey { get { return "unity:" + Application.companyName + "." + Application.productName; } } + private ulong OpenVROverlayHandle = OVR.OpenVR.OpenVR.k_ulOverlayHandleInvalid; + + void OnEnable() + { + if (OVRManager.OVRManagerinitialized) + InitOVROverlay(); + } + + void InitOVROverlay() + { + if (!OVRManager.isHmdPresent) + { + enabled = false; + return; + } + + constructedOverlayXRDevice = OVRManager.XRDevice.Unknown; + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + { + OVR.OpenVR.CVROverlay overlay = OVR.OpenVR.OpenVR.Overlay; + if (overlay != null) + { + OVR.OpenVR.EVROverlayError error = overlay.CreateOverlay(OpenVROverlayKey + transform.name, gameObject.name, ref OpenVROverlayHandle); + if (error != OVR.OpenVR.EVROverlayError.None) + { + enabled = false; + return; + } + } + else + { + enabled = false; + return; + } + } + + constructedOverlayXRDevice = OVRManager.loadedXRDevice; + xrDeviceConstructed = true; + } + + void OnDisable() + { + if ((gameObject.hideFlags & HideFlags.DontSaveInBuild) != 0) + return; + + if (!OVRManager.OVRManagerinitialized) + return; + + if (OVRManager.loadedXRDevice != constructedOverlayXRDevice) + return; + + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus) + { + DestroyLayerTextures(); + DestroyLayer(); + } + else if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + { + if (OpenVROverlayHandle != OVR.OpenVR.OpenVR.k_ulOverlayHandleInvalid) + { + OVR.OpenVR.CVROverlay overlay = OVR.OpenVR.OpenVR.Overlay; + if (overlay != null) + { + overlay.DestroyOverlay(OpenVROverlayHandle); + } + OpenVROverlayHandle = OVR.OpenVR.OpenVR.k_ulOverlayHandleInvalid; + } + } + constructedOverlayXRDevice = OVRManager.XRDevice.Unknown; + xrDeviceConstructed = false; + } + + void OnDestroy() + { + DestroyLayerTextures(); + DestroyLayer(); + } + + bool ComputeSubmit(ref OVRPose pose, ref Vector3 scale, ref bool overlay, ref bool headLocked) + { + Camera headCamera = Camera.main; + + overlay = (currentOverlayType == OverlayType.Overlay); + headLocked = false; + for (var t = transform; t != null && !headLocked; t = t.parent) + headLocked |= (t == headCamera.transform); + + pose = (headLocked) ? transform.ToHeadSpacePose(headCamera) : transform.ToTrackingSpacePose(headCamera); + scale = transform.lossyScale; + for (int i = 0; i < 3; ++i) + scale[i] /= headCamera.transform.lossyScale[i]; + + if (currentOverlayShape == OverlayShape.Cubemap) + { +#if UNITY_ANDROID && !UNITY_EDITOR + //HACK: VRAPI cubemaps assume are yawed 180 degrees relative to LibOVR. + pose.orientation = pose.orientation * Quaternion.AngleAxis(180, Vector3.up); +#endif + pose.position = headCamera.transform.position; + } + + // Pack the offsetCenter directly into pose.position for offcenterCubemap + if (currentOverlayShape == OverlayShape.OffcenterCubemap) + { + pose.position = transform.position; + if (pose.position.magnitude > 1.0f) + { + Debug.LogWarning("Your cube map center offset's magnitude is greater than 1, which will cause some cube map pixel always invisible ."); + return false; + } + } + + // Cylinder overlay sanity checking + if (currentOverlayShape == OverlayShape.Cylinder) + { + float arcAngle = scale.x / scale.z / (float)Math.PI * 180.0f; + if (arcAngle > 180.0f) + { + Debug.LogWarning("Cylinder overlay's arc angle has to be below 180 degree, current arc angle is " + arcAngle + " degree." ); + return false; + } + } + + return true; + } + + void OpenVROverlayUpdate(Vector3 scale, OVRPose pose) + { + OVR.OpenVR.CVROverlay overlayRef = OVR.OpenVR.OpenVR.Overlay; + if (overlayRef == null) + return; + + Texture overlayTex = textures[0]; + + if (overlayTex != null) + { + OVR.OpenVR.EVROverlayError error = overlayRef.ShowOverlay(OpenVROverlayHandle); + if (error == OVR.OpenVR.EVROverlayError.InvalidHandle || error == OVR.OpenVR.EVROverlayError.UnknownOverlay) + { + if (overlayRef.FindOverlay(OpenVROverlayKey + transform.name, ref OpenVROverlayHandle) != OVR.OpenVR.EVROverlayError.None) + return; + } + + OVR.OpenVR.Texture_t tex = new OVR.OpenVR.Texture_t(); + tex.handle = overlayTex.GetNativeTexturePtr(); + tex.eType = SystemInfo.graphicsDeviceVersion.StartsWith("OpenGL") ? OVR.OpenVR.ETextureType.OpenGL : OVR.OpenVR.ETextureType.DirectX; + tex.eColorSpace = OVR.OpenVR.EColorSpace.Auto; + overlayRef.SetOverlayTexture(OpenVROverlayHandle, ref tex); + + OVR.OpenVR.VRTextureBounds_t textureBounds = new OVR.OpenVR.VRTextureBounds_t(); + textureBounds.uMin = (0 + OpenVRUVOffsetAndScale.x) * OpenVRUVOffsetAndScale.z; + textureBounds.vMin = (1 + OpenVRUVOffsetAndScale.y) * OpenVRUVOffsetAndScale.w; + textureBounds.uMax = (1 + OpenVRUVOffsetAndScale.x) * OpenVRUVOffsetAndScale.z; + textureBounds.vMax = (0 + OpenVRUVOffsetAndScale.y) * OpenVRUVOffsetAndScale.w; + + overlayRef.SetOverlayTextureBounds(OpenVROverlayHandle, ref textureBounds); + + OVR.OpenVR.HmdVector2_t vecMouseScale = new OVR.OpenVR.HmdVector2_t(); + vecMouseScale.v0 = OpenVRMouseScale.x; + vecMouseScale.v1 = OpenVRMouseScale.y; + overlayRef.SetOverlayMouseScale(OpenVROverlayHandle, ref vecMouseScale); + + overlayRef.SetOverlayWidthInMeters(OpenVROverlayHandle, scale.x); + + Matrix4x4 mat44 = Matrix4x4.TRS(pose.position, pose.orientation, Vector3.one); + + OVR.OpenVR.HmdMatrix34_t pose34 = mat44.ConvertToHMDMatrix34(); + + overlayRef.SetOverlayTransformAbsolute(OpenVROverlayHandle, OVR.OpenVR.ETrackingUniverseOrigin.TrackingUniverseStanding, ref pose34); + + } + } + + private Vector4 OpenVRUVOffsetAndScale = new Vector4(0, 0, 1.0f, 1.0f); + private Vector2 OpenVRMouseScale = new Vector2(1, 1); + private OVRManager.XRDevice constructedOverlayXRDevice; + private bool xrDeviceConstructed = false; + + void LateUpdate() + { + if (!OVRManager.OVRManagerinitialized) + return; + if (!xrDeviceConstructed) + { + InitOVROverlay(); + } + + if (OVRManager.loadedXRDevice != constructedOverlayXRDevice) + { + Debug.LogError("Warning-XR Device was switched during runtime with overlays still enabled. When doing so, all overlays constructed with the previous XR device must first be disabled."); + return; + } + // The overlay must be specified every eye frame, because it is positioned relative to the + // current head location. If frames are dropped, it will be time warped appropriately, + // just like the eye buffers. + if (currentOverlayType == OverlayType.None || ((textures.Length < texturesPerStage || textures[0] == null) && !isExternalSurface)) + return; + + OVRPose pose = OVRPose.identity; + Vector3 scale = Vector3.one; + bool overlay = false; + bool headLocked = false; + if (!ComputeSubmit(ref pose, ref scale, ref overlay, ref headLocked)) + return; + + if (OVRManager.loadedXRDevice == OVRManager.XRDevice.OpenVR) + { + if (currentOverlayShape == OverlayShape.Quad) + OpenVROverlayUpdate(scale, pose); + //No more Overlay processing is required if we're on OpenVR + return; + } + + OVRPlugin.LayerDesc newDesc = GetCurrentLayerDesc(); + bool isHdr = (newDesc.Format == OVRPlugin.EyeTextureFormat.R16G16B16A16_FP); + + // If the layer and textures are created but sizes differ, force re-creating them + if (!layerDesc.TextureSize.Equals(newDesc.TextureSize) && layerId > 0) + { + DestroyLayerTextures(); + DestroyLayer(); + } + + bool createdLayer = CreateLayer(newDesc.MipLevels, newDesc.SampleCount, newDesc.Format, newDesc.LayerFlags, newDesc.TextureSize, newDesc.Shape); + + if (layerIndex == -1 || layerId <= 0) + return; + + bool useMipmaps = (newDesc.MipLevels > 1); + + createdLayer |= CreateLayerTextures(useMipmaps, newDesc.TextureSize, isHdr); + + if (!isExternalSurface && (layerTextures[0].appTexture as RenderTexture != null)) + isDynamic = true; + + if (!LatchLayerTextures()) + return; + + // Don't populate the same frame image twice. + if (frameIndex > prevFrameIndex) + { + int stage = frameIndex % stageCount; + if (!PopulateLayer (newDesc.MipLevels, isHdr, newDesc.TextureSize, newDesc.SampleCount, stage)) + return; + } + + bool isOverlayVisible = SubmitLayer(overlay, headLocked, noDepthBufferTesting, pose, scale, frameIndex); + + prevFrameIndex = frameIndex; + if (isDynamic) + ++frameIndex; + + // Backward compatibility: show regular renderer if overlay isn't visible. + if (rend) + rend.enabled = !isOverlayVisible; + } + +#endregion +} diff --git a/Assets/Oculus/VR/Scripts/OVROverlay.cs.meta b/Assets/Oculus/VR/Scripts/OVROverlay.cs.meta new file mode 100644 index 0000000..103c885 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVROverlay.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4444ce35d262aa648ad0c425a559b931 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/OVRPlatformMenu.cs b/Assets/Oculus/VR/Scripts/OVRPlatformMenu.cs new file mode 100644 index 0000000..a6efd19 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRPlatformMenu.cs @@ -0,0 +1,124 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using VR = UnityEngine.VR; +using System.Collections; +using System.Collections.Generic; + +/// +/// Shows the Oculus plaform UI. +/// +public class OVRPlatformMenu : MonoBehaviour +{ + /// + /// The key code. + /// + private OVRInput.RawButton inputCode = OVRInput.RawButton.Back; + + public enum eHandler + { + ShowConfirmQuit, + RetreatOneLevel, + }; + + public eHandler shortPressHandler = eHandler.ShowConfirmQuit; + + /// + /// Callback to handle short press. Returns true if ConfirmQuit menu should be shown. + /// + public System.Func OnShortPress; + private static Stack sceneStack = new Stack(); + + enum eBackButtonAction + { + NONE, + SHORT_PRESS + }; + + eBackButtonAction HandleBackButtonState() + { + eBackButtonAction action = eBackButtonAction.NONE; + + if (OVRInput.GetDown(inputCode)) + { + action = eBackButtonAction.SHORT_PRESS; + } + + return action; + } + + /// + /// Instantiate the cursor timer + /// + void Awake() + { + if (shortPressHandler == eHandler.RetreatOneLevel && OnShortPress == null) + OnShortPress = RetreatOneLevel; + + if (!OVRManager.isHmdPresent) + { + enabled = false; + return; + } + + sceneStack.Push(UnityEngine.SceneManagement.SceneManager.GetActiveScene().name); + } + + /// + /// Show the confirm quit menu + /// + void ShowConfirmQuitMenu() + { +#if UNITY_ANDROID && !UNITY_EDITOR + Debug.Log("[PlatformUI-ConfirmQuit] Showing @ " + Time.time); + OVRManager.PlatformUIConfirmQuit(); +#endif + } + + /// + /// Sample handler for short press which retreats to the previous scene that used OVRPlatformMenu. + /// + private static bool RetreatOneLevel() + { + if (sceneStack.Count > 1) + { + string parentScene = sceneStack.Pop(); + UnityEngine.SceneManagement.SceneManager.LoadSceneAsync (parentScene); + return false; + } + + return true; + } + + /// + /// Tests for long-press and activates global platform menu when detected. + /// as per the Unity integration doc, the back button responds to "mouse 1" button down/up/etc + /// + void Update() + { +#if UNITY_ANDROID + eBackButtonAction action = HandleBackButtonState(); + if (action == eBackButtonAction.SHORT_PRESS) + { + if (OnShortPress == null || OnShortPress()) + { + ShowConfirmQuitMenu(); + } + } +#endif + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRPlatformMenu.cs.meta b/Assets/Oculus/VR/Scripts/OVRPlatformMenu.cs.meta new file mode 100644 index 0000000..b5b9a79 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRPlatformMenu.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2afcf575f4a68de4db434c7b7233c451 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/OVRPlugin.cs b/Assets/Oculus/VR/Scripts/OVRPlugin.cs new file mode 100644 index 0000000..d378a52 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRPlugin.cs @@ -0,0 +1,5358 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +#if USING_XR_MANAGEMENT && USING_XR_SDK_OCULUS +#define USING_XR_SDK +#endif + +#if !(UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || (UNITY_ANDROID && !UNITY_EDITOR)) +#define OVRPLUGIN_UNSUPPORTED_PLATFORM +#endif + +#if UNITY_ANDROID && !UNITY_EDITOR +#define OVRPLUGIN_INCLUDE_MRC_ANDROID +#endif + +using System; +using System.Runtime.InteropServices; +using UnityEngine; + +// Internal C# wrapper for OVRPlugin. + +public static class OVRPlugin +{ +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + public const bool isSupportedPlatform = false; +#else + public const bool isSupportedPlatform = true; +#endif + +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + public static readonly System.Version wrapperVersion = _versionZero; +#else + public static readonly System.Version wrapperVersion = OVRP_1_44_0.version; +#endif + +#if !OVRPLUGIN_UNSUPPORTED_PLATFORM + private static System.Version _version; +#endif + public static System.Version version + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + Debug.LogWarning("Platform is not currently supported by OVRPlugin"); + return _versionZero; +#else + if (_version == null) + { + try + { + string pluginVersion = OVRP_1_1_0.ovrp_GetVersion(); + + if (pluginVersion != null) + { + // Truncate unsupported trailing version info for System.Version. Original string is returned if not present. + pluginVersion = pluginVersion.Split('-')[0]; + _version = new System.Version(pluginVersion); + } + else + { + _version = _versionZero; + } + } + catch + { + _version = _versionZero; + } + + // Unity 5.1.1f3-p3 have OVRPlugin version "0.5.0", which isn't accurate. + if (_version == OVRP_0_5_0.version) + _version = OVRP_0_1_0.version; + + if (_version > _versionZero && _version < OVRP_1_3_0.version) + throw new PlatformNotSupportedException("Oculus Utilities version " + wrapperVersion + " is too new for OVRPlugin version " + _version.ToString() + ". Update to the latest version of Unity."); + } + + return _version; +#endif + } + } + +#if !OVRPLUGIN_UNSUPPORTED_PLATFORM + private static System.Version _nativeSDKVersion; +#endif + public static System.Version nativeSDKVersion + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return _versionZero; +#else + if (_nativeSDKVersion == null) + { + try + { + string sdkVersion = string.Empty; + + if (version >= OVRP_1_1_0.version) + sdkVersion = OVRP_1_1_0.ovrp_GetNativeSDKVersion(); + else + sdkVersion = _versionZero.ToString(); + + if (sdkVersion != null) + { + // Truncate unsupported trailing version info for System.Version. Original string is returned if not present. + sdkVersion = sdkVersion.Split('-')[0]; + _nativeSDKVersion = new System.Version(sdkVersion); + } + else + { + _nativeSDKVersion = _versionZero; + } + } + catch + { + _nativeSDKVersion = _versionZero; + } + } + + return _nativeSDKVersion; +#endif + } + } + + [StructLayout(LayoutKind.Sequential)] + private class GUID + { + public int a; + public short b; + public short c; + public byte d0; + public byte d1; + public byte d2; + public byte d3; + public byte d4; + public byte d5; + public byte d6; + public byte d7; + } + + public enum Bool + { + False = 0, + True + } + + public enum Result + { + /// Success + Success = 0, + + /// Failure + Failure = -1000, + Failure_InvalidParameter = -1001, + Failure_NotInitialized = -1002, + Failure_InvalidOperation = -1003, + Failure_Unsupported = -1004, + Failure_NotYetImplemented = -1005, + Failure_OperationFailed = -1006, + Failure_InsufficientSize = -1007, + } + + public enum CameraStatus + { + CameraStatus_None, + CameraStatus_Connected, + CameraStatus_Calibrating, + CameraStatus_CalibrationFailed, + CameraStatus_Calibrated, + CameraStatus_EnumSize = 0x7fffffff + } + + public enum Eye + { + None = -1, + Left = 0, + Right = 1, + Count = 2 + } + + public enum Tracker + { + None = -1, + Zero = 0, + One = 1, + Two = 2, + Three = 3, + Count, + } + + public enum Node + { + None = -1, + EyeLeft = 0, + EyeRight = 1, + EyeCenter = 2, + HandLeft = 3, + HandRight = 4, + TrackerZero = 5, + TrackerOne = 6, + TrackerTwo = 7, + TrackerThree = 8, + Head = 9, + DeviceObjectZero = 10, + Count, + } + + public enum Controller + { + None = 0, + LTouch = 0x00000001, + RTouch = 0x00000002, + Touch = LTouch | RTouch, + Remote = 0x00000004, + Gamepad = 0x00000010, + LHand = 0x00000020, + RHand = 0x00000040, + Hands = LHand | RHand, + Touchpad = 0x08000000, + LTrackedRemote = 0x01000000, + RTrackedRemote = 0x02000000, + Active = unchecked((int)0x80000000), + All = ~None, + } + + public enum Handedness + { + Unsupported = 0, + LeftHanded = 1, + RightHanded = 2, + } + + public enum TrackingOrigin + { + EyeLevel = 0, + FloorLevel = 1, + Stage = 2, + Count, + } + + public enum RecenterFlags + { + Default = 0, + Controllers = 0x40000000, + IgnoreAll = unchecked((int)0x80000000), + Count, + } + + public enum BatteryStatus + { + Charging = 0, + Discharging, + Full, + NotCharging, + Unknown, + } + + public enum EyeTextureFormat + { + Default = 0, + R8G8B8A8_sRGB = 0, + R8G8B8A8 = 1, + R16G16B16A16_FP = 2, + R11G11B10_FP = 3, + B8G8R8A8_sRGB = 4, + B8G8R8A8 = 5, + R5G6B5 = 11, + EnumSize = 0x7fffffff + } + + public enum PlatformUI + { + None = -1, + ConfirmQuit = 1, + GlobalMenuTutorial, // Deprecated + } + + public enum SystemRegion + { + Unspecified = 0, + Japan, + China, + } + + public enum SystemHeadset + { + None = 0, + GearVR_R320, // Note4 Innovator + GearVR_R321, // S6 Innovator + GearVR_R322, // Commercial 1 + GearVR_R323, // Commercial 2 (USB Type C) + GearVR_R324, // Commercial 3 (USB Type C) + GearVR_R325, // Commercial 4 (USB Type C) + Oculus_Go, + Oculus_Quest, + + Rift_DK1 = 0x1000, + Rift_DK2, + Rift_CV1, + Rift_CB, + Rift_S, + } + + public enum OverlayShape + { + Quad = 0, + Cylinder = 1, + Cubemap = 2, + OffcenterCubemap = 4, + Equirect = 5, + } + + public enum Step + { + Render = -1, + Physics = 0, + } + + public enum CameraDevice + { + None = 0, + WebCamera0 = 100, + WebCamera1 = 101, + ZEDCamera = 300, + } + + public enum CameraDeviceDepthSensingMode + { + Standard = 0, + Fill = 1, + } + + public enum CameraDeviceDepthQuality + { + Low = 0, + Medium = 1, + High = 2, + } + + public enum FixedFoveatedRenderingLevel + { + Off = 0, + Low = 1, + Medium = 2, + High = 3, + // High foveation setting with more detail toward the bottom of the view and more foveation near the top (Same as High on Oculus Go) + HighTop = 4, + EnumSize = 0x7FFFFFFF + } + + [Obsolete("Please use FixedFoveatedRenderingLevel instead", false)] + public enum TiledMultiResLevel + { + Off = 0, + LMSLow = FixedFoveatedRenderingLevel.Low, + LMSMedium = FixedFoveatedRenderingLevel.Medium, + LMSHigh = FixedFoveatedRenderingLevel.High, + // High foveation setting with more detail toward the bottom of the view and more foveation near the top (Same as High on Oculus Go) + LMSHighTop = FixedFoveatedRenderingLevel.HighTop, + EnumSize = 0x7FFFFFFF + } + + public enum PerfMetrics + { + App_CpuTime_Float = 0, + App_GpuTime_Float = 1, + + Compositor_CpuTime_Float = 3, + Compositor_GpuTime_Float = 4, + Compositor_DroppedFrameCount_Int = 5, + + System_GpuUtilPercentage_Float = 7, + System_CpuUtilAveragePercentage_Float = 8, + System_CpuUtilWorstPercentage_Float = 9, + + // 1.32.0 + Device_CpuClockFrequencyInMHz_Float = 10, + Device_GpuClockFrequencyInMHz_Float = 11, + Device_CpuClockLevel_Int = 12, + Device_GpuClockLevel_Int = 13, + + Count, + EnumSize = 0x7FFFFFFF + } + + [StructLayout(LayoutKind.Sequential)] + public struct CameraDeviceIntrinsicsParameters + { + float fx; /* Focal length in pixels along x axis. */ + float fy; /* Focal length in pixels along y axis. */ + float cx; /* Optical center along x axis, defined in pixels (usually close to width/2). */ + float cy; /* Optical center along y axis, defined in pixels (usually close to height/2). */ + double disto0; /* Distortion factor : [ k1, k2, p1, p2, k3 ]. Radial (k1,k2,k3) and Tangential (p1,p2) distortion.*/ + double disto1; + double disto2; + double disto3; + double disto4; + float v_fov; /* Vertical field of view after stereo rectification, in degrees. */ + float h_fov; /* Horizontal field of view after stereo rectification, in degrees.*/ + float d_fov; /* Diagonal field of view after stereo rectification, in degrees.*/ + int w; /* Resolution width */ + int h; /* Resolution height */ + } + + private const int OverlayShapeFlagShift = 4; + private enum OverlayFlag + { + None = unchecked((int)0x00000000), + OnTop = unchecked((int)0x00000001), + HeadLocked = unchecked((int)0x00000002), + NoDepth = unchecked((int)0x00000004), + ExpensiveSuperSample = unchecked((int)0x00000008), + + // Using the 5-8 bits for shapes, total 16 potential shapes can be supported 0x000000[0]0 -> 0x000000[F]0 + ShapeFlag_Quad = unchecked((int)OverlayShape.Quad << OverlayShapeFlagShift), + ShapeFlag_Cylinder = unchecked((int)OverlayShape.Cylinder << OverlayShapeFlagShift), + ShapeFlag_Cubemap = unchecked((int)OverlayShape.Cubemap << OverlayShapeFlagShift), + ShapeFlag_OffcenterCubemap = unchecked((int)OverlayShape.OffcenterCubemap << OverlayShapeFlagShift), + ShapeFlagRangeMask = unchecked((int)0xF << OverlayShapeFlagShift), + + Hidden = unchecked((int)0x000000200), + } + + [StructLayout(LayoutKind.Sequential)] + public struct Vector2f + { + public float x; + public float y; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Vector3f + { + public float x; + public float y; + public float z; + public static readonly Vector3f zero = new Vector3f { x = 0.0f, y = 0.0f, z = 0.0f }; + public override string ToString() + { + return string.Format("{0}, {1}, {2}", x, y, z); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct Vector4f + { + public float x; + public float y; + public float z; + public float w; + public static readonly Vector4f zero = new Vector4f { x = 0.0f, y = 0.0f, z = 0.0f, w = 0.0f }; + public override string ToString() + { + return string.Format("{0}, {1}, {2}, {3}", x, y, z, w); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct Vector4s + { + public short x; + public short y; + public short z; + public short w; + public static readonly Vector4s zero = new Vector4s { x = 0, y = 0, z = 0, w = 0 }; + public override string ToString() + { + return string.Format("{0}, {1}, {2}, {3}", x, y, z, w); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct Quatf + { + public float x; + public float y; + public float z; + public float w; + public static readonly Quatf identity = new Quatf { x = 0.0f, y = 0.0f, z = 0.0f, w = 1.0f }; + public override string ToString() + { + return string.Format("{0}, {1}, {2}, {3}", x, y, z, w); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct Posef + { + public Quatf Orientation; + public Vector3f Position; + public static readonly Posef identity = new Posef { Orientation = Quatf.identity, Position = Vector3f.zero }; + public override string ToString() + { + return string.Format("Position ({0}), Orientation({1})", Position, Orientation); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct TextureRectMatrixf + { + public Rect leftRect; + public Rect rightRect; + public Vector4 leftScaleBias; + public Vector4 rightScaleBias; + public static readonly TextureRectMatrixf zero = new TextureRectMatrixf { leftRect = new Rect(0, 0, 1, 1), rightRect = new Rect(0, 0, 1, 1), leftScaleBias = new Vector4(1, 1, 0, 0), rightScaleBias = new Vector4(1, 1, 0, 0) }; + + public override string ToString() + { + return string.Format("Rect Left ({0}), Rect Right({1}), Scale Bias Left ({2}), Scale Bias Right({3})", leftRect, rightRect, leftScaleBias, rightScaleBias); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct PoseStatef + { + public Posef Pose; + public Vector3f Velocity; + public Vector3f Acceleration; + public Vector3f AngularVelocity; + public Vector3f AngularAcceleration; + public double Time; + + public static readonly PoseStatef identity = new PoseStatef + { + Pose = Posef.identity, + Velocity = Vector3f.zero, + Acceleration = Vector3f.zero, + AngularVelocity = Vector3f.zero, + AngularAcceleration = Vector3f.zero + }; + } + + [StructLayout(LayoutKind.Sequential)] + public struct ControllerState4 + { + public uint ConnectedControllers; + public uint Buttons; + public uint Touches; + public uint NearTouches; + public float LIndexTrigger; + public float RIndexTrigger; + public float LHandTrigger; + public float RHandTrigger; + public Vector2f LThumbstick; + public Vector2f RThumbstick; + public Vector2f LTouchpad; + public Vector2f RTouchpad; + public byte LBatteryPercentRemaining; + public byte RBatteryPercentRemaining; + public byte LRecenterCount; + public byte RRecenterCount; + public byte Reserved_27; + public byte Reserved_26; + public byte Reserved_25; + public byte Reserved_24; + public byte Reserved_23; + public byte Reserved_22; + public byte Reserved_21; + public byte Reserved_20; + public byte Reserved_19; + public byte Reserved_18; + public byte Reserved_17; + public byte Reserved_16; + public byte Reserved_15; + public byte Reserved_14; + public byte Reserved_13; + public byte Reserved_12; + public byte Reserved_11; + public byte Reserved_10; + public byte Reserved_09; + public byte Reserved_08; + public byte Reserved_07; + public byte Reserved_06; + public byte Reserved_05; + public byte Reserved_04; + public byte Reserved_03; + public byte Reserved_02; + public byte Reserved_01; + public byte Reserved_00; + + public ControllerState4(ControllerState2 cs) + { + ConnectedControllers = cs.ConnectedControllers; + Buttons = cs.Buttons; + Touches = cs.Touches; + NearTouches = cs.NearTouches; + LIndexTrigger = cs.LIndexTrigger; + RIndexTrigger = cs.RIndexTrigger; + LHandTrigger = cs.LHandTrigger; + RHandTrigger = cs.RHandTrigger; + LThumbstick = cs.LThumbstick; + RThumbstick = cs.RThumbstick; + LTouchpad = cs.LTouchpad; + RTouchpad = cs.RTouchpad; + LBatteryPercentRemaining = 0; + RBatteryPercentRemaining = 0; + LRecenterCount = 0; + RRecenterCount = 0; + Reserved_27 = 0; + Reserved_26 = 0; + Reserved_25 = 0; + Reserved_24 = 0; + Reserved_23 = 0; + Reserved_22 = 0; + Reserved_21 = 0; + Reserved_20 = 0; + Reserved_19 = 0; + Reserved_18 = 0; + Reserved_17 = 0; + Reserved_16 = 0; + Reserved_15 = 0; + Reserved_14 = 0; + Reserved_13 = 0; + Reserved_12 = 0; + Reserved_11 = 0; + Reserved_10 = 0; + Reserved_09 = 0; + Reserved_08 = 0; + Reserved_07 = 0; + Reserved_06 = 0; + Reserved_05 = 0; + Reserved_04 = 0; + Reserved_03 = 0; + Reserved_02 = 0; + Reserved_01 = 0; + Reserved_00 = 0; + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct ControllerState2 + { + public uint ConnectedControllers; + public uint Buttons; + public uint Touches; + public uint NearTouches; + public float LIndexTrigger; + public float RIndexTrigger; + public float LHandTrigger; + public float RHandTrigger; + public Vector2f LThumbstick; + public Vector2f RThumbstick; + public Vector2f LTouchpad; + public Vector2f RTouchpad; + + public ControllerState2(ControllerState cs) + { + ConnectedControllers = cs.ConnectedControllers; + Buttons = cs.Buttons; + Touches = cs.Touches; + NearTouches = cs.NearTouches; + LIndexTrigger = cs.LIndexTrigger; + RIndexTrigger = cs.RIndexTrigger; + LHandTrigger = cs.LHandTrigger; + RHandTrigger = cs.RHandTrigger; + LThumbstick = cs.LThumbstick; + RThumbstick = cs.RThumbstick; + LTouchpad = new Vector2f() { x = 0.0f, y = 0.0f }; + RTouchpad = new Vector2f() { x = 0.0f, y = 0.0f }; + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct ControllerState + { + public uint ConnectedControllers; + public uint Buttons; + public uint Touches; + public uint NearTouches; + public float LIndexTrigger; + public float RIndexTrigger; + public float LHandTrigger; + public float RHandTrigger; + public Vector2f LThumbstick; + public Vector2f RThumbstick; + } + + [StructLayout(LayoutKind.Sequential)] + public struct HapticsBuffer + { + public IntPtr Samples; + public int SamplesCount; + } + + [StructLayout(LayoutKind.Sequential)] + public struct HapticsState + { + public int SamplesAvailable; + public int SamplesQueued; + } + + [StructLayout(LayoutKind.Sequential)] + public struct HapticsDesc + { + public int SampleRateHz; + public int SampleSizeInBytes; + public int MinimumSafeSamplesQueued; + public int MinimumBufferSamplesCount; + public int OptimalBufferSamplesCount; + public int MaximumBufferSamplesCount; + } + + [StructLayout(LayoutKind.Sequential)] + public struct AppPerfFrameStats + { + public int HmdVsyncIndex; + public int AppFrameIndex; + public int AppDroppedFrameCount; + public float AppMotionToPhotonLatency; + public float AppQueueAheadTime; + public float AppCpuElapsedTime; + public float AppGpuElapsedTime; + public int CompositorFrameIndex; + public int CompositorDroppedFrameCount; + public float CompositorLatency; + public float CompositorCpuElapsedTime; + public float CompositorGpuElapsedTime; + public float CompositorCpuStartToGpuEndElapsedTime; + public float CompositorGpuEndToVsyncElapsedTime; + } + + public const int AppPerfFrameStatsMaxCount = 5; + + [StructLayout(LayoutKind.Sequential)] + public struct AppPerfStats + { + [MarshalAs(UnmanagedType.ByValArray, SizeConst = AppPerfFrameStatsMaxCount)] + public AppPerfFrameStats[] FrameStats; + public int FrameStatsCount; + public Bool AnyFrameStatsDropped; + public float AdaptiveGpuPerformanceScale; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Sizei + { + public int w; + public int h; + + public static readonly Sizei zero = new Sizei { w = 0, h = 0 }; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Sizef + { + public float w; + public float h; + + public static readonly Sizef zero = new Sizef { w = 0, h = 0 }; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Vector2i + { + public int x; + public int y; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Recti { + Vector2i Pos; + Sizei Size; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Rectf { + Vector2f Pos; + Sizef Size; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Frustumf + { + public float zNear; + public float zFar; + public float fovX; + public float fovY; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Frustumf2 + { + public float zNear; + public float zFar; + public Fovf Fov; + } + + public enum BoundaryType + { + OuterBoundary = 0x0001, + PlayArea = 0x0100, + } + + [StructLayout(LayoutKind.Sequential)] + public struct BoundaryTestResult + { + public Bool IsTriggering; + public float ClosestDistance; + public Vector3f ClosestPoint; + public Vector3f ClosestPointNormal; + } + + [StructLayout(LayoutKind.Sequential)] + public struct BoundaryGeometry + { + public BoundaryType BoundaryType; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] + public Vector3f[] Points; + public int PointsCount; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Colorf + { + public float r; + public float g; + public float b; + public float a; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Fovf + { + public float UpTan; + public float DownTan; + public float LeftTan; + public float RightTan; + } + + [StructLayout(LayoutKind.Sequential)] + public struct CameraIntrinsics + { + public Bool IsValid; + public double LastChangedTimeSeconds; + public Fovf FOVPort; + public float VirtualNearPlaneDistanceMeters; + public float VirtualFarPlaneDistanceMeters; + public Sizei ImageSensorPixelResolution; + } + + [StructLayout(LayoutKind.Sequential)] + public struct CameraExtrinsics + { + public Bool IsValid; + public double LastChangedTimeSeconds; + public CameraStatus CameraStatusData; + public Node AttachedToNode; + public Posef RelativePose; + } + + public enum LayerLayout + { + Stereo = 0, + Mono = 1, + DoubleWide = 2, + Array = 3, + EnumSize = 0xF + } + + public enum LayerFlags + { + Static = (1 << 0), + LoadingScreen = (1 << 1), + SymmetricFov = (1 << 2), + TextureOriginAtBottomLeft = (1 << 3), + ChromaticAberrationCorrection = (1 << 4), + NoAllocation = (1 << 5), + ProtectedContent = (1 << 6), + AndroidSurfaceSwapChain = (1 << 7), + } + + [StructLayout(LayoutKind.Sequential)] + public struct LayerDesc + { + public OverlayShape Shape; + public LayerLayout Layout; + public Sizei TextureSize; + public int MipLevels; + public int SampleCount; + public EyeTextureFormat Format; + public int LayerFlags; + + //Eye FOV-only members. + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public Fovf[] Fov; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public Rectf[] VisibleRect; + public Sizei MaxViewportSize; + EyeTextureFormat DepthFormat; + + public override string ToString() + { + string delim = ", "; + return Shape.ToString() + + delim + Layout.ToString() + + delim + TextureSize.w.ToString() + "x" + TextureSize.h.ToString() + + delim + MipLevels.ToString() + + delim + SampleCount.ToString() + + delim + Format.ToString() + + delim + LayerFlags.ToString(); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct LayerSubmit + { + int LayerId; + int TextureStage; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + Recti[] ViewportRect; + Posef Pose; + int LayerSubmitFlags; + } + + public enum TrackingConfidence + { + Low = 0, + High = 0x3f800000, + } + + public enum Hand + { + None = -1, + HandLeft = 0, + HandRight = 1, + } + + [Flags] + public enum HandStatus + { + HandTracked = (1 << 0), // if this is set the hand pose and bone rotations data is usable + InputStateValid = (1 << 1), // if this is set the pointer pose and pinch data is usable + SystemGestureInProgress = (1 << 6), // if this is set the hand is currently processing a system gesture + } + + public enum BoneId + { + Invalid = -1, + + Hand_Start = 0, + Hand_WristRoot = Hand_Start + 0, // root frame of the hand, where the wrist is located + Hand_ForearmStub = Hand_Start + 1, // frame for user's forearm + Hand_Thumb0 = Hand_Start + 2, // thumb trapezium bone + Hand_Thumb1 = Hand_Start + 3, // thumb metacarpal bone + Hand_Thumb2 = Hand_Start + 4, // thumb proximal phalange bone + Hand_Thumb3 = Hand_Start + 5, // thumb distal phalange bone + Hand_Index1 = Hand_Start + 6, // index proximal phalange bone + Hand_Index2 = Hand_Start + 7, // index intermediate phalange bone + Hand_Index3 = Hand_Start + 8, // index distal phalange bone + Hand_Middle1 = Hand_Start + 9, // middle proximal phalange bone + Hand_Middle2 = Hand_Start + 10, // middle intermediate phalange bone + Hand_Middle3 = Hand_Start + 11, // middle distal phalange bone + Hand_Ring1 = Hand_Start + 12, // ring proximal phalange bone + Hand_Ring2 = Hand_Start + 13, // ring intermediate phalange bone + Hand_Ring3 = Hand_Start + 14, // ring distal phalange bone + Hand_Pinky0 = Hand_Start + 15, // pinky metacarpal bone + Hand_Pinky1 = Hand_Start + 16, // pinky proximal phalange bone + Hand_Pinky2 = Hand_Start + 17, // pinky intermediate phalange bone + Hand_Pinky3 = Hand_Start + 18, // pinky distal phalange bone + Hand_MaxSkinnable = Hand_Start + 19, + // Bone tips are position only. They are not used for skinning but are useful for hit-testing. + // NOTE: Hand_ThumbTip == Hand_MaxSkinnable since the extended tips need to be contiguous + Hand_ThumbTip = Hand_Start + Hand_MaxSkinnable + 0, // tip of the thumb + Hand_IndexTip = Hand_Start + Hand_MaxSkinnable + 1, // tip of the index finger + Hand_MiddleTip = Hand_Start + Hand_MaxSkinnable + 2, // tip of the middle finger + Hand_RingTip = Hand_Start + Hand_MaxSkinnable + 3, // tip of the ring finger + Hand_PinkyTip = Hand_Start + Hand_MaxSkinnable + 4, // tip of the pinky + Hand_End = Hand_Start + Hand_MaxSkinnable + 5, + + // add new bones here + + Max = Hand_End + 0, + } + + public enum HandFinger + { + Thumb = 0, + Index = 1, + Middle = 2, + Ring = 3, + Pinky = 4, + Max = 5, + } + + [Flags] + public enum HandFingerPinch + { + Thumb = (1 << HandFinger.Thumb), + Index = (1 << HandFinger.Index), + Middle = (1 << HandFinger.Middle), + Ring = (1 << HandFinger.Ring), + Pinky = (1 << HandFinger.Pinky), + } + + [StructLayout(LayoutKind.Sequential)] + public struct HandState + { + public HandStatus Status; + public Posef RootPose; + public Quatf[] BoneRotations; + public HandFingerPinch Pinches; + public float[] PinchStrength; + public Posef PointerPose; + public float HandScale; + public TrackingConfidence HandConfidence; + public TrackingConfidence[] FingerConfidences; + public double RequestedTimeStamp; + public double SampleTimeStamp; + } + + [StructLayout(LayoutKind.Sequential)] + private struct HandStateInternal + { + public HandStatus Status; + public Posef RootPose; + public Quatf BoneRotations_0; + public Quatf BoneRotations_1; + public Quatf BoneRotations_2; + public Quatf BoneRotations_3; + public Quatf BoneRotations_4; + public Quatf BoneRotations_5; + public Quatf BoneRotations_6; + public Quatf BoneRotations_7; + public Quatf BoneRotations_8; + public Quatf BoneRotations_9; + public Quatf BoneRotations_10; + public Quatf BoneRotations_11; + public Quatf BoneRotations_12; + public Quatf BoneRotations_13; + public Quatf BoneRotations_14; + public Quatf BoneRotations_15; + public Quatf BoneRotations_16; + public Quatf BoneRotations_17; + public Quatf BoneRotations_18; + public Quatf BoneRotations_19; + public Quatf BoneRotations_20; + public Quatf BoneRotations_21; + public Quatf BoneRotations_22; + public Quatf BoneRotations_23; + public HandFingerPinch Pinches; + public float PinchStrength_0; + public float PinchStrength_1; + public float PinchStrength_2; + public float PinchStrength_3; + public float PinchStrength_4; + public Posef PointerPose; + public float HandScale; + public TrackingConfidence HandConfidence; + public TrackingConfidence FingerConfidences_0; + public TrackingConfidence FingerConfidences_1; + public TrackingConfidence FingerConfidences_2; + public TrackingConfidence FingerConfidences_3; + public TrackingConfidence FingerConfidences_4; + public double RequestedTimeStamp; + public double SampleTimeStamp; + } + + [StructLayout(LayoutKind.Sequential)] + public struct BoneCapsule + { + public short BoneIndex; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public Vector3f[] Points; + public float Radius; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Bone + { + public BoneId Id; + public short ParentBoneIndex; + public Posef Pose; + } + + public enum SkeletonConstants + { + MaxBones = BoneId.Max, + MaxBoneCapsules = 19, + } + + public enum SkeletonType + { + None = -1, + HandLeft = 0, + HandRight = 1, + } + + [StructLayout(LayoutKind.Sequential)] + public struct Skeleton + { + public SkeletonType Type; + public uint NumBones; + public uint NumBoneCapsules; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)SkeletonConstants.MaxBones)] + public Bone[] Bones; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)SkeletonConstants.MaxBoneCapsules)] + public BoneCapsule[] BoneCapsules; + } + + public enum MeshConstants + { + MaxVertices = 3000, + MaxIndices = MaxVertices * 6, + } + + public enum MeshType + { + None = -1, + HandLeft = 0, + HandRight = 1, + } + + [StructLayout(LayoutKind.Sequential)] + public struct Mesh + { + public MeshType Type; + public uint NumVertices; + public uint NumIndices; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)MeshConstants.MaxVertices)] + public Vector3f[] VertexPositions; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)MeshConstants.MaxIndices)] + public short[] Indices; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)MeshConstants.MaxVertices)] + public Vector3f[] VertexNormals; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)MeshConstants.MaxVertices)] + public Vector2f[] VertexUV0; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)MeshConstants.MaxVertices)] + public Vector4s[] BlendIndices; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)MeshConstants.MaxVertices)] + public Vector4f[] BlendWeights; + } + + public static bool initialized + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_1_1_0.ovrp_GetInitialized() == OVRPlugin.Bool.True; +#endif + } + } + + public static bool chromatic + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_7_0.version) + return initialized && OVRP_1_7_0.ovrp_GetAppChromaticCorrection() == OVRPlugin.Bool.True; + +#if UNITY_ANDROID && !UNITY_EDITOR + return false; +#else + return true; +#endif +#endif + } + + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + if (initialized && version >= OVRP_1_7_0.version) + OVRP_1_7_0.ovrp_SetAppChromaticCorrection(ToBool(value)); +#endif + } + } + + public static bool monoscopic + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return initialized && OVRP_1_1_0.ovrp_GetAppMonoscopic() == OVRPlugin.Bool.True; +#endif + } + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + if (initialized) + { + OVRP_1_1_0.ovrp_SetAppMonoscopic(ToBool(value)); + } +#endif + } + } + + public static bool rotation + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return initialized && OVRP_1_1_0.ovrp_GetTrackingOrientationEnabled() == Bool.True; +#endif + } + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + if (initialized) + { + OVRP_1_1_0.ovrp_SetTrackingOrientationEnabled(ToBool(value)); + } +#endif + } + } + + public static bool position + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return initialized && OVRP_1_1_0.ovrp_GetTrackingPositionEnabled() == Bool.True; +#endif + } + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + if (initialized) + { + OVRP_1_1_0.ovrp_SetTrackingPositionEnabled(ToBool(value)); + } +#endif + } + } + + public static bool useIPDInPositionTracking + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (initialized && version >= OVRP_1_6_0.version) + return OVRP_1_6_0.ovrp_GetTrackingIPDEnabled() == OVRPlugin.Bool.True; + + return true; +#endif + } + + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + if (initialized && version >= OVRP_1_6_0.version) + OVRP_1_6_0.ovrp_SetTrackingIPDEnabled(ToBool(value)); +#endif + } + } + + public static bool positionSupported + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return initialized && OVRP_1_1_0.ovrp_GetTrackingPositionSupported() == Bool.True; +#endif + } + } + + public static bool positionTracked + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return initialized && OVRP_1_1_0.ovrp_GetNodePositionTracked(Node.EyeCenter) == Bool.True; +#endif + } + } + + public static bool powerSaving + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return initialized && OVRP_1_1_0.ovrp_GetSystemPowerSavingMode() == Bool.True; +#endif + } + } + + public static bool hmdPresent + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return initialized && OVRP_1_1_0.ovrp_GetNodePresent(Node.EyeCenter) == Bool.True; +#endif + } + } + + public static bool userPresent + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return initialized && OVRP_1_1_0.ovrp_GetUserPresent() == Bool.True; +#endif + } + } + + public static bool headphonesPresent + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return initialized && OVRP_1_3_0.ovrp_GetSystemHeadphonesPresent() == OVRPlugin.Bool.True; +#endif + } + } + + public static int recommendedMSAALevel + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 2; +#else + if (initialized && version >= OVRP_1_6_0.version) + return OVRP_1_6_0.ovrp_GetSystemRecommendedMSAALevel(); + else + return 2; +#endif + } + } + + public static SystemRegion systemRegion + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return SystemRegion.Unspecified; +#else + if (initialized && version >= OVRP_1_5_0.version) + return OVRP_1_5_0.ovrp_GetSystemRegion(); + else + return SystemRegion.Unspecified; +#endif + } + } + +#if !OVRPLUGIN_UNSUPPORTED_PLATFORM + private static GUID _nativeAudioOutGuid = new OVRPlugin.GUID(); + private static Guid _cachedAudioOutGuid; + private static string _cachedAudioOutString; +#endif + + public static string audioOutId + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return string.Empty; +#else + try + { + if (_nativeAudioOutGuid == null) + _nativeAudioOutGuid = new OVRPlugin.GUID(); + + IntPtr ptr = OVRP_1_1_0.ovrp_GetAudioOutId(); + if (ptr != IntPtr.Zero) + { + Marshal.PtrToStructure(ptr, _nativeAudioOutGuid); + Guid managedGuid = new Guid( + _nativeAudioOutGuid.a, + _nativeAudioOutGuid.b, + _nativeAudioOutGuid.c, + _nativeAudioOutGuid.d0, + _nativeAudioOutGuid.d1, + _nativeAudioOutGuid.d2, + _nativeAudioOutGuid.d3, + _nativeAudioOutGuid.d4, + _nativeAudioOutGuid.d5, + _nativeAudioOutGuid.d6, + _nativeAudioOutGuid.d7); + + if (managedGuid != _cachedAudioOutGuid) + { + _cachedAudioOutGuid = managedGuid; + _cachedAudioOutString = _cachedAudioOutGuid.ToString(); + } + + return _cachedAudioOutString; + } + } + catch { } + + return string.Empty; +#endif + } + } + +#if !OVRPLUGIN_UNSUPPORTED_PLATFORM + private static GUID _nativeAudioInGuid = new OVRPlugin.GUID(); + private static Guid _cachedAudioInGuid; + private static string _cachedAudioInString; +#endif + + public static string audioInId + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return string.Empty; +#else + try + { + if (_nativeAudioInGuid == null) + _nativeAudioInGuid = new OVRPlugin.GUID(); + + IntPtr ptr = OVRP_1_1_0.ovrp_GetAudioInId(); + if (ptr != IntPtr.Zero) + { + Marshal.PtrToStructure(ptr, _nativeAudioInGuid); + Guid managedGuid = new Guid( + _nativeAudioInGuid.a, + _nativeAudioInGuid.b, + _nativeAudioInGuid.c, + _nativeAudioInGuid.d0, + _nativeAudioInGuid.d1, + _nativeAudioInGuid.d2, + _nativeAudioInGuid.d3, + _nativeAudioInGuid.d4, + _nativeAudioInGuid.d5, + _nativeAudioInGuid.d6, + _nativeAudioInGuid.d7); + + if (managedGuid != _cachedAudioInGuid) + { + _cachedAudioInGuid = managedGuid; + _cachedAudioInString = _cachedAudioInGuid.ToString(); + } + + return _cachedAudioInString; + } + } + catch { } + + return string.Empty; +#endif + } + } + + public static bool hasVrFocus + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_1_1_0.ovrp_GetAppHasVrFocus() == Bool.True; +#endif + } + } + + public static bool hasInputFocus + { + get + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return true; +#else + if (version >= OVRP_1_18_0.version) + { + Bool inputFocus = Bool.False; + Result result = OVRP_1_18_0.ovrp_GetAppHasInputFocus(out inputFocus); + if (Result.Success == result) + return inputFocus == Bool.True; + else + { + //Debug.LogWarning("ovrp_GetAppHasInputFocus return " + result); + return false; + } + } + + return true; +#endif + } + } + + public static bool shouldQuit + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_1_1_0.ovrp_GetAppShouldQuit() == Bool.True; +#endif + } + } + + public static bool shouldRecenter + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_1_1_0.ovrp_GetAppShouldRecenter() == Bool.True; +#endif + } + } + + public static string productName + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return string.Empty; +#else + return OVRP_1_1_0.ovrp_GetSystemProductName(); +#endif + } + } + + public static string latency + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return string.Empty; +#else + if (!initialized) + return string.Empty; + + return OVRP_1_1_0.ovrp_GetAppLatencyTimings(); +#endif + } + } + + public static float eyeDepth + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0f; +#else + if (!initialized) + return 0.0f; + + return OVRP_1_1_0.ovrp_GetUserEyeDepth(); +#endif + } + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + OVRP_1_1_0.ovrp_SetUserEyeDepth(value); +#endif + } + } + + public static float eyeHeight + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0f; +#else + return OVRP_1_1_0.ovrp_GetUserEyeHeight(); +#endif + } + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + OVRP_1_1_0.ovrp_SetUserEyeHeight(value); +#endif + } + } + + public static float batteryLevel + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0f; +#else + return OVRP_1_1_0.ovrp_GetSystemBatteryLevel(); +#endif + } + } + + public static float batteryTemperature + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0f; +#else + return OVRP_1_1_0.ovrp_GetSystemBatteryTemperature(); +#endif + } + } + + public static int cpuLevel + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0; +#else + return OVRP_1_1_0.ovrp_GetSystemCpuLevel(); +#endif + } + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + OVRP_1_1_0.ovrp_SetSystemCpuLevel(value); +#endif + } + } + + public static int gpuLevel + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0; +#else + return OVRP_1_1_0.ovrp_GetSystemGpuLevel(); +#endif + } + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + OVRP_1_1_0.ovrp_SetSystemGpuLevel(value); +#endif + } + } + + public static int vsyncCount + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0; +#else + return OVRP_1_1_0.ovrp_GetSystemVSyncCount(); +#endif + } + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + OVRP_1_2_0.ovrp_SetSystemVSyncCount(value); +#endif + } + } + + public static float systemVolume + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0f; +#else + return OVRP_1_1_0.ovrp_GetSystemVolume(); +#endif + } + } + + public static float ipd + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0f; +#else + return OVRP_1_1_0.ovrp_GetUserIPD(); +#endif + } + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + OVRP_1_1_0.ovrp_SetUserIPD(value); +#endif + } + } + + public static bool occlusionMesh + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return initialized && (OVRP_1_3_0.ovrp_GetEyeOcclusionMeshEnabled() == Bool.True); +#endif + } + set { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + if (!initialized) + return; + + OVRP_1_3_0.ovrp_SetEyeOcclusionMeshEnabled(ToBool(value)); +#endif + } + } + + public static BatteryStatus batteryStatus + { + get { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return default(BatteryStatus); +#else + return OVRP_1_1_0.ovrp_GetSystemBatteryStatus(); +#endif + } + } + + public static Frustumf GetEyeFrustum(Eye eyeId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new Frustumf(); +#else + return OVRP_1_1_0.ovrp_GetNodeFrustum((Node)eyeId); +#endif + } + + public static Sizei GetEyeTextureSize(Eye eyeId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new Sizei(); +#else + return OVRP_0_1_0.ovrp_GetEyeTextureSize(eyeId); +#endif + } + + public static Posef GetTrackerPose(Tracker trackerId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return Posef.identity; +#else + return GetNodePose((Node)((int)trackerId + (int)Node.TrackerZero), Step.Render); +#endif + } + + public static Frustumf GetTrackerFrustum(Tracker trackerId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new Frustumf(); +#else + return OVRP_1_1_0.ovrp_GetNodeFrustum((Node)((int)trackerId + (int)Node.TrackerZero)); +#endif + } + + public static bool ShowUI(PlatformUI ui) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_1_1_0.ovrp_ShowSystemUI(ui) == Bool.True; +#endif + } + + public static bool EnqueueSubmitLayer(bool onTop, bool headLocked, bool noDepthBufferTesting, IntPtr leftTexture, IntPtr rightTexture, int layerId, int frameIndex, Posef pose, Vector3f scale, int layerIndex = 0, OverlayShape shape = OverlayShape.Quad, + bool overrideTextureRectMatrix = false, TextureRectMatrixf textureRectMatrix = default(TextureRectMatrixf), bool overridePerLayerColorScaleAndOffset = false, Vector4 colorScale = default(Vector4), Vector4 colorOffset = default(Vector4), + bool expensiveSuperSample = false, bool hidden = false) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (!initialized) + return false; + + if (version >= OVRP_1_6_0.version) + { + uint flags = (uint)OverlayFlag.None; + if (onTop) + flags |= (uint)OverlayFlag.OnTop; + if (headLocked) + flags |= (uint)OverlayFlag.HeadLocked; + if (noDepthBufferTesting) + flags |= (uint)OverlayFlag.NoDepth; + if (expensiveSuperSample) + flags |= (uint)OverlayFlag.ExpensiveSuperSample; + if (hidden) + flags |= (uint)OverlayFlag.Hidden; + + if (shape == OverlayShape.Cylinder || shape == OverlayShape.Cubemap) + { +#if UNITY_ANDROID + if (version >= OVRP_1_7_0.version) + flags |= (uint)(shape) << OverlayShapeFlagShift; + else +#else + if (shape == OverlayShape.Cubemap && version >= OVRP_1_10_0.version) + flags |= (uint)(shape) << OverlayShapeFlagShift; + else if (shape == OverlayShape.Cylinder && version >= OVRP_1_16_0.version) + flags |= (uint)(shape) << OverlayShapeFlagShift; + else +#endif + return false; + } + + if (shape == OverlayShape.OffcenterCubemap) + { +#if UNITY_ANDROID + if (version >= OVRP_1_11_0.version) + flags |= (uint)(shape) << OverlayShapeFlagShift; + else +#endif + return false; + } + + if (shape == OverlayShape.Equirect) + { +#if UNITY_ANDROID + if (version >= OVRP_1_21_0.version) + flags |= (uint)(shape) << OverlayShapeFlagShift; + else +#endif + return false; + } + + if (version >= OVRP_1_34_0.version && layerId != -1) + return OVRP_1_34_0.ovrp_EnqueueSubmitLayer2(flags, leftTexture, rightTexture, layerId, frameIndex, ref pose, ref scale, layerIndex, + overrideTextureRectMatrix ? Bool.True : Bool.False, ref textureRectMatrix, overridePerLayerColorScaleAndOffset ? Bool.True : Bool.False, ref colorScale, ref colorOffset) == Result.Success; + else if (version >= OVRP_1_15_0.version && layerId != -1) + return OVRP_1_15_0.ovrp_EnqueueSubmitLayer(flags, leftTexture, rightTexture, layerId, frameIndex, ref pose, ref scale, layerIndex) == Result.Success; + + return OVRP_1_6_0.ovrp_SetOverlayQuad3(flags, leftTexture, rightTexture, IntPtr.Zero, pose, scale, layerIndex) == Bool.True; + } + + if (layerIndex != 0) + return false; + + return OVRP_0_1_1.ovrp_SetOverlayQuad2(ToBool(onTop), ToBool(headLocked), leftTexture, IntPtr.Zero, pose, scale) == Bool.True; +#endif + } + + public static LayerDesc CalculateLayerDesc(OverlayShape shape, LayerLayout layout, Sizei textureSize, + int mipLevels, int sampleCount, EyeTextureFormat format, int layerFlags) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new LayerDesc(); +#else + LayerDesc layerDesc = new LayerDesc(); + if (!initialized) + return layerDesc; + + if (version >= OVRP_1_15_0.version) + { + OVRP_1_15_0.ovrp_CalculateLayerDesc(shape, layout, ref textureSize, + mipLevels, sampleCount, format, layerFlags, ref layerDesc); + } + + return layerDesc; +#endif + } + + public static bool EnqueueSetupLayer(LayerDesc desc, int compositionDepth, IntPtr layerID) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (!initialized) + return false; + + if (version >= OVRP_1_28_0.version) + return OVRP_1_28_0.ovrp_EnqueueSetupLayer2(ref desc, compositionDepth, layerID) == Result.Success; + else if (version >= OVRP_1_15_0.version) + { + if (compositionDepth != 0) + { + Debug.LogWarning("Use Oculus Plugin 1.28.0 or above to support non-zero compositionDepth"); + } + return OVRP_1_15_0.ovrp_EnqueueSetupLayer(ref desc, layerID) == Result.Success; + } + + return false; +#endif + } + + public static bool EnqueueDestroyLayer(IntPtr layerID) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (!initialized) + return false; + if (version >= OVRP_1_15_0.version) + return OVRP_1_15_0.ovrp_EnqueueDestroyLayer(layerID) == Result.Success; + + return false; +#endif + } + + public static IntPtr GetLayerTexture(int layerId, int stage, Eye eyeId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return IntPtr.Zero; +#else + IntPtr textureHandle = IntPtr.Zero; + if (!initialized) + return textureHandle; + + if (version >= OVRP_1_15_0.version) + OVRP_1_15_0.ovrp_GetLayerTexturePtr(layerId, stage, eyeId, ref textureHandle); + + return textureHandle; +#endif + } + + public static int GetLayerTextureStageCount(int layerId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 1; +#else + if (!initialized) + return 1; + + int stageCount = 1; + + if (version >= OVRP_1_15_0.version) + OVRP_1_15_0.ovrp_GetLayerTextureStageCount(layerId, ref stageCount); + + return stageCount; +#endif + } + + public static IntPtr GetLayerAndroidSurfaceObject(int layerId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return IntPtr.Zero; +#else + IntPtr surfaceObject = IntPtr.Zero; + if (!initialized) + return surfaceObject; + + if (version >= OVRP_1_29_0.version) + OVRP_1_29_0.ovrp_GetLayerAndroidSurfaceObject(layerId, ref surfaceObject); + + return surfaceObject; +#endif + } + + public static bool UpdateNodePhysicsPoses(int frameIndex, double predictionSeconds) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_8_0.version) + return OVRP_1_8_0.ovrp_Update2((int)Step.Physics, frameIndex, predictionSeconds) == Bool.True; + + return false; +#endif + } + + public static Posef GetNodePose(Node nodeId, Step stepId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return Posef.identity; +#else + if (version >= OVRP_1_12_0.version) + return OVRP_1_12_0.ovrp_GetNodePoseState(stepId, nodeId).Pose; + + if (version >= OVRP_1_8_0.version && stepId == Step.Physics) + return OVRP_1_8_0.ovrp_GetNodePose2(0, nodeId); + + return OVRP_0_1_2.ovrp_GetNodePose(nodeId); +#endif + } + + public static Vector3f GetNodeVelocity(Node nodeId, Step stepId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new Vector3f(); +#else + if (version >= OVRP_1_12_0.version) + return OVRP_1_12_0.ovrp_GetNodePoseState(stepId, nodeId).Velocity; + + if (version >= OVRP_1_8_0.version && stepId == Step.Physics) + return OVRP_1_8_0.ovrp_GetNodeVelocity2(0, nodeId).Position; + + return OVRP_0_1_3.ovrp_GetNodeVelocity(nodeId).Position; +#endif + } + + public static Vector3f GetNodeAngularVelocity(Node nodeId, Step stepId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new Vector3f(); +#else + if (version >= OVRP_1_12_0.version) + return OVRP_1_12_0.ovrp_GetNodePoseState(stepId, nodeId).AngularVelocity; + + return new Vector3f(); //TODO: Convert legacy quat to vec3? +#endif + } + + public static Vector3f GetNodeAcceleration(Node nodeId, Step stepId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new Vector3f(); +#else + if (version >= OVRP_1_12_0.version) + return OVRP_1_12_0.ovrp_GetNodePoseState(stepId, nodeId).Acceleration; + + if (version >= OVRP_1_8_0.version && stepId == Step.Physics) + return OVRP_1_8_0.ovrp_GetNodeAcceleration2(0, nodeId).Position; + + return OVRP_0_1_3.ovrp_GetNodeAcceleration(nodeId).Position; +#endif + } + + public static Vector3f GetNodeAngularAcceleration(Node nodeId, Step stepId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new Vector3f(); +#else + if (version >= OVRP_1_12_0.version) + return OVRP_1_12_0.ovrp_GetNodePoseState(stepId, nodeId).AngularAcceleration; + + return new Vector3f(); //TODO: Convert legacy quat to vec3? +#endif + } + + public static bool GetNodePresent(Node nodeId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_1_1_0.ovrp_GetNodePresent(nodeId) == Bool.True; +#endif + } + + public static bool GetNodeOrientationTracked(Node nodeId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_1_1_0.ovrp_GetNodeOrientationTracked(nodeId) == Bool.True; +#endif + } + + public static bool GetNodeOrientationValid(Node nodeId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + Bool orientationValid = Bool.False; + Result result = OVRP_1_38_0.ovrp_GetNodeOrientationValid(nodeId, ref orientationValid); + return result == Result.Success && orientationValid == Bool.True; + } + else + { + return GetNodeOrientationTracked(nodeId); + } +#endif + + } + + public static bool GetNodePositionTracked(Node nodeId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_1_1_0.ovrp_GetNodePositionTracked(nodeId) == Bool.True; +#endif + } + + public static bool GetNodePositionValid(Node nodeId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + Bool positionValid = Bool.False; + Result result = OVRP_1_38_0.ovrp_GetNodePositionValid(nodeId, ref positionValid); + return result == Result.Success && positionValid == Bool.True; + } + else + { + return GetNodePositionTracked(nodeId); + } +#endif + } + + public static PoseStatef GetNodePoseStateRaw(Node nodeId, Step stepId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return PoseStatef.identity; +#else + if (version >= OVRP_1_29_0.version) + { + PoseStatef nodePoseState; + Result result = OVRP_1_29_0.ovrp_GetNodePoseStateRaw(stepId, -1, nodeId, out nodePoseState); + if (result == Result.Success) + { + return nodePoseState; + } + else + { + return PoseStatef.identity; + } + } + if (version >= OVRP_1_12_0.version) + return OVRP_1_12_0.ovrp_GetNodePoseState(stepId, nodeId); + else + return PoseStatef.identity; +#endif + } + + public static Posef GetCurrentTrackingTransformPose() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return Posef.identity; +#else + if (version >= OVRP_1_30_0.version) + { + Posef trackingTransformPose; + Result result = OVRP_1_30_0.ovrp_GetCurrentTrackingTransformPose(out trackingTransformPose); + if (result == Result.Success) + { + return trackingTransformPose; + } + else + { + return Posef.identity; + } + } + else + { + return Posef.identity; + } +#endif + } + + public static Posef GetTrackingTransformRawPose() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return Posef.identity; +#else + if (version >= OVRP_1_30_0.version) + { + Posef trackingTransforRawPose; + Result result = OVRP_1_30_0.ovrp_GetTrackingTransformRawPose(out trackingTransforRawPose); + if (result == Result.Success) + { + return trackingTransforRawPose; + } + else + { + return Posef.identity; + } + } + else + { + return Posef.identity; + } +#endif + } + + public static Posef GetTrackingTransformRelativePose(TrackingOrigin trackingOrigin) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return Posef.identity; +#else + if (version >= OVRP_1_38_0.version) + { + Posef trackingTransformRelativePose = Posef.identity; + Result result = OVRP_1_38_0.ovrp_GetTrackingTransformRelativePose(ref trackingTransformRelativePose, trackingOrigin); + if (result == Result.Success) + { + return trackingTransformRelativePose; + } + else + { + return Posef.identity; + } + } + else + { + return Posef.identity; + } +#endif + } + + public static ControllerState GetControllerState(uint controllerMask) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new ControllerState(); +#else + return OVRP_1_1_0.ovrp_GetControllerState(controllerMask); +#endif + } + + public static ControllerState2 GetControllerState2(uint controllerMask) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new ControllerState2(); +#else + if (version >= OVRP_1_12_0.version) + { + return OVRP_1_12_0.ovrp_GetControllerState2(controllerMask); + } + + return new ControllerState2(OVRP_1_1_0.ovrp_GetControllerState(controllerMask)); +#endif + } + + public static ControllerState4 GetControllerState4(uint controllerMask) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new ControllerState4(); +#else + if (version >= OVRP_1_16_0.version) + { + ControllerState4 controllerState = new ControllerState4(); + OVRP_1_16_0.ovrp_GetControllerState4(controllerMask, ref controllerState); + return controllerState; + } + + return new ControllerState4(GetControllerState2(controllerMask)); +#endif + } + + public static bool SetControllerVibration(uint controllerMask, float frequency, float amplitude) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_0_1_2.ovrp_SetControllerVibration(controllerMask, frequency, amplitude) == Bool.True; +#endif + } + + public static HapticsDesc GetControllerHapticsDesc(uint controllerMask) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new HapticsDesc(); +#else + if (version >= OVRP_1_6_0.version) + { + return OVRP_1_6_0.ovrp_GetControllerHapticsDesc(controllerMask); + } + else + { + return new HapticsDesc(); + } +#endif + } + + public static HapticsState GetControllerHapticsState(uint controllerMask) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new HapticsState(); +#else + if (version >= OVRP_1_6_0.version) + { + return OVRP_1_6_0.ovrp_GetControllerHapticsState(controllerMask); + } + else + { + return new HapticsState(); + } +#endif + } + + public static bool SetControllerHaptics(uint controllerMask, HapticsBuffer hapticsBuffer) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_6_0.version) + { + return OVRP_1_6_0.ovrp_SetControllerHaptics(controllerMask, hapticsBuffer) == Bool.True; + } + else + { + return false; + } +#endif + } + + public static float GetEyeRecommendedResolutionScale() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 1.0f; +#else + if (version >= OVRP_1_6_0.version) + { + return OVRP_1_6_0.ovrp_GetEyeRecommendedResolutionScale(); + } + else + { + return 1.0f; + } +#endif + } + + public static float GetAppCpuStartToGpuEndTime() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0f; +#else + if (version >= OVRP_1_6_0.version) + { + return OVRP_1_6_0.ovrp_GetAppCpuStartToGpuEndTime(); + } + else + { + return 0.0f; + } +#endif + } + + public static bool GetBoundaryConfigured() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_8_0.version) + { + return OVRP_1_8_0.ovrp_GetBoundaryConfigured() == OVRPlugin.Bool.True; + } + else + { + return false; + } +#endif + } + + public static BoundaryTestResult TestBoundaryNode(Node nodeId, BoundaryType boundaryType) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new BoundaryTestResult(); +#else + if (version >= OVRP_1_8_0.version) + { + return OVRP_1_8_0.ovrp_TestBoundaryNode(nodeId, boundaryType); + } + else + { + return new BoundaryTestResult(); + } +#endif + } + + public static BoundaryTestResult TestBoundaryPoint(Vector3f point, BoundaryType boundaryType) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new BoundaryTestResult(); +#else + if (version >= OVRP_1_8_0.version) + { + return OVRP_1_8_0.ovrp_TestBoundaryPoint(point, boundaryType); + } + else + { + return new BoundaryTestResult(); + } +#endif + } + + public static BoundaryGeometry GetBoundaryGeometry(BoundaryType boundaryType) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new BoundaryGeometry(); +#else + if (version >= OVRP_1_8_0.version) + { + return OVRP_1_8_0.ovrp_GetBoundaryGeometry(boundaryType); + } + else + { + return new BoundaryGeometry(); + } +#endif + } + + public static bool GetBoundaryGeometry2(BoundaryType boundaryType, IntPtr points, ref int pointsCount) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + pointsCount = 0; + return false; +#else + if (version >= OVRP_1_9_0.version) + { + return OVRP_1_9_0.ovrp_GetBoundaryGeometry2(boundaryType, points, ref pointsCount) == OVRPlugin.Bool.True; + } + else + { + pointsCount = 0; + + return false; + } +#endif + } + + public static AppPerfStats GetAppPerfStats() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new AppPerfStats(); +#else + if (version >= OVRP_1_9_0.version) + { + return OVRP_1_9_0.ovrp_GetAppPerfStats(); + } + else + { + return new AppPerfStats(); + } +#endif + } + + public static bool ResetAppPerfStats() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + + if (version >= OVRP_1_9_0.version) + { + return OVRP_1_9_0.ovrp_ResetAppPerfStats() == OVRPlugin.Bool.True; + } + else + { + return false; + } +#endif + } + + public static float GetAppFramerate() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0f; +#else + if (version >= OVRP_1_12_0.version) + { + return OVRP_1_12_0.ovrp_GetAppFramerate(); + } + else + { + return 0.0f; + } +#endif + } + + public static bool SetHandNodePoseStateLatency(double latencyInSeconds) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_18_0.version) + { + Result result = OVRP_1_18_0.ovrp_SetHandNodePoseStateLatency(latencyInSeconds); + if (result == Result.Success) + { + return true; + } + else + { + //Debug.LogWarning("ovrp_SetHandNodePoseStateLatency return " + result); + return false; + } + } + else + { + return false; + } +#endif + } + + public static double GetHandNodePoseStateLatency() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0; +#else + if (version >= OVRP_1_18_0.version) + { + double value = 0.0; + if (OVRP_1_18_0.ovrp_GetHandNodePoseStateLatency(out value) == OVRPlugin.Result.Success) + { + return value; + } + else + { + return 0.0; + } + } + else + { + return 0.0; + } +#endif + } + + public static EyeTextureFormat GetDesiredEyeTextureFormat() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return EyeTextureFormat.Default; +#else + if (version >= OVRP_1_11_0.version) + { + uint eyeTextureFormatValue = (uint)OVRP_1_11_0.ovrp_GetDesiredEyeTextureFormat(); + + // convert both R8G8B8A8 and R8G8B8A8_SRGB to R8G8B8A8 here for avoid confusing developers + if (eyeTextureFormatValue == 1) + eyeTextureFormatValue = 0; + + return (EyeTextureFormat)eyeTextureFormatValue; + } + else + { + return EyeTextureFormat.Default; + } +#endif + } + + public static bool SetDesiredEyeTextureFormat(EyeTextureFormat value) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_11_0.version) + { + return OVRP_1_11_0.ovrp_SetDesiredEyeTextureFormat(value) == OVRPlugin.Bool.True; + } + else + { + return false; + } +#endif + } + + public static bool InitializeMixedReality() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + +#if OVRPLUGIN_INCLUDE_MRC_ANDROID + if (version >= OVRP_1_38_0.version) // MRC functions are invalid before 1.38.0 +#else + if (version >= OVRP_1_15_0.version) +#endif + { + Result result = OVRP_1_15_0.ovrp_InitializeMixedReality(); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_InitializeMixedReality return " + result); + } + return result == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool ShutdownMixedReality() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + +#if OVRPLUGIN_INCLUDE_MRC_ANDROID + if (version >= OVRP_1_38_0.version) // MRC functions are invalid before 1.38.0 +#else + if (version >= OVRP_1_15_0.version) +#endif + { + Result result = OVRP_1_15_0.ovrp_ShutdownMixedReality(); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_ShutdownMixedReality return " + result); + } + return result == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool IsMixedRealityInitialized() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + +#if OVRPLUGIN_INCLUDE_MRC_ANDROID + if (version >= OVRP_1_38_0.version) // MRC functions are invalid before 1.38.0 +#else + if (version >= OVRP_1_15_0.version) +#endif + { + return OVRP_1_15_0.ovrp_GetMixedRealityInitialized() == Bool.True; + } + else + { + return false; + } +#endif + } + + public static int GetExternalCameraCount() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0; +#else + +#if OVRPLUGIN_INCLUDE_MRC_ANDROID + if (version >= OVRP_1_38_0.version) // MRC functions are invalid before 1.38.0 +#else + if (version >= OVRP_1_15_0.version) +#endif + { + int cameraCount = 0; + Result result = OVRP_1_15_0.ovrp_GetExternalCameraCount(out cameraCount); + if (result != OVRPlugin.Result.Success) + { + //Debug.LogWarning("ovrp_GetExternalCameraCount return " + result); + return 0; + } + + return cameraCount; + } + else + { + return 0; + } +#endif + } + + public static bool UpdateExternalCamera() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + +#if OVRPLUGIN_INCLUDE_MRC_ANDROID + if (version >= OVRP_1_38_0.version) // MRC functions are invalid before 1.38.0 +#else + if (version >= OVRP_1_15_0.version) +#endif + { + Result result = OVRP_1_15_0.ovrp_UpdateExternalCamera(); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_UpdateExternalCamera return " + result); + } + return result == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool GetMixedRealityCameraInfo(int cameraId, out CameraExtrinsics cameraExtrinsics, out CameraIntrinsics cameraIntrinsics, out Posef calibrationRawPose) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + cameraExtrinsics = default(CameraExtrinsics); + cameraIntrinsics = default(CameraIntrinsics); + calibrationRawPose = Posef.identity; + return false; +#else + + cameraExtrinsics = default(CameraExtrinsics); + cameraIntrinsics = default(CameraIntrinsics); + calibrationRawPose = Posef.identity; + +#if OVRPLUGIN_INCLUDE_MRC_ANDROID + if (version >= OVRP_1_38_0.version) // MRC functions are invalid before 1.38.0 +#else + if (version >= OVRP_1_15_0.version) +#endif + { + bool retValue = true; + + Result result = OVRP_1_15_0.ovrp_GetExternalCameraExtrinsics(cameraId, out cameraExtrinsics); + if (result != Result.Success) + { + retValue = false; + //Debug.LogWarning("ovrp_GetExternalCameraExtrinsics return " + result); + } + + result = OVRP_1_15_0.ovrp_GetExternalCameraIntrinsics(cameraId, out cameraIntrinsics); + if (result != Result.Success) + { + retValue = false; + //Debug.LogWarning("ovrp_GetExternalCameraIntrinsics return " + result); + } + +#if OVRPLUGIN_INCLUDE_MRC_ANDROID + result = OVRP_1_38_0.ovrp_GetExternalCameraCalibrationRawPose(cameraId, out calibrationRawPose); + if (result != Result.Success) + { + retValue = false; + //Debug.LogWarning("ovrp_GetExternalCameraCalibrationRawPose return " + result); + } +#endif + + return retValue; + } + else + { + return false; + } +#endif + } + + public static bool OverrideExternalCameraFov(int cameraId, bool useOverriddenFov, Fovf fov) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_44_0.version) + { + bool retValue = true; + Result result = OVRP_1_44_0.ovrp_OverrideExternalCameraFov(cameraId, useOverriddenFov ? Bool.True : Bool.False, ref fov); + if (result != Result.Success) + { + retValue = false; + } + return retValue; + } + else + { + return false; + } +#endif + } + + + public static bool GetUseOverriddenExternalCameraFov(int cameraId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_44_0.version) + { + bool retValue = true; + Bool useOverriddenFov = Bool.False; + Result result = OVRP_1_44_0.ovrp_GetUseOverriddenExternalCameraFov(cameraId, out useOverriddenFov); + if (result != Result.Success) + { + retValue = false; + } + if (useOverriddenFov == Bool.False) + { + retValue = false; + } + return retValue; + } + else + { + return false; + } +#endif + } + + public static bool OverrideExternalCameraStaticPose(int cameraId, bool useOverriddenPose, Posef pose) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_44_0.version) + { + bool retValue = true; + Result result = OVRP_1_44_0.ovrp_OverrideExternalCameraStaticPose(cameraId, useOverriddenPose ? Bool.True : Bool.False, ref pose); + if (result != Result.Success) + { + retValue = false; + } + return retValue; + } + else + { + return false; + } +#endif + } + + public static bool GetUseOverriddenExternalCameraStaticPose(int cameraId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_44_0.version) + { + bool retValue = true; + Bool useOverriddenStaticPose = Bool.False; + Result result = OVRP_1_44_0.ovrp_GetUseOverriddenExternalCameraStaticPose(cameraId, out useOverriddenStaticPose); + if (result != Result.Success) + { + retValue = false; + } + if (useOverriddenStaticPose == Bool.False) + { + retValue = false; + } + return retValue; + } + else + { + return false; + } +#endif + } + + public static bool ResetDefaultExternalCamera() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_44_0.version) + { + Result result = OVRP_1_44_0.ovrp_ResetDefaultExternalCamera(); + if (result != Result.Success) + { + return false; + } + return true; + } + else + { + return false; + } +#endif + } + + public static bool SetDefaultExternalCamera(string cameraName, ref CameraIntrinsics cameraIntrinsics, ref CameraExtrinsics cameraExtrinsics) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_44_0.version) + { + Result result = OVRP_1_44_0.ovrp_SetDefaultExternalCamera(cameraName, ref cameraIntrinsics, ref cameraExtrinsics); + if (result != Result.Success) + { + return false; + } + return true; + } + else + { + return false; + } +#endif + } + + public static Vector3f GetBoundaryDimensions(BoundaryType boundaryType) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new Vector3f(); +#else + if (version >= OVRP_1_8_0.version) + { + return OVRP_1_8_0.ovrp_GetBoundaryDimensions(boundaryType); + } + else + { + return new Vector3f(); + } +#endif + } + + public static bool GetBoundaryVisible() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_8_0.version) + { + return OVRP_1_8_0.ovrp_GetBoundaryVisible() == OVRPlugin.Bool.True; + } + else + { + return false; + } +#endif + } + + public static bool SetBoundaryVisible(bool value) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_8_0.version) + { + return OVRP_1_8_0.ovrp_SetBoundaryVisible(ToBool(value)) == OVRPlugin.Bool.True; + } + else + { + return false; + } +#endif + } + + public static SystemHeadset GetSystemHeadsetType() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return SystemHeadset.None; +#else + if (version >= OVRP_1_9_0.version) + return OVRP_1_9_0.ovrp_GetSystemHeadsetType(); + + return SystemHeadset.None; +#endif + } + + public static Controller GetActiveController() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return Controller.None; +#else + if (version >= OVRP_1_9_0.version) + return OVRP_1_9_0.ovrp_GetActiveController(); + + return Controller.None; +#endif + } + + public static Controller GetConnectedControllers() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return Controller.None; +#else + if (version >= OVRP_1_9_0.version) + return OVRP_1_9_0.ovrp_GetConnectedControllers(); + + return Controller.None; +#endif + } + + private static Bool ToBool(bool b) + { + return (b) ? OVRPlugin.Bool.True : OVRPlugin.Bool.False; + } + + public static TrackingOrigin GetTrackingOriginType() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return default(TrackingOrigin); +#else + return OVRP_1_0_0.ovrp_GetTrackingOriginType(); +#endif + } + + public static bool SetTrackingOriginType(TrackingOrigin originType) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_1_0_0.ovrp_SetTrackingOriginType(originType) == Bool.True; +#endif + } + + public static Posef GetTrackingCalibratedOrigin() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return Posef.identity; +#else + return OVRP_1_0_0.ovrp_GetTrackingCalibratedOrigin(); +#endif + } + + public static bool SetTrackingCalibratedOrigin() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_1_2_0.ovrpi_SetTrackingCalibratedOrigin() == Bool.True; +#endif + } + + public static bool RecenterTrackingOrigin(RecenterFlags flags) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + return OVRP_1_0_0.ovrp_RecenterTrackingOrigin((uint)flags) == Bool.True; +#endif + } + +#if UNITY_EDITOR || UNITY_STANDALONE_WIN + public static bool UpdateCameraDevices() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_16_0.version) + { + Result result = OVRP_1_16_0.ovrp_UpdateCameraDevices(); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_UpdateCameraDevices return " + result); + } + return result == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool IsCameraDeviceAvailable(CameraDevice cameraDevice) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_16_0.version) + { + Bool result = OVRP_1_16_0.ovrp_IsCameraDeviceAvailable(cameraDevice); + return result == Bool.True; + } + else + { + return false; + } +#endif + } + + public static bool SetCameraDevicePreferredColorFrameSize(CameraDevice cameraDevice, int width, int height) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_16_0.version) + { + Sizei size = new Sizei(); + size.w = width; + size.h = height; + Result result = OVRP_1_16_0.ovrp_SetCameraDevicePreferredColorFrameSize(cameraDevice, size); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_SetCameraDevicePreferredColorFrameSize return " + result); + } + return result == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool OpenCameraDevice(CameraDevice cameraDevice) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_16_0.version) + { + Result result = OVRP_1_16_0.ovrp_OpenCameraDevice(cameraDevice); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_OpenCameraDevice return " + result); + } + return result == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool CloseCameraDevice(CameraDevice cameraDevice) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_16_0.version) + { + Result result = OVRP_1_16_0.ovrp_CloseCameraDevice(cameraDevice); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_OpenCameraDevice return " + result); + } + return result == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool HasCameraDeviceOpened(CameraDevice cameraDevice) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_16_0.version) + { + Bool result = OVRP_1_16_0.ovrp_HasCameraDeviceOpened(cameraDevice); + return result == Bool.True; + } + else + { + return false; + } +#endif + } + + public static bool IsCameraDeviceColorFrameAvailable(CameraDevice cameraDevice) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_16_0.version) + { + Bool result = OVRP_1_16_0.ovrp_IsCameraDeviceColorFrameAvailable(cameraDevice); + return result == Bool.True; + } + else + { + return false; + } +#endif + } + +#if !OVRPLUGIN_UNSUPPORTED_PLATFORM + private static Texture2D cachedCameraFrameTexture = null; +#endif + public static Texture2D GetCameraDeviceColorFrameTexture(CameraDevice cameraDevice) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return null; +#else + if (version >= OVRP_1_16_0.version) + { + Sizei size = new Sizei(); + Result result = OVRP_1_16_0.ovrp_GetCameraDeviceColorFrameSize(cameraDevice, out size); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_GetCameraDeviceColorFrameSize return " + result); + return null; + } + IntPtr pixels; + int rowPitch; + result = OVRP_1_16_0.ovrp_GetCameraDeviceColorFrameBgraPixels(cameraDevice, out pixels, out rowPitch); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_GetCameraDeviceColorFrameBgraPixels return " + result); + return null; + } + if (rowPitch != size.w * 4) + { + //Debug.LogWarning(string.Format("RowPitch mismatch, expected {0}, get {1}", size.w * 4, rowPitch)); + return null; + } + if (!cachedCameraFrameTexture || cachedCameraFrameTexture.width != size.w || cachedCameraFrameTexture.height != size.h) + { + cachedCameraFrameTexture = new Texture2D(size.w, size.h, TextureFormat.BGRA32, false); + } + cachedCameraFrameTexture.LoadRawTextureData(pixels, rowPitch * size.h); + cachedCameraFrameTexture.Apply(); + return cachedCameraFrameTexture; + } + else + { + return null; + } +#endif + } + + public static bool DoesCameraDeviceSupportDepth(CameraDevice cameraDevice) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_17_0.version) + { + Bool supportDepth; + Result result = OVRP_1_17_0.ovrp_DoesCameraDeviceSupportDepth(cameraDevice, out supportDepth); + return result == Result.Success && supportDepth == Bool.True; + } + else + { + return false; + } +#endif + } + + public static bool SetCameraDeviceDepthSensingMode(CameraDevice camera, CameraDeviceDepthSensingMode depthSensoringMode) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_17_0.version) + { + Result result = OVRP_1_17_0.ovrp_SetCameraDeviceDepthSensingMode(camera, depthSensoringMode); + return result == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool SetCameraDevicePreferredDepthQuality(CameraDevice camera, CameraDeviceDepthQuality depthQuality) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_17_0.version) + { + Result result = OVRP_1_17_0.ovrp_SetCameraDevicePreferredDepthQuality(camera, depthQuality); + return result == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool IsCameraDeviceDepthFrameAvailable(CameraDevice cameraDevice) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_17_0.version) + { + Bool available; + Result result = OVRP_1_17_0.ovrp_IsCameraDeviceDepthFrameAvailable(cameraDevice, out available); + return result == Result.Success && available == Bool.True; + } + else + { + return false; + } +#endif + } + +#if !OVRPLUGIN_UNSUPPORTED_PLATFORM + private static Texture2D cachedCameraDepthTexture = null; +#endif + public static Texture2D GetCameraDeviceDepthFrameTexture(CameraDevice cameraDevice) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return null; +#else + if (version >= OVRP_1_17_0.version) + { + Sizei size = new Sizei(); + Result result = OVRP_1_17_0.ovrp_GetCameraDeviceDepthFrameSize(cameraDevice, out size); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_GetCameraDeviceDepthFrameSize return " + result); + return null; + } + IntPtr depthData; + int rowPitch; + result = OVRP_1_17_0.ovrp_GetCameraDeviceDepthFramePixels(cameraDevice, out depthData, out rowPitch); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_GetCameraDeviceDepthFramePixels return " + result); + return null; + } + if (rowPitch != size.w * 4) + { + //Debug.LogWarning(string.Format("RowPitch mismatch, expected {0}, get {1}", size.w * 4, rowPitch)); + return null; + } + if (!cachedCameraDepthTexture || cachedCameraDepthTexture.width != size.w || cachedCameraDepthTexture.height != size.h) + { + cachedCameraDepthTexture = new Texture2D(size.w, size.h, TextureFormat.RFloat, false); + cachedCameraDepthTexture.filterMode = FilterMode.Point; + } + cachedCameraDepthTexture.LoadRawTextureData(depthData, rowPitch * size.h); + cachedCameraDepthTexture.Apply(); + return cachedCameraDepthTexture; + } + else + { + return null; + } +#endif + } + +#if !OVRPLUGIN_UNSUPPORTED_PLATFORM + private static Texture2D cachedCameraDepthConfidenceTexture = null; +#endif + public static Texture2D GetCameraDeviceDepthConfidenceTexture(CameraDevice cameraDevice) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return null; +#else + if (version >= OVRP_1_17_0.version) + { + Sizei size = new Sizei(); + Result result = OVRP_1_17_0.ovrp_GetCameraDeviceDepthFrameSize(cameraDevice, out size); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_GetCameraDeviceDepthFrameSize return " + result); + return null; + } + IntPtr confidenceData; + int rowPitch; + result = OVRP_1_17_0.ovrp_GetCameraDeviceDepthConfidencePixels(cameraDevice, out confidenceData, out rowPitch); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_GetCameraDeviceDepthConfidencePixels return " + result); + return null; + } + if (rowPitch != size.w * 4) + { + //Debug.LogWarning(string.Format("RowPitch mismatch, expected {0}, get {1}", size.w * 4, rowPitch)); + return null; + } + if (!cachedCameraDepthConfidenceTexture || cachedCameraDepthConfidenceTexture.width != size.w || cachedCameraDepthConfidenceTexture.height != size.h) + { + cachedCameraDepthConfidenceTexture = new Texture2D(size.w, size.h, TextureFormat.RFloat, false); + } + cachedCameraDepthConfidenceTexture.LoadRawTextureData(confidenceData, rowPitch * size.h); + cachedCameraDepthConfidenceTexture.Apply(); + return cachedCameraDepthConfidenceTexture; + } + else + { + return null; + } +#endif + } +#endif + + public static bool fixedFoveatedRenderingSupported + { + get + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_21_0.version) + { + Bool supported; + Result result = OVRP_1_21_0.ovrp_GetTiledMultiResSupported(out supported); + if (result == Result.Success) + { + return supported == Bool.True; + } + else + { + //Debug.LogWarning("ovrp_GetTiledMultiResSupported return " + result); + return false; + } + } + else + { + return false; + } +#endif + } + } + + public static FixedFoveatedRenderingLevel fixedFoveatedRenderingLevel + { + get + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return FixedFoveatedRenderingLevel.Off; +#else + if (version >= OVRP_1_21_0.version && fixedFoveatedRenderingSupported) + { + FixedFoveatedRenderingLevel level; + Result result = OVRP_1_21_0.ovrp_GetTiledMultiResLevel(out level); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_GetTiledMultiResLevel return " + result); + } + return level; + } + else + { + return FixedFoveatedRenderingLevel.Off; + } +#endif + } + set + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + if (version >= OVRP_1_21_0.version && fixedFoveatedRenderingSupported) + { + Result result = OVRP_1_21_0.ovrp_SetTiledMultiResLevel(value); + if (result != Result.Success) + { + //Debug.LogWarning("ovrp_SetTiledMultiResLevel return " + result); + } + } +#endif + } + } + + [Obsolete("Please use fixedFoveatedRenderingSupported instead", false)] + public static bool tiledMultiResSupported + { + get + { + return fixedFoveatedRenderingSupported; + } + } + + [Obsolete("Please use fixedFoveatedRenderingLevel instead", false)] + public static TiledMultiResLevel tiledMultiResLevel + { + get + { + return (TiledMultiResLevel)fixedFoveatedRenderingLevel; + } + set + { + fixedFoveatedRenderingLevel = (FixedFoveatedRenderingLevel)value; + } + } + + public static bool gpuUtilSupported + { + get + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_21_0.version) + { + Bool supported; + Result result = OVRP_1_21_0.ovrp_GetGPUUtilSupported(out supported); + if (result == Result.Success) + { + return supported == Bool.True; + } + else + { + //Debug.LogWarning("ovrp_GetGPUUtilSupported return " + result); + return false; + } + } + else + { + return false; + } +#endif + } + } + + public static float gpuUtilLevel + { + get + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0f; +#else + if (version >= OVRP_1_21_0.version && gpuUtilSupported) + { + float level; + Result result = OVRP_1_21_0.ovrp_GetGPUUtilLevel(out level); + if (result == Result.Success) + { + return level; + } + else + { + //Debug.LogWarning("ovrp_GetGPUUtilLevel return " + result); + return 0.0f; + } + } + else + { + return 0.0f; + } +#endif + } + } + +#if !OVRPLUGIN_UNSUPPORTED_PLATFORM + private static OVRNativeBuffer _nativeSystemDisplayFrequenciesAvailable = null; + private static float[] _cachedSystemDisplayFrequenciesAvailable = null; +#endif + + public static float[] systemDisplayFrequenciesAvailable + { + get + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return new float[0]; +#else + if (_cachedSystemDisplayFrequenciesAvailable == null) + { + _cachedSystemDisplayFrequenciesAvailable = new float[0]; + + if (version >= OVRP_1_21_0.version) + { + int numFrequencies = 0; + Result result = OVRP_1_21_0.ovrp_GetSystemDisplayAvailableFrequencies(IntPtr.Zero, ref numFrequencies); + if (result == Result.Success) + { + if (numFrequencies > 0) + { + int maxNumElements = numFrequencies; + _nativeSystemDisplayFrequenciesAvailable = new OVRNativeBuffer(sizeof(float) * maxNumElements); + result = OVRP_1_21_0.ovrp_GetSystemDisplayAvailableFrequencies(_nativeSystemDisplayFrequenciesAvailable.GetPointer(), ref numFrequencies); + if (result == Result.Success) + { + int numElementsToCopy = (numFrequencies <= maxNumElements) ? numFrequencies : maxNumElements; + if (numElementsToCopy > 0) + { + _cachedSystemDisplayFrequenciesAvailable = new float[numElementsToCopy]; + Marshal.Copy(_nativeSystemDisplayFrequenciesAvailable.GetPointer(), _cachedSystemDisplayFrequenciesAvailable, 0, numElementsToCopy); + } + } + } + } + } + } + + return _cachedSystemDisplayFrequenciesAvailable; +#endif + } + } + + public static float systemDisplayFrequency + { + get + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0f; +#else + if (version >= OVRP_1_21_0.version) + { + float displayFrequency; + Result result = OVRP_1_21_0.ovrp_GetSystemDisplayFrequency2(out displayFrequency); + if (result == Result.Success) + { + return displayFrequency; + } + + return 0.0f; + } + else if (version >= OVRP_1_1_0.version) + { + return OVRP_1_1_0.ovrp_GetSystemDisplayFrequency(); + } + else + { + return 0.0f; + } +#endif + } + set + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return; +#else + if (version >= OVRP_1_21_0.version) + { + OVRP_1_21_0.ovrp_SetSystemDisplayFrequency(value); + } +#endif + } + } + + public static bool GetNodeFrustum2(Node nodeId, out Frustumf2 frustum) + { + frustum = default(Frustumf2); + +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_15_0.version) + { + Result result = OVRP_1_15_0.ovrp_GetNodeFrustum2(nodeId, out frustum); + if (result != Result.Success) + { + return false; + } + else + { + return true; + } + } + else + { + return false; + } +#endif + } + + public static bool AsymmetricFovEnabled + { + get + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_21_0.version) + { + Bool asymmetricFovEnabled = Bool.False; + Result result = OVRP_1_21_0.ovrp_GetAppAsymmetricFov(out asymmetricFovEnabled); + + if (result != Result.Success) + { + return false; + } + else + { + return asymmetricFovEnabled == Bool.True; + } + } + else + { + return false; + } +#endif + } + } + + public static bool EyeTextureArrayEnabled + { + get + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_15_0.version) + { + Bool enabled = Bool.False; + enabled = OVRP_1_15_0.ovrp_GetEyeTextureArrayEnabled(); + return enabled == Bool.True; + } + else + { + return false; + } +#endif + } + } + + + public static Handedness GetDominantHand() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return Handedness.Unsupported; +#else + Handedness dominantHand; + + if (version >= OVRP_1_28_0.version && OVRP_1_28_0.ovrp_GetDominantHand(out dominantHand) == Result.Success) + { + return dominantHand; + } + + return Handedness.Unsupported; +#endif + } + + public static bool GetReorientHMDOnControllerRecenter() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + Bool recenterMode; + if (version < OVRP_1_28_0.version || OVRP_1_28_0.ovrp_GetReorientHMDOnControllerRecenter(out recenterMode) != Result.Success) + return false; + + return (recenterMode == Bool.True); +#endif + } + + public static bool SetReorientHMDOnControllerRecenter(bool recenterSetting) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + Bool ovrpBoolRecenterSetting = recenterSetting ? Bool.True : Bool.False; + if (version < OVRP_1_28_0.version || OVRP_1_28_0.ovrp_SetReorientHMDOnControllerRecenter(ovrpBoolRecenterSetting) != Result.Success) + return false; + + return true; +#endif + } + + public static bool SendEvent(string name, string param = "", string source = "") + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_30_0.version) + { + return OVRP_1_30_0.ovrp_SendEvent2(name, param, source.Length == 0 ? "integration": source) == Result.Success; + } + else if (version >= OVRP_1_28_0.version) + { + return OVRP_1_28_0.ovrp_SendEvent(name, param) == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool SetHeadPoseModifier(ref Quatf relativeRotation, ref Vector3f relativeTranslation) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_29_0.version) + { + return OVRP_1_29_0.ovrp_SetHeadPoseModifier(ref relativeRotation, ref relativeTranslation) == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool GetHeadPoseModifier(out Quatf relativeRotation, out Vector3f relativeTranslation) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + relativeRotation = Quatf.identity; + relativeTranslation = Vector3f.zero; + return false; +#else + if (version >= OVRP_1_29_0.version) + { + return OVRP_1_29_0.ovrp_GetHeadPoseModifier(out relativeRotation, out relativeTranslation) == Result.Success; + } + else + { + relativeRotation = Quatf.identity; + relativeTranslation = Vector3f.zero; + return false; + } +#endif + } + + public static bool IsPerfMetricsSupported(PerfMetrics perfMetrics) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_30_0.version) + { + Bool isSupported; + Result result = OVRP_1_30_0.ovrp_IsPerfMetricsSupported(perfMetrics, out isSupported); + if (result == Result.Success) + { + return isSupported == Bool.True; + } + else + { + return false; + } + } + else + { + return false; + } +#endif + } + + public static float? GetPerfMetricsFloat(PerfMetrics perfMetrics) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return null; +#else + if (version >= OVRP_1_30_0.version) + { + float value; + Result result = OVRP_1_30_0.ovrp_GetPerfMetricsFloat(perfMetrics, out value); + if (result == Result.Success) + { + return value; + } + else + { + return null; + } + } + else + { + return null; + } +#endif + } + + public static int? GetPerfMetricsInt(PerfMetrics perfMetrics) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return null; +#else + if (version >= OVRP_1_30_0.version) + { + int value; + Result result = OVRP_1_30_0.ovrp_GetPerfMetricsInt(perfMetrics, out value); + if (result == Result.Success) + { + return value; + } + else + { + return null; + } + } + else + { + return null; + } +#endif + } + + public static double GetTimeInSeconds() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0.0; +#else + if (version >= OVRP_1_31_0.version) + { + double value; + Result result = OVRP_1_31_0.ovrp_GetTimeInSeconds(out value); + if (result == Result.Success) + { + return value; + } + else + { + return 0.0; + } + } + else + { + return 0.0; + } +#endif + } + + public static bool SetColorScaleAndOffset(Vector4 colorScale, Vector4 colorOffset, bool applyToAllLayers) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else +#if USING_XR_SDK + OculusXRPlugin.SetColorScale(colorScale.x, colorScale.y, colorScale.z, colorScale.w); + OculusXRPlugin.SetColorOffset(colorOffset.x, colorOffset.y, colorOffset.z, colorOffset.w); + return true; +#else + if (version >= OVRP_1_31_0.version) + { + Bool ovrpApplyToAllLayers = applyToAllLayers ? Bool.True : Bool.False; + return OVRP_1_31_0.ovrp_SetColorScaleAndOffset(colorScale, colorOffset, ovrpApplyToAllLayers) == Result.Success; + } + else + { + return false; + } +#endif +#endif + } + + public static bool AddCustomMetadata(string name, string param = "") + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_32_0.version) + { + return OVRP_1_32_0.ovrp_AddCustomMetadata(name, param) == Result.Success; + } + else + { + return false; + } +#endif + } + + public class Media + { + public enum MrcActivationMode + { + Automatic = 0, + Disabled = 1, + EnumSize = 0x7fffffff + } + + public enum InputVideoBufferType + { + Memory = 0, + TextureHandle = 1, + EnumSize = 0x7fffffff + } + + public static bool Initialize() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + return OVRP_1_38_0.ovrp_Media_Initialize() == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool Shutdown() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + return OVRP_1_38_0.ovrp_Media_Shutdown() == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool GetInitialized() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + Bool initialized = Bool.False; + Result result = OVRP_1_38_0.ovrp_Media_GetInitialized(out initialized); + if (result == Result.Success) + { + return initialized == Bool.True ? true : false; + } + else + { + return false; + } + } + else + { + return false; + } +#endif + } + + public static bool Update() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + return OVRP_1_38_0.ovrp_Media_Update() == Result.Success; + } + else + { + return false; + } +#endif + } + + public static MrcActivationMode GetMrcActivationMode() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return MrcActivationMode.Disabled; +#else + if (version >= OVRP_1_38_0.version) + { + MrcActivationMode mode; + if (OVRP_1_38_0.ovrp_Media_GetMrcActivationMode(out mode) == Result.Success) + { + return mode; + } + else + { + return default(MrcActivationMode); + } + } + else + { + return default(MrcActivationMode); + } +#endif + } + + public static bool SetMrcActivationMode(MrcActivationMode mode) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + return OVRP_1_38_0.ovrp_Media_SetMrcActivationMode(mode) == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool IsMrcEnabled() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + Bool b; + if (OVRP_1_38_0.ovrp_Media_IsMrcEnabled(out b) == Result.Success) + { + return b == Bool.True ? true : false; + } + else + { + return false; + } + } + else + { + return false; + } +#endif + } + + public static bool IsMrcActivated() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + Bool b; + if (OVRP_1_38_0.ovrp_Media_IsMrcActivated(out b) == Result.Success) + { + return b == Bool.True ? true : false; + } + else + { + return false; + } + } + else + { + return false; + } +#endif + } + + public static bool UseMrcDebugCamera() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + Bool b; + if (OVRP_1_38_0.ovrp_Media_UseMrcDebugCamera(out b) == Result.Success) + { + return b == Bool.True ? true : false; + } + else + { + return false; + } + } + else + { + return false; + } +#endif + } + + public static bool SetMrcInputVideoBufferType(InputVideoBufferType videoBufferType) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + if (OVRP_1_38_0.ovrp_Media_SetMrcInputVideoBufferType(videoBufferType) == Result.Success) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } +#endif + } + + public static InputVideoBufferType GetMrcInputVideoBufferType() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return InputVideoBufferType.Memory; +#else + if (version >= OVRP_1_38_0.version) + { + InputVideoBufferType videoBufferType = InputVideoBufferType.Memory; + OVRP_1_38_0.ovrp_Media_GetMrcInputVideoBufferType(ref videoBufferType); + return videoBufferType; + } + else + { + return InputVideoBufferType.Memory; + } +#endif + } + + public static bool SetMrcFrameSize(int frameWidth, int frameHeight) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + if (OVRP_1_38_0.ovrp_Media_SetMrcFrameSize(frameWidth, frameHeight) == Result.Success) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } +#endif + } + + public static void GetMrcFrameSize(out int frameWidth, out int frameHeight) + { + + frameWidth = -1; + frameHeight = -1; +#if !OVRPLUGIN_UNSUPPORTED_PLATFORM + if (version >= OVRP_1_38_0.version) + { + OVRP_1_38_0.ovrp_Media_GetMrcFrameSize(ref frameWidth, ref frameHeight); + } +#endif + } + + + public static bool SetMrcAudioSampleRate(int sampleRate) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + if (OVRP_1_38_0.ovrp_Media_SetMrcAudioSampleRate(sampleRate) == Result.Success) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } +#endif + } + + public static int GetMrcAudioSampleRate() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 0; +#else + int sampleRate = 0; + if (version >= OVRP_1_38_0.version) + { + OVRP_1_38_0.ovrp_Media_GetMrcAudioSampleRate(ref sampleRate); + } + return sampleRate; +#endif + } + + public static bool SetMrcFrameImageFlipped(bool imageFlipped) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + Bool flipped = imageFlipped ? Bool.True : Bool.False; + if (OVRP_1_38_0.ovrp_Media_SetMrcFrameImageFlipped(flipped) == Result.Success) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } +#endif + } + + public static bool GetMrcFrameImageFlipped() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + Bool flipped = 0; + if (version >= OVRP_1_38_0.version) + { + OVRP_1_38_0.ovrp_Media_GetMrcFrameImageFlipped(ref flipped); + } + return flipped == Bool.True ? true : false; +#endif + } + + public static bool EncodeMrcFrame(System.IntPtr textureHandle, float[] audioData, int audioFrames, int audioChannels, double timestamp, ref int outSyncId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + if (textureHandle == System.IntPtr.Zero) + { + Debug.LogError("EncodeMrcFrame: textureHandle is null"); + return false; + } + InputVideoBufferType videoBufferType = GetMrcInputVideoBufferType(); + if (videoBufferType != InputVideoBufferType.TextureHandle) + { + Debug.LogError("EncodeMrcFrame: videoBufferType mismatch"); + return false; + } + GCHandle pinnedAudioData = new GCHandle(); + IntPtr audioDataPtr = IntPtr.Zero; + int audioDataLen = 0; + if (audioData != null) + { + pinnedAudioData = GCHandle.Alloc(audioData, GCHandleType.Pinned); + audioDataPtr = pinnedAudioData.AddrOfPinnedObject(); + audioDataLen = audioFrames * 4; + } + Result result = OVRP_1_38_0.ovrp_Media_EncodeMrcFrame(textureHandle, audioDataPtr, audioDataLen, audioChannels, timestamp, ref outSyncId); + if (audioData != null) + { + pinnedAudioData.Free(); + } + return result == Result.Success; + } + else + { + return false; + } +#endif + } + +#if !OVRPLUGIN_UNSUPPORTED_PLATFORM + static Texture2D cachedTexture = null; +#endif + public static bool EncodeMrcFrame(RenderTexture frame, float[] audioData, int audioFrames, int audioChannels, double timestamp, ref int outSyncId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + if (frame == null) + { + Debug.LogError("EncodeMrcFrame: frame is null"); + return false; + } + InputVideoBufferType videoBufferType = GetMrcInputVideoBufferType(); + if (videoBufferType != InputVideoBufferType.Memory) + { + Debug.LogError("EncodeMrcFrame: videoBufferType mismatch"); + return false; + } + + GCHandle pinnedArray = new GCHandle(); + IntPtr pointer = IntPtr.Zero; + if (cachedTexture == null || cachedTexture.width != frame.width || cachedTexture.height != frame.height) + { + cachedTexture = new Texture2D(frame.width, frame.height, TextureFormat.ARGB32, false); + } + RenderTexture lastActive = RenderTexture.active; + RenderTexture.active = frame; + cachedTexture.ReadPixels(new Rect(0, 0, frame.width, frame.height), 0, 0); + RenderTexture.active = lastActive; + Color32[] bytes = cachedTexture.GetPixels32(0); + pinnedArray = GCHandle.Alloc(bytes, GCHandleType.Pinned); + pointer = pinnedArray.AddrOfPinnedObject(); + + GCHandle pinnedAudioData = new GCHandle(); + IntPtr audioDataPtr = IntPtr.Zero; + int audioDataLen = 0; + if (audioData != null) + { + pinnedAudioData = GCHandle.Alloc(audioData, GCHandleType.Pinned); + audioDataPtr = pinnedAudioData.AddrOfPinnedObject(); + audioDataLen = audioFrames * 4; + } + Result result = OVRP_1_38_0.ovrp_Media_EncodeMrcFrame(pointer, audioDataPtr, audioDataLen, audioChannels, timestamp, ref outSyncId); + + pinnedArray.Free(); + if (audioData != null) + { + pinnedAudioData.Free(); + } + return result == Result.Success; + } + else + { + return false; + } +#endif + } + + public static bool SyncMrcFrame(int syncId) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_38_0.version) + { + return OVRP_1_38_0.ovrp_Media_SyncMrcFrame(syncId) == Result.Success; + } + else + { + return false; + } +#endif + } + + } + + public static bool SetDeveloperMode(Bool active) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if(version >= OVRP_1_38_0.version) + { + return OVRP_1_38_0.ovrp_SetDeveloperMode(active) == Result.Success; + } + else + { + return false; + } +#endif + } + + public static float GetAdaptiveGPUPerformanceScale() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return 1.0f; +#else + if (version >= OVRP_1_42_0.version) + { + float adaptiveScale = 1.0f; + if (OVRP_1_42_0.ovrp_GetAdaptiveGpuPerformanceScale2(ref adaptiveScale) == Result.Success) + { + return adaptiveScale; + } + return 1.0f; + } + else + { + return 1.0f; + } +#endif + } + + public static bool GetHandTrackingEnabled() + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_44_0.version) + { + Bool val = OVRPlugin.Bool.False; + Result res = OVRP_1_44_0.ovrp_GetHandTrackingEnabled(ref val); + if (res == Result.Success) + { + return val == OVRPlugin.Bool.True; + } + + return false; + } + else + { + return false; + } +#endif + } + + private static HandStateInternal cachedHandState = new HandStateInternal(); + public static bool GetHandState(Step stepId, Hand hand, ref HandState handState) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + return false; +#else + if (version >= OVRP_1_44_0.version) + { + Result res = OVRP_1_44_0.ovrp_GetHandState(stepId, hand, out cachedHandState); + if (res == Result.Success) + { + // attempt to avoid allocations if client provides appropriately pre-initialized HandState + if (handState.BoneRotations == null || handState.BoneRotations.Length != ((int)BoneId.Hand_End - (int)BoneId.Hand_Start)) + { + handState.BoneRotations = new Quatf[(int)BoneId.Hand_End - (int)BoneId.Hand_Start]; + } + if (handState.PinchStrength == null || handState.PinchStrength.Length != (int)HandFinger.Max) + { + handState.PinchStrength = new float[(int)HandFinger.Max]; + } + if (handState.FingerConfidences == null || handState.FingerConfidences.Length != (int)HandFinger.Max) + { + handState.FingerConfidences = new TrackingConfidence[(int)HandFinger.Max]; + } + + // unrolling the arrays is necessary to avoid per-frame allocations during marshaling + handState.Status = cachedHandState.Status; + handState.RootPose = cachedHandState.RootPose; + handState.BoneRotations[0] = cachedHandState.BoneRotations_0; + handState.BoneRotations[1] = cachedHandState.BoneRotations_1; + handState.BoneRotations[2] = cachedHandState.BoneRotations_2; + handState.BoneRotations[3] = cachedHandState.BoneRotations_3; + handState.BoneRotations[4] = cachedHandState.BoneRotations_4; + handState.BoneRotations[5] = cachedHandState.BoneRotations_5; + handState.BoneRotations[6] = cachedHandState.BoneRotations_6; + handState.BoneRotations[7] = cachedHandState.BoneRotations_7; + handState.BoneRotations[8] = cachedHandState.BoneRotations_8; + handState.BoneRotations[9] = cachedHandState.BoneRotations_9; + handState.BoneRotations[10] = cachedHandState.BoneRotations_10; + handState.BoneRotations[11] = cachedHandState.BoneRotations_11; + handState.BoneRotations[12] = cachedHandState.BoneRotations_12; + handState.BoneRotations[13] = cachedHandState.BoneRotations_13; + handState.BoneRotations[14] = cachedHandState.BoneRotations_14; + handState.BoneRotations[15] = cachedHandState.BoneRotations_15; + handState.BoneRotations[16] = cachedHandState.BoneRotations_16; + handState.BoneRotations[17] = cachedHandState.BoneRotations_17; + handState.BoneRotations[18] = cachedHandState.BoneRotations_18; + handState.BoneRotations[19] = cachedHandState.BoneRotations_19; + handState.BoneRotations[20] = cachedHandState.BoneRotations_20; + handState.BoneRotations[21] = cachedHandState.BoneRotations_21; + handState.BoneRotations[22] = cachedHandState.BoneRotations_22; + handState.BoneRotations[23] = cachedHandState.BoneRotations_23; + handState.Pinches = cachedHandState.Pinches; + handState.PinchStrength[0] = cachedHandState.PinchStrength_0; + handState.PinchStrength[1] = cachedHandState.PinchStrength_1; + handState.PinchStrength[2] = cachedHandState.PinchStrength_2; + handState.PinchStrength[3] = cachedHandState.PinchStrength_3; + handState.PinchStrength[4] = cachedHandState.PinchStrength_4; + handState.PointerPose = cachedHandState.PointerPose; + handState.HandScale = cachedHandState.HandScale; + handState.HandConfidence = cachedHandState.HandConfidence; + handState.FingerConfidences[0] = cachedHandState.FingerConfidences_0; + handState.FingerConfidences[1] = cachedHandState.FingerConfidences_1; + handState.FingerConfidences[2] = cachedHandState.FingerConfidences_2; + handState.FingerConfidences[3] = cachedHandState.FingerConfidences_3; + handState.FingerConfidences[4] = cachedHandState.FingerConfidences_4; + handState.RequestedTimeStamp = cachedHandState.RequestedTimeStamp; + handState.SampleTimeStamp = cachedHandState.SampleTimeStamp; + + return true; + } + else + { + return false; + } + } + else + { + return false; + } +#endif + } + + public static bool GetSkeleton(SkeletonType skeletonType, out Skeleton skeleton) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + skeleton = default(Skeleton); + return false; +#else + if (version >= OVRP_1_44_0.version) + { + return OVRP_1_44_0.ovrp_GetSkeleton(skeletonType, out skeleton) == Result.Success; + } + else + { + skeleton = default(Skeleton); + return false; + } +#endif + } + + public static bool GetMesh(MeshType meshType, out Mesh mesh) + { +#if OVRPLUGIN_UNSUPPORTED_PLATFORM + mesh = default(Mesh); + return false; +#else + if (version >= OVRP_1_44_0.version) + { + return OVRP_1_44_0.ovrp_GetMesh(meshType, out mesh) == Result.Success; + } + else + { + mesh = default(Mesh); + return false; + } +#endif + } + + private const string pluginName = "OVRPlugin"; + private static System.Version _versionZero = new System.Version(0, 0, 0); + + // Disable all the DllImports when the platform is not supported +#if !OVRPLUGIN_UNSUPPORTED_PLATFORM + + private static class OVRP_0_1_0 + { + public static readonly System.Version version = new System.Version(0, 1, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Sizei ovrp_GetEyeTextureSize(Eye eyeId); + } + + private static class OVRP_0_1_1 + { + public static readonly System.Version version = new System.Version(0, 1, 1); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetOverlayQuad2(Bool onTop, Bool headLocked, IntPtr texture, IntPtr device, Posef pose, Vector3f scale); + } + + private static class OVRP_0_1_2 + { + public static readonly System.Version version = new System.Version(0, 1, 2); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Posef ovrp_GetNodePose(Node nodeId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetControllerVibration(uint controllerMask, float frequency, float amplitude); + } + + private static class OVRP_0_1_3 + { + public static readonly System.Version version = new System.Version(0, 1, 3); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Posef ovrp_GetNodeVelocity(Node nodeId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Posef ovrp_GetNodeAcceleration(Node nodeId); + } + + private static class OVRP_0_5_0 + { + public static readonly System.Version version = new System.Version(0, 5, 0); + } + + private static class OVRP_1_0_0 + { + public static readonly System.Version version = new System.Version(1, 0, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern TrackingOrigin ovrp_GetTrackingOriginType(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetTrackingOriginType(TrackingOrigin originType); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Posef ovrp_GetTrackingCalibratedOrigin(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_RecenterTrackingOrigin(uint flags); + } + + private static class OVRP_1_1_0 + { + public static readonly System.Version version = new System.Version(1, 1, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetInitialized(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl, EntryPoint = "ovrp_GetVersion")] + private static extern IntPtr _ovrp_GetVersion(); + public static string ovrp_GetVersion() { return Marshal.PtrToStringAnsi(_ovrp_GetVersion()); } + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl, EntryPoint = "ovrp_GetNativeSDKVersion")] + private static extern IntPtr _ovrp_GetNativeSDKVersion(); + public static string ovrp_GetNativeSDKVersion() { return Marshal.PtrToStringAnsi(_ovrp_GetNativeSDKVersion()); } + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr ovrp_GetAudioOutId(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr ovrp_GetAudioInId(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern float ovrp_GetEyeTextureScale(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetEyeTextureScale(float value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetTrackingOrientationSupported(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetTrackingOrientationEnabled(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetTrackingOrientationEnabled(Bool value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetTrackingPositionSupported(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetTrackingPositionEnabled(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetTrackingPositionEnabled(Bool value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetNodePresent(Node nodeId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetNodeOrientationTracked(Node nodeId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetNodePositionTracked(Node nodeId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Frustumf ovrp_GetNodeFrustum(Node nodeId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern ControllerState ovrp_GetControllerState(uint controllerMask); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern int ovrp_GetSystemCpuLevel(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetSystemCpuLevel(int value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern int ovrp_GetSystemGpuLevel(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetSystemGpuLevel(int value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetSystemPowerSavingMode(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern float ovrp_GetSystemDisplayFrequency(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern int ovrp_GetSystemVSyncCount(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern float ovrp_GetSystemVolume(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern BatteryStatus ovrp_GetSystemBatteryStatus(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern float ovrp_GetSystemBatteryLevel(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern float ovrp_GetSystemBatteryTemperature(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl, EntryPoint = "ovrp_GetSystemProductName")] + private static extern IntPtr _ovrp_GetSystemProductName(); + public static string ovrp_GetSystemProductName() { return Marshal.PtrToStringAnsi(_ovrp_GetSystemProductName()); } + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_ShowSystemUI(PlatformUI ui); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetAppMonoscopic(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetAppMonoscopic(Bool value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetAppHasVrFocus(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetAppShouldQuit(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetAppShouldRecenter(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl, EntryPoint = "ovrp_GetAppLatencyTimings")] + private static extern IntPtr _ovrp_GetAppLatencyTimings(); + public static string ovrp_GetAppLatencyTimings() { return Marshal.PtrToStringAnsi(_ovrp_GetAppLatencyTimings()); } + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetUserPresent(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern float ovrp_GetUserIPD(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetUserIPD(float value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern float ovrp_GetUserEyeDepth(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetUserEyeDepth(float value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern float ovrp_GetUserEyeHeight(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetUserEyeHeight(float value); + } + + private static class OVRP_1_2_0 + { + public static readonly System.Version version = new System.Version(1, 2, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetSystemVSyncCount(int vsyncCount); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrpi_SetTrackingCalibratedOrigin(); + } + + private static class OVRP_1_3_0 + { + public static readonly System.Version version = new System.Version(1, 3, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetEyeOcclusionMeshEnabled(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetEyeOcclusionMeshEnabled(Bool value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetSystemHeadphonesPresent(); + } + + private static class OVRP_1_5_0 + { + public static readonly System.Version version = new System.Version(1, 5, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern SystemRegion ovrp_GetSystemRegion(); + } + + private static class OVRP_1_6_0 + { + public static readonly System.Version version = new System.Version(1, 6, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetTrackingIPDEnabled(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetTrackingIPDEnabled(Bool value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern HapticsDesc ovrp_GetControllerHapticsDesc(uint controllerMask); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern HapticsState ovrp_GetControllerHapticsState(uint controllerMask); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetControllerHaptics(uint controllerMask, HapticsBuffer hapticsBuffer); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetOverlayQuad3(uint flags, IntPtr textureLeft, IntPtr textureRight, IntPtr device, Posef pose, Vector3f scale, int layerIndex); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern float ovrp_GetEyeRecommendedResolutionScale(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern float ovrp_GetAppCpuStartToGpuEndTime(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern int ovrp_GetSystemRecommendedMSAALevel(); + } + + private static class OVRP_1_7_0 + { + public static readonly System.Version version = new System.Version(1, 7, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetAppChromaticCorrection(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetAppChromaticCorrection(Bool value); + } + + private static class OVRP_1_8_0 + { + public static readonly System.Version version = new System.Version(1, 8, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetBoundaryConfigured(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern BoundaryTestResult ovrp_TestBoundaryNode(Node nodeId, BoundaryType boundaryType); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern BoundaryTestResult ovrp_TestBoundaryPoint(Vector3f point, BoundaryType boundaryType); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern BoundaryGeometry ovrp_GetBoundaryGeometry(BoundaryType boundaryType); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Vector3f ovrp_GetBoundaryDimensions(BoundaryType boundaryType); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetBoundaryVisible(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetBoundaryVisible(Bool value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_Update2(int stateId, int frameIndex, double predictionSeconds); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Posef ovrp_GetNodePose2(int stateId, Node nodeId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Posef ovrp_GetNodeVelocity2(int stateId, Node nodeId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Posef ovrp_GetNodeAcceleration2(int stateId, Node nodeId); + } + + private static class OVRP_1_9_0 + { + public static readonly System.Version version = new System.Version(1, 9, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern SystemHeadset ovrp_GetSystemHeadsetType(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Controller ovrp_GetActiveController(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Controller ovrp_GetConnectedControllers(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetBoundaryGeometry2(BoundaryType boundaryType, IntPtr points, ref int pointsCount); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern AppPerfStats ovrp_GetAppPerfStats(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_ResetAppPerfStats(); + } + + private static class OVRP_1_10_0 + { + public static readonly System.Version version = new System.Version(1, 10, 0); + } + + private static class OVRP_1_11_0 + { + public static readonly System.Version version = new System.Version(1, 11, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_SetDesiredEyeTextureFormat(EyeTextureFormat value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern EyeTextureFormat ovrp_GetDesiredEyeTextureFormat(); + } + + private static class OVRP_1_12_0 + { + public static readonly System.Version version = new System.Version(1, 12, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern float ovrp_GetAppFramerate(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern PoseStatef ovrp_GetNodePoseState(Step stepId, Node nodeId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern ControllerState2 ovrp_GetControllerState2(uint controllerMask); + } + + private static class OVRP_1_15_0 + { + public static readonly System.Version version = new System.Version(1, 15, 0); + + public const int OVRP_EXTERNAL_CAMERA_NAME_SIZE = 32; + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_InitializeMixedReality(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_ShutdownMixedReality(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetMixedRealityInitialized(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_UpdateExternalCamera(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetExternalCameraCount(out int cameraCount); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetExternalCameraName(int cameraId, [MarshalAs(UnmanagedType.LPArray, SizeConst = OVRP_EXTERNAL_CAMERA_NAME_SIZE)] char[] cameraName); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetExternalCameraIntrinsics(int cameraId, out CameraIntrinsics cameraIntrinsics); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetExternalCameraExtrinsics(int cameraId, out CameraExtrinsics cameraExtrinsics); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_CalculateLayerDesc(OverlayShape shape, LayerLayout layout, ref Sizei textureSize, + int mipLevels, int sampleCount, EyeTextureFormat format, int layerFlags, ref LayerDesc layerDesc); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_EnqueueSetupLayer(ref LayerDesc desc, IntPtr layerId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_EnqueueDestroyLayer(IntPtr layerId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetLayerTextureStageCount(int layerId, ref int layerTextureStageCount); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetLayerTexturePtr(int layerId, int stage, Eye eyeId, ref IntPtr textureHandle); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_EnqueueSubmitLayer(uint flags, IntPtr textureLeft, IntPtr textureRight, int layerId, int frameIndex, ref Posef pose, ref Vector3f scale, int layerIndex); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetNodeFrustum2(Node nodeId, out Frustumf2 nodeFrustum); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_GetEyeTextureArrayEnabled(); + } + + private static class OVRP_1_16_0 + { + public static readonly System.Version version = new System.Version(1, 16, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_UpdateCameraDevices(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_IsCameraDeviceAvailable(CameraDevice cameraDevice); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SetCameraDevicePreferredColorFrameSize(CameraDevice cameraDevice, Sizei preferredColorFrameSize); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_OpenCameraDevice(CameraDevice cameraDevice); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_CloseCameraDevice(CameraDevice cameraDevice); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_HasCameraDeviceOpened(CameraDevice cameraDevice); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Bool ovrp_IsCameraDeviceColorFrameAvailable(CameraDevice cameraDevice); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetCameraDeviceColorFrameSize(CameraDevice cameraDevice, out Sizei colorFrameSize); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetCameraDeviceColorFrameBgraPixels(CameraDevice cameraDevice, out IntPtr colorFrameBgraPixels, out int colorFrameRowPitch); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetControllerState4(uint controllerMask, ref ControllerState4 controllerState); + } + + private static class OVRP_1_17_0 + { + public static readonly System.Version version = new System.Version(1, 17, 0); + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetExternalCameraPose(CameraDevice camera, out Posef cameraPose); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_ConvertPoseToCameraSpace(CameraDevice camera, ref Posef trackingSpacePose, out Posef cameraSpacePose); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetCameraDeviceIntrinsicsParameters(CameraDevice camera, out Bool supportIntrinsics, out CameraDeviceIntrinsicsParameters intrinsicsParameters); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_DoesCameraDeviceSupportDepth(CameraDevice camera, out Bool supportDepth); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetCameraDeviceDepthSensingMode(CameraDevice camera, out CameraDeviceDepthSensingMode depthSensoringMode); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SetCameraDeviceDepthSensingMode(CameraDevice camera, CameraDeviceDepthSensingMode depthSensoringMode); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetCameraDevicePreferredDepthQuality(CameraDevice camera, out CameraDeviceDepthQuality depthQuality); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SetCameraDevicePreferredDepthQuality(CameraDevice camera, CameraDeviceDepthQuality depthQuality); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_IsCameraDeviceDepthFrameAvailable(CameraDevice camera, out Bool available); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetCameraDeviceDepthFrameSize(CameraDevice camera, out Sizei depthFrameSize); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetCameraDeviceDepthFramePixels(CameraDevice cameraDevice, out IntPtr depthFramePixels, out int depthFrameRowPitch); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetCameraDeviceDepthConfidencePixels(CameraDevice cameraDevice, out IntPtr depthConfidencePixels, out int depthConfidenceRowPitch); +#endif + } + + private static class OVRP_1_18_0 + { + public static readonly System.Version version = new System.Version(1, 18, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SetHandNodePoseStateLatency(double latencyInSeconds); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetHandNodePoseStateLatency(out double latencyInSeconds); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetAppHasInputFocus(out Bool appHasInputFocus); + } + + private static class OVRP_1_19_0 + { + public static readonly System.Version version = new System.Version(1, 19, 0); + } + + private static class OVRP_1_21_0 + { + public static readonly System.Version version = new System.Version(1, 21, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetTiledMultiResSupported(out Bool foveationSupported); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetTiledMultiResLevel(out FixedFoveatedRenderingLevel level); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SetTiledMultiResLevel(FixedFoveatedRenderingLevel level); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetGPUUtilSupported(out Bool gpuUtilSupported); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetGPUUtilLevel(out float gpuUtil); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetSystemDisplayFrequency2(out float systemDisplayFrequency); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetSystemDisplayAvailableFrequencies(IntPtr systemDisplayAvailableFrequencies, ref int numFrequencies); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SetSystemDisplayFrequency(float requestedFrequency); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetAppAsymmetricFov(out Bool useAsymmetricFov); + } + + private static class OVRP_1_28_0 + { + public static readonly System.Version version = new System.Version(1, 28, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetDominantHand(out Handedness dominantHand); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetReorientHMDOnControllerRecenter(out Bool recenter); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SetReorientHMDOnControllerRecenter(Bool recenter); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SendEvent(string name, string param); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_EnqueueSetupLayer2(ref LayerDesc desc, int compositionDepth, IntPtr layerId); + } + + private static class OVRP_1_29_0 + { + public static readonly System.Version version = new System.Version(1, 29, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetLayerAndroidSurfaceObject(int layerId, ref IntPtr surfaceObject); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SetHeadPoseModifier(ref Quatf relativeRotation, ref Vector3f relativeTranslation); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetHeadPoseModifier(out Quatf relativeRotation, out Vector3f relativeTranslation); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetNodePoseStateRaw(Step stepId, int frameIndex, Node nodeId, out PoseStatef nodePoseState); + } + + private static class OVRP_1_30_0 + { + public static readonly System.Version version = new System.Version(1, 30, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetCurrentTrackingTransformPose(out Posef trackingTransformPose); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetTrackingTransformRawPose(out Posef trackingTransformRawPose); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SendEvent2(string name, string param, string source); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_IsPerfMetricsSupported(PerfMetrics perfMetrics, out Bool isSupported); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetPerfMetricsFloat(PerfMetrics perfMetrics, out float value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetPerfMetricsInt(PerfMetrics perfMetrics, out int value); + } + + private static class OVRP_1_31_0 + { + public static readonly System.Version version = new System.Version(1, 31, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetTimeInSeconds(out double value); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SetColorScaleAndOffset(Vector4 colorScale, Vector4 colorOffset, Bool applyToAllLayers); + } + + private static class OVRP_1_32_0 + { + public static readonly System.Version version = new System.Version(1, 32, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_AddCustomMetadata(string name, string param); + } + + private static class OVRP_1_34_0 + { + public static readonly System.Version version = new System.Version(1, 34, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_EnqueueSubmitLayer2(uint flags, IntPtr textureLeft, IntPtr textureRight, int layerId, int frameIndex, ref Posef pose, ref Vector3f scale, int layerIndex, + Bool overrideTextureRectMatrix, ref TextureRectMatrixf textureRectMatrix, Bool overridePerLayerColorScaleAndOffset, ref Vector4 colorScale, ref Vector4 colorOffset); + + } + + private static class OVRP_1_35_0 + { + public static readonly System.Version version = new System.Version(1, 35, 0); + } + + private static class OVRP_1_36_0 + { + public static readonly System.Version version = new System.Version(1, 36, 0); + } + + private static class OVRP_1_37_0 + { + public static readonly System.Version version = new System.Version(1, 37, 0); + } + + private static class OVRP_1_38_0 + { + public static readonly System.Version version = new System.Version(1, 38, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetTrackingTransformRelativePose(ref Posef trackingTransformRelativePose, TrackingOrigin trackingOrigin); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_Initialize(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_Shutdown(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_GetInitialized(out Bool initialized); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_Update(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_GetMrcActivationMode(out Media.MrcActivationMode activationMode); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_SetMrcActivationMode(Media.MrcActivationMode activationMode); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_IsMrcEnabled(out Bool mrcEnabled); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_IsMrcActivated(out Bool mrcActivated); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_UseMrcDebugCamera(out Bool useMrcDebugCamera); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_SetMrcInputVideoBufferType(Media.InputVideoBufferType inputVideoBufferType); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_GetMrcInputVideoBufferType(ref Media.InputVideoBufferType inputVideoBufferType); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_SetMrcFrameSize(int frameWidth, int frameHeight); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_GetMrcFrameSize(ref int frameWidth, ref int frameHeight); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_SetMrcAudioSampleRate(int sampleRate); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_GetMrcAudioSampleRate(ref int sampleRate); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_SetMrcFrameImageFlipped(Bool flipped); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_GetMrcFrameImageFlipped(ref Bool flipped); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_EncodeMrcFrame(System.IntPtr rawBuffer, System.IntPtr audioDataPtr, int audioDataLen, int audioChannels, double timestamp, ref int outSyncId); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_EncodeMrcFrameWithDualTextures(System.IntPtr backgroundTextureHandle, System.IntPtr foregroundTextureHandle, System.IntPtr audioData, int audioDataLen, int audioChannels, double timestamp, ref int outSyncId); + + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_Media_SyncMrcFrame(int syncId); + + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetExternalCameraCalibrationRawPose(int cameraId, out Posef rawPose); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SetDeveloperMode(Bool active); + + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetNodeOrientationValid(Node nodeId, ref Bool nodeOrientationValid); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetNodePositionValid(Node nodeId, ref Bool nodePositionValid); + } + + private static class OVRP_1_39_0 + { + public static readonly System.Version version = new System.Version(1, 39, 0); + } + + private static class OVRP_1_40_0 + { + public static readonly System.Version version = new System.Version(1, 40, 0); + } + + private static class OVRP_1_41_0 + { + public static readonly System.Version version = new System.Version(1, 41, 0); + } + + private static class OVRP_1_42_0 + { + public static readonly System.Version version = new System.Version(1, 42, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetAdaptiveGpuPerformanceScale2(ref float adaptiveGpuPerformanceScale); + } + + private static class OVRP_1_43_0 + { + public static readonly System.Version version = new System.Version(1, 43, 0); + } + + private static class OVRP_1_44_0 + { + public static readonly System.Version version = new System.Version(1, 44, 0); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetHandTrackingEnabled(ref Bool handTrackingEnabled); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetHandState(Step stepId, Hand hand, out HandStateInternal handState); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetSkeleton(SkeletonType skeletonType, out Skeleton skeleton); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetMesh(MeshType meshType, out Mesh mesh); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_OverrideExternalCameraFov(int cameraId, Bool useOverriddenFov, ref Fovf fov); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetUseOverriddenExternalCameraFov(int cameraId, out Bool useOverriddenFov); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_OverrideExternalCameraStaticPose(int cameraId, Bool useOverriddenPose, ref Posef pose); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_GetUseOverriddenExternalCameraStaticPose(int cameraId, out Bool useOverriddenStaticPose); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_ResetDefaultExternalCamera(); + + [DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)] + public static extern Result ovrp_SetDefaultExternalCamera(string cameraName, ref CameraIntrinsics cameraIntrinsics, ref CameraExtrinsics cameraExtrinsics); + + } + +#endif // !OVRPLUGIN_UNSUPPORTED_PLATFORM + +} diff --git a/Assets/Oculus/VR/Scripts/OVRPlugin.cs.meta b/Assets/Oculus/VR/Scripts/OVRPlugin.cs.meta new file mode 100644 index 0000000..05c6c28 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRPlugin.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 61abd23f3aff5394ba8027ee380760b8 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/OVRProfile.cs b/Assets/Oculus/VR/Scripts/OVRProfile.cs new file mode 100644 index 0000000..3312133 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRProfile.cs @@ -0,0 +1,50 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections; +using System.Threading; +using VR = UnityEngine.VR; + +/// +/// (Deprecated) Contains information about the user's preferences and body dimensions. +/// +public class OVRProfile : Object +{ + [System.Obsolete] + public enum State + { + NOT_TRIGGERED, + LOADING, + READY, + ERROR + }; + + [System.Obsolete] + public string id { get { return "000abc123def"; } } + [System.Obsolete] + public string userName { get { return "Oculus User"; } } + [System.Obsolete] + public string locale { get { return "en_US"; } } + + public float ipd { get { return Vector3.Distance (OVRPlugin.GetNodePose (OVRPlugin.Node.EyeLeft, OVRPlugin.Step.Render).ToOVRPose ().position, OVRPlugin.GetNodePose (OVRPlugin.Node.EyeRight, OVRPlugin.Step.Render).ToOVRPose ().position); } } + public float eyeHeight { get { return OVRPlugin.eyeHeight; } } + public float eyeDepth { get { return OVRPlugin.eyeDepth; } } + public float neckHeight { get { return eyeHeight - 0.075f; } } + + [System.Obsolete] + public State state { get { return State.READY; } } +} diff --git a/Assets/Oculus/VR/Scripts/OVRProfile.cs.meta b/Assets/Oculus/VR/Scripts/OVRProfile.cs.meta new file mode 100644 index 0000000..c7bf6a7 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRProfile.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 08539141953f28e439731aaf7cd5362f +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/OVRResources.cs b/Assets/Oculus/VR/Scripts/OVRResources.cs new file mode 100644 index 0000000..4cd03d7 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRResources.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using UnityEngine; + +public class OVRResources : MonoBehaviour +{ + private static AssetBundle resourceBundle; + private static List assetNames; + + public static UnityEngine.Object Load(string path) + { + if (Debug.isDebugBuild) + { + if(resourceBundle == null) + { + Debug.Log("[OVRResources] Resource bundle was not loaded successfully"); + return null; + } + + var result = assetNames.Find(s => s.Contains(path.ToLower())); + return resourceBundle.LoadAsset(result); + } + return Resources.Load(path); + } + public static T Load(string path) where T : UnityEngine.Object + { + if (Debug.isDebugBuild) + { + if (resourceBundle == null) + { + Debug.Log("[OVRResources] Resource bundle was not loaded successfully"); + return null; + } + + var result = assetNames.Find(s => s.Contains(path.ToLower())); + return resourceBundle.LoadAsset(result); + } + return Resources.Load(path); + } + + public static void SetResourceBundle(AssetBundle bundle) + { + resourceBundle = bundle; + assetNames = new List(); + assetNames.AddRange(resourceBundle.GetAllAssetNames()); + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRResources.cs.meta b/Assets/Oculus/VR/Scripts/OVRResources.cs.meta new file mode 100644 index 0000000..3a0fefc --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRResources.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 17584d04fbb571344a3aa2b6593287c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/OVRSceneLoader.cs b/Assets/Oculus/VR/Scripts/OVRSceneLoader.cs new file mode 100644 index 0000000..a09d8cb --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRSceneLoader.cs @@ -0,0 +1,265 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; + +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.UI; + +public class OVRSceneLoader : MonoBehaviour +{ + public const string externalStoragePath = "/sdcard/Android/data"; + public const string sceneLoadDataName = "SceneLoadData.txt"; + public const string resourceBundleName = "asset_resources"; + + public float sceneCheckIntervalSeconds = 1f; + public float logCloseTime = 5.0f; + + public Canvas mainCanvas; + public Text logTextBox; + + private AsyncOperation loadSceneOperation; + private string formattedLogText; + + private float closeLogTimer; + private bool closeLogDialogue; + + private bool canvasPosUpdated; + + private struct SceneInfo + { + public List scenes; + public long version; + + public SceneInfo(List sceneList, long currentSceneEpochVersion) + { + scenes = sceneList; + version = currentSceneEpochVersion; + } + } + + private string scenePath = ""; + private string sceneLoadDataPath = ""; + private List loadedAssetBundles = new List(); + private SceneInfo currentSceneInfo; + + private void Awake() + { + // Make it presist across scene to continue checking for changes + DontDestroyOnLoad(this.gameObject); + } + + void Start() + { + string applicationPath = Path.Combine(externalStoragePath, Application.identifier); + scenePath = Path.Combine(applicationPath, "cache/scenes"); + sceneLoadDataPath = Path.Combine(scenePath, sceneLoadDataName); + + closeLogDialogue = false; + StartCoroutine(DelayCanvasPosUpdate()); + + currentSceneInfo = GetSceneInfo(); + // Check valid scene info has been fetched, and load the scenes + if (currentSceneInfo.version != 0 && !string.IsNullOrEmpty(currentSceneInfo.scenes[0])) + { + LoadScene(currentSceneInfo); + } + } + + private void LoadScene(SceneInfo sceneInfo) + { + AssetBundle mainSceneBundle = null; + Debug.Log("[OVRSceneLoader] Loading main scene: " + sceneInfo.scenes[0] + " with version " + sceneInfo.version.ToString()); + + logTextBox.text += "Target Scene: " + sceneInfo.scenes[0] + "\n"; + logTextBox.text += "Version: " + sceneInfo.version.ToString() + "\n"; + + // Load main scene and dependent additive scenes (if any) + Debug.Log("[OVRSceneLoader] Loading scene bundle files."); + // Fetch all files under scene cache path, excluding unnecessary files such as scene metadata file + string[] bundles = Directory.GetFiles(scenePath, "*_*"); + logTextBox.text += "Loading " + bundles.Length + " bundle(s) . . . "; + string mainSceneBundleFileName = "scene_" + sceneInfo.scenes[0].ToLower(); + try + { + foreach (string b in bundles) + { + var assetBundle = AssetBundle.LoadFromFile(b); + if (assetBundle != null) + { + Debug.Log("[OVRSceneLoader] Loading file bundle: " + assetBundle.name == null ? "null" : assetBundle.name); + loadedAssetBundles.Add(assetBundle); + } + else + { + Debug.LogError("[OVRSceneLoader] Loading file bundle failed"); + } + + if (assetBundle.name == mainSceneBundleFileName) + { + mainSceneBundle = assetBundle; + } + + if (assetBundle.name == resourceBundleName) + { + OVRResources.SetResourceBundle(assetBundle); + } + } + } + catch(Exception e) + { + logTextBox.text += "" + e.Message + ""; + return; + } + logTextBox.text += "DONE\n"; + + if (mainSceneBundle != null) + { + logTextBox.text += "Loading Scene: {0:P0}\n"; + formattedLogText = logTextBox.text; + string[] scenePaths = mainSceneBundle.GetAllScenePaths(); + string sceneName = Path.GetFileNameWithoutExtension(scenePaths[0]); + + loadSceneOperation = SceneManager.LoadSceneAsync(sceneName); + loadSceneOperation.completed += LoadSceneOperation_completed; + } + else + { + logTextBox.text += "Failed to get main scene bundle.\n"; + } + } + + private void LoadSceneOperation_completed(AsyncOperation obj) + { + StartCoroutine(onCheckSceneCoroutine()); + StartCoroutine(DelayCanvasPosUpdate()); + + closeLogTimer = 0; + closeLogDialogue = true; + + logTextBox.text += "Log closing in {0} seconds.\n"; + formattedLogText = logTextBox.text; + } + + public void Update() + { + // Display scene load percentage + if (loadSceneOperation != null) + { + if (!loadSceneOperation.isDone) + { + logTextBox.text = string.Format(formattedLogText, loadSceneOperation.progress + 0.1f); + if (loadSceneOperation.progress >= 0.9f) + { + logTextBox.text = formattedLogText.Replace("{0:P0}", "DONE"); + logTextBox.text += "Transitioning to new scene.\nLoad times will vary depending on scene complexity.\n"; + + } + } + } + + UpdateCanvasPosition(); + + // Wait a certain time before closing the log dialogue after the scene has transitioned + if (closeLogDialogue) + { + if (closeLogTimer < logCloseTime) + { + closeLogTimer += Time.deltaTime; + logTextBox.text = string.Format(formattedLogText, (int)(logCloseTime - closeLogTimer)); + } + else + { + mainCanvas.gameObject.SetActive(false); + closeLogDialogue = false; + } + } + } + + private void UpdateCanvasPosition() + { + // Update canvas camera reference and position if the main camera has changed + if (mainCanvas.worldCamera != Camera.main) + { + mainCanvas.worldCamera = Camera.main; + if (Camera.main != null) + { + Vector3 newPosition = Camera.main.transform.position + Camera.main.transform.forward * 0.3f; + gameObject.transform.position = newPosition; + gameObject.transform.rotation = Camera.main.transform.rotation; + } + } + } + + private SceneInfo GetSceneInfo() + { + SceneInfo sceneInfo = new SceneInfo(); + try + { + StreamReader reader = new StreamReader(sceneLoadDataPath); + sceneInfo.version = System.Convert.ToInt64(reader.ReadLine()); + List sceneList = new List(); + while (!reader.EndOfStream) + { + sceneList.Add(reader.ReadLine()); + } + sceneInfo.scenes = sceneList; + } + catch + { + logTextBox.text += "Failed to get scene info data.\n"; + } + return sceneInfo; + } + + // Update canvas position after a slight delay to get accurate headset position after scene transitions + IEnumerator DelayCanvasPosUpdate() + { + yield return new WaitForSeconds(0.1f); + UpdateCanvasPosition(); + } + + IEnumerator onCheckSceneCoroutine() + { + SceneInfo newSceneInfo; + while (true) + { + newSceneInfo = GetSceneInfo(); + if (newSceneInfo.version != currentSceneInfo.version) + { + Debug.Log("[OVRSceneLoader] Scene change detected."); + + // Unload all asset bundles + foreach (var b in loadedAssetBundles) + { + if (b != null) + { + b.Unload(true); + } + } + loadedAssetBundles.Clear(); + + // Unload all scenes in the hierarchy including main scene and + // its dependent additive scenes. + int activeScenes = SceneManager.sceneCount; + for (int i = 0; i < activeScenes; i++) + { + SceneManager.UnloadSceneAsync(SceneManager.GetSceneAt(i)); + } + DestroyAllGameObjects(); + SceneManager.LoadSceneAsync("OVRTransitionScene"); + break; + } + yield return new WaitForSeconds(sceneCheckIntervalSeconds); + } + } + + void DestroyAllGameObjects() + { + foreach (GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject)) as GameObject[]) + { + Destroy(go); + } + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRSceneLoader.cs.meta b/Assets/Oculus/VR/Scripts/OVRSceneLoader.cs.meta new file mode 100644 index 0000000..315f2f0 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRSceneLoader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a6d444f79f5ee4646b26c6d746385e80 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/OVRTracker.cs b/Assets/Oculus/VR/Scripts/OVRTracker.cs new file mode 100644 index 0000000..38f6643 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRTracker.cs @@ -0,0 +1,194 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System; +using System.Runtime.InteropServices; +using UnityEngine; +using VR = UnityEngine.VR; + +/// +/// An infrared camera that tracks the position of a head-mounted display. +/// +public class OVRTracker +{ + /// + /// The (symmetric) visible area in front of the sensor. + /// + public struct Frustum + { + /// + /// The sensor's minimum supported distance to the HMD. + /// + public float nearZ; + /// + /// The sensor's maximum supported distance to the HMD. + /// + public float farZ; + /// + /// The sensor's horizontal and vertical fields of view in degrees. + /// + public Vector2 fov; + } + + /// + /// If true, a sensor is attached to the system. + /// + public bool isPresent + { + get { + if (!OVRManager.isHmdPresent) + return false; + + return OVRPlugin.positionSupported; + } + } + + /// + /// If true, the sensor is actively tracking the HMD's position. Otherwise the HMD may be temporarily occluded, the system may not support position tracking, etc. + /// + public bool isPositionTracked + { + get { + return OVRPlugin.positionTracked; + } + } + + /// + /// If this is true and a sensor is available, the system will use position tracking when isPositionTracked is also true. + /// + public bool isEnabled + { + get { + if (!OVRManager.isHmdPresent) + return false; + + return OVRPlugin.position; + } + + set { + if (!OVRManager.isHmdPresent) + return; + + OVRPlugin.position = value; + } + } + + /// + /// Returns the number of sensors currently connected to the system. + /// + public int count + { + get { + int count = 0; + + for (int i = 0; i < (int)OVRPlugin.Tracker.Count; ++i) + { + if (GetPresent(i)) + count++; + } + + return count; + } + } + + /// + /// Gets the sensor's viewing frustum. + /// + public Frustum GetFrustum(int tracker = 0) + { + if (!OVRManager.isHmdPresent) + return new Frustum(); + + return OVRPlugin.GetTrackerFrustum((OVRPlugin.Tracker)tracker).ToFrustum(); + } + + /// + /// Gets the sensor's pose, relative to the head's pose at the time of the last pose recentering. + /// + public OVRPose GetPose(int tracker = 0) + { + if (!OVRManager.isHmdPresent) + return OVRPose.identity; + + OVRPose p; + switch (tracker) + { + case 0: + p = OVRPlugin.GetNodePose(OVRPlugin.Node.TrackerZero, OVRPlugin.Step.Render).ToOVRPose(); + break; + case 1: + p = OVRPlugin.GetNodePose(OVRPlugin.Node.TrackerOne, OVRPlugin.Step.Render).ToOVRPose(); + break; + case 2: + p = OVRPlugin.GetNodePose(OVRPlugin.Node.TrackerTwo, OVRPlugin.Step.Render).ToOVRPose(); + break; + case 3: + p = OVRPlugin.GetNodePose(OVRPlugin.Node.TrackerThree, OVRPlugin.Step.Render).ToOVRPose(); + break; + default: + return OVRPose.identity; + } + + return new OVRPose() + { + position = p.position, + orientation = p.orientation * Quaternion.Euler(0, 180, 0) + }; + } + + /// + /// If true, the pose of the sensor is valid and is ready to be queried. + /// + public bool GetPoseValid(int tracker = 0) + { + if (!OVRManager.isHmdPresent) + return false; + + switch (tracker) + { + case 0: + return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.TrackerZero); + case 1: + return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.TrackerOne); + case 2: + return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.TrackerTwo); + case 3: + return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.TrackerThree); + default: + return false; + } + } + + public bool GetPresent(int tracker = 0) + { + if (!OVRManager.isHmdPresent) + return false; + + switch (tracker) + { + case 0: + return OVRPlugin.GetNodePresent(OVRPlugin.Node.TrackerZero); + case 1: + return OVRPlugin.GetNodePresent(OVRPlugin.Node.TrackerOne); + case 2: + return OVRPlugin.GetNodePresent(OVRPlugin.Node.TrackerTwo); + case 3: + return OVRPlugin.GetNodePresent(OVRPlugin.Node.TrackerThree); + default: + return false; + } + } +} diff --git a/Assets/Oculus/VR/Scripts/OVRTracker.cs.meta b/Assets/Oculus/VR/Scripts/OVRTracker.cs.meta new file mode 100644 index 0000000..fa5fba9 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRTracker.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7cb3c9d4cb0970e448c655096649e814 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/OVRXRSDKNative.cs b/Assets/Oculus/VR/Scripts/OVRXRSDKNative.cs new file mode 100644 index 0000000..d6cff93 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRXRSDKNative.cs @@ -0,0 +1,34 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +#if USING_XR_MANAGEMENT && USING_XR_SDK_OCULUS +#define USING_XR_SDK +#endif + +using System.Runtime.InteropServices; + +// C# wrapper for Unity XR SDK Native APIs. + +#if USING_XR_SDK +public static class OculusXRPlugin +{ + [DllImport("OculusXRPlugin")] + public static extern void SetColorScale(float x, float y, float z, float w); + + [DllImport("OculusXRPlugin")] + public static extern void SetColorOffset(float x, float y, float z, float w); +} +#endif diff --git a/Assets/Oculus/VR/Scripts/OVRXRSDKNative.cs.meta b/Assets/Oculus/VR/Scripts/OVRXRSDKNative.cs.meta new file mode 100644 index 0000000..d9f396c --- /dev/null +++ b/Assets/Oculus/VR/Scripts/OVRXRSDKNative.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 903a593623dfcbf4a81205c0f7386ea9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util.meta b/Assets/Oculus/VR/Scripts/Util.meta new file mode 100644 index 0000000..3343588 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: c0c7a593695f68e4bbe0cabb0f4f93f2 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRAudioSourceTest.cs b/Assets/Oculus/VR/Scripts/Util/OVRAudioSourceTest.cs new file mode 100644 index 0000000..f07d56e --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRAudioSourceTest.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class OVRAudioSourceTest : MonoBehaviour +{ + public float period = 2.0f; + private float nextActionTime; + + // Start is called before the first frame update + void Start() + { + Material templateMaterial = GetComponent().material; + Material newMaterial = Instantiate(templateMaterial); + newMaterial.color = Color.green; + GetComponent().material = newMaterial; + + nextActionTime = Time.time + period; + } + + // Update is called once per frame + void Update() + { + if (Time.time > nextActionTime) + { + nextActionTime = Time.time + period; + + Material mat = GetComponent().material; + if (mat.color == Color.green) + { + mat.color = Color.red; + } + else + { + mat.color = Color.green; + } + + AudioSource audioSource = GetComponent(); + if (audioSource == null) + { + Debug.LogError("Unable to find AudioSource"); + } + else + { + audioSource.Play(); + } + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRAudioSourceTest.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRAudioSourceTest.cs.meta new file mode 100644 index 0000000..235ea6b --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRAudioSourceTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 358b12a21a8aa9540b435051f334fe9b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRAutoDestroyInMRC.cs b/Assets/Oculus/VR/Scripts/Util/OVRAutoDestroyInMRC.cs new file mode 100644 index 0000000..109f952 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRAutoDestroyInMRC.cs @@ -0,0 +1,34 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// If there is a game object under the main camera which should not be cloned under Mixed Reality Capture, +// attaching this component would auto destroy that after the MRC camera get cloned +public class OVRAutoDestroyInMRC : MonoBehaviour { + + // Use this for initialization + void Start () { + bool underMrcCamera = false; + + Transform p = transform.parent; + while (p != null) + { + if (p.gameObject.name.StartsWith("OculusMRC_")) + { + underMrcCamera = true; + break; + } + p = p.parent; + } + + if (underMrcCamera) + { + Destroy(gameObject); + } + } + + // Update is called once per frame + void Update () { + + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRAutoDestroyInMRC.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRAutoDestroyInMRC.cs.meta new file mode 100644 index 0000000..a55533c --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRAutoDestroyInMRC.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 42a68265e2d624d49ae7fced6a7e4d91 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRChromaticAberration.cs b/Assets/Oculus/VR/Scripts/Util/OVRChromaticAberration.cs new file mode 100644 index 0000000..c4e1e63 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRChromaticAberration.cs @@ -0,0 +1,51 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; + +/// +/// Allows you to toggle chromatic aberration correction with a gamepad button press. +/// +public class OVRChromaticAberration : MonoBehaviour +{ + /// + /// The button that will toggle chromatic aberration correction. + /// + public OVRInput.RawButton toggleButton = OVRInput.RawButton.X; + + private bool chromatic = false; + + void Start () + { + // Enable/Disable Chromatic Aberration Correction. + // NOTE: Enabling Chromatic Aberration for mobile has a large performance cost. + OVRManager.instance.chromatic = chromatic; + } + + void Update() + { + // NOTE: some of the buttons defined in OVRInput.RawButton are not available on the Android game pad controller + if (OVRInput.GetDown(toggleButton)) + { + //************************* + // toggle chromatic aberration correction + //************************* + chromatic = !chromatic; + OVRManager.instance.chromatic = chromatic; + } + } + +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRChromaticAberration.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRChromaticAberration.cs.meta new file mode 100644 index 0000000..0167611 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRChromaticAberration.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3b56515a831f2fb44bc7ae02679aeebc +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRControllerHelper.cs b/Assets/Oculus/VR/Scripts/Util/OVRControllerHelper.cs new file mode 100644 index 0000000..383d84f --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRControllerHelper.cs @@ -0,0 +1,172 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections; + +/// +/// Simple helper script that conditionally enables rendering of a controller if it is connected. +/// +public class OVRControllerHelper : MonoBehaviour +{ + /// + /// The root GameObject that represents the GearVr Controller model. + /// + public GameObject m_modelGearVrController; + + /// + /// The root GameObject that represents the Oculus Go Controller model. + /// + public GameObject m_modelOculusGoController; + + /// + /// The root GameObject that represents the Oculus Touch for Quest And RiftS Controller model (Left). + /// + public GameObject m_modelOculusTouchQuestAndRiftSLeftController; + + /// + /// The root GameObject that represents the Oculus Touch for Quest And RiftS Controller model (Right). + /// + public GameObject m_modelOculusTouchQuestAndRiftSRightController; + + /// + /// The root GameObject that represents the Oculus Touch for Rift Controller model (Left). + /// + public GameObject m_modelOculusTouchRiftLeftController; + + /// + /// The root GameObject that represents the Oculus Touch for Rift Controller model (Right). + /// + public GameObject m_modelOculusTouchRiftRightController; + + /// + /// The controller that determines whether or not to enable rendering of the controller model. + /// + public OVRInput.Controller m_controller; + + private enum ControllerType + { + GearVR, Go, QuestAndRiftS, Rift + } + + private ControllerType activeControllerType = ControllerType.Rift; + + private bool m_prevControllerConnected = false; + private bool m_prevControllerConnectedCached = false; + + void Start() + { + OVRPlugin.SystemHeadset headset = OVRPlugin.GetSystemHeadsetType(); + switch (headset) + { + case OVRPlugin.SystemHeadset.Oculus_Go: + activeControllerType = ControllerType.Go; + break; + case OVRPlugin.SystemHeadset.Oculus_Quest: + activeControllerType = ControllerType.QuestAndRiftS; + break; + case OVRPlugin.SystemHeadset.Rift_CV1: + activeControllerType = ControllerType.Rift; + break; + case OVRPlugin.SystemHeadset.Rift_S: + activeControllerType = ControllerType.QuestAndRiftS; + break; + case OVRPlugin.SystemHeadset.GearVR_R320: + case OVRPlugin.SystemHeadset.GearVR_R321: + case OVRPlugin.SystemHeadset.GearVR_R322: + case OVRPlugin.SystemHeadset.GearVR_R323: + case OVRPlugin.SystemHeadset.GearVR_R324: + case OVRPlugin.SystemHeadset.GearVR_R325: + activeControllerType = ControllerType.GearVR; + break; + default: +#if UNITY_EDITOR || !UNITY_ANDROID + activeControllerType = ControllerType.Rift; +#else + activeControllerType = ControllerType.GearVR; +#endif + break; + } + + Debug.LogFormat("OVRControllerHelp: Active controller type: {0} for product {1}", activeControllerType, OVRPlugin.productName); + if ((activeControllerType != ControllerType.GearVR) && (activeControllerType != ControllerType.Go)) + { + if (m_controller == OVRInput.Controller.LTrackedRemote) + { + m_controller = OVRInput.Controller.LTouch; + } + else if (m_controller == OVRInput.Controller.RTrackedRemote) + { + m_controller = OVRInput.Controller.RTouch; + } + } + else + { + if (m_controller == OVRInput.Controller.LTouch) + { + m_controller = OVRInput.Controller.LTrackedRemote; + } + else if (m_controller == OVRInput.Controller.RTouch) + { + m_controller = OVRInput.Controller.RTrackedRemote; + } + } + } + + void Update() + { + bool controllerConnected = OVRInput.IsControllerConnected(m_controller); + + if ((controllerConnected != m_prevControllerConnected) || !m_prevControllerConnectedCached) + { + if (activeControllerType == ControllerType.GearVR || activeControllerType == ControllerType.Go) + { + m_modelOculusGoController.SetActive(controllerConnected && (activeControllerType == ControllerType.Go)); + m_modelGearVrController.SetActive(controllerConnected && (activeControllerType != ControllerType.Go)); + m_modelOculusTouchQuestAndRiftSLeftController.SetActive(false); + m_modelOculusTouchQuestAndRiftSRightController.SetActive(false); + m_modelOculusTouchRiftLeftController.SetActive(false); + m_modelOculusTouchRiftRightController.SetActive(false); + } + else if (activeControllerType == ControllerType.QuestAndRiftS) + { + m_modelOculusGoController.SetActive(false); + m_modelGearVrController.SetActive(false); + m_modelOculusTouchQuestAndRiftSLeftController.SetActive(controllerConnected && (m_controller == OVRInput.Controller.LTouch)); + m_modelOculusTouchQuestAndRiftSRightController.SetActive(controllerConnected && (m_controller == OVRInput.Controller.RTouch)); + m_modelOculusTouchRiftLeftController.SetActive(false); + m_modelOculusTouchRiftRightController.SetActive(false); + } + else // if (activeControllerType == ControllerType.Rift) + { + m_modelOculusGoController.SetActive(false); + m_modelGearVrController.SetActive(false); + m_modelOculusTouchQuestAndRiftSLeftController.SetActive(false); + m_modelOculusTouchQuestAndRiftSRightController.SetActive(false); + m_modelOculusTouchRiftLeftController.SetActive(controllerConnected && (m_controller == OVRInput.Controller.LTouch)); + m_modelOculusTouchRiftRightController.SetActive(controllerConnected && (m_controller == OVRInput.Controller.RTouch)); + } + + m_prevControllerConnected = controllerConnected; + m_prevControllerConnectedCached = true; + } + + if (!controllerConnected) + { + return; + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRControllerHelper.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRControllerHelper.cs.meta new file mode 100644 index 0000000..05ac7db --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRControllerHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aed62bf3ae2456c408f247f96808ce96 +timeCreated: 1486166271 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRCubemapCapture.cs b/Assets/Oculus/VR/Scripts/Util/OVRCubemapCapture.cs new file mode 100644 index 0000000..8cdce3e --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRCubemapCapture.cs @@ -0,0 +1,284 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + + +using UnityEngine; +using System.Collections; +using System.IO; + +/// +/// Helper script for capture cubemap and save it into PNG or JPG file +/// + +/// +/// How it works: +/// 1) This script can be attached to a existing game object, you can also use prefab Assets\OVR\Prefabs\OVRCubemapCaptureProbe +/// There are 2 ways to trigger a capture if you attached this script to a game object. +/// * Automatic capturing: if [autoTriggerAfterLaunch] is true, a automatic capturing will be triggered after [autoTriggerDelay] seconds. +/// * Keyboard trigger: press key [triggeredByKey], a capturing will be triggered. +/// 2) If you like to trigger the screen capture in your code logic, just call static function [OVRCubemapCapture.TriggerCubemapCapture] with proper input arguments. +/// + +public class OVRCubemapCapture : MonoBehaviour +{ + /// + /// Enable the automatic screenshot trigger, which will capture a cubemap after autoTriggerDelay (seconds) + /// + public bool autoTriggerAfterLaunch = true; + public float autoTriggerDelay = 1.0f; + private float autoTriggerElapse = 0.0f; + + /// + /// Trigger cubemap screenshot if user pressed key triggeredByKey + /// + public KeyCode triggeredByKey = KeyCode.F8; + + /// + /// The complete file path for saving the cubemap screenshot, including the filename and extension + /// if pathName is blank, screenshots will be saved into %USERPROFILE%\Documents\OVR_ScreenShot360 + /// + public string pathName; + + /// + /// The cube face resolution + /// + public int cubemapSize = 2048; + + // Update is called once per frame + void Update() + { + // Trigger after autoTriggerDelay + if (autoTriggerAfterLaunch) + { + autoTriggerElapse += Time.deltaTime; + if (autoTriggerElapse >= autoTriggerDelay) + { + autoTriggerAfterLaunch = false; + TriggerCubemapCapture(transform.position, cubemapSize, pathName); + } + } + + // Trigger by press triggeredByKey + if ( Input.GetKeyDown( triggeredByKey ) ) + { + TriggerCubemapCapture(transform.position, cubemapSize, pathName); + } + } + + /// + /// Generate unity cubemap at specific location and save into JPG/PNG + /// + /// + /// Default save folder: your app's persistentDataPath + /// Default file name: using current time OVR_hh_mm_ss.png + /// Note1: this will take a few seconds to finish + /// Note2: if you only want to specify path not filename, please end [pathName] with "/" + /// + + public static void TriggerCubemapCapture(Vector3 capturePos, int cubemapSize = 2048, string pathName = null) + { + GameObject ownerObj = new GameObject("CubemapCamera", typeof(Camera)); + ownerObj.hideFlags = HideFlags.HideAndDontSave; + ownerObj.transform.position = capturePos; + ownerObj.transform.rotation = Quaternion.identity; + Camera camComponent = ownerObj.GetComponent(); + camComponent.farClipPlane = 10000.0f; + camComponent.enabled = false; + + Cubemap cubemap = new Cubemap(cubemapSize, TextureFormat.RGB24, false); + RenderIntoCubemap(camComponent, cubemap); + SaveCubemapCapture(cubemap, pathName); + DestroyImmediate(cubemap); + DestroyImmediate(ownerObj); + } + + + public static void RenderIntoCubemap(Camera ownerCamera, Cubemap outCubemap) + { + int width = (int)outCubemap.width; + int height = (int)outCubemap.height; + + CubemapFace[] faces = new CubemapFace[] { CubemapFace.PositiveX, CubemapFace.NegativeX, CubemapFace.PositiveY, CubemapFace.NegativeY, CubemapFace.PositiveZ, CubemapFace.NegativeZ }; + Vector3[] faceAngles = new Vector3[] { new Vector3(0.0f, 90.0f, 0.0f), new Vector3(0.0f, -90.0f, 0.0f), new Vector3(-90.0f, 0.0f, 0.0f), new Vector3(90.0f, 0.0f, 0.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 180.0f, 0.0f) }; + + // Backup states + RenderTexture backupRenderTex = RenderTexture.active; + float backupFieldOfView = ownerCamera.fieldOfView; + float backupAspect = ownerCamera.aspect; + Quaternion backupRot = ownerCamera.transform.rotation; + //RenderTexture backupRT = ownerCamera.targetTexture; + + // Enable 8X MSAA + RenderTexture faceTexture = new RenderTexture(width, height, 24); + faceTexture.antiAliasing = 8; + faceTexture.dimension = UnityEngine.Rendering.TextureDimension.Tex2D; + faceTexture.hideFlags = HideFlags.HideAndDontSave; + + // For intermediate saving + Texture2D swapTex = new Texture2D(width, height, TextureFormat.RGB24, false); + swapTex.hideFlags = HideFlags.HideAndDontSave; + + // Capture 6 Directions + ownerCamera.targetTexture = faceTexture; + ownerCamera.fieldOfView = 90; + ownerCamera.aspect = 1.0f; + + Color[] mirroredPixels = new Color[swapTex.height * swapTex.width]; + for (int i = 0; i < faces.Length; i++) + { + ownerCamera.transform.eulerAngles = faceAngles[i]; + ownerCamera.Render(); + RenderTexture.active = faceTexture; + swapTex.ReadPixels(new Rect(0, 0, width, height), 0, 0); + + // Mirror vertically to meet the standard of unity cubemap + Color[] OrignalPixels = swapTex.GetPixels(); + for (int y1 = 0; y1 < height; y1++) + { + for (int x1 = 0; x1 < width; x1++) + { + mirroredPixels[y1 * width + x1] = OrignalPixels[((height - 1 - y1) * width) + x1]; + } + }; + outCubemap.SetPixels(mirroredPixels, faces[i]); + } + + outCubemap.SmoothEdges(); + + // Restore states + RenderTexture.active = backupRenderTex; + ownerCamera.fieldOfView = backupFieldOfView; + ownerCamera.aspect = backupAspect; + ownerCamera.transform.rotation = backupRot; + ownerCamera.targetTexture = backupRenderTex; + + DestroyImmediate(swapTex); + DestroyImmediate(faceTexture); + + } + + + /// + /// Save unity cubemap into NPOT 6x1 cubemap/texture atlas in the following format PX NX PY NY PZ NZ + /// + /// + /// Supported format: PNG/JPG + /// Default file name: using current time OVR_hh_mm_ss.png + /// + + public static bool SaveCubemapCapture(Cubemap cubemap, string pathName = null) + { + string fileName; + string dirName; + int width = cubemap.width; + int height = cubemap.height; + int x = 0; + int y = 0; + bool saveToPNG = true; + + if (string.IsNullOrEmpty(pathName)) + { + dirName = Application.persistentDataPath + "/OVR_ScreenShot360/"; + fileName = null; + } + else + { + dirName = Path.GetDirectoryName(pathName); + fileName = Path.GetFileName(pathName); + + if (dirName[dirName.Length - 1] != '/' || dirName[dirName.Length - 1] != '\\') + dirName += "/"; + } + + if (string.IsNullOrEmpty(fileName)) + fileName = "OVR_" + System.DateTime.Now.ToString("hh_mm_ss") + ".png"; + + string extName = Path.GetExtension(fileName); + if (extName == ".png") + { + saveToPNG = true; + } + else if (extName == ".jpg") + { + saveToPNG = false; + } + else + { + Debug.LogError("Unsupported file format" + extName); + return false; + } + + // Validate path + try + { + System.IO.Directory.CreateDirectory(dirName); + } + catch (System.Exception e) + { + Debug.LogError("Failed to create path " + dirName + " since " + e.ToString()); + return false; + } + + + // Create the new texture + Texture2D tex = new Texture2D(width * 6, height, TextureFormat.RGB24, false); + if (tex == null) + { + Debug.LogError("[OVRScreenshotWizard] Failed creating the texture!"); + return false; + } + + // Merge all the cubemap faces into the texture + // Reference cubemap format: http://docs.unity3d.com/Manual/class-Cubemap.html + CubemapFace[] faces = new CubemapFace[] { CubemapFace.PositiveX, CubemapFace.NegativeX, CubemapFace.PositiveY, CubemapFace.NegativeY, CubemapFace.PositiveZ, CubemapFace.NegativeZ }; + for (int i = 0; i < faces.Length; i++) + { + // get the pixels from the cubemap + Color[] srcPixels = null; + Color[] pixels = cubemap.GetPixels(faces[i]); + // if desired, flip them as they are ordered left to right, bottom to top + srcPixels = new Color[pixels.Length]; + for (int y1 = 0; y1 < height; y1++) + { + for (int x1 = 0; x1 < width; x1++) + { + srcPixels[y1 * width + x1] = pixels[((height - 1 - y1) * width) + x1]; + } + } + // Copy them to the dest texture + tex.SetPixels(x, y, width, height, srcPixels); + x += width; + } + + try + { + // Encode the texture and save it to disk + byte[] bytes = saveToPNG ? tex.EncodeToPNG() : tex.EncodeToJPG(); + + System.IO.File.WriteAllBytes(dirName + fileName, bytes); + Debug.Log("Cubemap file created " + dirName + fileName); + } + catch (System.Exception e) + { + Debug.LogError("Failed to save cubemap file since " + e.ToString()); + return false; + } + + DestroyImmediate(tex); + return true; + } + +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRCubemapCapture.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRCubemapCapture.cs.meta new file mode 100644 index 0000000..2774e40 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRCubemapCapture.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7a489178b0acf0147846b3873447beaf +timeCreated: 1464728890 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRCursor.cs b/Assets/Oculus/VR/Scripts/Util/OVRCursor.cs new file mode 100644 index 0000000..b93c601 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRCursor.cs @@ -0,0 +1,28 @@ +/************************************************************************************ + +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. + +************************************************************************************/ + +using UnityEngine; +using System.Collections; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +abstract public class OVRCursor : MonoBehaviour +{ + public abstract void SetCursorRay(Transform ray); + public abstract void SetCursorStartDest(Vector3 start, Vector3 dest, Vector3 normal); +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRCursor.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRCursor.cs.meta new file mode 100644 index 0000000..8867e17 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRCursor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f2233ce673fcb9f41bd0753f867b7f70 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRDebugInfo.cs b/Assets/Oculus/VR/Scripts/Util/OVRDebugInfo.cs new file mode 100644 index 0000000..ca86ba2 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRDebugInfo.cs @@ -0,0 +1,433 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections; +using UnityEngine.UI; + +//------------------------------------------------------------------------------------- +/// +/// Shows debug information on a heads-up display. +/// +public class OVRDebugInfo : MonoBehaviour +{ + #region GameObjects for Debug Information UIs + GameObject debugUIManager; + GameObject debugUIObject; + GameObject riftPresent; + GameObject fps; + GameObject ipd; + GameObject fov; + GameObject height; + GameObject depth; + GameObject resolutionEyeTexture; + GameObject latencies; + GameObject texts; + #endregion + + #region Debug strings + string strRiftPresent = null; // "VR DISABLED" + string strFPS = null; // "FPS: 0"; + string strIPD = null; // "IPD: 0.000"; + string strFOV = null; // "FOV: 0.0f"; + string strHeight = null; // "Height: 0.0f"; + string strDepth = null; // "Depth: 0.0f"; + string strResolutionEyeTexture = null; // "Resolution : {0} x {1}" + string strLatencies = null; // "R: {0:F3} TW: {1:F3} PP: {2:F3} RE: {3:F3} TWE: {4:F3}" + #endregion + + /// + /// Variables for FPS + /// + float updateInterval = 0.5f; + float accum = 0.0f; + int frames = 0; + float timeLeft = 0.0f; + + /// + /// Managing for UI initialization + /// + bool initUIComponent = false; + bool isInited = false; + + /// + /// UIs Y offset + /// + float offsetY = 55.0f; + + /// + /// Managing for rift detection UI + /// + float riftPresentTimeout = 0.0f; + + /// + /// Turn on / off VR variables + /// + bool showVRVars = false; + + #region MonoBehaviour handler + + /// + /// Initialization + /// + void Awake() + { + // Create canvas for using new GUI + debugUIManager = new GameObject(); + debugUIManager.name = "DebugUIManager"; + debugUIManager.transform.parent = GameObject.Find("LeftEyeAnchor").transform; + + RectTransform rectTransform = debugUIManager.AddComponent(); + rectTransform.sizeDelta = new Vector2(100f, 100f); + rectTransform.localScale = new Vector3(0.001f, 0.001f, 0.001f); + rectTransform.localPosition = new Vector3(0.01f, 0.17f, 0.53f); + rectTransform.localEulerAngles = Vector3.zero; + + Canvas canvas = debugUIManager.AddComponent(); + canvas.renderMode = RenderMode.WorldSpace; + canvas.pixelPerfect = false; + } + + /// + /// Updating VR variables and managing UI present + /// + void Update() + { + if (initUIComponent && !isInited) + { + InitUIComponents(); + } + + if (Input.GetKeyDown(KeyCode.Space) && riftPresentTimeout < 0.0f) + { + initUIComponent = true; + showVRVars ^= true; + } + + UpdateDeviceDetection(); + + // Presenting VR variables + if (showVRVars) + { + debugUIManager.SetActive(true); + UpdateVariable(); + UpdateStrings(); + } + else + { + debugUIManager.SetActive(false); + } + } + + /// + /// Initialize isInited value on OnDestroy + /// + void OnDestroy() + { + isInited = false; + } + #endregion + + #region Private Functions + /// + /// Initialize UI GameObjects + /// + void InitUIComponents() + { + float posY = 0.0f; + int fontSize = 20; + + debugUIObject = new GameObject(); + debugUIObject.name = "DebugInfo"; + debugUIObject.transform.parent = GameObject.Find("DebugUIManager").transform; + debugUIObject.transform.localPosition = new Vector3(0.0f, 100.0f, 0.0f); + debugUIObject.transform.localEulerAngles = Vector3.zero; + debugUIObject.transform.localScale = new Vector3(1.0f, 1.0f, 1.0f); + + // Print out for FPS + if (!string.IsNullOrEmpty(strFPS)) + { + fps = VariableObjectManager(fps, "FPS", posY -= offsetY, strFPS, fontSize); + } + + // Print out for IPD + if (!string.IsNullOrEmpty(strIPD)) + { + ipd = VariableObjectManager(ipd, "IPD", posY -= offsetY, strIPD, fontSize); + } + + // Print out for FOV + if (!string.IsNullOrEmpty(strFOV)) + { + fov = VariableObjectManager(fov, "FOV", posY -= offsetY, strFOV, fontSize); + } + + // Print out for Height + if (!string.IsNullOrEmpty(strHeight)) + { + height = VariableObjectManager(height, "Height", posY -= offsetY, strHeight, fontSize); + } + + // Print out for Depth + if (!string.IsNullOrEmpty(strDepth)) + { + depth = VariableObjectManager(depth, "Depth", posY -= offsetY, strDepth, fontSize); + } + + // Print out for Resoulution of Eye Texture + if (!string.IsNullOrEmpty(strResolutionEyeTexture)) + { + resolutionEyeTexture = VariableObjectManager(resolutionEyeTexture, "Resolution", posY -= offsetY, strResolutionEyeTexture, fontSize); + } + + // Print out for Latency + if (!string.IsNullOrEmpty(strLatencies)) + { + latencies = VariableObjectManager(latencies, "Latency", posY -= offsetY, strLatencies, 17); + posY = 0.0f; + } + + initUIComponent = false; + isInited = true; + + } + + /// + /// Update VR Variables + /// + void UpdateVariable() + { + UpdateIPD(); + UpdateEyeHeightOffset(); + UpdateEyeDepthOffset(); + UpdateFOV(); + UpdateResolutionEyeTexture(); + UpdateLatencyValues(); + UpdateFPS(); + } + + /// + /// Update Strings + /// + void UpdateStrings() + { + if (debugUIObject == null) + return; + + if (!string.IsNullOrEmpty(strFPS)) + fps.GetComponentInChildren().text = strFPS; + if (!string.IsNullOrEmpty(strIPD)) + ipd.GetComponentInChildren().text = strIPD; + if (!string.IsNullOrEmpty(strFOV)) + fov.GetComponentInChildren().text = strFOV; + if (!string.IsNullOrEmpty(strResolutionEyeTexture)) + resolutionEyeTexture.GetComponentInChildren().text = strResolutionEyeTexture; + if (!string.IsNullOrEmpty(strLatencies)) + { + latencies.GetComponentInChildren().text = strLatencies; + latencies.GetComponentInChildren().fontSize = 14; + } + if (!string.IsNullOrEmpty(strHeight)) + height.GetComponentInChildren().text = strHeight; + if (!string.IsNullOrEmpty(strDepth)) + depth.GetComponentInChildren().text = strDepth; + } + + /// + /// It's for rift present GUI + /// + void RiftPresentGUI(GameObject guiMainOBj) + { + riftPresent = ComponentComposition(riftPresent); + riftPresent.transform.SetParent(guiMainOBj.transform); + riftPresent.name = "RiftPresent"; + RectTransform rectTransform = riftPresent.GetComponent(); + rectTransform.localPosition = new Vector3(0.0f, 0.0f, 0.0f); + rectTransform.localScale = new Vector3(1.0f, 1.0f, 1.0f); + rectTransform.localEulerAngles = Vector3.zero; + + Text text = riftPresent.GetComponentInChildren(); + text.text = strRiftPresent; + text.fontSize = 20; + } + + /// + /// Updates the device detection. + /// + void UpdateDeviceDetection() + { + if (riftPresentTimeout >= 0.0f) + { + riftPresentTimeout -= Time.deltaTime; + } + } + + /// + /// Object Manager for Variables + /// + /// gameobject for each Variable + GameObject VariableObjectManager(GameObject gameObject, string name, float posY, string str, int fontSize) + { + gameObject = ComponentComposition(gameObject); + gameObject.name = name; + gameObject.transform.SetParent(debugUIObject.transform); + + RectTransform rectTransform = gameObject.GetComponent(); + rectTransform.localPosition = new Vector3(0.0f, posY -= offsetY, 0.0f); + + Text text = gameObject.GetComponentInChildren(); + text.text = str; + text.fontSize = fontSize; + gameObject.transform.localEulerAngles = Vector3.zero; + + rectTransform.localScale = new Vector3(1.0f, 1.0f, 1.0f); + + return gameObject; + } + + /// + /// Component composition + /// + /// Composed gameobject. + GameObject ComponentComposition(GameObject GO) + { + GO = new GameObject(); + GO.AddComponent(); + GO.AddComponent(); + GO.AddComponent(); + GO.GetComponent().sizeDelta = new Vector2(350f, 50f); + GO.GetComponent().color = new Color(7f / 255f, 45f / 255f, 71f / 255f, 200f / 255f); + + texts = new GameObject(); + texts.AddComponent(); + texts.AddComponent(); + texts.AddComponent(); + texts.GetComponent().sizeDelta = new Vector2(350f, 50f); + texts.GetComponent().font = Resources.GetBuiltinResource(typeof(Font), "Arial.ttf") as Font; + texts.GetComponent().alignment = TextAnchor.MiddleCenter; + + texts.transform.SetParent(GO.transform); + texts.name = "TextBox"; + + return GO; + } + #endregion + + #region Debugging variables handler + /// + /// Updates the IPD. + /// + void UpdateIPD() + { + strIPD = System.String.Format("IPD (mm): {0:F4}", OVRManager.profile.ipd * 1000.0f); + } + + /// + /// Updates the eye height offset. + /// + void UpdateEyeHeightOffset() + { + float eyeHeight = OVRManager.profile.eyeHeight; + strHeight = System.String.Format("Eye Height (m): {0:F3}", eyeHeight); + } + + /// + /// Updates the eye depth offset. + /// + void UpdateEyeDepthOffset() + { + float eyeDepth = OVRManager.profile.eyeDepth; + strDepth = System.String.Format("Eye Depth (m): {0:F3}", eyeDepth); + } + + /// + /// Updates the FOV. + /// + void UpdateFOV() + { +#if UNITY_2017_2_OR_NEWER + OVRDisplay.EyeRenderDesc eyeDesc = OVRManager.display.GetEyeRenderDesc(UnityEngine.XR.XRNode.LeftEye); +#else + OVRDisplay.EyeRenderDesc eyeDesc = OVRManager.display.GetEyeRenderDesc(UnityEngine.VR.VRNode.LeftEye); +#endif + strFOV = System.String.Format("FOV (deg): {0:F3}", eyeDesc.fov.y); + } + + /// + /// Updates resolution of eye texture + /// + void UpdateResolutionEyeTexture() + { +#if UNITY_2017_2_OR_NEWER + OVRDisplay.EyeRenderDesc leftEyeDesc = OVRManager.display.GetEyeRenderDesc(UnityEngine.XR.XRNode.LeftEye); + OVRDisplay.EyeRenderDesc rightEyeDesc = OVRManager.display.GetEyeRenderDesc(UnityEngine.XR.XRNode.RightEye); + + float scale = UnityEngine.XR.XRSettings.renderViewportScale; +#else + OVRDisplay.EyeRenderDesc leftEyeDesc = OVRManager.display.GetEyeRenderDesc(UnityEngine.VR.VRNode.LeftEye); + OVRDisplay.EyeRenderDesc rightEyeDesc = OVRManager.display.GetEyeRenderDesc(UnityEngine.VR.VRNode.RightEye); + + float scale = UnityEngine.VR.VRSettings.renderViewportScale; +#endif + float w = (int)(scale * (float)(leftEyeDesc.resolution.x + rightEyeDesc.resolution.x)); + float h = (int)(scale * (float)Mathf.Max(leftEyeDesc.resolution.y, rightEyeDesc.resolution.y)); + + strResolutionEyeTexture = System.String.Format("Resolution : {0} x {1}", w, h); + } + + /// + /// Updates latency values + /// + void UpdateLatencyValues() + { +#if !UNITY_ANDROID || UNITY_EDITOR + OVRDisplay.LatencyData latency = OVRManager.display.latency; + if (latency.render < 0.000001f && latency.timeWarp < 0.000001f && latency.postPresent < 0.000001f) + strLatencies = System.String.Format("Latency values are not available."); + else + strLatencies = System.String.Format("Render: {0:F3} TimeWarp: {1:F3} Post-Present: {2:F3}\nRender Error: {3:F3} TimeWarp Error: {4:F3}", + latency.render, + latency.timeWarp, + latency.postPresent, + latency.renderError, + latency.timeWarpError); +#endif + } + + /// + /// Updates the FPS. + /// + void UpdateFPS() + { + timeLeft -= Time.unscaledDeltaTime; + accum += Time.unscaledDeltaTime; + ++frames; + + // Interval ended - update GUI text and start new interval + if (timeLeft <= 0.0) + { + // display two fractional digits (f2 format) + float fps = frames / accum; + + strFPS = System.String.Format("FPS: {0:F2}", fps); + + timeLeft += updateInterval; + accum = 0.0f; + frames = 0; + } + } + #endregion +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRDebugInfo.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRDebugInfo.cs.meta new file mode 100644 index 0000000..6f1cf1e --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRDebugInfo.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b71d1996d67004241a3b69960856ffcb +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRGazePointer.cs b/Assets/Oculus/VR/Scripts/Util/OVRGazePointer.cs new file mode 100644 index 0000000..f35f8c3 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRGazePointer.cs @@ -0,0 +1,277 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. + +************************************************************************************/ + +using UnityEngine; +using System.Collections; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +/// +/// UI pointer driven by gaze input. +/// +public class OVRGazePointer : OVRCursor { + private Transform gazeIcon; //the transform that rotates according to our movement + + [Tooltip("Should the pointer be hidden when not over interactive objects.")] + public bool hideByDefault = true; + + [Tooltip("Time after leaving interactive object before pointer fades.")] + public float showTimeoutPeriod = 1; + + [Tooltip("Time after mouse pointer becoming inactive before pointer unfades.")] + public float hideTimeoutPeriod = 0.1f; + + [Tooltip("Keep a faint version of the pointer visible while using a mouse")] + public bool dimOnHideRequest = true; + + [Tooltip("Angular scale of pointer")] + public float depthScaleMultiplier = 0.03f; + + public bool matchNormalOnPhysicsColliders; + + /// + /// The gaze ray. + /// + public Transform rayTransform; + + /// + /// Is gaze pointer current visible + /// + public bool hidden { get; private set; } + + /// + /// Current scale applied to pointer + /// + public float currentScale { get; private set; } + + /// + /// Current depth of pointer from camera + /// + private float depth; + private float hideUntilTime; + /// + /// How many times position has been set this frame. Used to detect when there are no position sets in a frame. + /// + private int positionSetsThisFrame = 0; + /// + /// Last time code requested the pointer be shown. Usually when pointer passes over interactive elements. + /// + private float lastShowRequestTime; + /// + /// Last time pointer was requested to be hidden. Usually mouse pointer activity. + /// + private float lastHideRequestTime; + + // Optionally present GUI element displaying progress when using gaze-to-select mechanics + private OVRProgressIndicator progressIndicator; + + private static OVRGazePointer _instance; + public static OVRGazePointer instance + { + // If there's no GazePointer already in the scene, instanciate one now. + get + { + if (_instance == null) + { + Debug.Log(string.Format("Instanciating GazePointer", 0)); + _instance = (OVRGazePointer)GameObject.Instantiate((OVRGazePointer)Resources.Load("Prefabs/GazePointerRing", typeof(OVRGazePointer))); + } + return _instance; + } + + } + + + /// + /// Used to determine alpha level of gaze cursor. Could also be used to determine cursor size, for example, as the cursor fades out. + /// + public float visibilityStrength + { + get + { + // It's possible there are reasons to show the cursor - such as it hovering over some UI - and reasons to hide + // the cursor - such as another input method (e.g. mouse) being used. We take both of these in to account. + + + float strengthFromShowRequest; + if (hideByDefault) + { + // fade the cursor out with time + strengthFromShowRequest = Mathf.Clamp01(1 - (Time.time - lastShowRequestTime) / showTimeoutPeriod); + } + else + { + // keep it fully visible + strengthFromShowRequest = 1; + } + + // Now consider factors requesting pointer to be hidden + float strengthFromHideRequest; + + strengthFromHideRequest = (lastHideRequestTime + hideTimeoutPeriod > Time.time) ? (dimOnHideRequest ? 0.1f : 0) : 1; + + + // Hide requests take priority + return Mathf.Min(strengthFromShowRequest, strengthFromHideRequest); + } + } + + public float SelectionProgress + { + get + { + return progressIndicator ? progressIndicator.currentProgress : 0; + } + set + { + if (progressIndicator) + progressIndicator.currentProgress = value; + } + } + + public void Awake() + { + currentScale = 1; + // Only allow one instance at runtime. + if (_instance != null && _instance != this) + { + enabled = false; + DestroyImmediate(this); + return; + } + + _instance = this; + + gazeIcon = transform.Find("GazeIcon"); + progressIndicator = transform.GetComponent(); + } + + void Update () + { + if (rayTransform == null && Camera.main != null) + rayTransform = Camera.main.transform; + + // Move the gaze cursor to keep it in the middle of the view + transform.position = rayTransform.position + rayTransform.forward * depth; + + // Should we show or hide the gaze cursor? + if (visibilityStrength == 0 && !hidden) + { + Hide(); + } + else if (visibilityStrength > 0 && hidden) + { + Show(); + } + } + + /// + /// Set position and orientation of pointer + /// + /// + /// + public override void SetCursorStartDest(Vector3 _, Vector3 pos, Vector3 normal) + { + transform.position = pos; + + if (!matchNormalOnPhysicsColliders) normal = rayTransform.forward; + + // Set the rotation to match the normal of the surface it's on. + Quaternion newRot = transform.rotation; + newRot.SetLookRotation(normal, rayTransform.up); + transform.rotation = newRot; + + // record depth so that distance doesn't pop when pointer leaves an object + depth = (rayTransform.position - pos).magnitude; + + //set scale based on depth + currentScale = depth * depthScaleMultiplier; + transform.localScale = new Vector3(currentScale, currentScale, currentScale); + + positionSetsThisFrame++; + RequestShow(); + } + + public override void SetCursorRay(Transform ray) + { + // We don't do anything here, because we already set this properly by default in Update. + } + + void LateUpdate() + { + // This happens after all Updates so we know that if positionSetsThisFrame is zero then nothing set the position this frame + if (positionSetsThisFrame == 0) + { + // No geometry intersections, so gazing into space. Make the cursor face directly at the camera + Quaternion newRot = transform.rotation; + newRot.SetLookRotation(rayTransform.forward, rayTransform.up); + transform.rotation = newRot; + } + + Quaternion iconRotation = gazeIcon.rotation; + iconRotation.SetLookRotation(transform.rotation * new Vector3(0, 0, 1)); + gazeIcon.rotation = iconRotation; + + positionSetsThisFrame = 0; + } + + /// + /// Request the pointer be hidden + /// + public void RequestHide() + { + if (!dimOnHideRequest) + { + Hide(); + } + lastHideRequestTime = Time.time; + } + + /// + /// Request the pointer be shown. Hide requests take priority + /// + public void RequestShow() + { + Show(); + lastShowRequestTime = Time.time; + } + + + // Disable/Enable child elements when we show/hide the cursor. For performance reasons. + void Hide() + { + foreach (Transform child in transform) + { + child.gameObject.SetActive(false); + } + if (GetComponent()) + GetComponent().enabled = false; + hidden = true; + } + + void Show() + { + foreach (Transform child in transform) + { + child.gameObject.SetActive(true); + } + if (GetComponent()) + GetComponent().enabled = true; + hidden = false; + } + +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRGazePointer.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRGazePointer.cs.meta new file mode 100644 index 0000000..b15e43a --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRGazePointer.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 30530ad0e40d0a64ea26d753ee4996ea +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRGearVrControllerTest.cs b/Assets/Oculus/VR/Scripts/Util/OVRGearVrControllerTest.cs new file mode 100644 index 0000000..7e74c7b --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRGearVrControllerTest.cs @@ -0,0 +1,211 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using UnityEngine.UI; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +public class OVRGearVrControllerTest : MonoBehaviour +{ + public class BoolMonitor + { + public delegate bool BoolGenerator(); + + private string m_name = ""; + private BoolGenerator m_generator; + private bool m_prevValue = false; + private bool m_currentValue = false; + private bool m_currentValueRecentlyChanged = false; + private float m_displayTimeout = 0.0f; + private float m_displayTimer = 0.0f; + + public BoolMonitor(string name, BoolGenerator generator, float displayTimeout = 0.5f) + { + m_name = name; + m_generator = generator; + m_displayTimeout = displayTimeout; + } + + public void Update() + { + m_prevValue = m_currentValue; + m_currentValue = m_generator(); + + if (m_currentValue != m_prevValue) + { + m_currentValueRecentlyChanged = true; + m_displayTimer = m_displayTimeout; + } + + if (m_displayTimer > 0.0f) + { + m_displayTimer -= Time.deltaTime; + + if (m_displayTimer <= 0.0f) + { + m_currentValueRecentlyChanged = false; + m_displayTimer = 0.0f; + } + } + } + + public void AppendToStringBuilder(ref StringBuilder sb) + { + sb.Append(m_name); + + if (m_currentValue && m_currentValueRecentlyChanged) + sb.Append(": *True*\n"); + else if (m_currentValue) + sb.Append(": True \n"); + else if (!m_currentValue && m_currentValueRecentlyChanged) + sb.Append(": *False*\n"); + else if (!m_currentValue) + sb.Append(": False \n"); + } + } + + public Text uiText; + private List monitors; + private StringBuilder data; + + void Start() + { + if (uiText != null) + { + uiText.supportRichText = false; + } + + data = new StringBuilder(2048); + + monitors = new List() + { + // virtual + new BoolMonitor("WasRecentered", () => OVRInput.GetControllerWasRecentered()), + new BoolMonitor("One", () => OVRInput.Get(OVRInput.Button.One)), + new BoolMonitor("OneDown", () => OVRInput.GetDown(OVRInput.Button.One)), + new BoolMonitor("OneUp", () => OVRInput.GetUp(OVRInput.Button.One)), + new BoolMonitor("One (Touch)", () => OVRInput.Get(OVRInput.Touch.One)), + new BoolMonitor("OneDown (Touch)", () => OVRInput.GetDown(OVRInput.Touch.One)), + new BoolMonitor("OneUp (Touch)", () => OVRInput.GetUp(OVRInput.Touch.One)), + new BoolMonitor("Two", () => OVRInput.Get(OVRInput.Button.Two)), + new BoolMonitor("TwoDown", () => OVRInput.GetDown(OVRInput.Button.Two)), + new BoolMonitor("TwoUp", () => OVRInput.GetUp(OVRInput.Button.Two)), + new BoolMonitor("PrimaryIndexTrigger", () => OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger)), + new BoolMonitor("PrimaryIndexTriggerDown", () => OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger)), + new BoolMonitor("PrimaryIndexTriggerUp", () => OVRInput.GetUp(OVRInput.Button.PrimaryIndexTrigger)), + new BoolMonitor("PrimaryIndexTrigger (Touch)", () => OVRInput.Get(OVRInput.Touch.PrimaryIndexTrigger)), + new BoolMonitor("PrimaryIndexTriggerDown (Touch)", () => OVRInput.GetDown(OVRInput.Touch.PrimaryIndexTrigger)), + new BoolMonitor("PrimaryIndexTriggerUp (Touch)", () => OVRInput.GetUp(OVRInput.Touch.PrimaryIndexTrigger)), + new BoolMonitor("PrimaryHandTrigger", () => OVRInput.Get(OVRInput.Button.PrimaryHandTrigger)), + new BoolMonitor("PrimaryHandTriggerDown", () => OVRInput.GetDown(OVRInput.Button.PrimaryHandTrigger)), + new BoolMonitor("PrimaryHandTriggerUp", () => OVRInput.GetUp(OVRInput.Button.PrimaryHandTrigger)), + new BoolMonitor("Up", () => OVRInput.Get(OVRInput.Button.Up)), + new BoolMonitor("Down", () => OVRInput.Get(OVRInput.Button.Down)), + new BoolMonitor("Left", () => OVRInput.Get(OVRInput.Button.Left)), + new BoolMonitor("Right", () => OVRInput.Get(OVRInput.Button.Right)), + new BoolMonitor("Touchpad (Click)", () => OVRInput.Get(OVRInput.Button.PrimaryTouchpad)), + new BoolMonitor("TouchpadDown (Click)", () => OVRInput.GetDown(OVRInput.Button.PrimaryTouchpad)), + new BoolMonitor("TouchpadUp (Click)", () => OVRInput.GetUp(OVRInput.Button.PrimaryTouchpad)), + new BoolMonitor("Touchpad (Touch)", () => OVRInput.Get(OVRInput.Touch.PrimaryTouchpad)), + new BoolMonitor("TouchpadDown (Touch)", () => OVRInput.GetDown(OVRInput.Touch.PrimaryTouchpad)), + new BoolMonitor("TouchpadUp (Touch)", () => OVRInput.GetUp(OVRInput.Touch.PrimaryTouchpad)), + + // raw + new BoolMonitor("Start", () => OVRInput.Get(OVRInput.RawButton.Start)), + new BoolMonitor("StartDown", () => OVRInput.GetDown(OVRInput.RawButton.Start)), + new BoolMonitor("StartUp", () => OVRInput.GetUp(OVRInput.RawButton.Start)), + new BoolMonitor("Back", () => OVRInput.Get(OVRInput.RawButton.Back)), + new BoolMonitor("BackDown", () => OVRInput.GetDown(OVRInput.RawButton.Back)), + new BoolMonitor("BackUp", () => OVRInput.GetUp(OVRInput.RawButton.Back)), + new BoolMonitor("A", () => OVRInput.Get(OVRInput.RawButton.A)), + new BoolMonitor("ADown", () => OVRInput.GetDown(OVRInput.RawButton.A)), + new BoolMonitor("AUp", () => OVRInput.GetUp(OVRInput.RawButton.A)), + }; + } + static string prevConnected = ""; + static BoolMonitor controllers = new BoolMonitor("Controllers Changed", () => { return OVRInput.GetConnectedControllers().ToString() != prevConnected; }); + + void Update() + { + OVRInput.Controller activeController = OVRInput.GetActiveController(); + + data.Length = 0; + byte recenterCount = OVRInput.GetControllerRecenterCount(); + data.AppendFormat("RecenterCount: {0}\n", recenterCount); + + byte battery = OVRInput.GetControllerBatteryPercentRemaining(); + data.AppendFormat("Battery: {0}\n", battery); + + float framerate = OVRPlugin.GetAppFramerate(); + data.AppendFormat("Framerate: {0:F2}\n", framerate); + + string activeControllerName = activeController.ToString(); + data.AppendFormat("Active: {0}\n", activeControllerName); + + string connectedControllerNames = OVRInput.GetConnectedControllers().ToString(); + data.AppendFormat("Connected: {0}\n", connectedControllerNames); + + data.AppendFormat("PrevConnected: {0}\n", prevConnected); + + controllers.Update(); + controllers.AppendToStringBuilder(ref data); + + prevConnected = connectedControllerNames; + + Quaternion rot = OVRInput.GetLocalControllerRotation(activeController); + data.AppendFormat("Orientation: ({0:F2}, {1:F2}, {2:F2}, {3:F2})\n", rot.x, rot.y, rot.z, rot.w); + + Vector3 angVel = OVRInput.GetLocalControllerAngularVelocity(activeController); + data.AppendFormat("AngVel: ({0:F2}, {1:F2}, {2:F2})\n", angVel.x, angVel.y, angVel.z); + + Vector3 angAcc = OVRInput.GetLocalControllerAngularAcceleration(activeController); + data.AppendFormat("AngAcc: ({0:F2}, {1:F2}, {2:F2})\n", angAcc.x, angAcc.y, angAcc.z); + + Vector3 pos = OVRInput.GetLocalControllerPosition(activeController); + data.AppendFormat("Position: ({0:F2}, {1:F2}, {2:F2})\n", pos.x, pos.y, pos.z); + + Vector3 vel = OVRInput.GetLocalControllerVelocity(activeController); + data.AppendFormat("Vel: ({0:F2}, {1:F2}, {2:F2})\n", vel.x, vel.y, vel.z); + + Vector3 acc = OVRInput.GetLocalControllerAcceleration(activeController); + data.AppendFormat("Acc: ({0:F2}, {1:F2}, {2:F2})\n", acc.x, acc.y, acc.z); + + Vector2 primaryTouchpad = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad); + data.AppendFormat("PrimaryTouchpad: ({0:F2}, {1:F2})\n", primaryTouchpad.x, primaryTouchpad.y); + + Vector2 secondaryTouchpad = OVRInput.Get(OVRInput.Axis2D.SecondaryTouchpad); + data.AppendFormat("SecondaryTouchpad: ({0:F2}, {1:F2})\n", secondaryTouchpad.x, secondaryTouchpad.y); + + float indexTrigger = OVRInput.Get(OVRInput.Axis1D.PrimaryIndexTrigger); + data.AppendFormat("PrimaryIndexTriggerAxis1D: ({0:F2})\n", indexTrigger); + + float handTrigger = OVRInput.Get(OVRInput.Axis1D.PrimaryHandTrigger); + data.AppendFormat("PrimaryHandTriggerAxis1D: ({0:F2})\n", handTrigger); + + for (int i = 0; i < monitors.Count; i++) + { + monitors[i].Update(); + monitors[i].AppendToStringBuilder(ref data); + } + + if (uiText != null) + { + uiText.text = data.ToString(); + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRGearVrControllerTest.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRGearVrControllerTest.cs.meta new file mode 100644 index 0000000..180cf82 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRGearVrControllerTest.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7acc4619d4cb5e64e9ed05e5a7a8099f +timeCreated: 1486173066 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRGrabbable.cs b/Assets/Oculus/VR/Scripts/Util/OVRGrabbable.cs new file mode 100644 index 0000000..687a913 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRGrabbable.cs @@ -0,0 +1,164 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System; +using UnityEngine; + +/// +/// An object that can be grabbed and thrown by OVRGrabber. +/// +public class OVRGrabbable : MonoBehaviour +{ + [SerializeField] + protected bool m_allowOffhandGrab = true; + [SerializeField] + protected bool m_snapPosition = false; + [SerializeField] + protected bool m_snapOrientation = false; + [SerializeField] + protected Transform m_snapOffset; + [SerializeField] + protected Collider[] m_grabPoints = null; + + protected bool m_grabbedKinematic = false; + protected Collider m_grabbedCollider = null; + protected OVRGrabber m_grabbedBy = null; + + /// + /// If true, the object can currently be grabbed. + /// + public bool allowOffhandGrab + { + get { return m_allowOffhandGrab; } + } + + /// + /// If true, the object is currently grabbed. + /// + public bool isGrabbed + { + get { return m_grabbedBy != null; } + } + + /// + /// If true, the object's position will snap to match snapOffset when grabbed. + /// + public bool snapPosition + { + get { return m_snapPosition; } + } + + /// + /// If true, the object's orientation will snap to match snapOffset when grabbed. + /// + public bool snapOrientation + { + get { return m_snapOrientation; } + } + + /// + /// An offset relative to the OVRGrabber where this object can snap when grabbed. + /// + public Transform snapOffset + { + get { return m_snapOffset; } + } + + /// + /// Returns the OVRGrabber currently grabbing this object. + /// + public OVRGrabber grabbedBy + { + get { return m_grabbedBy; } + } + + /// + /// The transform at which this object was grabbed. + /// + public Transform grabbedTransform + { + get { return m_grabbedCollider.transform; } + } + + /// + /// The Rigidbody of the collider that was used to grab this object. + /// + public Rigidbody grabbedRigidbody + { + get { return m_grabbedCollider.attachedRigidbody; } + } + + /// + /// The contact point(s) where the object was grabbed. + /// + public Collider[] grabPoints + { + get { return m_grabPoints; } + } + + /// + /// Notifies the object that it has been grabbed. + /// + virtual public void GrabBegin(OVRGrabber hand, Collider grabPoint) + { + m_grabbedBy = hand; + m_grabbedCollider = grabPoint; + gameObject.GetComponent().isKinematic = true; + } + + /// + /// Notifies the object that it has been released. + /// + virtual public void GrabEnd(Vector3 linearVelocity, Vector3 angularVelocity) + { + Rigidbody rb = gameObject.GetComponent(); + rb.isKinematic = m_grabbedKinematic; + rb.velocity = linearVelocity; + rb.angularVelocity = angularVelocity; + m_grabbedBy = null; + m_grabbedCollider = null; + } + + void Awake() + { + if (m_grabPoints.Length == 0) + { + // Get the collider from the grabbable + Collider collider = this.GetComponent(); + if (collider == null) + { + throw new ArgumentException("Grabbables cannot have zero grab points and no collider -- please add a grab point or collider."); + } + + // Create a default grab point + m_grabPoints = new Collider[1] { collider }; + } + } + + protected virtual void Start() + { + m_grabbedKinematic = GetComponent().isKinematic; + } + + void OnDestroy() + { + if (m_grabbedBy != null) + { + // Notify the hand to release destroyed grabbables + m_grabbedBy.ForceRelease(this); + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRGrabbable.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRGrabbable.cs.meta new file mode 100644 index 0000000..cdbe4fc --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRGrabbable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 02d61468f8b77ae4b92c344bc9a600fb +timeCreated: 1481833527 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRGrabber.cs b/Assets/Oculus/VR/Scripts/Util/OVRGrabber.cs new file mode 100644 index 0000000..c2a33ef --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRGrabber.cs @@ -0,0 +1,418 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System.Collections.Generic; +using UnityEngine; + +/// +/// Allows grabbing and throwing of objects with the OVRGrabbable component on them. +/// +[RequireComponent(typeof(Rigidbody))] +public class OVRGrabber : MonoBehaviour +{ + // Grip trigger thresholds for picking up objects, with some hysteresis. + public float grabBegin = 0.55f; + public float grabEnd = 0.35f; + + bool alreadyUpdated = false; + + // Demonstrates parenting the held object to the hand's transform when grabbed. + // When false, the grabbed object is moved every FixedUpdate using MovePosition. + // Note that MovePosition is required for proper physics simulation. If you set this to true, you can + // easily observe broken physics simulation by, for example, moving the bottom cube of a stacked + // tower and noting a complete loss of friction. + [SerializeField] + protected bool m_parentHeldObject = false; + + // If true, will move the hand to the transform specified by m_parentTransform, using MovePosition in + // FixedUpdate. This allows correct physics behavior, at the cost of some latency. + // (If false, the hand can simply be attached to the hand anchor, which updates position in LateUpdate, + // gaining us a few ms of reduced latency.) + [SerializeField] + protected bool m_moveHandPosition = false; + + // Child/attached transforms of the grabber, indicating where to snap held objects to (if you snap them). + // Also used for ranking grab targets in case of multiple candidates. + [SerializeField] + protected Transform m_gripTransform = null; + // Child/attached Colliders to detect candidate grabbable objects. + [SerializeField] + protected Collider[] m_grabVolumes = null; + + // Should be OVRInput.Controller.LTouch or OVRInput.Controller.RTouch. + [SerializeField] + protected OVRInput.Controller m_controller; + + [SerializeField] + protected Transform m_parentTransform; + + [SerializeField] + protected GameObject m_player; + + protected bool m_grabVolumeEnabled = true; + protected Vector3 m_lastPos; + protected Quaternion m_lastRot; + protected Quaternion m_anchorOffsetRotation; + protected Vector3 m_anchorOffsetPosition; + protected float m_prevFlex; + protected OVRGrabbable m_grabbedObj = null; + protected Vector3 m_grabbedObjectPosOff; + protected Quaternion m_grabbedObjectRotOff; + protected Dictionary m_grabCandidates = new Dictionary(); + protected bool m_operatingWithoutOVRCameraRig = true; + + /// + /// The currently grabbed object. + /// + public OVRGrabbable grabbedObject + { + get { return m_grabbedObj; } + } + + public void ForceRelease(OVRGrabbable grabbable) + { + bool canRelease = ( + (m_grabbedObj != null) && + (m_grabbedObj == grabbable) + ); + if (canRelease) + { + GrabEnd(); + } + } + + protected virtual void Awake() + { + m_anchorOffsetPosition = transform.localPosition; + m_anchorOffsetRotation = transform.localRotation; + + if(!m_moveHandPosition) + { + // If we are being used with an OVRCameraRig, let it drive input updates, which may come from Update or FixedUpdate. + OVRCameraRig rig = transform.GetComponentInParent(); + if (rig != null) + { + rig.UpdatedAnchors += (r) => {OnUpdatedAnchors();}; + m_operatingWithoutOVRCameraRig = false; + } + } + } + + protected virtual void Start() + { + m_lastPos = transform.position; + m_lastRot = transform.rotation; + if(m_parentTransform == null) + { + if(gameObject.transform.parent != null) + { + m_parentTransform = gameObject.transform.parent.transform; + } + else + { + m_parentTransform = new GameObject().transform; + m_parentTransform.position = Vector3.zero; + m_parentTransform.rotation = Quaternion.identity; + } + } + } + + virtual public void Update() + { + alreadyUpdated = false; + } + + virtual public void FixedUpdate() + { + if (m_operatingWithoutOVRCameraRig) + { + OnUpdatedAnchors(); + } + } + + // Hands follow the touch anchors by calling MovePosition each frame to reach the anchor. + // This is done instead of parenting to achieve workable physics. If you don't require physics on + // your hands or held objects, you may wish to switch to parenting. + void OnUpdatedAnchors() + { + // Don't want to MovePosition multiple times in a frame, as it causes high judder in conjunction + // with the hand position prediction in the runtime. + if (alreadyUpdated) return; + alreadyUpdated = true; + + Vector3 destPos = m_parentTransform.TransformPoint(m_anchorOffsetPosition); + Quaternion destRot = m_parentTransform.rotation * m_anchorOffsetRotation; + + if (m_moveHandPosition) + { + GetComponent().MovePosition(destPos); + GetComponent().MoveRotation(destRot); + } + + if (!m_parentHeldObject) + { + MoveGrabbedObject(destPos, destRot); + } + + m_lastPos = transform.position; + m_lastRot = transform.rotation; + + float prevFlex = m_prevFlex; + // Update values from inputs + m_prevFlex = OVRInput.Get(OVRInput.Axis1D.PrimaryHandTrigger, m_controller); + + CheckForGrabOrRelease(prevFlex); + } + + void OnDestroy() + { + if (m_grabbedObj != null) + { + GrabEnd(); + } + } + + void OnTriggerEnter(Collider otherCollider) + { + // Get the grab trigger + OVRGrabbable grabbable = otherCollider.GetComponent() ?? otherCollider.GetComponentInParent(); + if (grabbable == null) return; + + // Add the grabbable + int refCount = 0; + m_grabCandidates.TryGetValue(grabbable, out refCount); + m_grabCandidates[grabbable] = refCount + 1; + } + + void OnTriggerExit(Collider otherCollider) + { + OVRGrabbable grabbable = otherCollider.GetComponent() ?? otherCollider.GetComponentInParent(); + if (grabbable == null) return; + + // Remove the grabbable + int refCount = 0; + bool found = m_grabCandidates.TryGetValue(grabbable, out refCount); + if (!found) + { + return; + } + + if (refCount > 1) + { + m_grabCandidates[grabbable] = refCount - 1; + } + else + { + m_grabCandidates.Remove(grabbable); + } + } + + protected void CheckForGrabOrRelease(float prevFlex) + { + if ((m_prevFlex >= grabBegin) && (prevFlex < grabBegin)) + { + GrabBegin(); + } + else if ((m_prevFlex <= grabEnd) && (prevFlex > grabEnd)) + { + GrabEnd(); + } + } + + protected virtual void GrabBegin() + { + float closestMagSq = float.MaxValue; + OVRGrabbable closestGrabbable = null; + Collider closestGrabbableCollider = null; + + // Iterate grab candidates and find the closest grabbable candidate + foreach (OVRGrabbable grabbable in m_grabCandidates.Keys) + { + bool canGrab = !(grabbable.isGrabbed && !grabbable.allowOffhandGrab); + if (!canGrab) + { + continue; + } + + for (int j = 0; j < grabbable.grabPoints.Length; ++j) + { + Collider grabbableCollider = grabbable.grabPoints[j]; + // Store the closest grabbable + Vector3 closestPointOnBounds = grabbableCollider.ClosestPointOnBounds(m_gripTransform.position); + float grabbableMagSq = (m_gripTransform.position - closestPointOnBounds).sqrMagnitude; + if (grabbableMagSq < closestMagSq) + { + closestMagSq = grabbableMagSq; + closestGrabbable = grabbable; + closestGrabbableCollider = grabbableCollider; + } + } + } + + // Disable grab volumes to prevent overlaps + GrabVolumeEnable(false); + + if (closestGrabbable != null) + { + if (closestGrabbable.isGrabbed) + { + closestGrabbable.grabbedBy.OffhandGrabbed(closestGrabbable); + } + + m_grabbedObj = closestGrabbable; + m_grabbedObj.GrabBegin(this, closestGrabbableCollider); + + m_lastPos = transform.position; + m_lastRot = transform.rotation; + + // Set up offsets for grabbed object desired position relative to hand. + if(m_grabbedObj.snapPosition) + { + m_grabbedObjectPosOff = m_gripTransform.localPosition; + if(m_grabbedObj.snapOffset) + { + Vector3 snapOffset = m_grabbedObj.snapOffset.position; + if (m_controller == OVRInput.Controller.LTouch) snapOffset.x = -snapOffset.x; + m_grabbedObjectPosOff += snapOffset; + } + } + else + { + Vector3 relPos = m_grabbedObj.transform.position - transform.position; + relPos = Quaternion.Inverse(transform.rotation) * relPos; + m_grabbedObjectPosOff = relPos; + } + + if (m_grabbedObj.snapOrientation) + { + m_grabbedObjectRotOff = m_gripTransform.localRotation; + if(m_grabbedObj.snapOffset) + { + m_grabbedObjectRotOff = m_grabbedObj.snapOffset.rotation * m_grabbedObjectRotOff; + } + } + else + { + Quaternion relOri = Quaternion.Inverse(transform.rotation) * m_grabbedObj.transform.rotation; + m_grabbedObjectRotOff = relOri; + } + + // Note: force teleport on grab, to avoid high-speed travel to dest which hits a lot of other objects at high + // speed and sends them flying. The grabbed object may still teleport inside of other objects, but fixing that + // is beyond the scope of this demo. + MoveGrabbedObject(m_lastPos, m_lastRot, true); + SetPlayerIgnoreCollision(m_grabbedObj.gameObject, true); + if (m_parentHeldObject) + { + m_grabbedObj.transform.parent = transform; + } + } + } + + protected virtual void MoveGrabbedObject(Vector3 pos, Quaternion rot, bool forceTeleport = false) + { + if (m_grabbedObj == null) + { + return; + } + + Rigidbody grabbedRigidbody = m_grabbedObj.grabbedRigidbody; + Vector3 grabbablePosition = pos + rot * m_grabbedObjectPosOff; + Quaternion grabbableRotation = rot * m_grabbedObjectRotOff; + + if (forceTeleport) + { + grabbedRigidbody.transform.position = grabbablePosition; + grabbedRigidbody.transform.rotation = grabbableRotation; + } + else + { + grabbedRigidbody.MovePosition(grabbablePosition); + grabbedRigidbody.MoveRotation(grabbableRotation); + } + } + + protected void GrabEnd() + { + if (m_grabbedObj != null) + { + OVRPose localPose = new OVRPose { position = OVRInput.GetLocalControllerPosition(m_controller), orientation = OVRInput.GetLocalControllerRotation(m_controller) }; + OVRPose offsetPose = new OVRPose { position = m_anchorOffsetPosition, orientation = m_anchorOffsetRotation }; + localPose = localPose * offsetPose; + + OVRPose trackingSpace = transform.ToOVRPose() * localPose.Inverse(); + Vector3 linearVelocity = trackingSpace.orientation * OVRInput.GetLocalControllerVelocity(m_controller); + Vector3 angularVelocity = trackingSpace.orientation * OVRInput.GetLocalControllerAngularVelocity(m_controller); + + GrabbableRelease(linearVelocity, angularVelocity); + } + + // Re-enable grab volumes to allow overlap events + GrabVolumeEnable(true); + } + + protected void GrabbableRelease(Vector3 linearVelocity, Vector3 angularVelocity) + { + m_grabbedObj.GrabEnd(linearVelocity, angularVelocity); + if(m_parentHeldObject) m_grabbedObj.transform.parent = null; + SetPlayerIgnoreCollision(m_grabbedObj.gameObject, false); + m_grabbedObj = null; + } + + protected virtual void GrabVolumeEnable(bool enabled) + { + if (m_grabVolumeEnabled == enabled) + { + return; + } + + m_grabVolumeEnabled = enabled; + for (int i = 0; i < m_grabVolumes.Length; ++i) + { + Collider grabVolume = m_grabVolumes[i]; + grabVolume.enabled = m_grabVolumeEnabled; + } + + if (!m_grabVolumeEnabled) + { + m_grabCandidates.Clear(); + } + } + + protected virtual void OffhandGrabbed(OVRGrabbable grabbable) + { + if (m_grabbedObj == grabbable) + { + GrabbableRelease(Vector3.zero, Vector3.zero); + } + } + + protected void SetPlayerIgnoreCollision(GameObject grabbable, bool ignore) + { + if (m_player != null) + { + Collider playerCollider = m_player.GetComponent(); + if (playerCollider != null) + { + Collider[] colliders = grabbable.GetComponents(); + foreach (Collider c in colliders) + { + Physics.IgnoreCollision(c, playerCollider, ignore); + } + } + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRGrabber.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRGrabber.cs.meta new file mode 100644 index 0000000..3701fc8 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRGrabber.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fd425c2d06f39bf4899d07c05d0f10eb +timeCreated: 1481832436 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRGridCube.cs b/Assets/Oculus/VR/Scripts/Util/OVRGridCube.cs new file mode 100644 index 0000000..734b640 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRGridCube.cs @@ -0,0 +1,190 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections; + +/// +/// Diagnostic display with a regular grid of cubes for visual testing of +/// tracking and distortion. +/// +public class OVRGridCube : MonoBehaviour +{ + /// + /// The key that toggles the grid of cubes. + /// + public KeyCode GridKey = KeyCode.G; + + private GameObject CubeGrid = null; + + private bool CubeGridOn = false; + private bool CubeSwitchColorOld = false; + private bool CubeSwitchColor = false; + + private int gridSizeX = 6; + private int gridSizeY = 4; + private int gridSizeZ = 6; + private float gridScale = 0.3f; + private float cubeScale = 0.03f; + + // Handle to OVRCameraRig + private OVRCameraRig CameraController = null; + + /// + /// Update this instance. + /// + void Update () + { + UpdateCubeGrid(); + } + + /// + /// Sets the OVR camera controller. + /// + /// Camera controller. + public void SetOVRCameraController(ref OVRCameraRig cameraController) + { + CameraController = cameraController; + } + + void UpdateCubeGrid() + { + // Toggle the grid cube display on 'G' + if(Input.GetKeyDown(GridKey)) + { + if(CubeGridOn == false) + { + CubeGridOn = true; + Debug.LogWarning("CubeGrid ON"); + if(CubeGrid != null) + CubeGrid.SetActive(true); + else + CreateCubeGrid(); + } + else + { + CubeGridOn = false; + Debug.LogWarning("CubeGrid OFF"); + + if(CubeGrid != null) + CubeGrid.SetActive(false); + } + } + + if(CubeGrid != null) + { + // Set cube colors to let user know if camera is tracking + CubeSwitchColor = !OVRManager.tracker.isPositionTracked; + + if(CubeSwitchColor != CubeSwitchColorOld) + CubeGridSwitchColor(CubeSwitchColor); + CubeSwitchColorOld = CubeSwitchColor; + } + } + + void CreateCubeGrid() + { + Debug.LogWarning("Create CubeGrid"); + + // Create the visual cube grid + CubeGrid = new GameObject("CubeGrid"); + // Set a layer to target a specific camera + CubeGrid.layer = CameraController.gameObject.layer; + + for (int x = -gridSizeX; x <= gridSizeX; x++) + for (int y = -gridSizeY; y <= gridSizeY; y++) + for (int z = -gridSizeZ; z <= gridSizeZ; z++) + { + // Set the cube type: + // 0 = non-axis cube + // 1 = axis cube + // 2 = center cube + int CubeType = 0; + if ((x == 0 && y == 0) || (x == 0 && z == 0) || (y == 0 && z == 0)) + { + if((x == 0) && (y == 0) && (z == 0)) + CubeType = 2; + else + CubeType = 1; + } + + GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); + + BoxCollider bc = cube.GetComponent(); + bc.enabled = false; + + cube.layer = CameraController.gameObject.layer; + + // No shadows + Renderer r = cube.GetComponent(); + +#if UNITY_4_0 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_5 || UNITY_4_6 + // Renderer.castShadows was deprecated starting in Unity 5.0 + r.castShadows = false; +#else + r.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; +#endif + + r.receiveShadows = false; + + // Cube line is white down the middle + if (CubeType == 0) + r.material.color = Color.red; + else if (CubeType == 1) + r.material.color = Color.white; + else + r.material.color = Color.yellow; + + cube.transform.position = + new Vector3(((float)x * gridScale), + ((float)y * gridScale), + ((float)z * gridScale)); + + float s = 0.7f; + + // Axis cubes are bigger + if(CubeType == 1) + s = 1.0f; + // Center cube is the largest + if(CubeType == 2) + s = 2.0f; + + cube.transform.localScale = + new Vector3(cubeScale * s, cubeScale * s, cubeScale * s); + + cube.transform.parent = CubeGrid.transform; + } + } + + /// + /// Switch the Cube grid color. + /// + /// If set to true cube switch color. + void CubeGridSwitchColor(bool CubeSwitchColor) + { + Color c = Color.red; + if(CubeSwitchColor == true) + c = Color.blue; + + foreach(Transform child in CubeGrid.transform) + { + Material m = child.GetComponent().material; + // Cube line is white down the middle + if(m.color == Color.red || m.color == Color.blue) + m.color = c; + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRGridCube.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRGridCube.cs.meta new file mode 100644 index 0000000..297ee3e --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRGridCube.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4988596c8a187f94f8e6a345ebb4254b +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRHand.cs b/Assets/Oculus/VR/Scripts/Util/OVRHand.cs new file mode 100644 index 0000000..399b314 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRHand.cs @@ -0,0 +1,201 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[DefaultExecutionOrder(-90)] +public class OVRHand : MonoBehaviour, + OVRSkeleton.IOVRSkeletonDataProvider, + OVRSkeletonRenderer.IOVRSkeletonRendererDataProvider, + OVRMesh.IOVRMeshDataProvider, + OVRMeshRenderer.IOVRMeshRendererDataProvider +{ + public enum Hand + { + None = OVRPlugin.Hand.None, + HandLeft = OVRPlugin.Hand.HandLeft, + HandRight = OVRPlugin.Hand.HandRight, + } + + public enum HandFinger + { + Thumb = OVRPlugin.HandFinger.Thumb, + Index = OVRPlugin.HandFinger.Index, + Middle = OVRPlugin.HandFinger.Middle, + Ring = OVRPlugin.HandFinger.Ring, + Pinky = OVRPlugin.HandFinger.Pinky, + } + + public enum TrackingConfidence + { + Low = OVRPlugin.TrackingConfidence.Low, + High = OVRPlugin.TrackingConfidence.High + } + + [SerializeField] + private Hand HandType = Hand.None; + private OVRPlugin.HandState _handState = new OVRPlugin.HandState(); + private bool _isInitialized = false; + private GameObject _pointerPoseGO; + + public bool IsTracked { get; private set; } + public bool IsSystemGestureInProgress { get; private set; } + public bool IsPointerPoseValid { get; private set; } + public Transform PointerPose { get; private set; } + public float HandScale { get; private set; } + public TrackingConfidence HandConfidence { get; private set; } + + private void Awake() + { + _pointerPoseGO = new GameObject(); + PointerPose = _pointerPoseGO.transform; + + GetHandState(OVRPlugin.Step.Render); + } + + private void Update() + { + GetHandState(OVRPlugin.Step.Render); + } + + private void FixedUpdate() + { + GetHandState(OVRPlugin.Step.Physics); + } + + private void GetHandState(OVRPlugin.Step step) + { + if (OVRPlugin.GetHandState(step, (OVRPlugin.Hand)HandType, ref _handState)) + { + IsTracked = (_handState.Status & OVRPlugin.HandStatus.HandTracked) != 0; + IsSystemGestureInProgress = (_handState.Status & OVRPlugin.HandStatus.SystemGestureInProgress) != 0; + IsPointerPoseValid = (_handState.Status & OVRPlugin.HandStatus.InputStateValid) != 0; + PointerPose.localPosition = _handState.PointerPose.Position.FromFlippedZVector3f(); + PointerPose.localRotation = _handState.PointerPose.Orientation.FromFlippedZQuatf(); + HandScale = _handState.HandScale; + HandConfidence = (TrackingConfidence)_handState.HandConfidence; + + _isInitialized = true; + } + else + { + _isInitialized = false; + } + } + + public bool GetFingerIsPinching(HandFinger finger) + { + return _isInitialized && (((int)_handState.Pinches & (1 << (int)finger)) != 0); + } + + public float GetFingerPinchStrength(HandFinger finger) + { + if (_isInitialized + && _handState.PinchStrength != null + && _handState.PinchStrength.Length == (int)OVRPlugin.HandFinger.Max) + { + return _handState.PinchStrength[(int)finger]; + } + + return 0.0f; + } + + public TrackingConfidence GetFingerConfidence(HandFinger finger) + { + if (_isInitialized + && _handState.FingerConfidences != null + && _handState.FingerConfidences.Length == (int)OVRPlugin.HandFinger.Max) + { + return (TrackingConfidence)_handState.FingerConfidences[(int)finger]; + } + + return TrackingConfidence.Low; + } + + OVRSkeleton.SkeletonType OVRSkeleton.IOVRSkeletonDataProvider.GetSkeletonType() + { + switch (HandType) + { + case Hand.HandLeft: + return OVRSkeleton.SkeletonType.HandLeft; + case Hand.HandRight: + return OVRSkeleton.SkeletonType.HandRight; + case Hand.None: + default: + return OVRSkeleton.SkeletonType.None; + } + } + + OVRSkeleton.SkeletonPoseData OVRSkeleton.IOVRSkeletonDataProvider.GetSkeletonPoseData() + { + var data = new OVRSkeleton.SkeletonPoseData(); + + data.IsDataValid = _isInitialized; + if (_isInitialized) + { + data.RootPose = _handState.RootPose; + data.RootScale = _handState.HandScale; + data.BoneRotations = _handState.BoneRotations; + data.IsDataHighConfidence = IsTracked && HandConfidence == TrackingConfidence.High; + } + + return data; + } + + OVRSkeletonRenderer.SkeletonRendererData OVRSkeletonRenderer.IOVRSkeletonRendererDataProvider.GetSkeletonRendererData() + { + var data = new OVRSkeletonRenderer.SkeletonRendererData(); + + data.IsDataValid = _isInitialized; + if (_isInitialized) + { + data.RootScale = _handState.HandScale; + data.IsDataHighConfidence = IsTracked && HandConfidence == TrackingConfidence.High; + } + + return data; + } + + OVRMesh.MeshType OVRMesh.IOVRMeshDataProvider.GetMeshType() + { + switch (HandType) + { + case Hand.None: + return OVRMesh.MeshType.None; + case Hand.HandLeft: + return OVRMesh.MeshType.HandLeft; + case Hand.HandRight: + return OVRMesh.MeshType.HandRight; + default: + return OVRMesh.MeshType.None; + } + } + + OVRMeshRenderer.MeshRendererData OVRMeshRenderer.IOVRMeshRendererDataProvider.GetMeshRendererData() + { + var data = new OVRMeshRenderer.MeshRendererData(); + + data.IsDataValid = _isInitialized; + if (_isInitialized) + { + data.IsDataHighConfidence = IsTracked && HandConfidence == TrackingConfidence.High; + } + + return data; + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRHand.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRHand.cs.meta new file mode 100644 index 0000000..433b86c --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRHand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cb7623a8f0b49cf4dbaa40aea4d4be64 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRHandTest.cs b/Assets/Oculus/VR/Scripts/Util/OVRHandTest.cs new file mode 100644 index 0000000..979768c --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRHandTest.cs @@ -0,0 +1,191 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using UnityEngine.UI; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +public class OVRHandTest : MonoBehaviour +{ + public class BoolMonitor + { + public delegate bool BoolGenerator(); + + private string m_name = ""; + private BoolGenerator m_generator; + private bool m_prevValue = false; + private bool m_currentValue = false; + private bool m_currentValueRecentlyChanged = false; + private float m_displayTimeout = 0.0f; + private float m_displayTimer = 0.0f; + + public BoolMonitor(string name, BoolGenerator generator, float displayTimeout = 0.5f) + { + m_name = name; + m_generator = generator; + m_displayTimeout = displayTimeout; + } + + public void Update() + { + m_prevValue = m_currentValue; + m_currentValue = m_generator(); + + if (m_currentValue != m_prevValue) + { + m_currentValueRecentlyChanged = true; + m_displayTimer = m_displayTimeout; + } + + if (m_displayTimer > 0.0f) + { + m_displayTimer -= Time.deltaTime; + + if (m_displayTimer <= 0.0f) + { + m_currentValueRecentlyChanged = false; + m_displayTimer = 0.0f; + } + } + } + + public void AppendToStringBuilder(ref StringBuilder sb) + { + sb.Append(m_name); + + if (m_currentValue && m_currentValueRecentlyChanged) + sb.Append(": *True*\n"); + else if (m_currentValue) + sb.Append(": True \n"); + else if (!m_currentValue && m_currentValueRecentlyChanged) + sb.Append(": *False*\n"); + else if (!m_currentValue) + sb.Append(": False \n"); + } + } + + public Text uiText; + private List monitors; + private StringBuilder data; + + private OVRPlugin.HandState hs_LH = new OVRPlugin.HandState(); + private OVRPlugin.HandState hs_RH = new OVRPlugin.HandState(); + + private OVRPlugin.Skeleton skel_LH = new OVRPlugin.Skeleton(); + private OVRPlugin.Skeleton skel_RH = new OVRPlugin.Skeleton(); + + private OVRPlugin.Mesh mesh_LH = new OVRPlugin.Mesh(); + private OVRPlugin.Mesh mesh_RH = new OVRPlugin.Mesh(); + + private bool result_skel_LH = false; + private bool result_skel_RH = false; + + private bool result_mesh_LH = false; + private bool result_mesh_RH = false; + + void Start() + { + if (uiText != null) + { + uiText.supportRichText = false; + } + + data = new StringBuilder(2048); + + monitors = new List() + { + new BoolMonitor("WasRecentered", () => OVRInput.GetControllerWasRecentered()), + new BoolMonitor("One", () => OVRInput.Get(OVRInput.Button.One)), + }; + + result_skel_LH = OVRPlugin.GetSkeleton(OVRPlugin.SkeletonType.HandLeft, out skel_LH); + result_skel_RH = OVRPlugin.GetSkeleton(OVRPlugin.SkeletonType.HandRight, out skel_RH); + + result_mesh_LH = OVRPlugin.GetMesh(OVRPlugin.MeshType.HandLeft, out mesh_LH); + result_mesh_RH = OVRPlugin.GetMesh(OVRPlugin.MeshType.HandRight, out mesh_RH); + } + + static string prevConnected = ""; + static BoolMonitor controllers = new BoolMonitor("Controllers Changed", () => { return OVRInput.GetConnectedControllers().ToString() != prevConnected; }); + + void Update() + { + data.Length = 0; + + OVRInput.Controller activeController = OVRInput.GetActiveController(); + + string activeControllerName = activeController.ToString(); + data.AppendFormat("Active: {0}\n", activeControllerName); + + string connectedControllerNames = OVRInput.GetConnectedControllers().ToString(); + data.AppendFormat("Connected: {0}\n", connectedControllerNames); + + data.AppendFormat("PrevConnected: {0}\n", prevConnected); + + controllers.Update(); + controllers.AppendToStringBuilder(ref data); + prevConnected = connectedControllerNames; + + Vector3 pos = OVRInput.GetLocalControllerPosition(activeController); + data.AppendFormat("Position: ({0:F2}, {1:F2}, {2:F2})\n", pos.x, pos.y, pos.z); + + Quaternion rot = OVRInput.GetLocalControllerRotation(activeController); + data.AppendFormat("Orientation: ({0:F2}, {1:F2}, {2:F2}, {3:F2})\n", rot.x, rot.y, rot.z, rot.w); + + data.AppendFormat("HandTrackingEnabled: {0}\n", OVRPlugin.GetHandTrackingEnabled()); + + bool result_hs_LH = OVRPlugin.GetHandState(OVRPlugin.Step.Render, OVRPlugin.Hand.HandLeft, ref hs_LH); + data.AppendFormat("LH HS Query Res: {0}\n", result_hs_LH); + data.AppendFormat("LH HS Status: {0}\n", hs_LH.Status); + data.AppendFormat("LH HS Pose: {0}\n", hs_LH.RootPose); + data.AppendFormat("LH HS HandConf: {0}\n", hs_LH.HandConfidence); + + bool result_hs_RH = OVRPlugin.GetHandState(OVRPlugin.Step.Render, OVRPlugin.Hand.HandRight, ref hs_RH); + data.AppendFormat("RH HS Query Res: {0}\n", result_hs_RH); + data.AppendFormat("RH HS Status: {0}\n", hs_RH.Status); + data.AppendFormat("RH HS Pose: {0}\n", hs_RH.RootPose); + data.AppendFormat("RH HS HandConf: {0}\n", hs_RH.HandConfidence); + + data.AppendFormat("LH Skel Query Res: {0}\n", result_skel_LH); + data.AppendFormat("LH Skel Type: {0}\n", skel_LH.Type); + data.AppendFormat("LH Skel NumBones: {0}\n", skel_LH.NumBones); + + data.AppendFormat("RH Skel Query Res: {0}\n", result_skel_RH); + data.AppendFormat("RH Skel Type: {0}\n", skel_RH.Type); + data.AppendFormat("RH Skel NumBones: {0}\n", skel_RH.NumBones); + + data.AppendFormat("LH Mesh Query Res: {0}\n", result_mesh_LH); + data.AppendFormat("LH Mesh Type: {0}\n", mesh_LH.Type); + data.AppendFormat("LH Mesh NumVers: {0}\n", mesh_LH.NumVertices); + + data.AppendFormat("RH Mesh Query Res: {0}\n", result_mesh_RH); + data.AppendFormat("RH Mesh Type: {0}\n", mesh_RH.Type); + data.AppendFormat("RH Mesh NumVers: {0}\n", mesh_RH.NumVertices); + + for (int i = 0; i < monitors.Count; i++) + { + monitors[i].Update(); + monitors[i].AppendToStringBuilder(ref data); + } + + if (uiText != null) + { + uiText.text = data.ToString(); + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRHandTest.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRHandTest.cs.meta new file mode 100644 index 0000000..8aa43a1 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRHandTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 12a1e4a79af8fe849b7a2769ff0d3886 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRInputModule.cs b/Assets/Oculus/VR/Scripts/Util/OVRInputModule.cs new file mode 100644 index 0000000..15675a0 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRInputModule.cs @@ -0,0 +1,894 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace UnityEngine.EventSystems +{ + /// + /// VR extension of PointerInputModule which supports gaze and controller pointing. + /// + public class OVRInputModule : PointerInputModule + { + [Tooltip("Object which points with Z axis. E.g. CentreEyeAnchor from OVRCameraRig")] + public Transform rayTransform; + + public OVRCursor m_Cursor; + + [Tooltip("Gamepad button to act as gaze click")] + public OVRInput.Button joyPadClickButton = OVRInput.Button.One; + + [Tooltip("Keyboard button to act as gaze click")] + public KeyCode gazeClickKey = KeyCode.Space; + + [Header("Physics")] + [Tooltip("Perform an sphere cast to determine correct depth for gaze pointer")] + public bool performSphereCastForGazepointer; + + [Header("Gamepad Stick Scroll")] + [Tooltip("Enable scrolling with the right stick on a gamepad")] + public bool useRightStickScroll = true; + + [Tooltip("Deadzone for right stick to prevent accidental scrolling")] + public float rightStickDeadZone = 0.15f; + + [Header("Touchpad Swipe Scroll")] + [Tooltip("Enable scrolling by swiping the GearVR touchpad")] + public bool useSwipeScroll = true; + [Tooltip("Minimum trackpad movement in pixels to start swiping")] + public float swipeDragThreshold = 2; + [Tooltip("Distance scrolled when swipe scroll occurs")] + public float swipeDragScale = 1f; + /* It's debatable which way left and right are on the Gear VR touchpad since it's facing away from you + * the following bool allows this to be swapped*/ + [Tooltip("Invert X axis on touchpad")] + public bool InvertSwipeXAxis = false; + + + // The raycaster that gets to do pointer interaction (e.g. with a mouse), gaze interaction always works + [NonSerialized] + public OVRRaycaster activeGraphicRaycaster; + [Header("Dragging")] + [Tooltip("Minimum pointer movement in degrees to start dragging")] + public float angleDragThreshold = 1; + + [SerializeField] + private float m_SpherecastRadius = 1.0f; + + + + + + // The following region contains code exactly the same as the implementation + // of StandaloneInputModule. It is copied here rather than inheriting from StandaloneInputModule + // because most of StandaloneInputModule is private so it isn't possible to easily derive from. + // Future changes from Unity to StandaloneInputModule will make it possible for this class to + // derive from StandaloneInputModule instead of PointerInput module. + // + // The following functions are not present in the following region since they have modified + // versions in the next region: + // Process + // ProcessMouseEvent + // UseMouse + #region StandaloneInputModule code + private float m_NextAction; + + private Vector2 m_LastMousePosition; + private Vector2 m_MousePosition; + + protected OVRInputModule() + {} + +#if UNITY_EDITOR + protected override void Reset() + { + allowActivationOnMobileDevice = true; + } +#endif + + [Obsolete("Mode is no longer needed on input module as it handles both mouse and keyboard simultaneously.", false)] + public enum InputMode + { + Mouse, + Buttons + } + + [Obsolete("Mode is no longer needed on input module as it handles both mouse and keyboard simultaneously.", false)] + public InputMode inputMode + { + get { return InputMode.Mouse; } + } + [Header("Standalone Input Module")] + [SerializeField] + private string m_HorizontalAxis = "Horizontal"; + + /// + /// Name of the vertical axis for movement (if axis events are used). + /// + [SerializeField] + private string m_VerticalAxis = "Vertical"; + + /// + /// Name of the submit button. + /// + [SerializeField] + private string m_SubmitButton = "Submit"; + + /// + /// Name of the submit button. + /// + [SerializeField] + private string m_CancelButton = "Cancel"; + + [SerializeField] + private float m_InputActionsPerSecond = 10; + + [SerializeField] + private bool m_AllowActivationOnMobileDevice; + + public bool allowActivationOnMobileDevice + { + get { return m_AllowActivationOnMobileDevice; } + set { m_AllowActivationOnMobileDevice = value; } + } + + public float inputActionsPerSecond + { + get { return m_InputActionsPerSecond; } + set { m_InputActionsPerSecond = value; } + } + + /// + /// Name of the horizontal axis for movement (if axis events are used). + /// + public string horizontalAxis + { + get { return m_HorizontalAxis; } + set { m_HorizontalAxis = value; } + } + + /// + /// Name of the vertical axis for movement (if axis events are used). + /// + public string verticalAxis + { + get { return m_VerticalAxis; } + set { m_VerticalAxis = value; } + } + + public string submitButton + { + get { return m_SubmitButton; } + set { m_SubmitButton = value; } + } + + public string cancelButton + { + get { return m_CancelButton; } + set { m_CancelButton = value; } + } + + public override void UpdateModule() + { + m_LastMousePosition = m_MousePosition; + m_MousePosition = Input.mousePosition; + } + + public override bool IsModuleSupported() + { + // Check for mouse presence instead of whether touch is supported, + // as you can connect mouse to a tablet and in that case we'd want + // to use StandaloneInputModule for non-touch input events. + return m_AllowActivationOnMobileDevice || Input.mousePresent; + } + + public override bool ShouldActivateModule() + { + if (!base.ShouldActivateModule()) + return false; + + var shouldActivate = Input.GetButtonDown(m_SubmitButton); + shouldActivate |= Input.GetButtonDown(m_CancelButton); + shouldActivate |= !Mathf.Approximately(Input.GetAxisRaw(m_HorizontalAxis), 0.0f); + shouldActivate |= !Mathf.Approximately(Input.GetAxisRaw(m_VerticalAxis), 0.0f); + shouldActivate |= (m_MousePosition - m_LastMousePosition).sqrMagnitude > 0.0f; + shouldActivate |= Input.GetMouseButtonDown(0); + return shouldActivate; + } + + public override void ActivateModule() + { + base.ActivateModule(); + m_MousePosition = Input.mousePosition; + m_LastMousePosition = Input.mousePosition; + + var toSelect = eventSystem.currentSelectedGameObject; + if (toSelect == null) + toSelect = eventSystem.firstSelectedGameObject; + + eventSystem.SetSelectedGameObject(toSelect, GetBaseEventData()); + } + + public override void DeactivateModule() + { + base.DeactivateModule(); + ClearSelection(); + } + + + + /// + /// Process submit keys. + /// + private bool SendSubmitEventToSelectedObject() + { + if (eventSystem.currentSelectedGameObject == null) + return false; + + var data = GetBaseEventData(); + if (Input.GetButtonDown(m_SubmitButton)) + ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.submitHandler); + + if (Input.GetButtonDown(m_CancelButton)) + ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.cancelHandler); + return data.used; + } + + private bool AllowMoveEventProcessing(float time) + { + bool allow = Input.GetButtonDown(m_HorizontalAxis); + allow |= Input.GetButtonDown(m_VerticalAxis); + allow |= (time > m_NextAction); + return allow; + } + + private Vector2 GetRawMoveVector() + { + Vector2 move = Vector2.zero; + move.x = Input.GetAxisRaw(m_HorizontalAxis); + move.y = Input.GetAxisRaw(m_VerticalAxis); + + if (Input.GetButtonDown(m_HorizontalAxis)) + { + if (move.x < 0) + move.x = -1f; + if (move.x > 0) + move.x = 1f; + } + if (Input.GetButtonDown(m_VerticalAxis)) + { + if (move.y < 0) + move.y = -1f; + if (move.y > 0) + move.y = 1f; + } + return move; + } + + /// + /// Process keyboard events. + /// + private bool SendMoveEventToSelectedObject() + { + float time = Time.unscaledTime; + + if (!AllowMoveEventProcessing(time)) + return false; + + Vector2 movement = GetRawMoveVector(); + // Debug.Log(m_ProcessingEvent.rawType + " axis:" + m_AllowAxisEvents + " value:" + "(" + x + "," + y + ")"); + var axisEventData = GetAxisEventData(movement.x, movement.y, 0.6f); + if (!Mathf.Approximately(axisEventData.moveVector.x, 0f) + || !Mathf.Approximately(axisEventData.moveVector.y, 0f)) + { + ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, axisEventData, ExecuteEvents.moveHandler); + } + m_NextAction = time + 1f / m_InputActionsPerSecond; + return axisEventData.used; + } + + + + + + private bool SendUpdateEventToSelectedObject() + { + if (eventSystem.currentSelectedGameObject == null) + return false; + + var data = GetBaseEventData(); + ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.updateSelectedHandler); + return data.used; + } + + /// + /// Process the current mouse press. + /// + private void ProcessMousePress(MouseButtonEventData data) + { + var pointerEvent = data.buttonData; + var currentOverGo = pointerEvent.pointerCurrentRaycast.gameObject; + + // PointerDown notification + if (data.PressedThisFrame()) + { + pointerEvent.eligibleForClick = true; + pointerEvent.delta = Vector2.zero; + pointerEvent.dragging = false; + pointerEvent.useDragThreshold = true; + pointerEvent.pressPosition = pointerEvent.position; + if (pointerEvent.IsVRPointer()) + { + pointerEvent.SetSwipeStart(Input.mousePosition); + } + pointerEvent.pointerPressRaycast = pointerEvent.pointerCurrentRaycast; + + DeselectIfSelectionChanged(currentOverGo, pointerEvent); + + // search for the control that will receive the press + // if we can't find a press handler set the press + // handler to be what would receive a click. + var newPressed = ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.pointerDownHandler); + + // didnt find a press handler... search for a click handler + if (newPressed == null) + newPressed = ExecuteEvents.GetEventHandler(currentOverGo); + + // Debug.Log("Pressed: " + newPressed); + + float time = Time.unscaledTime; + + if (newPressed == pointerEvent.lastPress) + { + var diffTime = time - pointerEvent.clickTime; + if (diffTime < 0.3f) + ++pointerEvent.clickCount; + else + pointerEvent.clickCount = 1; + + pointerEvent.clickTime = time; + } + else + { + pointerEvent.clickCount = 1; + } + + pointerEvent.pointerPress = newPressed; + pointerEvent.rawPointerPress = currentOverGo; + + pointerEvent.clickTime = time; + + // Save the drag handler as well + pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler(currentOverGo); + + if (pointerEvent.pointerDrag != null) + ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag); + } + + // PointerUp notification + if (data.ReleasedThisFrame()) + { + // Debug.Log("Executing pressup on: " + pointer.pointerPress); + ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerUpHandler); + + // Debug.Log("KeyCode: " + pointer.eventData.keyCode); + + // see if we mouse up on the same element that we clicked on... + var pointerUpHandler = ExecuteEvents.GetEventHandler(currentOverGo); + + // PointerClick and Drop events + if (pointerEvent.pointerPress == pointerUpHandler && pointerEvent.eligibleForClick) + { + ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerClickHandler); + } + else if (pointerEvent.pointerDrag != null) + { + ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.dropHandler); + } + + pointerEvent.eligibleForClick = false; + pointerEvent.pointerPress = null; + pointerEvent.rawPointerPress = null; + + if (pointerEvent.pointerDrag != null && pointerEvent.dragging) + ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.endDragHandler); + + pointerEvent.dragging = false; + pointerEvent.pointerDrag = null; + + // redo pointer enter / exit to refresh state + // so that if we moused over somethign that ignored it before + // due to having pressed on something else + // it now gets it. + if (currentOverGo != pointerEvent.pointerEnter) + { + HandlePointerExitAndEnter(pointerEvent, null); + HandlePointerExitAndEnter(pointerEvent, currentOverGo); + } + } + } +#endregion + #region Modified StandaloneInputModule methods + + /// + /// Process all mouse events. This is the same as the StandaloneInputModule version except that + /// it takes MouseState as a parameter, allowing it to be used for both Gaze and Mouse + /// pointerss. + /// + private void ProcessMouseEvent(MouseState mouseData) + { + var pressed = mouseData.AnyPressesThisFrame(); + var released = mouseData.AnyReleasesThisFrame(); + + var leftButtonData = mouseData.GetButtonState(PointerEventData.InputButton.Left).eventData; + + if (!UseMouse(pressed, released, leftButtonData.buttonData)) + return; + + // Process the first mouse button fully + ProcessMousePress(leftButtonData); + ProcessMove(leftButtonData.buttonData); + ProcessDrag(leftButtonData.buttonData); + + // Now process right / middle clicks + ProcessMousePress(mouseData.GetButtonState(PointerEventData.InputButton.Right).eventData); + ProcessDrag(mouseData.GetButtonState(PointerEventData.InputButton.Right).eventData.buttonData); + ProcessMousePress(mouseData.GetButtonState(PointerEventData.InputButton.Middle).eventData); + ProcessDrag(mouseData.GetButtonState(PointerEventData.InputButton.Middle).eventData.buttonData); + + if (!Mathf.Approximately(leftButtonData.buttonData.scrollDelta.sqrMagnitude, 0.0f)) + { + var scrollHandler = ExecuteEvents.GetEventHandler(leftButtonData.buttonData.pointerCurrentRaycast.gameObject); + ExecuteEvents.ExecuteHierarchy(scrollHandler, leftButtonData.buttonData, ExecuteEvents.scrollHandler); + } + } + + /// + /// Process this InputModule. Same as the StandaloneInputModule version, except that it calls + /// ProcessMouseEvent twice, once for gaze pointers, and once for mouse pointers. + /// + public override void Process() + { + bool usedEvent = SendUpdateEventToSelectedObject(); + + if (eventSystem.sendNavigationEvents) + { + if (!usedEvent) + usedEvent |= SendMoveEventToSelectedObject(); + + if (!usedEvent) + SendSubmitEventToSelectedObject(); + } + + ProcessMouseEvent(GetGazePointerData()); +#if !UNITY_ANDROID + ProcessMouseEvent(GetCanvasPointerData()); +#endif + } + /// + /// Decide if mouse events need to be processed this frame. Same as StandloneInputModule except + /// that the IsPointerMoving method from this class is used, instead of the method on PointerEventData + /// + private static bool UseMouse(bool pressed, bool released, PointerEventData pointerData) + { + if (pressed || released || IsPointerMoving(pointerData) || pointerData.IsScrolling()) + return true; + + return false; + } + #endregion + + + /// + /// Convenience function for cloning PointerEventData + /// + /// Copy this value + /// to this object + protected void CopyFromTo(OVRPointerEventData @from, OVRPointerEventData @to) + { + @to.position = @from.position; + @to.delta = @from.delta; + @to.scrollDelta = @from.scrollDelta; + @to.pointerCurrentRaycast = @from.pointerCurrentRaycast; + @to.pointerEnter = @from.pointerEnter; + @to.worldSpaceRay = @from.worldSpaceRay; + } + /// + /// Convenience function for cloning PointerEventData + /// + /// Copy this value + /// to this object + protected new void CopyFromTo(PointerEventData @from, PointerEventData @to) + { + @to.position = @from.position; + @to.delta = @from.delta; + @to.scrollDelta = @from.scrollDelta; + @to.pointerCurrentRaycast = @from.pointerCurrentRaycast; + @to.pointerEnter = @from.pointerEnter; + } + + + // In the following region we extend the PointerEventData system implemented in PointerInputModule + // We define an additional dictionary for ray(e.g. gaze) based pointers. Mouse pointers still use the dictionary + // in PointerInputModule +#region PointerEventData pool + + // Pool for OVRRayPointerEventData for ray based pointers + protected Dictionary m_VRRayPointerData = new Dictionary(); + + + protected bool GetPointerData(int id, out OVRPointerEventData data, bool create) + { + if (!m_VRRayPointerData.TryGetValue(id, out data) && create) + { + data = new OVRPointerEventData(eventSystem) + { + pointerId = id, + }; + + m_VRRayPointerData.Add(id, data); + return true; + } + return false; + } + + /// + /// Clear pointer state for both types of pointer + /// + protected new void ClearSelection() + { + var baseEventData = GetBaseEventData(); + + foreach (var pointer in m_PointerData.Values) + { + // clear all selection + HandlePointerExitAndEnter(pointer, null); + } + foreach (var pointer in m_VRRayPointerData.Values) + { + // clear all selection + HandlePointerExitAndEnter(pointer, null); + } + + m_PointerData.Clear(); + eventSystem.SetSelectedGameObject(null, baseEventData); + } +#endregion + + /// + /// For RectTransform, calculate it's normal in world space + /// + static Vector3 GetRectTransformNormal(RectTransform rectTransform) + { + Vector3[] corners = new Vector3[4]; + rectTransform.GetWorldCorners(corners); + Vector3 BottomEdge = corners[3] - corners[0]; + Vector3 LeftEdge = corners[1] - corners[0]; + rectTransform.GetWorldCorners(corners); + return Vector3.Cross(BottomEdge, LeftEdge).normalized; + } + + private readonly MouseState m_MouseState = new MouseState(); + + + // The following 2 functions are equivalent to PointerInputModule.GetMousePointerEventData but are customized to + // get data for ray pointers and canvas mouse pointers. + + /// + /// State for a pointer controlled by a world space ray. E.g. gaze pointer + /// + /// + virtual protected MouseState GetGazePointerData() + { + // Get the OVRRayPointerEventData reference + OVRPointerEventData leftData; + GetPointerData(kMouseLeftId, out leftData, true ); + leftData.Reset(); + + //Now set the world space ray. This ray is what the user uses to point at UI elements + leftData.worldSpaceRay = new Ray(rayTransform.position, rayTransform.forward); + leftData.scrollDelta = GetExtraScrollDelta(); + + //Populate some default values + leftData.button = PointerEventData.InputButton.Left; + leftData.useDragThreshold = true; + // Perform raycast to find intersections with world + eventSystem.RaycastAll(leftData, m_RaycastResultCache); + var raycast = FindFirstRaycast(m_RaycastResultCache); + leftData.pointerCurrentRaycast = raycast; + m_RaycastResultCache.Clear(); + + m_Cursor.SetCursorRay(rayTransform); + + OVRRaycaster ovrRaycaster = raycast.module as OVRRaycaster; + // We're only interested in intersections from OVRRaycasters + if (ovrRaycaster) + { + // The Unity UI system expects event data to have a screen position + // so even though this raycast came from a world space ray we must get a screen + // space position for the camera attached to this raycaster for compatability + leftData.position = ovrRaycaster.GetScreenPosition(raycast); + + // Find the world position and normal the Graphic the ray intersected + RectTransform graphicRect = raycast.gameObject.GetComponent(); + if (graphicRect != null) + { + // Set are gaze indicator with this world position and normal + Vector3 worldPos = raycast.worldPosition; + Vector3 normal = GetRectTransformNormal(graphicRect); + m_Cursor.SetCursorStartDest(rayTransform.position, worldPos, normal); + } + } + + // Now process physical raycast intersections + OVRPhysicsRaycaster physicsRaycaster = raycast.module as OVRPhysicsRaycaster; + if (physicsRaycaster) + { + Vector3 position = raycast.worldPosition; + + if (performSphereCastForGazepointer) + { + // Here we cast a sphere into the scene rather than a ray. This gives a more accurate depth + // for positioning a circular gaze pointer + List results = new List(); + physicsRaycaster.Spherecast(leftData, results, m_SpherecastRadius); + if (results.Count > 0 && results[0].distance < raycast.distance) + { + position = results[0].worldPosition; + } + } + + leftData.position = physicsRaycaster.GetScreenPos(raycast.worldPosition); + + m_Cursor.SetCursorStartDest(rayTransform.position, position, raycast.worldNormal); + } + + // Stick default data values in right and middle slots for compatability + + // copy the apropriate data into right and middle slots + OVRPointerEventData rightData; + GetPointerData(kMouseRightId, out rightData, true ); + CopyFromTo(leftData, rightData); + rightData.button = PointerEventData.InputButton.Right; + + OVRPointerEventData middleData; + GetPointerData(kMouseMiddleId, out middleData, true ); + CopyFromTo(leftData, middleData); + middleData.button = PointerEventData.InputButton.Middle; + + + m_MouseState.SetButtonState(PointerEventData.InputButton.Left, GetGazeButtonState(), leftData); + m_MouseState.SetButtonState(PointerEventData.InputButton.Right, PointerEventData.FramePressState.NotChanged, rightData); + m_MouseState.SetButtonState(PointerEventData.InputButton.Middle, PointerEventData.FramePressState.NotChanged, middleData); + return m_MouseState; + } + + /// + /// Get state for pointer which is a pointer moving in world space across the surface of a world space canvas. + /// + /// + protected MouseState GetCanvasPointerData() + { + // Get the OVRRayPointerEventData reference + PointerEventData leftData; + GetPointerData(kMouseLeftId, out leftData, true ); + leftData.Reset(); + + // Setup default values here. Set position to zero because we don't actually know the pointer + // positions. Each canvas knows the position of its canvas pointer. + leftData.position = Vector2.zero; + leftData.scrollDelta = Input.mouseScrollDelta; + leftData.button = PointerEventData.InputButton.Left; + + if (activeGraphicRaycaster) + { + // Let the active raycaster find intersections on its canvas + activeGraphicRaycaster.RaycastPointer(leftData, m_RaycastResultCache); + var raycast = FindFirstRaycast(m_RaycastResultCache); + leftData.pointerCurrentRaycast = raycast; + m_RaycastResultCache.Clear(); + + OVRRaycaster ovrRaycaster = raycast.module as OVRRaycaster; + if (ovrRaycaster) // raycast may not actually contain a result + { + // The Unity UI system expects event data to have a screen position + // so even though this raycast came from a world space ray we must get a screen + // space position for the camera attached to this raycaster for compatability + Vector2 position = ovrRaycaster.GetScreenPosition(raycast); + + leftData.delta = position - leftData.position; + leftData.position = position; + } + } + + // copy the apropriate data into right and middle slots + PointerEventData rightData; + GetPointerData(kMouseRightId, out rightData, true ); + CopyFromTo(leftData, rightData); + rightData.button = PointerEventData.InputButton.Right; + + PointerEventData middleData; + GetPointerData(kMouseMiddleId, out middleData, true ); + CopyFromTo(leftData, middleData); + middleData.button = PointerEventData.InputButton.Middle; + + m_MouseState.SetButtonState(PointerEventData.InputButton.Left, StateForMouseButton(0), leftData); + m_MouseState.SetButtonState(PointerEventData.InputButton.Right, StateForMouseButton(1), rightData); + m_MouseState.SetButtonState(PointerEventData.InputButton.Middle, StateForMouseButton(2), middleData); + return m_MouseState; + } + + /// + /// New version of ShouldStartDrag implemented first in PointerInputModule. This version differs in that + /// for ray based pointers it makes a decision about whether a drag should start based on the angular change + /// the pointer has made so far, as seen from the camera. This also works when the world space ray is + /// translated rather than rotated, since the beginning and end of the movement are considered as angle from + /// the same point. + /// + private bool ShouldStartDrag(PointerEventData pointerEvent) + { + if (!pointerEvent.useDragThreshold) + return true; + + if (!pointerEvent.IsVRPointer()) + { + // Same as original behaviour for canvas based pointers + return (pointerEvent.pressPosition - pointerEvent.position).sqrMagnitude >= eventSystem.pixelDragThreshold * eventSystem.pixelDragThreshold; + } + else + { +#if UNITY_ANDROID && !UNITY_EDITOR // On android allow swiping to start drag + if (useSwipeScroll && ((Vector3)pointerEvent.GetSwipeStart() - Input.mousePosition).magnitude > swipeDragThreshold) + { + return true; + } +#endif + // When it's not a screen space pointer we have to look at the angle it moved rather than the pixels distance + // For gaze based pointing screen-space distance moved will always be near 0 + Vector3 cameraPos = pointerEvent.pressEventCamera.transform.position; + Vector3 pressDir = (pointerEvent.pointerPressRaycast.worldPosition - cameraPos).normalized; + Vector3 currentDir = (pointerEvent.pointerCurrentRaycast.worldPosition - cameraPos).normalized; + return Vector3.Dot(pressDir, currentDir) < Mathf.Cos(Mathf.Deg2Rad * (angleDragThreshold)); + } + } + + /// + /// The purpose of this function is to allow us to switch between using the standard IsPointerMoving + /// method for mouse driven pointers, but to always return true when it's a ray based pointer. + /// All real-world ray-based input devices are always moving so for simplicity we just return true + /// for them. + /// + /// If PointerEventData.IsPointerMoving was virtual we could just override that in + /// OVRRayPointerEventData. + /// + /// + /// + static bool IsPointerMoving(PointerEventData pointerEvent) + { + if (pointerEvent.IsVRPointer()) + return true; + else + return pointerEvent.IsPointerMoving(); + } + + protected Vector2 SwipeAdjustedPosition(Vector2 originalPosition, PointerEventData pointerEvent) + { +#if UNITY_ANDROID && !UNITY_EDITOR + // On android we use the touchpad position (accessed through Input.mousePosition) to modify + // the effective cursor position for events related to dragging. This allows the user to + // use the touchpad to drag draggable UI elements + if (useSwipeScroll) + { + Vector2 delta = (Vector2)Input.mousePosition - pointerEvent.GetSwipeStart(); + if (InvertSwipeXAxis) + delta.x *= -1; + return originalPosition + delta * swipeDragScale; + } +#endif + // If not Gear VR or swipe scroll isn't enabled just return original position + return originalPosition; + + } + + /// + /// Exactly the same as the code from PointerInputModule, except that we call our own + /// IsPointerMoving. + /// + /// This would also not be necessary if PointerEventData.IsPointerMoving was virtual + /// + /// + protected override void ProcessDrag(PointerEventData pointerEvent) + { + Vector2 originalPosition = pointerEvent.position; + bool moving = IsPointerMoving(pointerEvent); + if (moving && pointerEvent.pointerDrag != null + && !pointerEvent.dragging + && ShouldStartDrag(pointerEvent)) + { + if (pointerEvent.IsVRPointer()) + { + //adjust the position used based on swiping action. Allowing the user to + //drag items by swiping on the GearVR touchpad + pointerEvent.position = SwipeAdjustedPosition (originalPosition, pointerEvent); + } + ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.beginDragHandler); + pointerEvent.dragging = true; + } + + // Drag notification + if (pointerEvent.dragging && moving && pointerEvent.pointerDrag != null) + { + if (pointerEvent.IsVRPointer()) + { + pointerEvent.position = SwipeAdjustedPosition(originalPosition, pointerEvent); + } + // Before doing drag we should cancel any pointer down state + // And clear selection! + if (pointerEvent.pointerPress != pointerEvent.pointerDrag) + { + ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerUpHandler); + + pointerEvent.eligibleForClick = false; + pointerEvent.pointerPress = null; + pointerEvent.rawPointerPress = null; + } + ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.dragHandler); + } + } + + /// + /// Get state of button corresponding to gaze pointer + /// + /// + virtual protected PointerEventData.FramePressState GetGazeButtonState() + { + var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton); + var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton); + +#if UNITY_ANDROID && !UNITY_EDITOR + // On Gear VR the mouse button events correspond to touch pad events. We only use these as gaze pointer clicks + // on Gear VR because on PC the mouse clicks are used for actual mouse pointer interactions. + pressed |= Input.GetMouseButtonDown(0); + released |= Input.GetMouseButtonUp(0); +#endif + + if (pressed && released) + return PointerEventData.FramePressState.PressedAndReleased; + if (pressed) + return PointerEventData.FramePressState.Pressed; + if (released) + return PointerEventData.FramePressState.Released; + return PointerEventData.FramePressState.NotChanged; + } + + /// + /// Get extra scroll delta from gamepad + /// + protected Vector2 GetExtraScrollDelta() + { + Vector2 scrollDelta = new Vector2(); + if (useRightStickScroll) + { + Vector2 s = OVRInput.Get(OVRInput.Axis2D.SecondaryThumbstick); + if (Mathf.Abs(s.x) < rightStickDeadZone) s.x = 0; + if (Mathf.Abs(s.y) < rightStickDeadZone) s.y = 0; + scrollDelta = s; + } + return scrollDelta; + } + }; +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRInputModule.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRInputModule.cs.meta new file mode 100644 index 0000000..5b8e889 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRInputModule.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8f1a9a1d119a5944aacfb87d1ec283a2 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRMesh.cs b/Assets/Oculus/VR/Scripts/Util/OVRMesh.cs new file mode 100644 index 0000000..f420ae9 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRMesh.cs @@ -0,0 +1,124 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[DefaultExecutionOrder(-80)] +public class OVRMesh : MonoBehaviour +{ + public interface IOVRMeshDataProvider + { + MeshType GetMeshType(); + } + + public enum MeshType + { + None = OVRPlugin.MeshType.None, + HandLeft = OVRPlugin.MeshType.HandLeft, + HandRight = OVRPlugin.MeshType.HandRight, + } + + [SerializeField] + private IOVRMeshDataProvider _dataProvider; + [SerializeField] + private MeshType _meshType = MeshType.None; + private Mesh _mesh; + + public Mesh Mesh + { + get { return _mesh; } + } + + private void Awake() + { + if (_mesh != null) + { + // simply act as a mesh reference if a custom mesh is specified + return; + } + + if (_dataProvider == null) + { + _dataProvider = GetComponent(); + } + + if (_dataProvider != null) + { + _meshType = _dataProvider.GetMeshType(); + } + + if (_meshType != MeshType.None) + { + Initialize(_meshType); + } + } + + private void Initialize(MeshType meshType) + { + _mesh = new Mesh(); + + var ovrpMesh = new OVRPlugin.Mesh(); + if (OVRPlugin.GetMesh((OVRPlugin.MeshType)_meshType, out ovrpMesh)) + { + var vertices = new Vector3[ovrpMesh.NumVertices]; + for (int i = 0; i < ovrpMesh.NumVertices; ++i) + { + vertices[i] = ovrpMesh.VertexPositions[i].FromFlippedZVector3f(); + } + _mesh.vertices = vertices; + + var uv = new Vector2[ovrpMesh.NumVertices]; + for (int i = 0; i < ovrpMesh.NumVertices; ++i) + { + uv[i] = new Vector2(ovrpMesh.VertexUV0[i].x, -ovrpMesh.VertexUV0[i].y); + } + _mesh.uv = uv; + + var triangles = new int[ovrpMesh.NumIndices]; + for (int i = 0; i < ovrpMesh.NumIndices; ++i) + { + triangles[i] = ovrpMesh.Indices[ovrpMesh.NumIndices - i - 1]; + } + _mesh.triangles = triangles; + + var normals = new Vector3[ovrpMesh.NumVertices]; + for (int i = 0; i < ovrpMesh.NumVertices; ++i) + { + normals[i] = ovrpMesh.VertexNormals[i].FromFlippedZVector3f(); + } + _mesh.normals = normals; + + var boneWeights = new BoneWeight[ovrpMesh.NumVertices]; + for (int i = 0; i < ovrpMesh.NumVertices; ++i) + { + var currentBlendWeight = ovrpMesh.BlendWeights[i]; + var currentBlendIndices = ovrpMesh.BlendIndices[i]; + + boneWeights[i].boneIndex0 = (int)currentBlendIndices.x; + boneWeights[i].weight0 = currentBlendWeight.x; + boneWeights[i].boneIndex1 = (int)currentBlendIndices.y; + boneWeights[i].weight1 = currentBlendWeight.y; + boneWeights[i].boneIndex2 = (int)currentBlendIndices.z; + boneWeights[i].weight2 = currentBlendWeight.z; + boneWeights[i].boneIndex3 = (int)currentBlendIndices.w; + boneWeights[i].weight3 = currentBlendWeight.w; + } + _mesh.boneWeights = boneWeights; + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRMesh.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRMesh.cs.meta new file mode 100644 index 0000000..0522200 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRMesh.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5cc5c234723e3a54d8dd09b131117743 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRMeshRenderer.cs b/Assets/Oculus/VR/Scripts/Util/OVRMeshRenderer.cs new file mode 100644 index 0000000..7889fe8 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRMeshRenderer.cs @@ -0,0 +1,120 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class OVRMeshRenderer : MonoBehaviour +{ + public interface IOVRMeshRendererDataProvider + { + MeshRendererData GetMeshRendererData(); + } + + public struct MeshRendererData + { + public bool IsDataValid { get; set; } + public bool IsDataHighConfidence { get; set; } + } + + [SerializeField] + private IOVRMeshRendererDataProvider _dataProvider; + [SerializeField] + private OVRMesh _ovrMesh; + [SerializeField] + private OVRSkeleton _ovrSkeleton; + + private SkinnedMeshRenderer _skinnedMeshRenderer; + private bool _isInitialized; + + private void Awake() + { + if (_dataProvider == null) + { + _dataProvider = GetComponent(); + } + + if (_ovrMesh == null) + { + _ovrMesh = GetComponent(); + } + + if (_ovrSkeleton == null) + { + _ovrSkeleton = GetComponent(); + } + } + + private void Start() + { + if (_ovrMesh == null) + { + this.enabled = false; + return; + } + + Initialize(); + } + + private void Initialize() + { + _skinnedMeshRenderer = GetComponent(); + if (!_skinnedMeshRenderer) + { + _skinnedMeshRenderer = gameObject.AddComponent(); + } + _skinnedMeshRenderer.sharedMesh = _ovrMesh.Mesh; + + if (_ovrSkeleton != null) + { + int numSkinnableBones = _ovrSkeleton.GetCurrentNumSkinnableBones(); + var bindPoses = new Matrix4x4[numSkinnableBones]; + var bones = new Transform[numSkinnableBones]; + var localToWorldMatrix = transform.localToWorldMatrix; + for (int i = 0; i < numSkinnableBones && i < _ovrSkeleton.Bones.Count; ++i) + { + bones[i] = _ovrSkeleton.Bones[i].Transform; + bindPoses[i] = _ovrSkeleton.BindPoses[i].Transform.worldToLocalMatrix * localToWorldMatrix; + } + _ovrMesh.Mesh.bindposes = bindPoses; + _skinnedMeshRenderer.bones = bones; + _skinnedMeshRenderer.updateWhenOffscreen = true; + } + + _isInitialized = true; + } + + private void Update() + { + if (_isInitialized) + { + bool shouldRender = false; + + if (_dataProvider != null) + { + var data = _dataProvider.GetMeshRendererData(); + + shouldRender = data.IsDataValid && data.IsDataHighConfidence; + } + + if (_skinnedMeshRenderer != null && _skinnedMeshRenderer.enabled != shouldRender) + { + _skinnedMeshRenderer.enabled = shouldRender; + } + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRMeshRenderer.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRMeshRenderer.cs.meta new file mode 100644 index 0000000..307c94f --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRMeshRenderer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 73eac66b128fc8749a21623225c34541 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureSettings.cs b/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureSettings.cs new file mode 100644 index 0000000..df7e048 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureSettings.cs @@ -0,0 +1,149 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +#if UNITY_ANDROID && !UNITY_EDITOR +#define OVR_ANDROID_MRC +#endif + +using UnityEngine; +using System; +using System.IO; + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC +public class OVRMixedRealityCaptureSettings : ScriptableObject +{ + public bool enableMixedReality = false; + public LayerMask extraHiddenLayers; + public OVRManager.CompositionMethod compositionMethod = OVRManager.CompositionMethod.External; + public Color externalCompositionBackdropColorRift = Color.green; + public Color externalCompositionBackdropColorQuest = Color.clear; + public OVRManager.CameraDevice capturingCameraDevice = OVRManager.CameraDevice.WebCamera0; + public bool flipCameraFrameHorizontally = false; + public bool flipCameraFrameVertically = false; + public float handPoseStateLatency = 0.0f; + public float sandwichCompositionRenderLatency = 0.0f; + public int sandwichCompositionBufferedFrames = 8; + public Color chromaKeyColor = Color.green; + public float chromaKeySimilarity = 0.6f; + public float chromaKeySmoothRange = 0.03f; + public float chromaKeySpillRange = 0.04f; + public bool useDynamicLighting = false; + public OVRManager.DepthQuality depthQuality = OVRManager.DepthQuality.Medium; + public float dynamicLightingSmoothFactor = 8.0f; + public float dynamicLightingDepthVariationClampingValue = 0.001f; + public OVRManager.VirtualGreenScreenType virtualGreenScreenType = OVRManager.VirtualGreenScreenType.Off; + public float virtualGreenScreenTopY; + public float virtualGreenScreenBottomY; + public bool virtualGreenScreenApplyDepthCulling = false; + public float virtualGreenScreenDepthTolerance = 0.2f; + + public void ReadFrom(OVRManager manager) + { + enableMixedReality = manager.enableMixedReality; + compositionMethod = manager.compositionMethod; + extraHiddenLayers = manager.extraHiddenLayers; + externalCompositionBackdropColorRift = manager.externalCompositionBackdropColorRift; + externalCompositionBackdropColorQuest = manager.externalCompositionBackdropColorQuest; + capturingCameraDevice = manager.capturingCameraDevice; + flipCameraFrameHorizontally = manager.flipCameraFrameHorizontally; + flipCameraFrameVertically = manager.flipCameraFrameVertically; + handPoseStateLatency = manager.handPoseStateLatency; + sandwichCompositionRenderLatency = manager.sandwichCompositionRenderLatency; + sandwichCompositionBufferedFrames = manager.sandwichCompositionBufferedFrames; + chromaKeyColor = manager.chromaKeyColor; + chromaKeySimilarity = manager.chromaKeySimilarity; + chromaKeySmoothRange = manager.chromaKeySmoothRange; + chromaKeySpillRange = manager.chromaKeySpillRange; + useDynamicLighting = manager.useDynamicLighting; + depthQuality = manager.depthQuality; + dynamicLightingSmoothFactor = manager.dynamicLightingSmoothFactor; + dynamicLightingDepthVariationClampingValue = manager.dynamicLightingDepthVariationClampingValue; + virtualGreenScreenType = manager.virtualGreenScreenType; + virtualGreenScreenTopY = manager.virtualGreenScreenTopY; + virtualGreenScreenBottomY = manager.virtualGreenScreenBottomY; + virtualGreenScreenApplyDepthCulling = manager.virtualGreenScreenApplyDepthCulling; + virtualGreenScreenDepthTolerance = manager.virtualGreenScreenDepthTolerance; + } + public void ApplyTo(OVRManager manager) + { + manager.enableMixedReality = enableMixedReality; + manager.compositionMethod = compositionMethod; + manager.extraHiddenLayers = extraHiddenLayers; + manager.externalCompositionBackdropColorRift = externalCompositionBackdropColorRift; + manager.externalCompositionBackdropColorQuest = externalCompositionBackdropColorQuest; + manager.capturingCameraDevice = capturingCameraDevice; + manager.flipCameraFrameHorizontally = flipCameraFrameHorizontally; + manager.flipCameraFrameVertically = flipCameraFrameVertically; + manager.handPoseStateLatency = handPoseStateLatency; + manager.sandwichCompositionRenderLatency = sandwichCompositionRenderLatency; + manager.sandwichCompositionBufferedFrames = sandwichCompositionBufferedFrames; + manager.chromaKeyColor = chromaKeyColor; + manager.chromaKeySimilarity = chromaKeySimilarity; + manager.chromaKeySmoothRange = chromaKeySmoothRange; + manager.chromaKeySpillRange = chromaKeySpillRange; + manager.useDynamicLighting = useDynamicLighting; + manager.depthQuality = depthQuality; + manager.dynamicLightingSmoothFactor = dynamicLightingSmoothFactor; + manager.dynamicLightingDepthVariationClampingValue = dynamicLightingDepthVariationClampingValue; + manager.virtualGreenScreenType = virtualGreenScreenType; + manager.virtualGreenScreenTopY = virtualGreenScreenTopY; + manager.virtualGreenScreenBottomY = virtualGreenScreenBottomY; + manager.virtualGreenScreenApplyDepthCulling = virtualGreenScreenApplyDepthCulling; + manager.virtualGreenScreenDepthTolerance = virtualGreenScreenDepthTolerance; + } + +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN // Rift MRC only + const string configFileName = "mrc.config"; + public void WriteToConfigurationFile() + { + string text = JsonUtility.ToJson(this, true); + try + { + string configPath = Path.Combine(Application.dataPath, configFileName); + Debug.Log("Write OVRMixedRealityCaptureSettings to " + configPath); + File.WriteAllText(configPath, text); + } + catch(Exception e) + { + Debug.LogWarning("Exception caught " + e.Message); + } + } + + public void CombineWithConfigurationFile() + { + try + { + string configPath = Path.Combine(Application.dataPath, configFileName); + if (File.Exists(configPath)) + { + Debug.Log("MixedRealityCapture configuration file found at " + configPath); + string text = File.ReadAllText(configPath); + Debug.Log("Apply MixedRealityCapture configuration"); + JsonUtility.FromJsonOverwrite(text, this); + } + else + { + Debug.Log("MixedRealityCapture configuration file doesn't exist at " + configPath); + } + } + catch(Exception e) + { + Debug.LogWarning("Exception caught " + e.Message); + } + } +#endif +} +#endif diff --git a/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureSettings.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureSettings.cs.meta new file mode 100644 index 0000000..8aa6a37 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureSettings.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 99bbd170d56da4248941de890e6d7af5 +timeCreated: 1501004238 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureTest.cs b/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureTest.cs new file mode 100644 index 0000000..4a405fc --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureTest.cs @@ -0,0 +1,240 @@ +#if UNITY_ANDROID && !UNITY_EDITOR +#define OVR_ANDROID_MRC +#endif + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class OVRMixedRealityCaptureTest : MonoBehaviour { + + bool inited = false; + + enum CameraMode + { + Normal = 0, + OverrideFov, + ThirdPerson, + } + + CameraMode currentMode = CameraMode.Normal; + + public Camera defaultExternalCamera; + OVRPlugin.Fovf defaultFov; + + // Use this for initialization + void Start () { +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC + if (!defaultExternalCamera) + { + Debug.LogWarning("defaultExternalCamera undefined"); + } + +#if !OVR_ANDROID_MRC + // On Quest, we enable MRC automatically through the configuration + if (!OVRManager.instance.enableMixedReality) + { + OVRManager.instance.enableMixedReality = true; + } +#endif +#endif + } + + void Initialize() + { +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC + if (inited) + return; + +#if OVR_ANDROID_MRC + if (!OVRPlugin.Media.GetInitialized()) + return; +#else + if (!OVRPlugin.IsMixedRealityInitialized()) + return; +#endif + + OVRPlugin.ResetDefaultExternalCamera(); + Debug.LogFormat("GetExternalCameraCount before adding manual external camera {0}", OVRPlugin.GetExternalCameraCount()); + UpdateDefaultExternalCamera(); + Debug.LogFormat("GetExternalCameraCount after adding manual external camera {0}", OVRPlugin.GetExternalCameraCount()); + + // obtain default FOV + { + OVRPlugin.CameraIntrinsics cameraIntrinsics; + OVRPlugin.CameraExtrinsics cameraExtrinsics; + OVRPlugin.Posef calibrationRawPose; + OVRPlugin.GetMixedRealityCameraInfo(0, out cameraExtrinsics, out cameraIntrinsics, out calibrationRawPose); + defaultFov = cameraIntrinsics.FOVPort; + } + + inited = true; +#endif + } + + void UpdateDefaultExternalCamera() + { +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC + // always build a 1080p external camera + const int cameraPixelWidth = 1920; + const int cameraPixelHeight = 1080; + const float cameraAspect = (float)cameraPixelWidth / cameraPixelHeight; + + + string cameraName = "UnityExternalCamera"; + OVRPlugin.CameraIntrinsics cameraIntrinsics = new OVRPlugin.CameraIntrinsics(); + OVRPlugin.CameraExtrinsics cameraExtrinsics = new OVRPlugin.CameraExtrinsics(); + + // intrinsics + + cameraIntrinsics.IsValid = OVRPlugin.Bool.True; + cameraIntrinsics.LastChangedTimeSeconds = Time.time; + + float vFov = defaultExternalCamera.fieldOfView * Mathf.Deg2Rad; + float hFov = Mathf.Atan(Mathf.Tan(vFov * 0.5f) * cameraAspect) * 2.0f; + OVRPlugin.Fovf fov = new OVRPlugin.Fovf(); + fov.UpTan = fov.DownTan = Mathf.Tan(vFov * 0.5f); + fov.LeftTan = fov.RightTan = Mathf.Tan(hFov * 0.5f); + + cameraIntrinsics.FOVPort = fov; + cameraIntrinsics.VirtualNearPlaneDistanceMeters = defaultExternalCamera.nearClipPlane; + cameraIntrinsics.VirtualFarPlaneDistanceMeters = defaultExternalCamera.farClipPlane; + cameraIntrinsics.ImageSensorPixelResolution.w = cameraPixelWidth; + cameraIntrinsics.ImageSensorPixelResolution.h = cameraPixelHeight; + + // extrinsics + + cameraExtrinsics.IsValid = OVRPlugin.Bool.True; + cameraExtrinsics.LastChangedTimeSeconds = Time.time; + cameraExtrinsics.CameraStatusData = OVRPlugin.CameraStatus.CameraStatus_Calibrated; + cameraExtrinsics.AttachedToNode = OVRPlugin.Node.None; + + Camera mainCamera = Camera.main; + OVRCameraRig cameraRig = mainCamera.GetComponentInParent(); + if (cameraRig) + { + Transform trackingSpace = cameraRig.trackingSpace; + OVRPose trackingSpacePose = trackingSpace.ToOVRPose(false); + OVRPose cameraPose = defaultExternalCamera.transform.ToOVRPose(false); + OVRPose relativePose = trackingSpacePose.Inverse() * cameraPose; + cameraExtrinsics.RelativePose = relativePose.ToPosef(); + } + else + { + cameraExtrinsics.RelativePose = OVRPlugin.Posef.identity; + } + + if (!OVRPlugin.SetDefaultExternalCamera(cameraName, ref cameraIntrinsics, ref cameraExtrinsics)) + { + Debug.LogError("SetDefaultExternalCamera() failed"); + } +#endif + } + + // Update is called once per frame + void Update () { +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC + if (!inited) + { + Initialize(); + return; + } + + if (!defaultExternalCamera) + { + return; + } + +#if OVR_ANDROID_MRC + if (!OVRPlugin.Media.GetInitialized()) + { + return; + } +#else + if (!OVRPlugin.IsMixedRealityInitialized()) + { + return; + } +#endif + + if (OVRInput.GetDown(OVRInput.Button.One)) + { + if (currentMode == CameraMode.ThirdPerson) + { + currentMode = CameraMode.Normal; + } + else + { + currentMode = currentMode + 1; + } + + Debug.LogFormat("Camera mode change to {0}", currentMode); + } + + if (currentMode == CameraMode.Normal) + { + UpdateDefaultExternalCamera(); + OVRPlugin.OverrideExternalCameraFov(0, false, new OVRPlugin.Fovf()); + OVRPlugin.OverrideExternalCameraStaticPose(0, false, OVRPlugin.Posef.identity); + } + else if (currentMode == CameraMode.OverrideFov) + { + OVRPlugin.Fovf fov = defaultFov; + OVRPlugin.Fovf newFov = new OVRPlugin.Fovf(); + newFov.LeftTan = fov.LeftTan * 2.0f; + newFov.RightTan = fov.RightTan * 2.0f; + newFov.UpTan = fov.UpTan * 2.0f; + newFov.DownTan = fov.DownTan * 2.0f; + + OVRPlugin.OverrideExternalCameraFov(0, true, newFov); + OVRPlugin.OverrideExternalCameraStaticPose(0, false, OVRPlugin.Posef.identity); + + if (!OVRPlugin.GetUseOverriddenExternalCameraFov(0)) + { + Debug.LogWarning("FOV not overridden"); + } + } + else if (currentMode == CameraMode.ThirdPerson) + { + Camera camera = GetComponent(); + if (camera == null) + { + return; + } + + float vFov = camera.fieldOfView * Mathf.Deg2Rad; + float hFov = Mathf.Atan(Mathf.Tan(vFov * 0.5f) * camera.aspect) * 2.0f; + OVRPlugin.Fovf fov = new OVRPlugin.Fovf(); + fov.UpTan = fov.DownTan = Mathf.Tan(vFov * 0.5f); + fov.LeftTan = fov.RightTan = Mathf.Tan(hFov * 0.5f); + OVRPlugin.OverrideExternalCameraFov(0, true, fov); + + Camera mainCamera = Camera.main; + OVRCameraRig cameraRig = mainCamera.GetComponentInParent(); + if (cameraRig) + { + Transform trackingSpace = cameraRig.trackingSpace; + OVRPose trackingSpacePose = trackingSpace.ToOVRPose(false); + OVRPose cameraPose = transform.ToOVRPose(false); + OVRPose relativePose = trackingSpacePose.Inverse() * cameraPose; + OVRPlugin.Posef relativePosef = relativePose.ToPosef(); + OVRPlugin.OverrideExternalCameraStaticPose(0, true, relativePosef); + } + else + { + OVRPlugin.OverrideExternalCameraStaticPose(0, false, OVRPlugin.Posef.identity); + } + + if (!OVRPlugin.GetUseOverriddenExternalCameraFov(0)) + { + Debug.LogWarning("FOV not overridden"); + } + + if (!OVRPlugin.GetUseOverriddenExternalCameraStaticPose(0)) + { + Debug.LogWarning("StaticPose not overridden"); + } + } +#endif + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureTest.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureTest.cs.meta new file mode 100644 index 0000000..c261692 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRMixedRealityCaptureTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95a5f282b22a9d846bd1a9d2de25079c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRModeParms.cs b/Assets/Oculus/VR/Scripts/Util/OVRModeParms.cs new file mode 100644 index 0000000..f286c34 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRModeParms.cs @@ -0,0 +1,81 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; + +/// +/// Logs when the application enters power save mode and allows you to a low-power CPU/GPU level with a button press. +/// +public class OVRModeParms : MonoBehaviour +{ +#region Member Variables + + /// + /// The gamepad button that will switch the application to CPU level 0 and GPU level 1. + /// + public OVRInput.RawButton resetButton = OVRInput.RawButton.X; + +#endregion + + /// + /// Invoke power state mode test. + /// + void Start() + { + if (!OVRManager.isHmdPresent) + { + enabled = false; + return; + } + + // Call TestPowerLevelState after 10 seconds + // and repeats every 10 seconds. + InvokeRepeating ( "TestPowerStateMode", 10, 10.0f ); + } + + /// + /// Change default vr mode parms dynamically. + /// + void Update() + { + // NOTE: some of the buttons defined in OVRInput.RawButton are not available on the Android game pad controller + if ( OVRInput.GetDown(resetButton)) + { + //************************* + // Dynamically change VrModeParms cpu and gpu level. + // NOTE: Reset will cause 1 frame of flicker as it leaves + // and re-enters Vr mode. + //************************* + OVRPlugin.cpuLevel = 0; + OVRPlugin.gpuLevel = 1; + } + } + + /// + /// Check current power state mode. + /// + void TestPowerStateMode() + { + //************************* + // Check power-level state mode + //************************* + if (OVRPlugin.powerSaving) + { + // The device has been throttled + Debug.Log("POWER SAVE MODE ACTIVATED"); + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRModeParms.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRModeParms.cs.meta new file mode 100644 index 0000000..235bdff --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRModeParms.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6a6ae8e8def81df429a8fdfc00f63e5c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRMonoscopic.cs b/Assets/Oculus/VR/Scripts/Util/OVRMonoscopic.cs new file mode 100644 index 0000000..6f3d0a0 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRMonoscopic.cs @@ -0,0 +1,48 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; + +/// +/// Allows you to toggle monoscopic rendering with a gamepad button press. +/// +public class OVRMonoscopic : MonoBehaviour +{ + /// + /// The gamepad button that will toggle monoscopic rendering. + /// + public OVRInput.RawButton toggleButton = OVRInput.RawButton.B; + + private bool monoscopic = false; + + /// + /// Check input and toggle monoscopic rendering mode if necessary + /// See the input mapping setup in the Unity Integration guide + /// + void Update() + { + // NOTE: some of the buttons defined in OVRInput.RawButton are not available on the Android game pad controller + if (OVRInput.GetDown(toggleButton)) + { + //************************* + // toggle monoscopic rendering mode + //************************* + monoscopic = !monoscopic; + OVRManager.instance.monoscopic = monoscopic; + } + } + +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRMonoscopic.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRMonoscopic.cs.meta new file mode 100644 index 0000000..6261901 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRMonoscopic.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 06ef2a389c534554c848533f88dbb32c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRNetwork.cs b/Assets/Oculus/VR/Scripts/Util/OVRNetwork.cs new file mode 100644 index 0000000..594c56b --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRNetwork.cs @@ -0,0 +1,435 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Threading; +using UnityEngine; + +using Debug = UnityEngine.Debug; + +public class OVRNetwork +{ + public const int MaxBufferLength = 65536; + public const int MaxPayloadLength = MaxBufferLength - FrameHeader.StructSize; + + public const uint FrameHeaderMagicIdentifier = 0x5283A76B; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + struct FrameHeader + { + public uint protocolIdentifier; + public int payloadType; + public int payloadLength; + + public const int StructSize = sizeof(uint) + sizeof(int) + sizeof(int); + + // endianness conversion is NOT handled since all our current mobile/PC devices are little-endian + public byte[] ToBytes() + { + int size = Marshal.SizeOf(this); + Trace.Assert(size == StructSize); + + byte[] arr = new byte[size]; + + IntPtr ptr = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(this, ptr, true); + Marshal.Copy(ptr, arr, 0, size); + Marshal.FreeHGlobal(ptr); + return arr; + } + + public static FrameHeader FromBytes(byte[] arr) + { + FrameHeader header = new FrameHeader(); + + int size = Marshal.SizeOf(header); + Trace.Assert(size == StructSize); + + IntPtr ptr = Marshal.AllocHGlobal(size); + + Marshal.Copy(arr, 0, ptr, size); + + header = (FrameHeader)Marshal.PtrToStructure(ptr, header.GetType()); + Marshal.FreeHGlobal(ptr); + + return header; + } + } + + public class OVRNetworkTcpServer + { + public TcpListener tcpListener = null; + + private readonly object clientsLock = new object(); + public readonly List clients = new List(); + + public void StartListening(int listeningPort) + { + if (tcpListener != null) + { + Debug.LogWarning("[OVRNetworkTcpServer] tcpListener is not null"); + return; + } + + IPAddress localAddr = IPAddress.Any; + + tcpListener = new TcpListener(localAddr, listeningPort); + try + { + tcpListener.Start(); + Debug.LogFormat("TcpListener started. Local endpoint: {0}", tcpListener.LocalEndpoint.ToString()); + } + catch (SocketException e) + { + Debug.LogWarningFormat("[OVRNetworkTcpServer] Unsable to start TcpListener. Socket exception: {0}", e.Message); + Debug.LogWarning("It could be caused by multiple instances listening at the same port, or the port is forwarded to the Android device through ADB"); + Debug.LogWarning("If the port is forwarded through ADB, use the Android Tools in Tools/Oculus/System Metrics Profiler to kill the server"); + tcpListener = null; + } + + if (tcpListener != null) + { + Debug.LogFormat("[OVRNetworkTcpServer] Start Listening on port {0}", listeningPort); + + try + { + tcpListener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), tcpListener); + } + catch (Exception e) + { + Debug.LogWarningFormat("[OVRNetworkTcpServer] can't accept new client: {0}", e.Message); + } + } + } + + public void StopListening() + { + if (tcpListener == null) + { + Debug.LogWarning("[OVRNetworkTcpServer] tcpListener is null"); + return; + } + + lock (clientsLock) + { + clients.Clear(); + } + tcpListener.Stop(); + tcpListener = null; + + Debug.Log("[OVRNetworkTcpServer] Stopped listening"); + } + + private void DoAcceptTcpClientCallback(IAsyncResult ar) + { + TcpListener listener = ar.AsyncState as TcpListener; + try + { + TcpClient client = listener.EndAcceptTcpClient(ar); + lock (clientsLock) + { + clients.Add(client); + Debug.Log("[OVRNetworkTcpServer] client added"); + } + + try + { + tcpListener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), tcpListener); + } + catch (Exception e) + { + Debug.LogWarningFormat("[OVRNetworkTcpServer] can't accept new client: {0}", e.Message); + } + } + catch (ObjectDisposedException) + { + // Do nothing. It happens when stop preview in editor, which is normal behavior. + } + catch (Exception e) + { + Debug.LogWarningFormat("[OVRNetworkTcpServer] EndAcceptTcpClient failed: {0}", e.Message); + } + } + + public bool HasConnectedClient() + { + lock (clientsLock) + { + foreach (TcpClient client in clients) + { + if (client.Connected) + { + return true; + } + } + } + return false; + } + + public void Broadcast(int payloadType, byte[] payload) + { + if (payload.Length > OVRNetwork.MaxPayloadLength) + { + Debug.LogWarningFormat("[OVRNetworkTcpServer] drop payload because it's too long: {0} bytes", payload.Length); + } + + FrameHeader header = new FrameHeader(); + header.protocolIdentifier = FrameHeaderMagicIdentifier; + header.payloadType = payloadType; + header.payloadLength = payload.Length; + + byte[] headerBuffer = header.ToBytes(); + + byte[] dataBuffer = new byte[headerBuffer.Length + payload.Length]; + headerBuffer.CopyTo(dataBuffer, 0); + payload.CopyTo(dataBuffer, headerBuffer.Length); + + lock (clientsLock) + { + foreach (TcpClient client in clients) + { + if (client.Connected) + { + try + { + client.GetStream().BeginWrite(dataBuffer, 0, dataBuffer.Length, new AsyncCallback(DoWriteDataCallback), client.GetStream()); + } + catch (SocketException e) + { + Debug.LogWarningFormat("[OVRNetworkTcpServer] close client because of socket error: {0}", e.Message); + client.GetStream().Close(); + client.Close(); + } + } + } + } + } + + private void DoWriteDataCallback(IAsyncResult ar) + { + NetworkStream stream = ar.AsyncState as NetworkStream; + stream.EndWrite(ar); + } + } + + public class OVRNetworkTcpClient + { + public Action connectionStateChangedCallback; + public Action payloadReceivedCallback; + + public enum ConnectionState + { + Disconnected, + Connected, + Connecting + } + + public ConnectionState connectionState + { + get + { + if (tcpClient == null) + { + return ConnectionState.Disconnected; + } + else + { + if (tcpClient.Connected) + { + return ConnectionState.Connected; + } + else + { + return ConnectionState.Connecting; + } + } + } + } + + public bool Connected + { + get + { + return connectionState == ConnectionState.Connected; + } + } + + TcpClient tcpClient = null; + + byte[][] receivedBuffers = { new byte[OVRNetwork.MaxBufferLength], new byte[OVRNetwork.MaxBufferLength] }; + int receivedBufferIndex = 0; + int receivedBufferDataSize = 0; + ManualResetEvent readyReceiveDataEvent = new ManualResetEvent(true); + + public void Connect(int listeningPort) + { + if (tcpClient == null) + { + receivedBufferIndex = 0; + receivedBufferDataSize = 0; + readyReceiveDataEvent.Set(); + + string remoteAddress = "127.0.0.1"; + tcpClient = new TcpClient(AddressFamily.InterNetwork); + tcpClient.BeginConnect(remoteAddress, listeningPort, new AsyncCallback(ConnectCallback), tcpClient); + + if (connectionStateChangedCallback != null) + { + connectionStateChangedCallback(); + } + } + else + { + Debug.LogWarning("[OVRNetworkTcpClient] already connected"); + } + } + + void ConnectCallback(IAsyncResult ar) + { + try + { + TcpClient client = ar.AsyncState as TcpClient; + client.EndConnect(ar); + Debug.LogFormat("[OVRNetworkTcpClient] connected to {0}", client.ToString()); + } + catch (Exception e) + { + Debug.LogWarningFormat("[OVRNetworkTcpClient] connect error {0}", e.Message); + } + + if (connectionStateChangedCallback != null) + { + connectionStateChangedCallback(); + } + } + + public void Disconnect() + { + if (tcpClient != null) + { + if (!readyReceiveDataEvent.WaitOne(5)) + { + Debug.LogWarning("[OVRNetworkTcpClient] readyReceiveDataEvent not signaled. data receiving timeout?"); + } + + Debug.Log("[OVRNetworkTcpClient] close tcpClient"); + try + { + tcpClient.GetStream().Close(); + tcpClient.Close(); + } + catch (Exception e) + { + Debug.LogWarning("[OVRNetworkTcpClient] " + e.Message); + } + tcpClient = null; + + if (connectionStateChangedCallback != null) + { + connectionStateChangedCallback(); + } + } + else + { + Debug.LogWarning("[OVRNetworkTcpClient] not connected"); + } + } + + public void Tick() + { + if (tcpClient == null || !tcpClient.Connected) + { + return; + } + + if (readyReceiveDataEvent.WaitOne(TimeSpan.Zero)) + { + if (tcpClient.GetStream().DataAvailable) + { + if (receivedBufferDataSize >= OVRNetwork.MaxBufferLength) + { + Debug.LogWarning("[OVRNetworkTcpClient] receive buffer overflow. It should not happen since we have the constraint on message size"); + Disconnect(); + return; + } + + readyReceiveDataEvent.Reset(); + int maximumDataSize = OVRSystemPerfMetrics.MaxBufferLength - receivedBufferDataSize; + + tcpClient.GetStream().BeginRead(receivedBuffers[receivedBufferIndex], receivedBufferDataSize, maximumDataSize, new AsyncCallback(OnReadDataCallback), tcpClient.GetStream()); + } + } + } + + void OnReadDataCallback(IAsyncResult ar) + { + NetworkStream stream = ar.AsyncState as NetworkStream; + try + { + int numBytes = stream.EndRead(ar); + receivedBufferDataSize += numBytes; + + while (receivedBufferDataSize >= FrameHeader.StructSize) + { + FrameHeader header = FrameHeader.FromBytes(receivedBuffers[receivedBufferIndex]); + if (header.protocolIdentifier != OVRNetwork.FrameHeaderMagicIdentifier) + { + Debug.LogWarning("[OVRNetworkTcpClient] header mismatch"); + Disconnect(); + return; + } + + if (header.payloadLength < 0 || header.payloadLength > OVRNetwork.MaxPayloadLength) + { + Debug.LogWarningFormat("[OVRNetworkTcpClient] Sanity check failed. PayloadLength %d", header.payloadLength); + Disconnect(); + return; + } + + if (receivedBufferDataSize >= FrameHeader.StructSize + header.payloadLength) + { + if (payloadReceivedCallback != null) + { + payloadReceivedCallback(header.payloadType, receivedBuffers[receivedBufferIndex], FrameHeader.StructSize, header.payloadLength); + } + + // swap receive buffer + int newBufferIndex = 1 - receivedBufferIndex; + int newBufferDataSize = receivedBufferDataSize - (FrameHeader.StructSize + header.payloadLength); + if (newBufferDataSize > 0) + { + Array.Copy(receivedBuffers[receivedBufferIndex], (FrameHeader.StructSize + header.payloadLength), receivedBuffers[newBufferIndex], 0, newBufferDataSize); + } + receivedBufferIndex = newBufferIndex; + receivedBufferDataSize = newBufferDataSize; + } + } + readyReceiveDataEvent.Set(); + } + catch (SocketException e) + { + Debug.LogErrorFormat("[OVRNetworkTcpClient] OnReadDataCallback: socket error: {0}", e.Message); + Disconnect(); + } + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRNetwork.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRNetwork.cs.meta new file mode 100644 index 0000000..474bd0f --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRNetwork.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df7e9afcfd21ebd44951ca0eeb5cd692 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRPhysicsRaycaster.cs b/Assets/Oculus/VR/Scripts/Util/OVRPhysicsRaycaster.cs new file mode 100644 index 0000000..e15cb28 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRPhysicsRaycaster.cs @@ -0,0 +1,179 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System.Collections.Generic; + +namespace UnityEngine.EventSystems +{ + /// + /// Simple event system using physics raycasts. Very closely based on UnityEngine.EventSystems.PhysicsRaycaster + /// + [RequireComponent(typeof(OVRCameraRig))] + public class OVRPhysicsRaycaster : BaseRaycaster + { + /// + /// Const to use for clarity when no event mask is set + /// + protected const int kNoEventMaskSet = -1; + + + /// + /// Layer mask used to filter events. Always combined with the camera's culling mask if a camera is used. + /// + [SerializeField] + protected LayerMask m_EventMask = kNoEventMaskSet; + + protected OVRPhysicsRaycaster() + { } + + public override Camera eventCamera + { + get + { + return GetComponent().leftEyeCamera; + } + } + + /// + /// Depth used to determine the order of event processing. + /// + public virtual int depth + { + get { return (eventCamera != null) ? (int)eventCamera.depth : 0xFFFFFF; } + } + + public int sortOrder = 0; + public override int sortOrderPriority + { + get + { + return sortOrder; + } + } + + /// + /// Event mask used to determine which objects will receive events. + /// + public int finalEventMask + { + get { return (eventCamera != null) ? eventCamera.cullingMask & m_EventMask : kNoEventMaskSet; } + } + + /// + /// Layer mask used to filter events. Always combined with the camera's culling mask if a camera is used. + /// + public LayerMask eventMask + { + get { return m_EventMask; } + set { m_EventMask = value; } + } + + + /// + /// Perform a raycast using the worldSpaceRay in eventData. + /// + /// + /// + public override void Raycast(PointerEventData eventData, List resultAppendList) + { + // This function is closely based on PhysicsRaycaster.Raycast + + if (eventCamera == null) + return; + + if (!eventData.IsVRPointer()) + return; + + var ray = eventData.GetRay(); + + float dist = eventCamera.farClipPlane - eventCamera.nearClipPlane; + + var hits = Physics.RaycastAll(ray, dist, finalEventMask); + + if (hits.Length > 1) + System.Array.Sort(hits, (r1, r2) => r1.distance.CompareTo(r2.distance)); + + if (hits.Length != 0) + { + for (int b = 0, bmax = hits.Length; b < bmax; ++b) + { + var result = new RaycastResult + { + gameObject = hits[b].collider.gameObject, + module = this, + distance = hits[b].distance, + index = resultAppendList.Count, + worldPosition = hits[0].point, + worldNormal = hits[0].normal, + }; + resultAppendList.Add(result); + } + } + } + + /// + /// Perform a Spherecast using the worldSpaceRay in eventData. + /// + /// + /// + /// Radius of the sphere + public void Spherecast(PointerEventData eventData, List resultAppendList, float radius) + { + if (eventCamera == null) + return; + + if (!eventData.IsVRPointer()) + return; + + var ray = eventData.GetRay(); + + + float dist = eventCamera.farClipPlane - eventCamera.nearClipPlane; + + var hits = Physics.SphereCastAll(ray, radius, dist, finalEventMask); + + if (hits.Length > 1) + System.Array.Sort(hits, (r1, r2) => r1.distance.CompareTo(r2.distance)); + + if (hits.Length != 0) + { + for (int b = 0, bmax = hits.Length; b < bmax; ++b) + { + var result = new RaycastResult + { + gameObject = hits[b].collider.gameObject, + module = this, + distance = hits[b].distance, + index = resultAppendList.Count, + worldPosition = hits[0].point, + worldNormal = hits[0].normal, + }; + resultAppendList.Add(result); + } + } + } + /// + /// Get screen position of this world position as seen by the event camera of this OVRPhysicsRaycaster + /// + /// + /// + public Vector2 GetScreenPos(Vector3 worldPosition) + { + // In future versions of Uinty RaycastResult will contain screenPosition so this will not be necessary + return eventCamera.WorldToScreenPoint(worldPosition); + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRPhysicsRaycaster.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRPhysicsRaycaster.cs.meta new file mode 100644 index 0000000..4af7e97 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRPhysicsRaycaster.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f8e7ff1cdf4c4e74db00c3684108bc9a +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRPlayerController.cs b/Assets/Oculus/VR/Scripts/Util/OVRPlayerController.cs new file mode 100644 index 0000000..93eb561 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRPlayerController.cs @@ -0,0 +1,613 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. +You may obtain a copy of the License at https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System; +using UnityEngine; + +/// +/// Controls the player's movement in virtual reality. +/// +[RequireComponent(typeof(CharacterController))] +public class OVRPlayerController : MonoBehaviour +{ + /// + /// The rate acceleration during movement. + /// + public float Acceleration = 0.1f; + + /// + /// The rate of damping on movement. + /// + public float Damping = 0.3f; + + /// + /// The rate of additional damping when moving sideways or backwards. + /// + public float BackAndSideDampen = 0.5f; + + /// + /// The force applied to the character when jumping. + /// + public float JumpForce = 0.3f; + + /// + /// The rate of rotation when using a gamepad. + /// + public float RotationAmount = 1.5f; + + /// + /// The rate of rotation when using the keyboard. + /// + public float RotationRatchet = 45.0f; + + /// + /// The player will rotate in fixed steps if Snap Rotation is enabled. + /// + [Tooltip("The player will rotate in fixed steps if Snap Rotation is enabled.")] + public bool SnapRotation = true; + + /// + /// How many fixed speeds to use with linear movement? 0=linear control + /// + [Tooltip("How many fixed speeds to use with linear movement? 0=linear control")] + public int FixedSpeedSteps; + + /// + /// If true, reset the initial yaw of the player controller when the Hmd pose is recentered. + /// + public bool HmdResetsY = true; + + /// + /// If true, tracking data from a child OVRCameraRig will update the direction of movement. + /// + public bool HmdRotatesY = true; + + /// + /// Modifies the strength of gravity. + /// + public float GravityModifier = 0.379f; + + /// + /// If true, each OVRPlayerController will use the player's physical height. + /// + public bool useProfileData = true; + + /// + /// The CameraHeight is the actual height of the HMD and can be used to adjust the height of the character controller, which will affect the + /// ability of the character to move into areas with a low ceiling. + /// + [NonSerialized] + public float CameraHeight; + + /// + /// This event is raised after the character controller is moved. This is used by the OVRAvatarLocomotion script to keep the avatar transform synchronized + /// with the OVRPlayerController. + /// + public event Action TransformUpdated; + + /// + /// This bool is set to true whenever the player controller has been teleported. It is reset after every frame. Some systems, such as + /// CharacterCameraConstraint, test this boolean in order to disable logic that moves the character controller immediately + /// following the teleport. + /// + [NonSerialized] // This doesn't need to be visible in the inspector. + public bool Teleported; + + /// + /// This event is raised immediately after the camera transform has been updated, but before movement is updated. + /// + public event Action CameraUpdated; + + /// + /// This event is raised right before the character controller is actually moved in order to provide other systems the opportunity to + /// move the character controller in response to things other than user input, such as movement of the HMD. See CharacterCameraConstraint.cs + /// for an example of this. + /// + public event Action PreCharacterMove; + + /// + /// When true, user input will be applied to linear movement. Set this to false whenever the player controller needs to ignore input for + /// linear movement. + /// + public bool EnableLinearMovement = true; + + /// + /// When true, user input will be applied to rotation. Set this to false whenever the player controller needs to ignore input for rotation. + /// + public bool EnableRotation = true; + + /// + /// Rotation defaults to secondary thumbstick. You can allow either here. Note that this won't behave well if EnableLinearMovement is true. + /// + public bool RotationEitherThumbstick = false; + + protected CharacterController Controller = null; + protected OVRCameraRig CameraRig = null; + + private float MoveScale = 1.0f; + private Vector3 MoveThrottle = Vector3.zero; + private float FallSpeed = 0.0f; + private OVRPose? InitialPose; + public float InitialYRotation { get; private set; } + private float MoveScaleMultiplier = 1.0f; + private float RotationScaleMultiplier = 1.0f; + private bool SkipMouseRotation = true; // It is rare to want to use mouse movement in VR, so ignore the mouse by default. + private bool HaltUpdateMovement = false; + private bool prevHatLeft = false; + private bool prevHatRight = false; + private float SimulationRate = 60f; + private float buttonRotation = 0f; + private bool ReadyToSnapTurn; // Set to true when a snap turn has occurred, code requires one frame of centered thumbstick to enable another snap turn. + private bool playerControllerEnabled = false; + + void Start() + { + // Add eye-depth as a camera offset from the player controller + var p = CameraRig.transform.localPosition; + p.z = OVRManager.profile.eyeDepth; + CameraRig.transform.localPosition = p; + } + + void Awake() + { + Controller = gameObject.GetComponent(); + + if (Controller == null) + Debug.LogWarning("OVRPlayerController: No CharacterController attached."); + + // We use OVRCameraRig to set rotations to cameras, + // and to be influenced by rotation + OVRCameraRig[] CameraRigs = gameObject.GetComponentsInChildren(); + + if (CameraRigs.Length == 0) + Debug.LogWarning("OVRPlayerController: No OVRCameraRig attached."); + else if (CameraRigs.Length > 1) + Debug.LogWarning("OVRPlayerController: More then 1 OVRCameraRig attached."); + else + CameraRig = CameraRigs[0]; + + InitialYRotation = transform.rotation.eulerAngles.y; + } + + void OnEnable() + { + } + + void OnDisable() + { + if (playerControllerEnabled) + { + OVRManager.display.RecenteredPose -= ResetOrientation; + + if (CameraRig != null) + { + CameraRig.UpdatedAnchors -= UpdateTransform; + } + playerControllerEnabled = false; + } + } + + void Update() + { + if (!playerControllerEnabled) + { + if (OVRManager.OVRManagerinitialized) + { + OVRManager.display.RecenteredPose += ResetOrientation; + + if (CameraRig != null) + { + CameraRig.UpdatedAnchors += UpdateTransform; + } + playerControllerEnabled = true; + } + else + return; + } + //Use keys to ratchet rotation + if (Input.GetKeyDown(KeyCode.Q)) + buttonRotation -= RotationRatchet; + + if (Input.GetKeyDown(KeyCode.E)) + buttonRotation += RotationRatchet; + } + + protected virtual void UpdateController() + { + if (useProfileData) + { + if (InitialPose == null) + { + // Save the initial pose so it can be recovered if useProfileData + // is turned off later. + InitialPose = new OVRPose() + { + position = CameraRig.transform.localPosition, + orientation = CameraRig.transform.localRotation + }; + } + + var p = CameraRig.transform.localPosition; + if (OVRManager.instance.trackingOriginType == OVRManager.TrackingOrigin.EyeLevel) + { + p.y = OVRManager.profile.eyeHeight - (0.5f * Controller.height) + Controller.center.y; + } + else if (OVRManager.instance.trackingOriginType == OVRManager.TrackingOrigin.FloorLevel) + { + p.y = -(0.5f * Controller.height) + Controller.center.y; + } + CameraRig.transform.localPosition = p; + } + else if (InitialPose != null) + { + // Return to the initial pose if useProfileData was turned off at runtime + CameraRig.transform.localPosition = InitialPose.Value.position; + CameraRig.transform.localRotation = InitialPose.Value.orientation; + InitialPose = null; + } + + CameraHeight = CameraRig.centerEyeAnchor.localPosition.y; + + if (CameraUpdated != null) + { + CameraUpdated(); + } + + UpdateMovement(); + + Vector3 moveDirection = Vector3.zero; + + float motorDamp = (1.0f + (Damping * SimulationRate * Time.deltaTime)); + + MoveThrottle.x /= motorDamp; + MoveThrottle.y = (MoveThrottle.y > 0.0f) ? (MoveThrottle.y / motorDamp) : MoveThrottle.y; + MoveThrottle.z /= motorDamp; + + moveDirection += MoveThrottle * SimulationRate * Time.deltaTime; + + // Gravity + if (Controller.isGrounded && FallSpeed <= 0) + FallSpeed = ((Physics.gravity.y * (GravityModifier * 0.002f))); + else + FallSpeed += ((Physics.gravity.y * (GravityModifier * 0.002f)) * SimulationRate * Time.deltaTime); + + moveDirection.y += FallSpeed * SimulationRate * Time.deltaTime; + + + if (Controller.isGrounded && MoveThrottle.y <= transform.lossyScale.y * 0.001f) + { + // Offset correction for uneven ground + float bumpUpOffset = Mathf.Max(Controller.stepOffset, new Vector3(moveDirection.x, 0, moveDirection.z).magnitude); + moveDirection -= bumpUpOffset * Vector3.up; + } + + if (PreCharacterMove != null) + { + PreCharacterMove(); + Teleported = false; + } + + Vector3 predictedXZ = Vector3.Scale((Controller.transform.localPosition + moveDirection), new Vector3(1, 0, 1)); + + // Move contoller + Controller.Move(moveDirection); + Vector3 actualXZ = Vector3.Scale(Controller.transform.localPosition, new Vector3(1, 0, 1)); + + if (predictedXZ != actualXZ) + MoveThrottle += (actualXZ - predictedXZ) / (SimulationRate * Time.deltaTime); + } + + + + + + public virtual void UpdateMovement() + { + if (HaltUpdateMovement) + return; + + if (EnableLinearMovement) + { + bool moveForward = Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow); + bool moveLeft = Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow); + bool moveRight = Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow); + bool moveBack = Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow); + + bool dpad_move = false; + + if (OVRInput.Get(OVRInput.Button.DpadUp)) + { + moveForward = true; + dpad_move = true; + + } + + if (OVRInput.Get(OVRInput.Button.DpadDown)) + { + moveBack = true; + dpad_move = true; + } + + MoveScale = 1.0f; + + if ((moveForward && moveLeft) || (moveForward && moveRight) || + (moveBack && moveLeft) || (moveBack && moveRight)) + MoveScale = 0.70710678f; + + // No positional movement if we are in the air + if (!Controller.isGrounded) + MoveScale = 0.0f; + + MoveScale *= SimulationRate * Time.deltaTime; + + // Compute this for key movement + float moveInfluence = Acceleration * 0.1f * MoveScale * MoveScaleMultiplier; + + // Run! + if (dpad_move || Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) + moveInfluence *= 2.0f; + + Quaternion ort = transform.rotation; + Vector3 ortEuler = ort.eulerAngles; + ortEuler.z = ortEuler.x = 0f; + ort = Quaternion.Euler(ortEuler); + + if (moveForward) + MoveThrottle += ort * (transform.lossyScale.z * moveInfluence * Vector3.forward); + if (moveBack) + MoveThrottle += ort * (transform.lossyScale.z * moveInfluence * BackAndSideDampen * Vector3.back); + if (moveLeft) + MoveThrottle += ort * (transform.lossyScale.x * moveInfluence * BackAndSideDampen * Vector3.left); + if (moveRight) + MoveThrottle += ort * (transform.lossyScale.x * moveInfluence * BackAndSideDampen * Vector3.right); + + + + moveInfluence = Acceleration * 0.1f * MoveScale * MoveScaleMultiplier; + +#if !UNITY_ANDROID // LeftTrigger not avail on Android game pad + moveInfluence *= 1.0f + OVRInput.Get(OVRInput.Axis1D.PrimaryIndexTrigger); +#endif + + Vector2 primaryAxis = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick); + + // If speed quantization is enabled, adjust the input to the number of fixed speed steps. + if (FixedSpeedSteps > 0) + { + primaryAxis.y = Mathf.Round(primaryAxis.y * FixedSpeedSteps) / FixedSpeedSteps; + primaryAxis.x = Mathf.Round(primaryAxis.x * FixedSpeedSteps) / FixedSpeedSteps; + } + + if (primaryAxis.y > 0.0f) + MoveThrottle += ort * (primaryAxis.y * transform.lossyScale.z * moveInfluence * Vector3.forward); + + if (primaryAxis.y < 0.0f) + MoveThrottle += ort * (Mathf.Abs(primaryAxis.y) * transform.lossyScale.z * moveInfluence * + BackAndSideDampen * Vector3.back); + + if (primaryAxis.x < 0.0f) + MoveThrottle += ort * (Mathf.Abs(primaryAxis.x) * transform.lossyScale.x * moveInfluence * + BackAndSideDampen * Vector3.left); + + if (primaryAxis.x > 0.0f) + MoveThrottle += ort * (primaryAxis.x * transform.lossyScale.x * moveInfluence * BackAndSideDampen * + Vector3.right); + } + + if (EnableRotation) + { + Vector3 euler = transform.rotation.eulerAngles; + float rotateInfluence = SimulationRate * Time.deltaTime * RotationAmount * RotationScaleMultiplier; + + bool curHatLeft = OVRInput.Get(OVRInput.Button.PrimaryShoulder); + + if (curHatLeft && !prevHatLeft) + euler.y -= RotationRatchet; + + prevHatLeft = curHatLeft; + + bool curHatRight = OVRInput.Get(OVRInput.Button.SecondaryShoulder); + + if (curHatRight && !prevHatRight) + euler.y += RotationRatchet; + + prevHatRight = curHatRight; + + euler.y += buttonRotation; + buttonRotation = 0f; + + +#if !UNITY_ANDROID || UNITY_EDITOR + if (!SkipMouseRotation) + euler.y += Input.GetAxis("Mouse X") * rotateInfluence * 3.25f; +#endif + + if (SnapRotation) + { + if (OVRInput.Get(OVRInput.Button.SecondaryThumbstickLeft) || + (RotationEitherThumbstick && OVRInput.Get(OVRInput.Button.PrimaryThumbstickLeft))) + { + if (ReadyToSnapTurn) + { + euler.y -= RotationRatchet; + ReadyToSnapTurn = false; + } + } + else if (OVRInput.Get(OVRInput.Button.SecondaryThumbstickRight) || + (RotationEitherThumbstick && OVRInput.Get(OVRInput.Button.PrimaryThumbstickRight))) + { + if (ReadyToSnapTurn) + { + euler.y += RotationRatchet; + ReadyToSnapTurn = false; + } + } + else + { + ReadyToSnapTurn = true; + } + } + else + { + Vector2 secondaryAxis = OVRInput.Get(OVRInput.Axis2D.SecondaryThumbstick); + if (RotationEitherThumbstick) + { + Vector2 altSecondaryAxis = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick); + if (secondaryAxis.sqrMagnitude < altSecondaryAxis.sqrMagnitude) + { + secondaryAxis = altSecondaryAxis; + } + } + euler.y += secondaryAxis.x * rotateInfluence; + } + + transform.rotation = Quaternion.Euler(euler); + } + } + + + /// + /// Invoked by OVRCameraRig's UpdatedAnchors callback. Allows the Hmd rotation to update the facing direction of the player. + /// + public void UpdateTransform(OVRCameraRig rig) + { + Transform root = CameraRig.trackingSpace; + Transform centerEye = CameraRig.centerEyeAnchor; + + if (HmdRotatesY && !Teleported) + { + Vector3 prevPos = root.position; + Quaternion prevRot = root.rotation; + + transform.rotation = Quaternion.Euler(0.0f, centerEye.rotation.eulerAngles.y, 0.0f); + + root.position = prevPos; + root.rotation = prevRot; + } + + UpdateController(); + if (TransformUpdated != null) + { + TransformUpdated(root); + } + } + + /// + /// Jump! Must be enabled manually. + /// + public bool Jump() + { + if (!Controller.isGrounded) + return false; + + MoveThrottle += new Vector3(0, transform.lossyScale.y * JumpForce, 0); + + return true; + } + + /// + /// Stop this instance. + /// + public void Stop() + { + Controller.Move(Vector3.zero); + MoveThrottle = Vector3.zero; + FallSpeed = 0.0f; + } + + /// + /// Gets the move scale multiplier. + /// + /// Move scale multiplier. + public void GetMoveScaleMultiplier(ref float moveScaleMultiplier) + { + moveScaleMultiplier = MoveScaleMultiplier; + } + + /// + /// Sets the move scale multiplier. + /// + /// Move scale multiplier. + public void SetMoveScaleMultiplier(float moveScaleMultiplier) + { + MoveScaleMultiplier = moveScaleMultiplier; + } + + /// + /// Gets the rotation scale multiplier. + /// + /// Rotation scale multiplier. + public void GetRotationScaleMultiplier(ref float rotationScaleMultiplier) + { + rotationScaleMultiplier = RotationScaleMultiplier; + } + + /// + /// Sets the rotation scale multiplier. + /// + /// Rotation scale multiplier. + public void SetRotationScaleMultiplier(float rotationScaleMultiplier) + { + RotationScaleMultiplier = rotationScaleMultiplier; + } + + /// + /// Gets the allow mouse rotation. + /// + /// Allow mouse rotation. + public void GetSkipMouseRotation(ref bool skipMouseRotation) + { + skipMouseRotation = SkipMouseRotation; + } + + /// + /// Sets the allow mouse rotation. + /// + /// If set to true allow mouse rotation. + public void SetSkipMouseRotation(bool skipMouseRotation) + { + SkipMouseRotation = skipMouseRotation; + } + + /// + /// Gets the halt update movement. + /// + /// Halt update movement. + public void GetHaltUpdateMovement(ref bool haltUpdateMovement) + { + haltUpdateMovement = HaltUpdateMovement; + } + + /// + /// Sets the halt update movement. + /// + /// If set to true halt update movement. + public void SetHaltUpdateMovement(bool haltUpdateMovement) + { + HaltUpdateMovement = haltUpdateMovement; + } + + /// + /// Resets the player look rotation when the device orientation is reset. + /// + public void ResetOrientation() + { + if (HmdResetsY && !HmdRotatesY) + { + Vector3 euler = transform.rotation.eulerAngles; + euler.y = InitialYRotation; + transform.rotation = Quaternion.Euler(euler); + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRPlayerController.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRPlayerController.cs.meta new file mode 100644 index 0000000..7c1e6ad --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRPlayerController.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0950df82e7936c84983497630bde5b54 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRPointerEventData.cs b/Assets/Oculus/VR/Scripts/Util/OVRPointerEventData.cs new file mode 100644 index 0000000..7d3bf1e --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRPointerEventData.cs @@ -0,0 +1,94 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System; +using System.Text; +using UnityEngine; +using UnityEngine.Assertions; + + +namespace UnityEngine.EventSystems +{ + /// + /// Extension of Unity's PointerEventData to support ray based pointing and also touchpad swiping + /// + public class OVRPointerEventData : PointerEventData + { + public OVRPointerEventData(EventSystem eventSystem) + : base(eventSystem) + { + + } + + public Ray worldSpaceRay; + public Vector2 swipeStart; + + public override string ToString() + { + var sb = new StringBuilder(); + sb.AppendLine("Position: " + position); + sb.AppendLine("delta: " + delta); + sb.AppendLine("eligibleForClick: " + eligibleForClick); + sb.AppendLine("pointerEnter: " + pointerEnter); + sb.AppendLine("pointerPress: " + pointerPress); + sb.AppendLine("lastPointerPress: " + lastPress); + sb.AppendLine("pointerDrag: " + pointerDrag); + sb.AppendLine("worldSpaceRay: " + worldSpaceRay); + sb.AppendLine("swipeStart: " + swipeStart); + sb.AppendLine("Use Drag Threshold: " + useDragThreshold); + return sb.ToString(); + } + + } + + + /// + /// Static helpers for OVRPointerEventData. + /// + public static class PointerEventDataExtension + { + + public static bool IsVRPointer(this PointerEventData pointerEventData) + { + return (pointerEventData is OVRPointerEventData); + } + public static Ray GetRay(this PointerEventData pointerEventData) + { + OVRPointerEventData vrPointerEventData = pointerEventData as OVRPointerEventData; + Assert.IsNotNull(vrPointerEventData); + + return vrPointerEventData.worldSpaceRay; + } + public static Vector2 GetSwipeStart(this PointerEventData pointerEventData) + { + OVRPointerEventData vrPointerEventData = pointerEventData as OVRPointerEventData; + Assert.IsNotNull(vrPointerEventData); + + return vrPointerEventData.swipeStart; + } + public static void SetSwipeStart(this PointerEventData pointerEventData, Vector2 start) + { + OVRPointerEventData vrPointerEventData = pointerEventData as OVRPointerEventData; + Assert.IsNotNull(vrPointerEventData); + + vrPointerEventData.swipeStart = start; + } + + + + + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRPointerEventData.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRPointerEventData.cs.meta new file mode 100644 index 0000000..4117752 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRPointerEventData.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 646c937ce12610744adc2b5e487f77ac +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRProfiler.cs b/Assets/Oculus/VR/Scripts/Util/OVRProfiler.cs new file mode 100644 index 0000000..bfe8a70 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRProfiler.cs @@ -0,0 +1,179 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +#if UNITY_EDITOR + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using Assets.OVR.Scripts; + +public class OVRProfiler : EditorWindow +{ + enum TargetPlatform + { + OculusGo, + GearVR, + Quest, + OculusRift + }; + + private static List mRecords = new List(); + private Vector2 mScrollPosition; + static private TargetPlatform mTargetPlatform; + + [MenuItem("Oculus/Tools/OVR Profiler")] + static void Init() + { + // Get existing open window or if none, make a new one: + EditorWindow.GetWindow(typeof(OVRProfiler)); +#if UNITY_ANDROID + mTargetPlatform = TargetPlatform.OculusGo; +#else + mTargetPlatform = TargetPlatform.OculusRift; +#endif + } + + void OnGUI() + { + GUILayout.Label("OVR Profiler", EditorStyles.boldLabel); + string[] options = new string[] + { + "Oculus Go", "Gear VR", "Oculus Quest", "Oculus Rift", + }; + mTargetPlatform = (TargetPlatform)EditorGUILayout.Popup("Target Oculus Platform", (int)mTargetPlatform, options); + + if (EditorApplication.isPlaying) + { + UpdateRecords(); + DrawResults(); + } + else + { + ShowCenterAlignedMessageLabel("Click Run in Unity to view stats."); + } + } + + void OnInspectorUpdate() + { + Repaint(); + } + + void DrawResults() + { + string lastCategory = ""; + + mScrollPosition = EditorGUILayout.BeginScrollView(mScrollPosition); + + foreach (RangedRecord record in mRecords) + { + // Add separator and label for new category + if (!record.category.Equals(lastCategory)) + { + lastCategory = record.category; + EditorGUILayout.Separator(); + EditorGUILayout.BeginHorizontal(); + GUILayout.Label(lastCategory, EditorStyles.label, GUILayout.Width(200)); + EditorGUILayout.EndHorizontal(); + } + + // Draw records + EditorGUILayout.BeginHorizontal(); + Rect r = EditorGUILayout.BeginVertical(); + EditorGUI.ProgressBar(r, record.value / (record.max * 2), record.category + " " + record.value.ToString()); + GUILayout.Space(16); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + GUILayout.Label(record.message); + EditorGUILayout.EndHorizontal(); + + GUI.enabled = true; + + } + + EditorGUILayout.EndScrollView(); + } + + private void UpdateRecords() + { + mRecords.Clear(); + + if (mTargetPlatform == TargetPlatform.OculusRift) + { + AddRecord("Client Frame CPU Time (ms)", "", UnityStats.frameTime * 1000, 0, 11); + AddRecord("Render Frame CPU Time (ms)", "", UnityStats.renderTime * 1000, 0, 11); + } + else + { + // Graphics memory + long memSizeByte = UnityStats.usedTextureMemorySize + UnityStats.vboTotalBytes; + AddRecord("Graphics Memory (MB)", "Please use less than 1024 MB of vertex and texture memory.", ConvertBytes(memSizeByte, "MB"), 0, 1024); + } + + float triVertRec = mTargetPlatform == TargetPlatform.OculusRift ? 1000000 : 100000; + // Triangle count + AddRecord("Triangles", "Please use less than 100000 triangles.", UnityStats.triangles, 0, triVertRec); + + // Vertices count + AddRecord("Vertices", "Please use less than 100000 vertices.", UnityStats.vertices, 0, triVertRec); + + float dcRec = mTargetPlatform == TargetPlatform.OculusRift ? 1000 : 100; + // Draw call count + AddRecord("Draw Call", "Please use less than 100 draw calls.", UnityStats.drawCalls, 0, dcRec); + } + + private string FormatBytes(long bytes, string target) + { + return System.String.Format("{0:0.##} {1}", ConvertBytes(bytes, target), target); + } + + private float ConvertBytes(long bytes, string target) + { + string[] Suffix = { "B", "KB", "MB", "GB", "TB" }; + int i; + double dblSByte = bytes; + for (i = 0; i < Suffix.Length; i++, bytes /= 1024) + { + if (Suffix[i] == target) + return (float)dblSByte; + dblSByte = bytes / 1024.0; + } + return 0; + } + + private void ShowCenterAlignedMessageLabel(string message) + { + GUILayout.BeginVertical(); + GUILayout.FlexibleSpace(); + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.Label(message, EditorStyles.boldLabel); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.EndVertical(); + } + + private void AddRecord(string category, string message, float value, float min, float max) + { + RangedRecord record = new RangedRecord(category, message, value, min, max); + mRecords.Add(record); + } +} + +#endif diff --git a/Assets/Oculus/VR/Scripts/Util/OVRProfiler.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRProfiler.cs.meta new file mode 100644 index 0000000..e12af70 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRProfiler.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3303d4232ee59ac40a9fdc223870fbbc +timeCreated: 1520636357 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRProgressIndicator.cs b/Assets/Oculus/VR/Scripts/Util/OVRProgressIndicator.cs new file mode 100644 index 0000000..7c0ac58 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRProgressIndicator.cs @@ -0,0 +1,44 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using UnityEngine.UI; +using System.Collections; + +/// +/// Visualizes progress for operations such as loading. +/// +public class OVRProgressIndicator : MonoBehaviour +{ + public MeshRenderer progressImage; + + [Range(0, 1)] + public float currentProgress = 0.7f; + + void Awake() + { + progressImage.sortingOrder = 150; + } + + + + // Update is called once per frame + void Update() + { + progressImage.sharedMaterial.SetFloat("_AlphaCutoff", 1-currentProgress); + + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRProgressIndicator.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRProgressIndicator.cs.meta new file mode 100644 index 0000000..e66f8f6 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRProgressIndicator.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f14ece5575e2b1e4d80619901d65b428 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRRaycaster.cs b/Assets/Oculus/VR/Scripts/Util/OVRRaycaster.cs new file mode 100644 index 0000000..cf9e440 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRRaycaster.cs @@ -0,0 +1,328 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.EventSystems; +using UnityEngine.Serialization; + +/// +/// Extension of GraphicRaycaster to support ray casting with world space rays instead of just screen-space +/// pointer positions +/// +[RequireComponent(typeof(Canvas))] +public class OVRRaycaster : GraphicRaycaster, IPointerEnterHandler +{ + [Tooltip("A world space pointer for this canvas")] + public GameObject pointer; + + public int sortOrder = 0; + + protected OVRRaycaster() + { } + + [NonSerialized] + private Canvas m_Canvas; + + private Canvas canvas + { + get + { + if (m_Canvas != null) + return m_Canvas; + + m_Canvas = GetComponent(); + return m_Canvas; + } + } + + public override Camera eventCamera + { + get + { + return canvas.worldCamera; + } + } + + public override int sortOrderPriority + { + get + { + return sortOrder; + } + } + + protected override void Start() + { + if(!canvas.worldCamera) + { + Debug.Log("Canvas does not have an event camera attached. Attaching OVRCameraRig.centerEyeAnchor as default."); + OVRCameraRig rig = FindObjectOfType(); + canvas.worldCamera = rig.centerEyeAnchor.gameObject.GetComponent(); + } + } + + /// + /// For the given ray, find graphics on this canvas which it intersects and are not blocked by other + /// world objects + /// + [NonSerialized] + private List m_RaycastResults = new List(); + private void Raycast(PointerEventData eventData, List resultAppendList, Ray ray, bool checkForBlocking) + { + //This function is closely based on + //void GraphicRaycaster.Raycast(PointerEventData eventData, List resultAppendList) + + if (canvas == null) + return; + + float hitDistance = float.MaxValue; + + if (checkForBlocking && blockingObjects != BlockingObjects.None) + { + float dist = eventCamera.farClipPlane; + + if (blockingObjects == BlockingObjects.ThreeD || blockingObjects == BlockingObjects.All) + { + var hits = Physics.RaycastAll(ray, dist, m_BlockingMask); + + if (hits.Length > 0 && hits[0].distance < hitDistance) + { + hitDistance = hits[0].distance; + } + } + + if (blockingObjects == BlockingObjects.TwoD || blockingObjects == BlockingObjects.All) + { + var hits = Physics2D.GetRayIntersectionAll(ray, dist, m_BlockingMask); + + if (hits.Length > 0 && hits[0].fraction * dist < hitDistance) + { + hitDistance = hits[0].fraction * dist; + } + } + } + + m_RaycastResults.Clear(); + + GraphicRaycast(canvas, ray, m_RaycastResults); + + for (var index = 0; index < m_RaycastResults.Count; index++) + { + var go = m_RaycastResults[index].graphic.gameObject; + bool appendGraphic = true; + + if (ignoreReversedGraphics) + { + // If we have a camera compare the direction against the cameras forward. + var cameraFoward = ray.direction; + var dir = go.transform.rotation * Vector3.forward; + appendGraphic = Vector3.Dot(cameraFoward, dir) > 0; + } + + // Ignore points behind us (can happen with a canvas pointer) + if (eventCamera.transform.InverseTransformPoint(m_RaycastResults[index].worldPos).z <= 0) + { + appendGraphic = false; + } + + if (appendGraphic) + { + float distance = Vector3.Distance(ray.origin, m_RaycastResults[index].worldPos); + + if (distance >= hitDistance) + { + continue; + } + + var castResult = new RaycastResult + { + gameObject = go, + module = this, + distance = distance, + index = resultAppendList.Count, + depth = m_RaycastResults[index].graphic.depth, + + worldPosition = m_RaycastResults[index].worldPos + }; + resultAppendList.Add(castResult); + } + } + } + + /// + /// Performs a raycast using eventData.worldSpaceRay + /// + /// + /// + public override void Raycast(PointerEventData eventData, List resultAppendList) + { + if (eventData.IsVRPointer()) + { + Raycast(eventData, resultAppendList, eventData.GetRay(), true); + } + } + /// + /// Performs a raycast using the pointer object attached to this OVRRaycaster + /// + /// + /// + public void RaycastPointer(PointerEventData eventData, List resultAppendList) + { + if (pointer != null && pointer.activeInHierarchy) + { + Raycast(eventData, resultAppendList, new Ray(eventCamera.transform.position, (pointer.transform.position - eventCamera.transform.position).normalized), false); + } + } + + + /// + /// Perform a raycast into the screen and collect all graphics underneath it. + /// + [NonSerialized] + static readonly List s_SortedGraphics = new List(); + private void GraphicRaycast(Canvas canvas, Ray ray, List results) + { + //This function is based closely on : + // void GraphicRaycaster.Raycast(Canvas canvas, Camera eventCamera, Vector2 pointerPosition, List results) + // But modified to take a Ray instead of a canvas pointer, and also to explicitly ignore + // the graphic associated with the pointer + + // Necessary for the event system + var foundGraphics = GraphicRegistry.GetGraphicsForCanvas(canvas); + s_SortedGraphics.Clear(); + for (int i = 0; i < foundGraphics.Count; ++i) + { + Graphic graphic = foundGraphics[i]; + + // -1 means it hasn't been processed by the canvas, which means it isn't actually drawn + if (graphic.depth == -1 || (pointer == graphic.gameObject)) + continue; + Vector3 worldPos; + if (RayIntersectsRectTransform(graphic.rectTransform, ray, out worldPos)) + { + //Work out where this is on the screen for compatibility with existing Unity UI code + Vector2 screenPos = eventCamera.WorldToScreenPoint(worldPos); + // mask/image intersection - See Unity docs on eventAlphaThreshold for when this does anything + if (graphic.Raycast(screenPos, eventCamera)) + { + RaycastHit hit; + hit.graphic = graphic; + hit.worldPos = worldPos; + hit.fromMouse = false; + s_SortedGraphics.Add(hit); + } + } + } + + s_SortedGraphics.Sort((g1, g2) => g2.graphic.depth.CompareTo(g1.graphic.depth)); + + for (int i = 0; i < s_SortedGraphics.Count; ++i) + { + results.Add(s_SortedGraphics[i]); + } + } + /// + /// Get screen position of worldPosition contained in this RaycastResult + /// + /// + /// + public Vector2 GetScreenPosition(RaycastResult raycastResult) + { + // In future versions of Uinty RaycastResult will contain screenPosition so this will not be necessary + return eventCamera.WorldToScreenPoint(raycastResult.worldPosition); + } + + + /// + /// Detects whether a ray intersects a RectTransform and if it does also + /// returns the world position of the intersection. + /// + /// + /// + /// + /// + static bool RayIntersectsRectTransform(RectTransform rectTransform, Ray ray, out Vector3 worldPos) + { + Vector3[] corners = new Vector3[4]; + rectTransform.GetWorldCorners(corners); + Plane plane = new Plane(corners[0], corners[1], corners[2]); + + float enter; + if (!plane.Raycast(ray, out enter)) + { + worldPos = Vector3.zero; + return false; + } + + Vector3 intersection = ray.GetPoint(enter); + + Vector3 BottomEdge = corners[3] - corners[0]; + Vector3 LeftEdge = corners[1] - corners[0]; + float BottomDot = Vector3.Dot(intersection - corners[0], BottomEdge); + float LeftDot = Vector3.Dot(intersection - corners[0], LeftEdge); + if (BottomDot < BottomEdge.sqrMagnitude && // Can use sqrMag because BottomEdge is not normalized + LeftDot < LeftEdge.sqrMagnitude && + BottomDot >= 0 && + LeftDot >= 0) + { + worldPos = corners[0] + LeftDot * LeftEdge / LeftEdge.sqrMagnitude + BottomDot * BottomEdge / BottomEdge.sqrMagnitude; + return true; + } + else + { + worldPos = Vector3.zero; + return false; + } + } + + + struct RaycastHit + { + public Graphic graphic; + public Vector3 worldPos; + public bool fromMouse; + }; + + + /// + /// Is this the currently focussed Raycaster according to the InputModule + /// + /// + public bool IsFocussed() + { + OVRInputModule inputModule = EventSystem.current.currentInputModule as OVRInputModule; + return inputModule && inputModule.activeGraphicRaycaster == this; + } + + public void OnPointerEnter(PointerEventData e) + { + if (e.IsVRPointer()) + { + // Gaze has entered this canvas. We'll make it the active one so that canvas-mouse pointer can be used. + OVRInputModule inputModule = EventSystem.current.currentInputModule as OVRInputModule; + if(inputModule != null) + { + inputModule.activeGraphicRaycaster = this; + } + + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRRaycaster.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRRaycaster.cs.meta new file mode 100644 index 0000000..053eab6 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRRaycaster.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7aaf960227867044282d921171d2d7ac +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRRecord.cs b/Assets/Oculus/VR/Scripts/Util/OVRRecord.cs new file mode 100644 index 0000000..1771e36 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRRecord.cs @@ -0,0 +1,69 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Assets.OVR.Scripts +{ + public class Record + { + public string category; + public string message; + public Record(string cat, string msg) + { + category = cat; + message = msg; + } + } + + public class RangedRecord : Record + { + public float value; + public float min; + public float max; + public RangedRecord(string cat, string msg, float val, float minVal, float maxVal) + : base(cat, msg) + { + value = val; + min = minVal; + max = maxVal; + } + } + + public delegate void FixMethodDelegate(UnityEngine.Object obj, bool isLastInSet, int selectedIndex); + + public class FixRecord : Record + { + public FixMethodDelegate fixMethod; + public UnityEngine.Object targetObject; + public string[] buttonNames; + public bool editModeRequired; + public bool complete; + + public FixRecord(string cat, string msg, FixMethodDelegate fix, UnityEngine.Object target, bool editRequired, string[] buttons) + : base(cat, msg) + { + buttonNames = buttons; + fixMethod = fix; + targetObject = target; + editModeRequired = editRequired; + complete = false; + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRRecord.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRRecord.cs.meta new file mode 100644 index 0000000..c72c0a2 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRRecord.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 63f0fe0d60ddeb54f9f43d701286af2d +timeCreated: 1520636357 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRResetOrientation.cs b/Assets/Oculus/VR/Scripts/Util/OVRResetOrientation.cs new file mode 100644 index 0000000..4724c26 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRResetOrientation.cs @@ -0,0 +1,44 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; + +/// +/// Allows you to reset VR input tracking with a gamepad button press. +/// +public class OVRResetOrientation : MonoBehaviour +{ + /// + /// The gamepad button that will reset VR input tracking. + /// + public OVRInput.RawButton resetButton = OVRInput.RawButton.Y; + + /// + /// Check input and reset orientation if necessary + /// See the input mapping setup in the Unity Integration guide + /// + void Update() + { + // NOTE: some of the buttons defined in OVRInput.RawButton are not available on the Android game pad controller + if (OVRInput.GetDown(resetButton)) + { + //************************* + // reset orientation + //************************* + OVRManager.display.RecenterPose(); + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRResetOrientation.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRResetOrientation.cs.meta new file mode 100644 index 0000000..49ce73b --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRResetOrientation.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 09bb0a17b6a704298b65be4fb08ef480 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRSceneSampleController.cs b/Assets/Oculus/VR/Scripts/Util/OVRSceneSampleController.cs new file mode 100644 index 0000000..c1d7b9e --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRSceneSampleController.cs @@ -0,0 +1,213 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections; + +/// +/// Sample that allows you to play with various VR settings. +/// +public class OVRSceneSampleController : MonoBehaviour +{ + /// + /// The key that quits the application. + /// + public KeyCode quitKey = KeyCode.Escape; + + /// + /// An optional texture that appears before the menu fades in. + /// + public Texture fadeInTexture = null; + + /// + /// Controls how quickly the player's speed and rotation change based on input. + /// + public float speedRotationIncrement = 0.05f; + + private OVRPlayerController playerController = null; + + // Handle to OVRCameraRig + private OVRCameraRig cameraController = null; + + /// + /// We can set the layer to be anything we want to, this allows + /// a specific camera to render it. + /// + public string layerName = "Default"; + + // Vision mode on/off + private bool visionMode = true; + + // We want to hold onto GridCube, for potential sharing + // of the menu RenderTarget + OVRGridCube gridCube = null; + +#if SHOW_DK2_VARIABLES + private string strVisionMode = "Vision Enabled: ON"; +#endif + + #region MonoBehaviour Message Handlers + /// + /// Awake this instance. + /// + void Awake() + { + // Find camera controller + OVRCameraRig[] cameraControllers; + cameraControllers = gameObject.GetComponentsInChildren(); + + if (cameraControllers.Length == 0) + { + Debug.LogWarning("OVRMainMenu: No OVRCameraRig attached."); + } + else if (cameraControllers.Length > 1) + { + Debug.LogWarning("OVRMainMenu: More then 1 OVRCameraRig attached."); + } + else + { + cameraController = cameraControllers[0]; + } + + // Find player controller + OVRPlayerController[] playerControllers; + playerControllers = gameObject.GetComponentsInChildren(); + + if (playerControllers.Length == 0) + { + Debug.LogWarning("OVRMainMenu: No OVRPlayerController attached."); + } + else if (playerControllers.Length > 1) + { + Debug.LogWarning("OVRMainMenu: More then 1 OVRPlayerController attached."); + } + else + { + playerController = playerControllers[0]; + } + } + + /// + /// Start this instance. + /// + void Start() + { + // Make sure to hide cursor + if (Application.isEditor == false) + { + Cursor.visible = false; + Cursor.lockState = CursorLockMode.Locked; + } + + // CameraController updates + if (cameraController != null) + { + // Add a GridCube component to this object + gridCube = gameObject.AddComponent(); + gridCube.SetOVRCameraController(ref cameraController); + } + } + + + /// + /// Update this instance. + /// + void Update() + { + // Recenter pose + UpdateRecenterPose(); + + // Turn On/Off Vision Mode + UpdateVisionMode(); + + // Update Speed and Rotation Scale + if (playerController != null) + UpdateSpeedAndRotationScaleMultiplier(); + + // Toggle Fullscreen + if (Input.GetKeyDown(KeyCode.F11)) + Screen.fullScreen = !Screen.fullScreen; + + if (Input.GetKeyDown(KeyCode.M)) +#if UNITY_2017_2_OR_NEWER + UnityEngine.XR.XRSettings.showDeviceView = !UnityEngine.XR.XRSettings.showDeviceView; +#else + UnityEngine.VR.VRSettings.showDeviceView = !UnityEngine.VR.VRSettings.showDeviceView; +#endif + +#if !UNITY_ANDROID || UNITY_EDITOR + // Escape Application + if (Input.GetKeyDown(quitKey)) + Application.Quit(); +#endif + } + #endregion + + /// + /// Updates the vision mode. + /// + void UpdateVisionMode() + { + if (Input.GetKeyDown(KeyCode.F2)) + { + visionMode ^= visionMode; + OVRManager.tracker.isEnabled = visionMode; + } + } + + /// + /// Updates the speed and rotation scale multiplier. + /// + void UpdateSpeedAndRotationScaleMultiplier() + { + float moveScaleMultiplier = 0.0f; + playerController.GetMoveScaleMultiplier(ref moveScaleMultiplier); + + if (Input.GetKeyDown(KeyCode.Alpha7)) + { + moveScaleMultiplier -= speedRotationIncrement; + } + else if (Input.GetKeyDown(KeyCode.Alpha8)) + { + moveScaleMultiplier += speedRotationIncrement; + } + + playerController.SetMoveScaleMultiplier(moveScaleMultiplier); + + float rotationScaleMultiplier = 0.0f; + playerController.GetRotationScaleMultiplier(ref rotationScaleMultiplier); + + if (Input.GetKeyDown(KeyCode.Alpha9)) + { + rotationScaleMultiplier -= speedRotationIncrement; + } + else if (Input.GetKeyDown(KeyCode.Alpha0)) + { + rotationScaleMultiplier += speedRotationIncrement; + } + + playerController.SetRotationScaleMultiplier(rotationScaleMultiplier); + } + + /// + /// Recenter pose + /// + void UpdateRecenterPose() + { + if (Input.GetKeyDown(KeyCode.R)) + OVRManager.display.RecenterPose(); + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRSceneSampleController.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRSceneSampleController.cs.meta new file mode 100644 index 0000000..4d9611a --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRSceneSampleController.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4f07515ada089df47868559a20dd6783 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRScreenFade.cs b/Assets/Oculus/VR/Scripts/Util/OVRScreenFade.cs new file mode 100644 index 0000000..3a18749 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRScreenFade.cs @@ -0,0 +1,207 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; +using System.Collections; // required for Coroutines + +/// +/// Fades the screen from black after a new scene is loaded. Fade can also be controlled mid-scene using SetUIFade and SetFadeLevel +/// +public class OVRScreenFade : MonoBehaviour +{ + [Tooltip("Fade duration")] + public float fadeTime = 2.0f; + + [Tooltip("Screen color at maximum fade")] + public Color fadeColor = new Color(0.01f, 0.01f, 0.01f, 1.0f); + + public bool fadeOnStart = true; + + /// + /// The render queue used by the fade mesh. Reduce this if you need to render on top of it. + /// + public int renderQueue = 5000; + + private float uiFadeAlpha = 0; + + private MeshRenderer fadeRenderer; + private MeshFilter fadeMesh; + private Material fadeMaterial = null; + private bool isFading = false; + + public float currentAlpha { get; private set; } + + /// + /// Automatically starts a fade in + /// + void Start() + { + if (gameObject.name.StartsWith("OculusMRC_")) + { + Destroy(this); + return; + } + + // create the fade material + fadeMaterial = new Material(Shader.Find("Oculus/Unlit Transparent Color")); + fadeMesh = gameObject.AddComponent(); + fadeRenderer = gameObject.AddComponent(); + + var mesh = new Mesh(); + fadeMesh.mesh = mesh; + + Vector3[] vertices = new Vector3[4]; + + float width = 2f; + float height = 2f; + float depth = 1f; + + vertices[0] = new Vector3(-width, -height, depth); + vertices[1] = new Vector3(width, -height, depth); + vertices[2] = new Vector3(-width, height, depth); + vertices[3] = new Vector3(width, height, depth); + + mesh.vertices = vertices; + + int[] tri = new int[6]; + + tri[0] = 0; + tri[1] = 2; + tri[2] = 1; + + tri[3] = 2; + tri[4] = 3; + tri[5] = 1; + + mesh.triangles = tri; + + Vector3[] normals = new Vector3[4]; + + normals[0] = -Vector3.forward; + normals[1] = -Vector3.forward; + normals[2] = -Vector3.forward; + normals[3] = -Vector3.forward; + + mesh.normals = normals; + + Vector2[] uv = new Vector2[4]; + + uv[0] = new Vector2(0, 0); + uv[1] = new Vector2(1, 0); + uv[2] = new Vector2(0, 1); + uv[3] = new Vector2(1, 1); + + mesh.uv = uv; + + SetFadeLevel(0); + + if (fadeOnStart) + { + StartCoroutine(Fade(1, 0)); + } + } + + /// + /// Start a fade out + /// + public void FadeOut() + { + StartCoroutine(Fade(0,1)); + } + + + /// + /// Starts a fade in when a new level is loaded + /// + void OnLevelFinishedLoading(int level) + { + StartCoroutine(Fade(1,0)); + } + + void OnEnable() + { + if (!fadeOnStart) + { + SetFadeLevel(0); + } + } + + /// + /// Cleans up the fade material + /// + void OnDestroy() + { + if (fadeRenderer != null) + Destroy(fadeRenderer); + + if (fadeMaterial != null) + Destroy(fadeMaterial); + + if (fadeMesh != null) + Destroy(fadeMesh); + } + + /// + /// Set the UI fade level - fade due to UI in foreground + /// + public void SetUIFade(float level) + { + uiFadeAlpha = Mathf.Clamp01(level); + SetMaterialAlpha(); + } + /// + /// Override current fade level + /// + /// + public void SetFadeLevel(float level) + { + currentAlpha = level; + SetMaterialAlpha(); + } + + /// + /// Fades alpha from 1.0 to 0.0 + /// + IEnumerator Fade(float startAlpha, float endAlpha) + { + float elapsedTime = 0.0f; + while (elapsedTime < fadeTime) + { + elapsedTime += Time.deltaTime; + currentAlpha = Mathf.Lerp(startAlpha, endAlpha, Mathf.Clamp01(elapsedTime / fadeTime)); + SetMaterialAlpha(); + yield return new WaitForEndOfFrame(); + } + } + + /// + /// Update material alpha. UI fade and the current fade due to fade in/out animations (or explicit control) + /// both affect the fade. (The max is taken) + /// + private void SetMaterialAlpha() + { + Color color = fadeColor; + color.a = Mathf.Max(currentAlpha, uiFadeAlpha); + isFading = color.a > 0; + if (fadeMaterial != null) + { + fadeMaterial.color = color; + fadeMaterial.renderQueue = renderQueue; + fadeRenderer.material = fadeMaterial; + fadeRenderer.enabled = isFading; + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRScreenFade.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRScreenFade.cs.meta new file mode 100644 index 0000000..68714fc --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRScreenFade.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: df8e1d778abf442e4bec449c360e9e1c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: -100 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRSkeleton.cs b/Assets/Oculus/VR/Scripts/Util/OVRSkeleton.cs new file mode 100644 index 0000000..0b76098 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRSkeleton.cs @@ -0,0 +1,423 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[DefaultExecutionOrder(-80)] +public class OVRSkeleton : MonoBehaviour +{ + public interface IOVRSkeletonDataProvider + { + SkeletonType GetSkeletonType(); + SkeletonPoseData GetSkeletonPoseData(); + } + + public struct SkeletonPoseData + { + public OVRPlugin.Posef RootPose { get; set; } + public float RootScale { get; set; } + public OVRPlugin.Quatf[] BoneRotations { get; set; } + public bool IsDataValid { get; set; } + public bool IsDataHighConfidence { get; set; } + } + + public enum SkeletonType + { + None = OVRPlugin.SkeletonType.None, + HandLeft = OVRPlugin.SkeletonType.HandLeft, + HandRight = OVRPlugin.SkeletonType.HandRight, + } + + public enum BoneId + { + Invalid = OVRPlugin.BoneId.Invalid, + + Hand_Start = OVRPlugin.BoneId.Hand_Start, + Hand_WristRoot = OVRPlugin.BoneId.Hand_WristRoot, // root frame of the hand, where the wrist is located + Hand_ForearmStub = OVRPlugin.BoneId.Hand_ForearmStub, // frame for user's forearm + Hand_Thumb0 = OVRPlugin.BoneId.Hand_Thumb0, // thumb trapezium bone + Hand_Thumb1 = OVRPlugin.BoneId.Hand_Thumb1, // thumb metacarpal bone + Hand_Thumb2 = OVRPlugin.BoneId.Hand_Thumb2, // thumb proximal phalange bone + Hand_Thumb3 = OVRPlugin.BoneId.Hand_Thumb3, // thumb distal phalange bone + Hand_Index1 = OVRPlugin.BoneId.Hand_Index1, // index proximal phalange bone + Hand_Index2 = OVRPlugin.BoneId.Hand_Index2, // index intermediate phalange bone + Hand_Index3 = OVRPlugin.BoneId.Hand_Index3, // index distal phalange bone + Hand_Middle1 = OVRPlugin.BoneId.Hand_Middle1, // middle proximal phalange bone + Hand_Middle2 = OVRPlugin.BoneId.Hand_Middle2, // middle intermediate phalange bone + Hand_Middle3 = OVRPlugin.BoneId.Hand_Middle3, // middle distal phalange bone + Hand_Ring1 = OVRPlugin.BoneId.Hand_Ring1, // ring proximal phalange bone + Hand_Ring2 = OVRPlugin.BoneId.Hand_Ring2, // ring intermediate phalange bone + Hand_Ring3 = OVRPlugin.BoneId.Hand_Ring3, // ring distal phalange bone + Hand_Pinky0 = OVRPlugin.BoneId.Hand_Pinky0, // pinky metacarpal bone + Hand_Pinky1 = OVRPlugin.BoneId.Hand_Pinky1, // pinky proximal phalange bone + Hand_Pinky2 = OVRPlugin.BoneId.Hand_Pinky2, // pinky intermediate phalange bone + Hand_Pinky3 = OVRPlugin.BoneId.Hand_Pinky3, // pinky distal phalange bone + Hand_MaxSkinnable = OVRPlugin.BoneId.Hand_MaxSkinnable, + // Bone tips are position only. They are not used for skinning but are useful for hit-testing. + // NOTE: Hand_ThumbTip == Hand_MaxSkinnable since the extended tips need to be contiguous + Hand_ThumbTip = OVRPlugin.BoneId.Hand_ThumbTip, // tip of the thumb + Hand_IndexTip = OVRPlugin.BoneId.Hand_IndexTip, // tip of the index finger + Hand_MiddleTip = OVRPlugin.BoneId.Hand_MiddleTip, // tip of the middle finger + Hand_RingTip = OVRPlugin.BoneId.Hand_RingTip, // tip of the ring finger + Hand_PinkyTip = OVRPlugin.BoneId.Hand_PinkyTip, // tip of the pinky + Hand_End = OVRPlugin.BoneId.Hand_End, + + // add new bones here + + Max = OVRPlugin.BoneId.Max + } + + [SerializeField] + private SkeletonType _skeletonType = SkeletonType.None; + [SerializeField] + private IOVRSkeletonDataProvider _dataProvider; + private bool _isInitialized; + + [SerializeField] + private bool _updateRootPose = false; + [SerializeField] + private bool _updateRootScale = false; + [SerializeField] + private bool _enablePhysicsCapsules = false; + + private GameObject _bonesGO; + private GameObject _bindPosesGO; + private GameObject _capsulesGO; + + private List _bones; + private List _bindPoses; + private List _capsules; + + public IList Bones { get; private set; } + public IList BindPoses { get; private set; } + public IList Capsules { get; private set; } + + private void Awake() + { + if (_dataProvider == null) + { + _dataProvider = GetComponent(); + } + + _bones = new List(); + Bones = _bones.AsReadOnly(); + + _bindPoses = new List(); + BindPoses = _bindPoses.AsReadOnly(); + + _capsules = new List(); + Capsules = _capsules.AsReadOnly(); + + if (_dataProvider != null) + { + _skeletonType = _dataProvider.GetSkeletonType(); + } + } + + private void Start() + { + if (_skeletonType != SkeletonType.None) + { + Initialize(); + } + } + + private void Initialize() + { + var skeleton = new OVRPlugin.Skeleton(); + if (OVRPlugin.GetSkeleton((OVRPlugin.SkeletonType)_skeletonType, out skeleton)) + { + if (!_bonesGO) + { + _bonesGO = new GameObject("Bones"); + _bonesGO.transform.SetParent(transform, false); + _bonesGO.transform.localPosition = Vector3.zero; + _bonesGO.transform.localRotation = Quaternion.identity; + } + + if (!_bindPosesGO) + { + _bindPosesGO = new GameObject("BindPoses"); + _bindPosesGO.transform.SetParent(transform, false); + _bindPosesGO.transform.localPosition = Vector3.zero; + _bindPosesGO.transform.localRotation = Quaternion.identity; + } + + if (_enablePhysicsCapsules) + { + if (!_capsulesGO) + { + _capsulesGO = new GameObject("Capsules"); + _capsulesGO.transform.SetParent(transform, false); + _capsulesGO.transform.localPosition = Vector3.zero; + _capsulesGO.transform.localRotation = Quaternion.identity; + } + } + + _bones = new List(new OVRBone[skeleton.NumBones]); + Bones = _bones.AsReadOnly(); + + _bindPoses = new List(new OVRBone[skeleton.NumBones]); + BindPoses = _bindPoses.AsReadOnly(); + + // pre-populate bones list before attempting to apply bone hierarchy + for (int i = 0; i < skeleton.NumBones; ++i) + { + BoneId id = (OVRSkeleton.BoneId)skeleton.Bones[i].Id; + short parentIdx = skeleton.Bones[i].ParentBoneIndex; + Vector3 pos = skeleton.Bones[i].Pose.Position.FromFlippedZVector3f(); + Quaternion rot = skeleton.Bones[i].Pose.Orientation.FromFlippedZQuatf(); + + var boneGO = new GameObject(id.ToString()); + boneGO.transform.localPosition = pos; + boneGO.transform.localRotation = rot; + _bones[i] = new OVRBone(id, parentIdx, boneGO.transform); + + var bindPoseGO = new GameObject(id.ToString()); + bindPoseGO.transform.localPosition = pos; + bindPoseGO.transform.localRotation = rot; + _bindPoses[i] = new OVRBone(id, parentIdx, bindPoseGO.transform); + } + + for (int i = 0; i < skeleton.NumBones; ++i) + { + if (((OVRPlugin.BoneId)skeleton.Bones[i].ParentBoneIndex) == OVRPlugin.BoneId.Invalid) + { + _bones[i].Transform.SetParent(_bonesGO.transform, false); + _bindPoses[i].Transform.SetParent(_bindPosesGO.transform, false); + } + else + { + _bones[i].Transform.SetParent(_bones[_bones[i].ParentBoneIndex].Transform, false); + _bindPoses[i].Transform.SetParent(_bindPoses[_bones[i].ParentBoneIndex].Transform, false); + } + } + + if (_enablePhysicsCapsules) + { + _capsules = new List(new OVRBoneCapsule[skeleton.NumBoneCapsules]); + Capsules = _capsules.AsReadOnly(); + + for (int i = 0; i < skeleton.NumBoneCapsules; ++i) + { + var capsule = skeleton.BoneCapsules[i]; + Transform bone = Bones[capsule.BoneIndex].Transform; + + var capsuleRigidBodyGO = new GameObject((_bones[capsule.BoneIndex].Id).ToString() + "_CapsuleRigidBody"); + capsuleRigidBodyGO.transform.SetParent(_capsulesGO.transform, false); + capsuleRigidBodyGO.transform.localPosition = bone.position; + capsuleRigidBodyGO.transform.localRotation = bone.rotation; + + var capsuleRigidBody = capsuleRigidBodyGO.AddComponent(); + capsuleRigidBody.mass = 1.0f; + capsuleRigidBody.isKinematic = true; + capsuleRigidBody.useGravity = false; +#if UNITY_2018_3_OR_NEWER + capsuleRigidBody.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative; +#else + capsuleRigidBody.collisionDetectionMode = CollisionDetectionMode.Continuous; +#endif + + var capsuleColliderGO = new GameObject((_bones[capsule.BoneIndex].Id).ToString() + "_CapsuleCollider"); + capsuleColliderGO.transform.SetParent(capsuleRigidBodyGO.transform, false); + var capsuleCollider = capsuleColliderGO.AddComponent(); + var p0 = capsule.Points[0].FromFlippedZVector3f(); + var p1 = capsule.Points[1].FromFlippedZVector3f(); + var delta = p1 - p0; + var mag = delta.magnitude; + var rot = Quaternion.FromToRotation(capsuleRigidBodyGO.transform.localRotation * Vector3.right, delta); + capsuleCollider.radius = capsule.Radius; + capsuleCollider.height = mag + capsule.Radius * 2.0f; + capsuleCollider.isTrigger = false; + capsuleCollider.direction = 0; + capsuleColliderGO.transform.localPosition = p0; + capsuleColliderGO.transform.localRotation = rot; + capsuleCollider.center = Vector3.right * mag * 0.5f; + + _capsules[i] = new OVRBoneCapsule(capsule.BoneIndex, capsuleRigidBody, capsuleCollider); + } + } + + _isInitialized = true; + } + } + + private void Update() + { + if (!_isInitialized || _dataProvider == null) + return; + + var data = _dataProvider.GetSkeletonPoseData(); + + if (data.IsDataValid) + { + if (_updateRootPose) + { + transform.localPosition = data.RootPose.Position.FromFlippedZVector3f(); + transform.localRotation = data.RootPose.Orientation.FromFlippedZQuatf(); + } + + if (_updateRootScale) + { + transform.localScale = new Vector3(data.RootScale, data.RootScale, data.RootScale); + } + + for (var i = 0; i < _bones.Count; ++i) + { + _bones[i].Transform.localRotation = data.BoneRotations[i].FromFlippedZQuatf(); + } + } + } + + private void FixedUpdate() + { + if (!_isInitialized || _dataProvider == null) + return; + + Update(); + + if (_enablePhysicsCapsules) + { + var data = _dataProvider.GetSkeletonPoseData(); + + for (int i = 0; i < _capsules.Count; ++i) + { + OVRBoneCapsule capsule = _capsules[i]; + var capsuleGO = capsule.CapsuleRigidbody.gameObject; + + if (data.IsDataValid && data.IsDataHighConfidence) + { + Transform bone = _bones[(int)capsule.BoneIndex].Transform; + + if (capsuleGO.activeSelf) + { + capsule.CapsuleRigidbody.MovePosition(bone.position); + capsule.CapsuleRigidbody.MoveRotation(bone.rotation); + } + else + { + capsuleGO.SetActive(true); + capsule.CapsuleRigidbody.position = bone.position; + capsule.CapsuleRigidbody.rotation = bone.rotation; + } + } + else + { + if (capsuleGO.activeSelf) + { + capsuleGO.SetActive(false); + } + } + } + } + } + + public BoneId GetCurrentStartBoneId() + { + switch (_skeletonType) + { + case SkeletonType.HandLeft: + case SkeletonType.HandRight: + return BoneId.Hand_Start; + case SkeletonType.None: + default: + return BoneId.Invalid; + } + } + + public BoneId GetCurrentEndBoneId() + { + switch (_skeletonType) + { + case SkeletonType.HandLeft: + case SkeletonType.HandRight: + return BoneId.Hand_End; + case SkeletonType.None: + default: + return BoneId.Invalid; + } + } + + private BoneId GetCurrentMaxSkinnableBoneId() + { + switch (_skeletonType) + { + case SkeletonType.HandLeft: + case SkeletonType.HandRight: + return BoneId.Hand_MaxSkinnable; + case SkeletonType.None: + default: + return BoneId.Invalid; + } + } + + public int GetCurrentNumBones() + { + switch (_skeletonType) + { + case SkeletonType.HandLeft: + case SkeletonType.HandRight: + return GetCurrentEndBoneId() - GetCurrentStartBoneId(); + case SkeletonType.None: + default: + return 0; + } + } + + public int GetCurrentNumSkinnableBones() + { + switch (_skeletonType) + { + case SkeletonType.HandLeft: + case SkeletonType.HandRight: + return GetCurrentMaxSkinnableBoneId() - GetCurrentStartBoneId(); + case SkeletonType.None: + default: + return 0; + } + } +} + +public class OVRBone +{ + public OVRSkeleton.BoneId Id { get; private set; } + public short ParentBoneIndex { get; private set; } + public Transform Transform { get; private set; } + + public OVRBone(OVRSkeleton.BoneId id, short parentBoneIndex, Transform trans) + { + Id = id; + ParentBoneIndex = parentBoneIndex; + Transform = trans; + } +} + +public class OVRBoneCapsule +{ + public short BoneIndex { get; private set; } + public Rigidbody CapsuleRigidbody { get; private set; } + public CapsuleCollider CapsuleCollider { get; private set; } + + public OVRBoneCapsule(short boneIndex, Rigidbody capsuleRigidBody, CapsuleCollider capsuleCollider) + { + BoneIndex = boneIndex; + CapsuleRigidbody = capsuleRigidBody; + CapsuleCollider = capsuleCollider; + } +} + diff --git a/Assets/Oculus/VR/Scripts/Util/OVRSkeleton.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRSkeleton.cs.meta new file mode 100644 index 0000000..59f144b --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRSkeleton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2609c54f376cffc4da1ab9401cc1a36f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRSkeletonRenderer.cs b/Assets/Oculus/VR/Scripts/Util/OVRSkeletonRenderer.cs new file mode 100644 index 0000000..5ce4865 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRSkeletonRenderer.cs @@ -0,0 +1,161 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[DefaultExecutionOrder(-70)] +public class OVRSkeletonRenderer : MonoBehaviour +{ + public interface IOVRSkeletonRendererDataProvider + { + SkeletonRendererData GetSkeletonRendererData(); + } + + public struct SkeletonRendererData + { + public float RootScale { get; set; } + public bool IsDataValid { get; set; } + public bool IsDataHighConfidence { get; set; } + } + + [SerializeField] + private IOVRSkeletonRendererDataProvider _dataProvider; + [SerializeField] + private Material _skeletonMaterial; + private const float LINE_RENDERER_WIDTH = 0.005f; + private List _boneVisualizations; + private OVRSkeleton _ovrSkeleton; + private GameObject _skeletonGO; + private float _scale; + private bool _isInitialized; + + private class BoneVisualization + { + public GameObject BoneGO; + public Transform BoneBegin; + public Transform BoneEnd; + public LineRenderer Line; + + public BoneVisualization(GameObject rootGO, Material mat, float scale, Transform begin, Transform end) + { + BoneBegin = begin; + BoneEnd = end; + + BoneGO = new GameObject(begin.name); + BoneGO.transform.SetParent(rootGO.transform, false); + + Line = BoneGO.AddComponent(); + Line.sharedMaterial = mat; + Line.useWorldSpace = true; + Line.positionCount = 2; + + Line.SetPosition(0, BoneBegin.position); + Line.SetPosition(1, BoneEnd.position); + + Line.startWidth = LINE_RENDERER_WIDTH * scale; + Line.endWidth = LINE_RENDERER_WIDTH * scale; + } + + public void Update(float scale, bool shouldRender) + { + Line.enabled = shouldRender; + + Line.SetPosition(0, BoneBegin.position); + Line.SetPosition(1, BoneEnd.position); + + Line.startWidth = LINE_RENDERER_WIDTH * scale; + Line.endWidth = LINE_RENDERER_WIDTH * scale; + } + } + + private void Awake() + { + if (_dataProvider == null) + { + _dataProvider = GetComponent(); + } + + if (_ovrSkeleton == null) + { + _ovrSkeleton = GetComponent(); + } + } + + private void Start() + { + if (_ovrSkeleton == null) + { + this.enabled = false; + return; + } + + Initialize(); + } + + private void Initialize() + { + _boneVisualizations = new List(); + _ovrSkeleton = GetComponent(); + _skeletonGO = new GameObject("SkeletonRenderer"); + _skeletonGO.transform.SetParent(transform, false); + + if (_skeletonMaterial == null) + { + _skeletonMaterial = new Material(Shader.Find("Diffuse")); + } + + for (int i = 0; i < _ovrSkeleton.Bones.Count; i++) + { + var boneVis = new BoneVisualization( + _skeletonGO, + _skeletonMaterial, + _scale, + _ovrSkeleton.Bones[i].Transform, + _ovrSkeleton.Bones[i].Transform.parent); + + _boneVisualizations.Add(boneVis); + } + + _isInitialized = true; + } + + public void Update() + { + if (_isInitialized) + { + bool shouldRender = false; + + if (_dataProvider != null) + { + var data = _dataProvider.GetSkeletonRendererData(); + + shouldRender = data.IsDataValid && data.IsDataHighConfidence; + + if (data.IsDataValid) + { + _scale = data.RootScale; + } + } + + for (int i = 0; i < _boneVisualizations.Count; i++) + { + _boneVisualizations[i].Update(_scale, shouldRender); + } + } + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRSkeletonRenderer.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRSkeletonRenderer.cs.meta new file mode 100644 index 0000000..6da18b7 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRSkeletonRenderer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 54c16b381e28e8d479237771d234dbae +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRSystemPerfMetrics.cs b/Assets/Oculus/VR/Scripts/Util/OVRSystemPerfMetrics.cs new file mode 100644 index 0000000..3ef4a24 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRSystemPerfMetrics.cs @@ -0,0 +1,276 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using UnityEngine; +using UnityEngine.Networking; + +using Debug = UnityEngine.Debug; + +public class OVRSystemPerfMetrics +{ + public const int TcpListeningPort = 32419; + public const int PayloadTypeMetrics = 100; + + public const int MaxBufferLength = 65536; + public const int MaxMessageLength = MaxBufferLength - sizeof(int); + + public class PerfMetrics + { + public int frameCount; + public float frameTime; + public float deltaFrameTime; + + public bool appCpuTime_IsValid; + public float appCpuTime; + public bool appGpuTime_IsValid; + public float appGpuTime; + public bool compositorCpuTime_IsValid; + public float compositorCpuTime; + public bool compositorGpuTime_IsValid; + public float compositorGpuTime; + public bool compositorDroppedFrameCount_IsValid; + public int compositorDroppedFrameCount; + public bool systemGpuUtilPercentage_IsValid; + public float systemGpuUtilPercentage; + public bool systemCpuUtilAveragePercentage_IsValid; + public float systemCpuUtilAveragePercentage; + public bool systemCpuUtilWorstPercentage_IsValid; + public float systemCpuUtilWorstPercentage; + public bool deviceCpuClockFrequencyInMHz_IsValid; + public float deviceCpuClockFrequencyInMHz; + public bool deviceGpuClockFrequencyInMHz_IsValid; + public float deviceGpuClockFrequencyInMHz; + public bool deviceCpuClockLevel_IsValid; + public int deviceCpuClockLevel; + public bool deviceGpuClockLevel_IsValid; + public int deviceGpuClockLevel; + + public string ToJSON() + { + OVRSimpleJSON.JSONObject jsonNode = new OVRSimpleJSON.JSONObject(); + jsonNode.Add("frameCount", new OVRSimpleJSON.JSONNumber(frameCount)); + jsonNode.Add("frameTime", new OVRSimpleJSON.JSONNumber(frameTime)); + jsonNode.Add("deltaFrameTime", new OVRSimpleJSON.JSONNumber(deltaFrameTime)); + if (appCpuTime_IsValid) + { + jsonNode.Add("appCpuTime", new OVRSimpleJSON.JSONNumber(appCpuTime)); + } + if (appGpuTime_IsValid) + { + jsonNode.Add("appGpuTime", new OVRSimpleJSON.JSONNumber(appGpuTime)); + } + if (compositorCpuTime_IsValid) + { + jsonNode.Add("compositorCpuTime", new OVRSimpleJSON.JSONNumber(compositorCpuTime)); + } + if (compositorGpuTime_IsValid) + { + jsonNode.Add("compositorGpuTime", new OVRSimpleJSON.JSONNumber(compositorGpuTime)); + } + if (compositorDroppedFrameCount_IsValid) + { + jsonNode.Add("compositorDroppedFrameCount", new OVRSimpleJSON.JSONNumber(compositorDroppedFrameCount)); + } + if (systemGpuUtilPercentage_IsValid) + { + jsonNode.Add("systemGpuUtilPercentage", new OVRSimpleJSON.JSONNumber(systemGpuUtilPercentage)); + } + if (systemCpuUtilAveragePercentage_IsValid) + { + jsonNode.Add("systemCpuUtilAveragePercentage", new OVRSimpleJSON.JSONNumber(systemCpuUtilAveragePercentage)); + } + if (systemCpuUtilWorstPercentage_IsValid) + { + jsonNode.Add("systemCpuUtilWorstPercentage", new OVRSimpleJSON.JSONNumber(systemCpuUtilWorstPercentage)); + } + if (deviceCpuClockFrequencyInMHz_IsValid) + { + jsonNode.Add("deviceCpuClockFrequencyInMHz", new OVRSimpleJSON.JSONNumber(deviceCpuClockFrequencyInMHz)); + } + if (deviceGpuClockFrequencyInMHz_IsValid) + { + jsonNode.Add("deviceGpuClockFrequencyInMHz", new OVRSimpleJSON.JSONNumber(deviceGpuClockFrequencyInMHz)); + } + if (deviceCpuClockLevel_IsValid) + { + jsonNode.Add("deviceCpuClockLevel", new OVRSimpleJSON.JSONNumber(deviceCpuClockLevel)); + } + if (deviceGpuClockLevel_IsValid) + { + jsonNode.Add("deviceGpuClockLevel", new OVRSimpleJSON.JSONNumber(deviceGpuClockLevel)); + } + string str = jsonNode.ToString(); + return str; + } + + public bool LoadFromJSON(string json) + { + OVRSimpleJSON.JSONObject jsonNode = OVRSimpleJSON.JSONObject.Parse(json) as OVRSimpleJSON.JSONObject; + if (jsonNode == null) + { + return false; + } + frameCount = jsonNode["frameCount"] != null ? jsonNode["frameCount"].AsInt : 0; + frameTime = jsonNode["frameTime"] != null ? jsonNode["frameTime"].AsFloat : 0; + deltaFrameTime = jsonNode["deltaFrameTime"] != null ? jsonNode["deltaFrameTime"].AsFloat : 0; + appCpuTime_IsValid = jsonNode["appCpuTime"] != null; + appCpuTime = appCpuTime_IsValid ? jsonNode["appCpuTime"].AsFloat : 0; + appGpuTime_IsValid = jsonNode["appGpuTime"] != null; + appGpuTime = appGpuTime_IsValid ? jsonNode["appGpuTime"].AsFloat : 0; + compositorCpuTime_IsValid = jsonNode["compositorCpuTime"] != null; + compositorCpuTime = compositorCpuTime_IsValid ? jsonNode["compositorCpuTime"].AsFloat : 0; + compositorGpuTime_IsValid = jsonNode["compositorGpuTime"] != null; + compositorGpuTime = compositorGpuTime_IsValid ? jsonNode["compositorGpuTime"].AsFloat : 0; + compositorDroppedFrameCount_IsValid = jsonNode["compositorDroppedFrameCount"] != null; + compositorDroppedFrameCount = compositorDroppedFrameCount_IsValid ? jsonNode["ompositorDroppedFrameCount"].AsInt : 0; + systemGpuUtilPercentage_IsValid = jsonNode["systemGpuUtilPercentage"] != null; + systemGpuUtilPercentage = systemGpuUtilPercentage_IsValid ? jsonNode["systemGpuUtilPercentage"].AsFloat : 0; + systemCpuUtilAveragePercentage_IsValid = jsonNode["systemCpuUtilAveragePercentage"] != null; + systemCpuUtilAveragePercentage = systemCpuUtilAveragePercentage_IsValid ? jsonNode["systemCpuUtilAveragePercentage"].AsFloat : 0; + systemCpuUtilWorstPercentage_IsValid = jsonNode["systemCpuUtilWorstPercentage"] != null; + systemCpuUtilWorstPercentage = systemCpuUtilWorstPercentage_IsValid ? jsonNode["systemCpuUtilWorstPercentage"].AsFloat : 0; + deviceCpuClockFrequencyInMHz_IsValid = jsonNode["deviceCpuClockFrequencyInMHz"] != null; + deviceCpuClockFrequencyInMHz = deviceCpuClockFrequencyInMHz_IsValid ? jsonNode["deviceCpuClockFrequencyInMHz"].AsFloat : 0; + deviceGpuClockFrequencyInMHz_IsValid = jsonNode["deviceGpuClockFrequencyInMHz"] != null; + deviceGpuClockFrequencyInMHz = deviceGpuClockFrequencyInMHz_IsValid ? jsonNode["deviceGpuClockFrequencyInMHz"].AsFloat : 0; + deviceCpuClockLevel_IsValid = jsonNode["deviceCpuClockLevel"] != null; + deviceCpuClockLevel = deviceCpuClockLevel_IsValid ? jsonNode["deviceCpuClockLevel"].AsInt : 0; + deviceGpuClockLevel_IsValid = jsonNode["deviceGpuClockLevel"] != null; + deviceGpuClockLevel = deviceGpuClockLevel_IsValid ? jsonNode["deviceGpuClockLevel"].AsInt : 0; + return true; + } + } + + public class OVRSystemPerfMetricsTcpServer : MonoBehaviour + { + public static OVRSystemPerfMetricsTcpServer singleton = null; + + private OVRNetwork.OVRNetworkTcpServer tcpServer = new OVRNetwork.OVRNetworkTcpServer(); + + public int listeningPort = OVRSystemPerfMetrics.TcpListeningPort; + + void OnEnable() + { + if (singleton != null) + { + Debug.LogError("Mutiple OVRSystemPerfMetricsTcpServer exists"); + return; + } + else + { + singleton = this; + } + + if (Application.isEditor) + { + Application.runInBackground = true; + } + tcpServer.StartListening(listeningPort); + } + + void OnDisable() + { + tcpServer.StopListening(); + + singleton = null; + + Debug.Log("[OVRSystemPerfMetricsTcpServer] server destroyed"); + } + + private void Update() + { + if (tcpServer.HasConnectedClient()) + { + PerfMetrics metrics = GatherPerfMetrics(); + string json = metrics.ToJSON(); + byte[] bytes = Encoding.UTF8.GetBytes(json); + tcpServer.Broadcast(OVRSystemPerfMetrics.PayloadTypeMetrics, bytes); + } + } + + PerfMetrics GatherPerfMetrics() + { + PerfMetrics metrics = new PerfMetrics(); + + metrics.frameCount = Time.frameCount; + metrics.frameTime = Time.unscaledTime; + metrics.deltaFrameTime = Time.unscaledDeltaTime; + + float? floatValue; + int? intValue; + + floatValue = OVRPlugin.GetPerfMetricsFloat(OVRPlugin.PerfMetrics.App_CpuTime_Float); + metrics.appCpuTime_IsValid = floatValue.HasValue; + metrics.appCpuTime = floatValue.GetValueOrDefault(); + + floatValue = OVRPlugin.GetPerfMetricsFloat(OVRPlugin.PerfMetrics.App_GpuTime_Float); + metrics.appGpuTime_IsValid = floatValue.HasValue; + metrics.appGpuTime = floatValue.GetValueOrDefault(); + + floatValue = OVRPlugin.GetPerfMetricsFloat(OVRPlugin.PerfMetrics.Compositor_CpuTime_Float); + metrics.compositorCpuTime_IsValid = floatValue.HasValue; + metrics.compositorCpuTime = floatValue.GetValueOrDefault(); + + floatValue = OVRPlugin.GetPerfMetricsFloat(OVRPlugin.PerfMetrics.Compositor_GpuTime_Float); + metrics.compositorGpuTime_IsValid = floatValue.HasValue; + metrics.compositorGpuTime = floatValue.GetValueOrDefault(); + + intValue = OVRPlugin.GetPerfMetricsInt(OVRPlugin.PerfMetrics.Compositor_DroppedFrameCount_Int); + metrics.compositorDroppedFrameCount_IsValid = intValue.HasValue; + metrics.compositorDroppedFrameCount = intValue.GetValueOrDefault(); + + floatValue = OVRPlugin.GetPerfMetricsFloat(OVRPlugin.PerfMetrics.System_GpuUtilPercentage_Float); + metrics.systemGpuUtilPercentage_IsValid = floatValue.HasValue; + metrics.systemGpuUtilPercentage = floatValue.GetValueOrDefault(); + + floatValue = OVRPlugin.GetPerfMetricsFloat(OVRPlugin.PerfMetrics.System_CpuUtilAveragePercentage_Float); + metrics.systemCpuUtilAveragePercentage_IsValid = floatValue.HasValue; + metrics.systemCpuUtilAveragePercentage = floatValue.GetValueOrDefault(); + + floatValue = OVRPlugin.GetPerfMetricsFloat(OVRPlugin.PerfMetrics.System_CpuUtilWorstPercentage_Float); + metrics.systemCpuUtilWorstPercentage_IsValid = floatValue.HasValue; + metrics.systemCpuUtilWorstPercentage = floatValue.GetValueOrDefault(); + + floatValue = OVRPlugin.GetPerfMetricsFloat(OVRPlugin.PerfMetrics.Device_CpuClockFrequencyInMHz_Float); + metrics.deviceCpuClockFrequencyInMHz_IsValid = floatValue.HasValue; + metrics.deviceCpuClockFrequencyInMHz = floatValue.GetValueOrDefault(); + + floatValue = OVRPlugin.GetPerfMetricsFloat(OVRPlugin.PerfMetrics.Device_GpuClockFrequencyInMHz_Float); + metrics.deviceGpuClockFrequencyInMHz_IsValid = floatValue.HasValue; + metrics.deviceGpuClockFrequencyInMHz = floatValue.GetValueOrDefault(); + + intValue = OVRPlugin.GetPerfMetricsInt(OVRPlugin.PerfMetrics.Device_CpuClockLevel_Int); + metrics.deviceCpuClockLevel_IsValid = intValue.HasValue; + metrics.deviceCpuClockLevel = intValue.GetValueOrDefault(); + + intValue = OVRPlugin.GetPerfMetricsInt(OVRPlugin.PerfMetrics.Device_GpuClockLevel_Int); + metrics.deviceGpuClockLevel_IsValid = intValue.HasValue; + metrics.deviceGpuClockLevel = intValue.GetValueOrDefault(); + + return metrics; + } + + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRSystemPerfMetrics.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRSystemPerfMetrics.cs.meta new file mode 100644 index 0000000..49e352a --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRSystemPerfMetrics.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a987a7ebe2d568f459dab8dfb866479f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Scripts/Util/OVRWaitCursor.cs b/Assets/Oculus/VR/Scripts/Util/OVRWaitCursor.cs new file mode 100644 index 0000000..28ba043 --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRWaitCursor.cs @@ -0,0 +1,33 @@ +/************************************************************************************ +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use +the Utilities SDK except in compliance with the License, which is provided at the time of installation +or download, or which otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at +https://developer.oculus.com/licenses/utilities-1.31 + +Unless required by applicable law or agreed to in writing, the Utilities SDK distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +ANY KIND, either express or implied. See the License for the specific language governing +permissions and limitations under the License. +************************************************************************************/ + +using UnityEngine; + +/// +/// Rotates this GameObject at a given speed. +/// +public class OVRWaitCursor : MonoBehaviour +{ + public Vector3 rotateSpeeds = new Vector3(0.0f, 0.0f, -60.0f); + + /// + /// Auto rotates the attached cursor. + /// + void Update() + { + transform.Rotate(rotateSpeeds * Time.smoothDeltaTime); + } +} diff --git a/Assets/Oculus/VR/Scripts/Util/OVRWaitCursor.cs.meta b/Assets/Oculus/VR/Scripts/Util/OVRWaitCursor.cs.meta new file mode 100644 index 0000000..3bb6dca --- /dev/null +++ b/Assets/Oculus/VR/Scripts/Util/OVRWaitCursor.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d313011a8bc474fe49260bde01cffcd3 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Oculus/VR/Shaders.meta b/Assets/Oculus/VR/Shaders.meta new file mode 100644 index 0000000..e765f1c --- /dev/null +++ b/Assets/Oculus/VR/Shaders.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d79c5fa4d57bda54f88884a89963d684 +folderAsset: yes +timeCreated: 1466707365 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Shaders/OVRColorRampAlpha.shader b/Assets/Oculus/VR/Shaders/OVRColorRampAlpha.shader new file mode 100644 index 0000000..e15c53e --- /dev/null +++ b/Assets/Oculus/VR/Shaders/OVRColorRampAlpha.shader @@ -0,0 +1,63 @@ +Shader "OVRColorRampAlpa" { + Properties { + _Color ("Main Color", Color ) = (1,1,1,1) + _MainTex ("Diffuse (RGB) AlphaMask (A)", 2D) = "white" {} + _ColorRamp ("Color Ramp (A)", 2D) = "white" {} + _ColorRampOffset ("Color Ramp Offset", Range(0,1)) = 0.0 + } + +Category { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + Blend SrcAlpha OneMinusSrcAlpha + AlphaTest Greater .01 + ColorMask RGB + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } + + SubShader { + Pass { + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + sampler2D _MainTex; + sampler2D _ColorRamp; + float _ColorRampOffset; + fixed4 _Color; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert(appdata_t v) { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.color = v.color; + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + return o; + } + + fixed4 frag(v2f i) : SV_Target { + float4 texel = tex2D(_MainTex, i.texcoord); + float2 colorIndex = float2( texel.x, _ColorRampOffset ); + float4 outColor = tex2D(_ColorRamp, colorIndex) * _Color; + outColor.a = texel.a; + return outColor; + } + ENDCG + } + } +} +} // Category \ No newline at end of file diff --git a/Assets/Oculus/VR/Shaders/OVRColorRampAlpha.shader.meta b/Assets/Oculus/VR/Shaders/OVRColorRampAlpha.shader.meta new file mode 100644 index 0000000..68b81e7 --- /dev/null +++ b/Assets/Oculus/VR/Shaders/OVRColorRampAlpha.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b95caf64e2cc3614892026a94bb2be84 +timeCreated: 1433268462 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Shaders/Unlit Crosshair.shader b/Assets/Oculus/VR/Shaders/Unlit Crosshair.shader new file mode 100644 index 0000000..04e64d3 --- /dev/null +++ b/Assets/Oculus/VR/Shaders/Unlit Crosshair.shader @@ -0,0 +1,79 @@ +// Unlit alpha-blended shader. +// - no lighting +// - no lightmap support +// - supports tint color + +Shader "Unlit/Crosshair" { + + Properties + { + _MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {} + _Color ("Main Color", Color) = (0.5,0.5,0.5,0.5) + } + + SubShader + { + LOD 100 + + Tags + { + "Queue" = "Transparent" + "IgnoreProjector" = "True" + "RenderType" = "Transparent" + } + + Cull Off + Lighting Off + ZTest Always + ZWrite Off + Fog { Mode Off } + Offset -1, -1 + Blend SrcAlpha OneMinusSrcAlpha + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata_t + { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + fixed4 color : COLOR; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + half2 texcoord : TEXCOORD0; + fixed4 color : COLOR; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + fixed4 _Color; + + v2f vert (appdata_t v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); + o.color = v.color; + return o; + } + + fixed4 frag (v2f i) : COLOR + { + fixed4 col = tex2D(_MainTex, i.texcoord) * i.color * _Color * 2.0; + return col; + } + ENDCG + } + } + + +} + diff --git a/Assets/Oculus/VR/Shaders/Unlit Crosshair.shader.meta b/Assets/Oculus/VR/Shaders/Unlit Crosshair.shader.meta new file mode 100644 index 0000000..98141b4 --- /dev/null +++ b/Assets/Oculus/VR/Shaders/Unlit Crosshair.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 05b53b473302943b58b8e33c93a38dac +ShaderImporter: + defaultTextures: [] + userData: diff --git a/Assets/Oculus/VR/Textures.meta b/Assets/Oculus/VR/Textures.meta new file mode 100644 index 0000000..e17ea9d --- /dev/null +++ b/Assets/Oculus/VR/Textures.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 1938789817fe3974ea20e502ed4bcd76 +DefaultImporter: + userData: diff --git a/Assets/Oculus/VR/Textures/Black.png b/Assets/Oculus/VR/Textures/Black.png new file mode 100644 index 0000000..7d35fa4 Binary files /dev/null and b/Assets/Oculus/VR/Textures/Black.png differ diff --git a/Assets/Oculus/VR/Textures/Black.png.meta b/Assets/Oculus/VR/Textures/Black.png.meta new file mode 100644 index 0000000..18e32c2 --- /dev/null +++ b/Assets/Oculus/VR/Textures/Black.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: a025c23fceb7d4966b603419f551ce99 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 2 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapMode: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: -1 + buildTargetSettings: [] + userData: diff --git a/Assets/Oculus/VR/Textures/GazeRing.png b/Assets/Oculus/VR/Textures/GazeRing.png new file mode 100644 index 0000000..ea87ece Binary files /dev/null and b/Assets/Oculus/VR/Textures/GazeRing.png differ diff --git a/Assets/Oculus/VR/Textures/GazeRing.png.meta b/Assets/Oculus/VR/Textures/GazeRing.png.meta new file mode 100644 index 0000000..54f93c7 --- /dev/null +++ b/Assets/Oculus/VR/Textures/GazeRing.png.meta @@ -0,0 +1,82 @@ +fileFormatVersion: 2 +guid: 82026cb669304dc4897d2c11d3753141 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 16 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/GearVrController.meta b/Assets/Oculus/VR/Textures/GearVrController.meta new file mode 100644 index 0000000..b39f9a2 --- /dev/null +++ b/Assets/Oculus/VR/Textures/GearVrController.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6f0243e2a75c57c4dbd1b782c7557b50 +folderAsset: yes +timeCreated: 1486168258 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_1024.tif b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_1024.tif new file mode 100644 index 0000000..2d39574 Binary files /dev/null and b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_1024.tif differ diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_1024.tif.meta b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_1024.tif.meta new file mode 100644 index 0000000..4c55306 --- /dev/null +++ b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_1024.tif.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 4b12fa22be3f7f143b055ad60e483684 +timeCreated: 1488144144 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_128.tif b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_128.tif new file mode 100644 index 0000000..bd387be Binary files /dev/null and b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_128.tif differ diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_128.tif.meta b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_128.tif.meta new file mode 100644 index 0000000..89e31d4 --- /dev/null +++ b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_ao_128.tif.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 8556f6ca8690f0a47bcc8c5adec768da +timeCreated: 1488144144 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_1024.tif b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_1024.tif new file mode 100644 index 0000000..6f31d63 Binary files /dev/null and b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_1024.tif differ diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_1024.tif.meta b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_1024.tif.meta new file mode 100644 index 0000000..973083d --- /dev/null +++ b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_1024.tif.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 8dcaddcb07fa3214989bf16d62f3efbc +timeCreated: 1488144146 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_128.tif b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_128.tif new file mode 100644 index 0000000..55ca42f Binary files /dev/null and b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_128.tif differ diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_128.tif.meta b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_128.tif.meta new file mode 100644 index 0000000..7038037 --- /dev/null +++ b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_color_128.tif.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 2cf74d0adf6b17348bb03c979684482b +timeCreated: 1488144137 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_1024.tif b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_1024.tif new file mode 100644 index 0000000..4730a9a Binary files /dev/null and b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_1024.tif differ diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_1024.tif.meta b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_1024.tif.meta new file mode 100644 index 0000000..4e1fa94 --- /dev/null +++ b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_1024.tif.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: ab629f733cdfcfa4ba04695645307f24 +timeCreated: 1488144803 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_128.tif b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_128.tif new file mode 100644 index 0000000..8ef3ca1 Binary files /dev/null and b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_128.tif differ diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_128.tif.meta b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_128.tif.meta new file mode 100644 index 0000000..f602aa3 --- /dev/null +++ b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_normal_128.tif.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: cd52447b7b5ad174bb3858eb22a8fe2e +timeCreated: 1488144473 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_1024.tif b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_1024.tif new file mode 100644 index 0000000..6346787 Binary files /dev/null and b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_1024.tif differ diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_1024.tif.meta b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_1024.tif.meta new file mode 100644 index 0000000..199f083 --- /dev/null +++ b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_1024.tif.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 2dd5a3d0ec7b92841a55a5e07e67db76 +timeCreated: 1488144138 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_128.tif b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_128.tif new file mode 100644 index 0000000..b537f05 Binary files /dev/null and b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_128.tif differ diff --git a/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_128.tif.meta b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_128.tif.meta new file mode 100644 index 0000000..4a1eeea --- /dev/null +++ b/Assets/Oculus/VR/Textures/GearVrController/GearVrController_roughness_128.tif.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 8200b8b7f126cc949bdb39c3eff99890 +timeCreated: 1488144144 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/HandTracking.meta b/Assets/Oculus/VR/Textures/HandTracking.meta new file mode 100644 index 0000000..1b8a44e --- /dev/null +++ b/Assets/Oculus/VR/Textures/HandTracking.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e3fd01f2f4617074b80e5e691882c81d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/HandTracking/HandTracking_uvmap_2048.png b/Assets/Oculus/VR/Textures/HandTracking/HandTracking_uvmap_2048.png new file mode 100644 index 0000000..9e3aa2a Binary files /dev/null and b/Assets/Oculus/VR/Textures/HandTracking/HandTracking_uvmap_2048.png differ diff --git a/Assets/Oculus/VR/Textures/HandTracking/HandTracking_uvmap_2048.png.meta b/Assets/Oculus/VR/Textures/HandTracking/HandTracking_uvmap_2048.png.meta new file mode 100644 index 0000000..c44c9b1 --- /dev/null +++ b/Assets/Oculus/VR/Textures/HandTracking/HandTracking_uvmap_2048.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: c00bf1ce0c68d5646ad7ea3d26b3486d +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/Icons.meta b/Assets/Oculus/VR/Textures/Icons.meta new file mode 100644 index 0000000..8f498cc --- /dev/null +++ b/Assets/Oculus/VR/Textures/Icons.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: e081f465852cec14380da085e957c52b +DefaultImporter: + userData: diff --git a/Assets/Oculus/VR/Textures/Icons/OculusIcon.png b/Assets/Oculus/VR/Textures/Icons/OculusIcon.png new file mode 100644 index 0000000..1b6a32b Binary files /dev/null and b/Assets/Oculus/VR/Textures/Icons/OculusIcon.png differ diff --git a/Assets/Oculus/VR/Textures/Icons/OculusIcon.png.meta b/Assets/Oculus/VR/Textures/Icons/OculusIcon.png.meta new file mode 100644 index 0000000..961e7d3 --- /dev/null +++ b/Assets/Oculus/VR/Textures/Icons/OculusIcon.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: ee6b6c047f060074596445bbb9ebbfe7 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 128 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/Logos.meta b/Assets/Oculus/VR/Textures/Logos.meta new file mode 100644 index 0000000..1f0119f --- /dev/null +++ b/Assets/Oculus/VR/Textures/Logos.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 1c18650754748f647bacde4e2116cbff +DefaultImporter: + userData: diff --git a/Assets/Oculus/VR/Textures/Logos/OculusLogo.png b/Assets/Oculus/VR/Textures/Logos/OculusLogo.png new file mode 100644 index 0000000..05ce012 Binary files /dev/null and b/Assets/Oculus/VR/Textures/Logos/OculusLogo.png differ diff --git a/Assets/Oculus/VR/Textures/Logos/OculusLogo.png.meta b/Assets/Oculus/VR/Textures/Logos/OculusLogo.png.meta new file mode 100644 index 0000000..d191e19 --- /dev/null +++ b/Assets/Oculus/VR/Textures/Logos/OculusLogo.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: a56d69833b6471340bd0029e57449b72 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 5 + buildTargetSettings: [] + userData: diff --git a/Assets/Oculus/VR/Textures/Logos/OculusLogoSplash.png b/Assets/Oculus/VR/Textures/Logos/OculusLogoSplash.png new file mode 100644 index 0000000..1f1f6a8 Binary files /dev/null and b/Assets/Oculus/VR/Textures/Logos/OculusLogoSplash.png differ diff --git a/Assets/Oculus/VR/Textures/Logos/OculusLogoSplash.png.meta b/Assets/Oculus/VR/Textures/Logos/OculusLogoSplash.png.meta new file mode 100644 index 0000000..3d3f364 --- /dev/null +++ b/Assets/Oculus/VR/Textures/Logos/OculusLogoSplash.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 3caded05dba914447a5f85650f9f4ab2 +timeCreated: 1456251719 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/OculusGoController.meta b/Assets/Oculus/VR/Textures/OculusGoController.meta new file mode 100644 index 0000000..28f515a --- /dev/null +++ b/Assets/Oculus/VR/Textures/OculusGoController.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 829191324a3df8944b07ba1bd4c8f335 +folderAsset: yes +timeCreated: 1513040773 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/OculusGoController/OculusGoController_albedo.tga b/Assets/Oculus/VR/Textures/OculusGoController/OculusGoController_albedo.tga new file mode 100644 index 0000000..394127f Binary files /dev/null and b/Assets/Oculus/VR/Textures/OculusGoController/OculusGoController_albedo.tga differ diff --git a/Assets/Oculus/VR/Textures/OculusGoController/OculusGoController_albedo.tga.meta b/Assets/Oculus/VR/Textures/OculusGoController/OculusGoController_albedo.tga.meta new file mode 100644 index 0000000..d6fd9a2 --- /dev/null +++ b/Assets/Oculus/VR/Textures/OculusGoController/OculusGoController_albedo.tga.meta @@ -0,0 +1,84 @@ +fileFormatVersion: 2 +guid: 6fd132ea4bdd3ec4298a583f001ed5ab +timeCreated: 1513127630 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/OculusTouchForQuestAndRiftS.meta b/Assets/Oculus/VR/Textures/OculusTouchForQuestAndRiftS.meta new file mode 100644 index 0000000..c41c901 --- /dev/null +++ b/Assets/Oculus/VR/Textures/OculusTouchForQuestAndRiftS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7b78d5b642ac2854496c21322109cde3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/OculusTouchForQuestAndRiftS/OculusQuestTouchControllerTexture.tga b/Assets/Oculus/VR/Textures/OculusTouchForQuestAndRiftS/OculusQuestTouchControllerTexture.tga new file mode 100644 index 0000000..fb3ddaa Binary files /dev/null and b/Assets/Oculus/VR/Textures/OculusTouchForQuestAndRiftS/OculusQuestTouchControllerTexture.tga differ diff --git a/Assets/Oculus/VR/Textures/OculusTouchForQuestAndRiftS/OculusQuestTouchControllerTexture.tga.meta b/Assets/Oculus/VR/Textures/OculusTouchForQuestAndRiftS/OculusQuestTouchControllerTexture.tga.meta new file mode 100644 index 0000000..ce9f60c --- /dev/null +++ b/Assets/Oculus/VR/Textures/OculusTouchForQuestAndRiftS/OculusQuestTouchControllerTexture.tga.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a53d1d4e8207acf45b310f189c342b70 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/OculusTouchForRift.meta b/Assets/Oculus/VR/Textures/OculusTouchForRift.meta new file mode 100644 index 0000000..1c528bc --- /dev/null +++ b/Assets/Oculus/VR/Textures/OculusTouchForRift.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65282c4c93cd6da48841b9e0c575c030 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_albedo.png b/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_albedo.png new file mode 100644 index 0000000..231e4b8 Binary files /dev/null and b/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_albedo.png differ diff --git a/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_albedo.png.meta b/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_albedo.png.meta new file mode 100644 index 0000000..cf76f0b --- /dev/null +++ b/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_albedo.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 063f7a502a7e06e428090710e8286b2b +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_controlmap.tga b/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_controlmap.tga new file mode 100644 index 0000000..86315b6 Binary files /dev/null and b/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_controlmap.tga differ diff --git a/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_controlmap.tga.meta b/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_controlmap.tga.meta new file mode 100644 index 0000000..2987bf2 --- /dev/null +++ b/Assets/Oculus/VR/Textures/OculusTouchForRift/touchController_controlmap.tga.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8469e5158ec88094497effdf524ee900 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/color_ramp_timer.tga b/Assets/Oculus/VR/Textures/color_ramp_timer.tga new file mode 100644 index 0000000..d2caeea Binary files /dev/null and b/Assets/Oculus/VR/Textures/color_ramp_timer.tga differ diff --git a/Assets/Oculus/VR/Textures/color_ramp_timer.tga.meta b/Assets/Oculus/VR/Textures/color_ramp_timer.tga.meta new file mode 100644 index 0000000..9f3ac00 --- /dev/null +++ b/Assets/Oculus/VR/Textures/color_ramp_timer.tga.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 8929c8bc5148a624b8c9d6df0ee6f0ca +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: 4 + maxTextureSize: 1024 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/cube_texture.png b/Assets/Oculus/VR/Textures/cube_texture.png new file mode 100644 index 0000000..b289fff Binary files /dev/null and b/Assets/Oculus/VR/Textures/cube_texture.png differ diff --git a/Assets/Oculus/VR/Textures/cube_texture.png.meta b/Assets/Oculus/VR/Textures/cube_texture.png.meta new file mode 100644 index 0000000..4ddecb8 --- /dev/null +++ b/Assets/Oculus/VR/Textures/cube_texture.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 020d1a102a7f2a14ebf6cefe7b977303 +timeCreated: 1425942022 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/gaze_cursor.png b/Assets/Oculus/VR/Textures/gaze_cursor.png new file mode 100644 index 0000000..65d1ea5 Binary files /dev/null and b/Assets/Oculus/VR/Textures/gaze_cursor.png differ diff --git a/Assets/Oculus/VR/Textures/gaze_cursor.png.meta b/Assets/Oculus/VR/Textures/gaze_cursor.png.meta new file mode 100644 index 0000000..cfbca2f --- /dev/null +++ b/Assets/Oculus/VR/Textures/gaze_cursor.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 077028084dceb584798dade6c58d1978 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Oculus/VR/Textures/gaze_cursor_timer.tga b/Assets/Oculus/VR/Textures/gaze_cursor_timer.tga new file mode 100644 index 0000000..1ecf4cf Binary files /dev/null and b/Assets/Oculus/VR/Textures/gaze_cursor_timer.tga differ diff --git a/Assets/Oculus/VR/Textures/gaze_cursor_timer.tga.meta b/Assets/Oculus/VR/Textures/gaze_cursor_timer.tga.meta new file mode 100644 index 0000000..7b218b8 --- /dev/null +++ b/Assets/Oculus/VR/Textures/gaze_cursor_timer.tga.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 79a33e7a7166c6142ad50f46a9a23d3e +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: 4 + maxTextureSize: 1024 + textureSettings: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/handle.png b/Assets/Oculus/VR/Textures/handle.png new file mode 100644 index 0000000..e30f59f Binary files /dev/null and b/Assets/Oculus/VR/Textures/handle.png differ diff --git a/Assets/Oculus/VR/Textures/handle.png.meta b/Assets/Oculus/VR/Textures/handle.png.meta new file mode 100644 index 0000000..3ea7be7 --- /dev/null +++ b/Assets/Oculus/VR/Textures/handle.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: ce8f78b2b9292484e97f36ad9568fc4f +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: gui + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/Textures/windowgui.png b/Assets/Oculus/VR/Textures/windowgui.png new file mode 100644 index 0000000..4e1b6af Binary files /dev/null and b/Assets/Oculus/VR/Textures/windowgui.png differ diff --git a/Assets/Oculus/VR/Textures/windowgui.png.meta b/Assets/Oculus/VR/Textures/windowgui.png.meta new file mode 100644 index 0000000..89194f4 --- /dev/null +++ b/Assets/Oculus/VR/Textures/windowgui.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: a26663690a6580440963aa46e582c35b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -2 + maxTextureSize: 1024 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: pointersui + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/ThirdParty.meta b/Assets/Oculus/VR/ThirdParty.meta new file mode 100644 index 0000000..42aa760 --- /dev/null +++ b/Assets/Oculus/VR/ThirdParty.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3366bc22ba4a2bd4ab63507d836013d6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/ThirdParty/SimpleJSON.cs b/Assets/Oculus/VR/ThirdParty/SimpleJSON.cs new file mode 100644 index 0000000..1910229 --- /dev/null +++ b/Assets/Oculus/VR/ThirdParty/SimpleJSON.cs @@ -0,0 +1,1352 @@ +/* * * * * + * A simple JSON Parser / builder + * ------------------------------ + * + * It mainly has been written as a simple JSON parser. It can build a JSON string + * from the node-tree, or generate a node tree from any valid JSON string. + * + * If you want to use compression when saving to file / stream / B64 you have to include + * SharpZipLib ( http://www.icsharpcode.net/opensource/sharpziplib/ ) in your project and + * define "USE_SharpZipLib" at the top of the file + * + * Written by Bunny83 + * 2012-06-09 + * + * [2012-06-09 First Version] + * - provides strongly typed node classes and lists / dictionaries + * - provides easy access to class members / array items / data values + * - the parser now properly identifies types. So generating JSON with this framework should work. + * - only double quotes (") are used for quoting strings. + * - provides "casting" properties to easily convert to / from those types: + * int / float / double / bool + * - provides a common interface for each node so no explicit casting is required. + * - the parser tries to avoid errors, but if malformed JSON is parsed the result is more or less undefined + * - It can serialize/deserialize a node tree into/from an experimental compact binary format. It might + * be handy if you want to store things in a file and don't want it to be easily modifiable + * + * [2012-12-17 Update] + * - Added internal JSONLazyCreator class which simplifies the construction of a JSON tree + * Now you can simple reference any item that doesn't exist yet and it will return a JSONLazyCreator + * The class determines the required type by it's further use, creates the type and removes itself. + * - Added binary serialization / deserialization. + * - Added support for BZip2 zipped binary format. Requires the SharpZipLib ( http://www.icsharpcode.net/opensource/sharpziplib/ ) + * The usage of the SharpZipLib library can be disabled by removing or commenting out the USE_SharpZipLib define at the top + * - The serializer uses different types when it comes to store the values. Since my data values + * are all of type string, the serializer will "try" which format fits best. The order is: int, float, double, bool, string. + * It's not the most efficient way but for a moderate amount of data it should work on all platforms. + * + * [2017-03-08 Update] + * - Optimised parsing by using a StringBuilder for token. This prevents performance issues when large + * string data fields are contained in the json data. + * - Finally refactored the badly named JSONClass into JSONObject. + * - Replaced the old JSONData class by distict typed classes ( JSONString, JSONNumber, JSONBool, JSONNull ) this + * allows to propertly convert the node tree back to json without type information loss. The actual value + * parsing now happens at parsing time and not when you actually access one of the casting properties. + * + * [2017-04-11 Update] + * - Fixed parsing bug where empty string values have been ignored. + * - Optimised "ToString" by using a StringBuilder internally. This should heavily improve performance for large files + * - Changed the overload of "ToString(string aIndent)" to "ToString(int aIndent)" + * + * [2017-11-29 Update] + * - Removed the IEnumerator implementations on JSONArray & JSONObject and replaced it with a common + * struct Enumerator in JSONNode that should avoid garbage generation. The enumerator always works + * on KeyValuePair, even for JSONArray. + * - Added two wrapper Enumerators that allows for easy key or value enumeration. A JSONNode now has + * a "Keys" and a "Values" enumerable property. Those are also struct enumerators / enumerables + * - A KeyValuePair can now be implicitly converted into a JSONNode. This allows + * a foreach loop over a JSONNode to directly access the values only. Since KeyValuePair as well as + * all the Enumerators are structs, no garbage is allocated. + * - To add Linq support another "LinqEnumerator" is available through the "Linq" property. This + * enumerator does implement the generic IEnumerable interface so most Linq extensions can be used + * on this enumerable object. This one does allocate memory as it's a wrapper class. + * - The Escape method now escapes all control characters (# < 32) in strings as uncode characters + * (\uXXXX) and if the static bool JSONNode.forceASCII is set to true it will also escape all + * characters # > 127. This might be useful if you require an ASCII output. Though keep in mind + * when your strings contain many non-ascii characters the strings become much longer (x6) and are + * no longer human readable. + * - The node types JSONObject and JSONArray now have an "Inline" boolean switch which will default to + * false. It can be used to serialize this element inline even you serialize with an indented format + * This is useful for arrays containing numbers so it doesn't place every number on a new line + * - Extracted the binary serialization code into a seperate extension file. All classes are now declared + * as "partial" so an extension file can even add a new virtual or abstract method / interface to + * JSONNode and override it in the concrete type classes. It's of course a hacky approach which is + * generally not recommended, but i wanted to keep everything tightly packed. + * - Added a static CreateOrGet method to the JSONNull class. Since this class is immutable it could + * be reused without major problems. If you have a lot null fields in your data it will help reduce + * the memory / garbage overhead. I also added a static setting (reuseSameInstance) to JSONNull + * (default is true) which will change the behaviour of "CreateOrGet". If you set this to false + * CreateOrGet will not reuse the cached instance but instead create a new JSONNull instance each time. + * I made the JSONNull constructor private so if you need to create an instance manually use + * JSONNull.CreateOrGet() + * + * [2018-01-09 Update] + * - Changed all double.TryParse and double.ToString uses to use the invariant culture to avoid problems + * on systems with a culture that uses a comma as decimal point. + * + * [2018-01-26 Update] + * - Added AsLong. Note that a JSONNumber is stored as double and can't represent all long values. However + * storing it as string would work. + * - Added static setting "JSONNode.longAsString" which controls the default type that is used by the + * LazyCreator when using AsLong + * + * [2018-04-25 Update] + * - Added support for parsing single values (JSONBool, JSONString, JSONNumber, JSONNull) as top level value. + * + * The MIT License (MIT) + * + * Copyright (c) 2012-2017 Markus Göbel (Bunny83) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * * * * */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; + +// renaming the namespace to avoid conflict +namespace OVRSimpleJSON // SimpleJSON +{ + public enum JSONNodeType + { + Array = 1, + Object = 2, + String = 3, + Number = 4, + NullValue = 5, + Boolean = 6, + None = 7, + Custom = 0xFF, + } + public enum JSONTextMode + { + Compact, + Indent + } + + public abstract partial class JSONNode + { + #region Enumerators + public struct Enumerator + { + private enum Type { None, Array, Object } + private Type type; + private Dictionary.Enumerator m_Object; + private List.Enumerator m_Array; + public bool IsValid { get { return type != Type.None; } } + public Enumerator(List.Enumerator aArrayEnum) + { + type = Type.Array; + m_Object = default(Dictionary.Enumerator); + m_Array = aArrayEnum; + } + public Enumerator(Dictionary.Enumerator aDictEnum) + { + type = Type.Object; + m_Object = aDictEnum; + m_Array = default(List.Enumerator); + } + public KeyValuePair Current + { + get { + if (type == Type.Array) + return new KeyValuePair(string.Empty, m_Array.Current); + else if (type == Type.Object) + return m_Object.Current; + return new KeyValuePair(string.Empty, null); + } + } + public bool MoveNext() + { + if (type == Type.Array) + return m_Array.MoveNext(); + else if (type == Type.Object) + return m_Object.MoveNext(); + return false; + } + } + public struct ValueEnumerator + { + private Enumerator m_Enumerator; + public ValueEnumerator(List.Enumerator aArrayEnum) : this(new Enumerator(aArrayEnum)) { } + public ValueEnumerator(Dictionary.Enumerator aDictEnum) : this(new Enumerator(aDictEnum)) { } + public ValueEnumerator(Enumerator aEnumerator) { m_Enumerator = aEnumerator; } + public JSONNode Current { get { return m_Enumerator.Current.Value; } } + public bool MoveNext() { return m_Enumerator.MoveNext(); } + public ValueEnumerator GetEnumerator() { return this; } + } + public struct KeyEnumerator + { + private Enumerator m_Enumerator; + public KeyEnumerator(List.Enumerator aArrayEnum) : this(new Enumerator(aArrayEnum)) { } + public KeyEnumerator(Dictionary.Enumerator aDictEnum) : this(new Enumerator(aDictEnum)) { } + public KeyEnumerator(Enumerator aEnumerator) { m_Enumerator = aEnumerator; } + public string Current { get { return m_Enumerator.Current.Key; } } + public bool MoveNext() { return m_Enumerator.MoveNext(); } + public KeyEnumerator GetEnumerator() { return this; } + } + + public class LinqEnumerator : IEnumerator>, IEnumerable> + { + private JSONNode m_Node; + private Enumerator m_Enumerator; + internal LinqEnumerator(JSONNode aNode) + { + m_Node = aNode; + if (m_Node != null) + m_Enumerator = m_Node.GetEnumerator(); + } + public KeyValuePair Current { get { return m_Enumerator.Current; } } + object IEnumerator.Current { get { return m_Enumerator.Current; } } + public bool MoveNext() { return m_Enumerator.MoveNext(); } + + public void Dispose() + { + m_Node = null; + m_Enumerator = new Enumerator(); + } + + public IEnumerator> GetEnumerator() + { + return new LinqEnumerator(m_Node); + } + + public void Reset() + { + if (m_Node != null) + m_Enumerator = m_Node.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return new LinqEnumerator(m_Node); + } + } + + #endregion Enumerators + + #region common interface + + public static bool forceASCII = false; // Use Unicode by default + public static bool longAsString = false; // lazy creator creates a JSONString instead of JSONNumber + + public abstract JSONNodeType Tag { get; } + + public virtual JSONNode this[int aIndex] { get { return null; } set { } } + + public virtual JSONNode this[string aKey] { get { return null; } set { } } + + public virtual string Value { get { return ""; } set { } } + + public virtual int Count { get { return 0; } } + + public virtual bool IsNumber { get { return false; } } + public virtual bool IsString { get { return false; } } + public virtual bool IsBoolean { get { return false; } } + public virtual bool IsNull { get { return false; } } + public virtual bool IsArray { get { return false; } } + public virtual bool IsObject { get { return false; } } + + public virtual bool Inline { get { return false; } set { } } + + public virtual void Add(string aKey, JSONNode aItem) + { + } + public virtual void Add(JSONNode aItem) + { + Add("", aItem); + } + + public virtual JSONNode Remove(string aKey) + { + return null; + } + + public virtual JSONNode Remove(int aIndex) + { + return null; + } + + public virtual JSONNode Remove(JSONNode aNode) + { + return aNode; + } + + public virtual IEnumerable Children + { + get + { + yield break; + } + } + + public IEnumerable DeepChildren + { + get + { + foreach (var C in Children) + foreach (var D in C.DeepChildren) + yield return D; + } + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + WriteToStringBuilder(sb, 0, 0, JSONTextMode.Compact); + return sb.ToString(); + } + + public virtual string ToString(int aIndent) + { + StringBuilder sb = new StringBuilder(); + WriteToStringBuilder(sb, 0, aIndent, JSONTextMode.Indent); + return sb.ToString(); + } + internal abstract void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode); + + public abstract Enumerator GetEnumerator(); + public IEnumerable> Linq { get { return new LinqEnumerator(this); } } + public KeyEnumerator Keys { get { return new KeyEnumerator(GetEnumerator()); } } + public ValueEnumerator Values { get { return new ValueEnumerator(GetEnumerator()); } } + + #endregion common interface + + #region typecasting properties + + + public virtual double AsDouble + { + get + { + double v = 0.0; + if (double.TryParse(Value,NumberStyles.Float, CultureInfo.InvariantCulture, out v)) + return v; + return 0.0; + } + set + { + Value = value.ToString(CultureInfo.InvariantCulture); + } + } + + public virtual int AsInt + { + get { return (int)AsDouble; } + set { AsDouble = value; } + } + + public virtual float AsFloat + { + get { return (float)AsDouble; } + set { AsDouble = value; } + } + + public virtual bool AsBool + { + get + { + bool v = false; + if (bool.TryParse(Value, out v)) + return v; + return !string.IsNullOrEmpty(Value); + } + set + { + Value = (value) ? "true" : "false"; + } + } + + public virtual long AsLong + { + get + { + long val = 0; + if (long.TryParse(Value, out val)) + return val; + return 0L; + } + set + { + Value = value.ToString(); + } + } + + public virtual JSONArray AsArray + { + get + { + return this as JSONArray; + } + } + + public virtual JSONObject AsObject + { + get + { + return this as JSONObject; + } + } + + + #endregion typecasting properties + + #region operators + + public static implicit operator JSONNode(string s) + { + return new JSONString(s); + } + public static implicit operator string(JSONNode d) + { + return (d == null) ? null : d.Value; + } + + public static implicit operator JSONNode(double n) + { + return new JSONNumber(n); + } + public static implicit operator double(JSONNode d) + { + return (d == null) ? 0 : d.AsDouble; + } + + public static implicit operator JSONNode(float n) + { + return new JSONNumber(n); + } + public static implicit operator float(JSONNode d) + { + return (d == null) ? 0 : d.AsFloat; + } + + public static implicit operator JSONNode(int n) + { + return new JSONNumber(n); + } + public static implicit operator int(JSONNode d) + { + return (d == null) ? 0 : d.AsInt; + } + + public static implicit operator JSONNode(long n) + { + if (longAsString) + return new JSONString(n.ToString()); + return new JSONNumber(n); + } + public static implicit operator long(JSONNode d) + { + return (d == null) ? 0L : d.AsLong; + } + + public static implicit operator JSONNode(bool b) + { + return new JSONBool(b); + } + public static implicit operator bool(JSONNode d) + { + return (d == null) ? false : d.AsBool; + } + + public static implicit operator JSONNode(KeyValuePair aKeyValue) + { + return aKeyValue.Value; + } + + public static bool operator ==(JSONNode a, object b) + { + if (ReferenceEquals(a, b)) + return true; + bool aIsNull = a is JSONNull || ReferenceEquals(a, null) || a is JSONLazyCreator; + bool bIsNull = b is JSONNull || ReferenceEquals(b, null) || b is JSONLazyCreator; + if (aIsNull && bIsNull) + return true; + return !aIsNull && a.Equals(b); + } + + public static bool operator !=(JSONNode a, object b) + { + return !(a == b); + } + + public override bool Equals(object obj) + { + return ReferenceEquals(this, obj); + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + + #endregion operators + + [ThreadStatic] + private static StringBuilder m_EscapeBuilder; + internal static StringBuilder EscapeBuilder + { + get { + if (m_EscapeBuilder == null) + m_EscapeBuilder = new StringBuilder(); + return m_EscapeBuilder; + } + } + internal static string Escape(string aText) + { + var sb = EscapeBuilder; + sb.Length = 0; + if (sb.Capacity < aText.Length + aText.Length / 10) + sb.Capacity = aText.Length + aText.Length / 10; + foreach (char c in aText) + { + switch (c) + { + case '\\': + sb.Append("\\\\"); + break; + case '\"': + sb.Append("\\\""); + break; + case '\n': + sb.Append("\\n"); + break; + case '\r': + sb.Append("\\r"); + break; + case '\t': + sb.Append("\\t"); + break; + case '\b': + sb.Append("\\b"); + break; + case '\f': + sb.Append("\\f"); + break; + default: + if (c < ' ' || (forceASCII && c > 127)) + { + ushort val = c; + sb.Append("\\u").Append(val.ToString("X4")); + } + else + sb.Append(c); + break; + } + } + string result = sb.ToString(); + sb.Length = 0; + return result; + } + + private static JSONNode ParseElement(string token, bool quoted) + { + if (quoted) + return token; + string tmp = token.ToLower(); + if (tmp == "false" || tmp == "true") + return tmp == "true"; + if (tmp == "null") + return JSONNull.CreateOrGet(); + double val; + if (double.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out val)) + return val; + else + return token; + } + + public static JSONNode Parse(string aJSON) + { + Stack stack = new Stack(); + JSONNode ctx = null; + int i = 0; + StringBuilder Token = new StringBuilder(); + string TokenName = ""; + bool QuoteMode = false; + bool TokenIsQuoted = false; + while (i < aJSON.Length) + { + switch (aJSON[i]) + { + case '{': + if (QuoteMode) + { + Token.Append(aJSON[i]); + break; + } + stack.Push(new JSONObject()); + if (ctx != null) + { + ctx.Add(TokenName, stack.Peek()); + } + TokenName = ""; + Token.Length = 0; + ctx = stack.Peek(); + break; + + case '[': + if (QuoteMode) + { + Token.Append(aJSON[i]); + break; + } + + stack.Push(new JSONArray()); + if (ctx != null) + { + ctx.Add(TokenName, stack.Peek()); + } + TokenName = ""; + Token.Length = 0; + ctx = stack.Peek(); + break; + + case '}': + case ']': + if (QuoteMode) + { + + Token.Append(aJSON[i]); + break; + } + if (stack.Count == 0) + throw new Exception("JSON Parse: Too many closing brackets"); + + stack.Pop(); + if (Token.Length > 0 || TokenIsQuoted) + ctx.Add(TokenName, ParseElement(Token.ToString(), TokenIsQuoted)); + TokenIsQuoted = false; + TokenName = ""; + Token.Length = 0; + if (stack.Count > 0) + ctx = stack.Peek(); + break; + + case ':': + if (QuoteMode) + { + Token.Append(aJSON[i]); + break; + } + TokenName = Token.ToString(); + Token.Length = 0; + TokenIsQuoted = false; + break; + + case '"': + QuoteMode ^= true; + TokenIsQuoted |= QuoteMode; + break; + + case ',': + if (QuoteMode) + { + Token.Append(aJSON[i]); + break; + } + if (Token.Length > 0 || TokenIsQuoted) + ctx.Add(TokenName, ParseElement(Token.ToString(), TokenIsQuoted)); + TokenIsQuoted = false; + TokenName = ""; + Token.Length = 0; + TokenIsQuoted = false; + break; + + case '\r': + case '\n': + break; + + case ' ': + case '\t': + if (QuoteMode) + Token.Append(aJSON[i]); + break; + + case '\\': + ++i; + if (QuoteMode) + { + char C = aJSON[i]; + switch (C) + { + case 't': + Token.Append('\t'); + break; + case 'r': + Token.Append('\r'); + break; + case 'n': + Token.Append('\n'); + break; + case 'b': + Token.Append('\b'); + break; + case 'f': + Token.Append('\f'); + break; + case 'u': + { + string s = aJSON.Substring(i + 1, 4); + Token.Append((char)int.Parse( + s, + System.Globalization.NumberStyles.AllowHexSpecifier)); + i += 4; + break; + } + default: + Token.Append(C); + break; + } + } + break; + + default: + Token.Append(aJSON[i]); + break; + } + ++i; + } + if (QuoteMode) + { + throw new Exception("JSON Parse: Quotation marks seems to be messed up."); + } + if (ctx == null) + return ParseElement(Token.ToString(), TokenIsQuoted); + return ctx; + } + + } + // End of JSONNode + + public partial class JSONArray : JSONNode + { + private List m_List = new List(); + private bool inline = false; + public override bool Inline + { + get { return inline; } + set { inline = value; } + } + + public override JSONNodeType Tag { get { return JSONNodeType.Array; } } + public override bool IsArray { get { return true; } } + public override Enumerator GetEnumerator() { return new Enumerator(m_List.GetEnumerator()); } + + public override JSONNode this[int aIndex] + { + get + { + if (aIndex < 0 || aIndex >= m_List.Count) + return new JSONLazyCreator(this); + return m_List[aIndex]; + } + set + { + if (value == null) + value = JSONNull.CreateOrGet(); + if (aIndex < 0 || aIndex >= m_List.Count) + m_List.Add(value); + else + m_List[aIndex] = value; + } + } + + public override JSONNode this[string aKey] + { + get { return new JSONLazyCreator(this); } + set + { + if (value == null) + value = JSONNull.CreateOrGet(); + m_List.Add(value); + } + } + + public override int Count + { + get { return m_List.Count; } + } + + public override void Add(string aKey, JSONNode aItem) + { + if (aItem == null) + aItem = JSONNull.CreateOrGet(); + m_List.Add(aItem); + } + + public override JSONNode Remove(int aIndex) + { + if (aIndex < 0 || aIndex >= m_List.Count) + return null; + JSONNode tmp = m_List[aIndex]; + m_List.RemoveAt(aIndex); + return tmp; + } + + public override JSONNode Remove(JSONNode aNode) + { + m_List.Remove(aNode); + return aNode; + } + + public override IEnumerable Children + { + get + { + foreach (JSONNode N in m_List) + yield return N; + } + } + + + internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) + { + aSB.Append('['); + int count = m_List.Count; + if (inline) + aMode = JSONTextMode.Compact; + for (int i = 0; i < count; i++) + { + if (i > 0) + aSB.Append(','); + if (aMode == JSONTextMode.Indent) + aSB.AppendLine(); + + if (aMode == JSONTextMode.Indent) + aSB.Append(' ', aIndent + aIndentInc); + m_List[i].WriteToStringBuilder(aSB, aIndent + aIndentInc, aIndentInc, aMode); + } + if (aMode == JSONTextMode.Indent) + aSB.AppendLine().Append(' ', aIndent); + aSB.Append(']'); + } + } + // End of JSONArray + + public partial class JSONObject : JSONNode + { + private Dictionary m_Dict = new Dictionary(); + + private bool inline = false; + public override bool Inline + { + get { return inline; } + set { inline = value; } + } + + public override JSONNodeType Tag { get { return JSONNodeType.Object; } } + public override bool IsObject { get { return true; } } + + public override Enumerator GetEnumerator() { return new Enumerator(m_Dict.GetEnumerator()); } + + + public override JSONNode this[string aKey] + { + get + { + if (m_Dict.ContainsKey(aKey)) + return m_Dict[aKey]; + else + return new JSONLazyCreator(this, aKey); + } + set + { + if (value == null) + value = JSONNull.CreateOrGet(); + if (m_Dict.ContainsKey(aKey)) + m_Dict[aKey] = value; + else + m_Dict.Add(aKey, value); + } + } + + public override JSONNode this[int aIndex] + { + get + { + if (aIndex < 0 || aIndex >= m_Dict.Count) + return null; + return m_Dict.ElementAt(aIndex).Value; + } + set + { + if (value == null) + value = JSONNull.CreateOrGet(); + if (aIndex < 0 || aIndex >= m_Dict.Count) + return; + string key = m_Dict.ElementAt(aIndex).Key; + m_Dict[key] = value; + } + } + + public override int Count + { + get { return m_Dict.Count; } + } + + public override void Add(string aKey, JSONNode aItem) + { + if (aItem == null) + aItem = JSONNull.CreateOrGet(); + + if (!string.IsNullOrEmpty(aKey)) + { + if (m_Dict.ContainsKey(aKey)) + m_Dict[aKey] = aItem; + else + m_Dict.Add(aKey, aItem); + } + else + m_Dict.Add(Guid.NewGuid().ToString(), aItem); + } + + public override JSONNode Remove(string aKey) + { + if (!m_Dict.ContainsKey(aKey)) + return null; + JSONNode tmp = m_Dict[aKey]; + m_Dict.Remove(aKey); + return tmp; + } + + public override JSONNode Remove(int aIndex) + { + if (aIndex < 0 || aIndex >= m_Dict.Count) + return null; + var item = m_Dict.ElementAt(aIndex); + m_Dict.Remove(item.Key); + return item.Value; + } + + public override JSONNode Remove(JSONNode aNode) + { + try + { + var item = m_Dict.Where(k => k.Value == aNode).First(); + m_Dict.Remove(item.Key); + return aNode; + } + catch + { + return null; + } + } + + public override IEnumerable Children + { + get + { + foreach (KeyValuePair N in m_Dict) + yield return N.Value; + } + } + + internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) + { + aSB.Append('{'); + bool first = true; + if (inline) + aMode = JSONTextMode.Compact; + foreach (var k in m_Dict) + { + if (!first) + aSB.Append(','); + first = false; + if (aMode == JSONTextMode.Indent) + aSB.AppendLine(); + if (aMode == JSONTextMode.Indent) + aSB.Append(' ', aIndent + aIndentInc); + aSB.Append('\"').Append(Escape(k.Key)).Append('\"'); + if (aMode == JSONTextMode.Compact) + aSB.Append(':'); + else + aSB.Append(" : "); + k.Value.WriteToStringBuilder(aSB, aIndent + aIndentInc, aIndentInc, aMode); + } + if (aMode == JSONTextMode.Indent) + aSB.AppendLine().Append(' ', aIndent); + aSB.Append('}'); + } + + } + // End of JSONObject + + public partial class JSONString : JSONNode + { + private string m_Data; + + public override JSONNodeType Tag { get { return JSONNodeType.String; } } + public override bool IsString { get { return true; } } + + public override Enumerator GetEnumerator() { return new Enumerator(); } + + + public override string Value + { + get { return m_Data; } + set + { + m_Data = value; + } + } + + public JSONString(string aData) + { + m_Data = aData; + } + + internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) + { + aSB.Append('\"').Append(Escape(m_Data)).Append('\"'); + } + public override bool Equals(object obj) + { + if (base.Equals(obj)) + return true; + string s = obj as string; + if (s != null) + return m_Data == s; + JSONString s2 = obj as JSONString; + if (s2 != null) + return m_Data == s2.m_Data; + return false; + } + public override int GetHashCode() + { + return m_Data.GetHashCode(); + } + } + // End of JSONString + + public partial class JSONNumber : JSONNode + { + private double m_Data; + + public override JSONNodeType Tag { get { return JSONNodeType.Number; } } + public override bool IsNumber { get { return true; } } + public override Enumerator GetEnumerator() { return new Enumerator(); } + + public override string Value + { + get { return m_Data.ToString(CultureInfo.InvariantCulture); } + set + { + double v; + if (double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out v)) + m_Data = v; + } + } + + public override double AsDouble + { + get { return m_Data; } + set { m_Data = value; } + } + public override long AsLong + { + get { return (long)m_Data; } + set { m_Data = value; } + } + + public JSONNumber(double aData) + { + m_Data = aData; + } + + public JSONNumber(string aData) + { + Value = aData; + } + + internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) + { + aSB.Append(Value); + } + private static bool IsNumeric(object value) + { + return value is int || value is uint + || value is float || value is double + || value is decimal + || value is long || value is ulong + || value is short || value is ushort + || value is sbyte || value is byte; + } + public override bool Equals(object obj) + { + if (obj == null) + return false; + if (base.Equals(obj)) + return true; + JSONNumber s2 = obj as JSONNumber; + if (s2 != null) + return m_Data == s2.m_Data; + if (IsNumeric(obj)) + return Convert.ToDouble(obj) == m_Data; + return false; + } + public override int GetHashCode() + { + return m_Data.GetHashCode(); + } + } + // End of JSONNumber + + public partial class JSONBool : JSONNode + { + private bool m_Data; + + public override JSONNodeType Tag { get { return JSONNodeType.Boolean; } } + public override bool IsBoolean { get { return true; } } + public override Enumerator GetEnumerator() { return new Enumerator(); } + + public override string Value + { + get { return m_Data.ToString(); } + set + { + bool v; + if (bool.TryParse(value, out v)) + m_Data = v; + } + } + public override bool AsBool + { + get { return m_Data; } + set { m_Data = value; } + } + + public JSONBool(bool aData) + { + m_Data = aData; + } + + public JSONBool(string aData) + { + Value = aData; + } + + internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) + { + aSB.Append((m_Data) ? "true" : "false"); + } + public override bool Equals(object obj) + { + if (obj == null) + return false; + if (obj is bool) + return m_Data == (bool)obj; + return false; + } + public override int GetHashCode() + { + return m_Data.GetHashCode(); + } + } + // End of JSONBool + + public partial class JSONNull : JSONNode + { + static JSONNull m_StaticInstance = new JSONNull(); + public static bool reuseSameInstance = true; + public static JSONNull CreateOrGet() + { + if (reuseSameInstance) + return m_StaticInstance; + return new JSONNull(); + } + private JSONNull() { } + + public override JSONNodeType Tag { get { return JSONNodeType.NullValue; } } + public override bool IsNull { get { return true; } } + public override Enumerator GetEnumerator() { return new Enumerator(); } + + public override string Value + { + get { return "null"; } + set { } + } + public override bool AsBool + { + get { return false; } + set { } + } + + public override bool Equals(object obj) + { + if (object.ReferenceEquals(this, obj)) + return true; + return (obj is JSONNull); + } + public override int GetHashCode() + { + return 0; + } + + internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) + { + aSB.Append("null"); + } + } + // End of JSONNull + + internal partial class JSONLazyCreator : JSONNode + { + private JSONNode m_Node = null; + private string m_Key = null; + public override JSONNodeType Tag { get { return JSONNodeType.None; } } + public override Enumerator GetEnumerator() { return new Enumerator(); } + + public JSONLazyCreator(JSONNode aNode) + { + m_Node = aNode; + m_Key = null; + } + + public JSONLazyCreator(JSONNode aNode, string aKey) + { + m_Node = aNode; + m_Key = aKey; + } + + private T Set(T aVal) where T : JSONNode + { + if (m_Key == null) + m_Node.Add(aVal); + else + m_Node.Add(m_Key, aVal); + m_Node = null; // Be GC friendly. + return aVal; + } + + public override JSONNode this[int aIndex] + { + get { return new JSONLazyCreator(this); } + set { Set(new JSONArray()).Add(value); } + } + + public override JSONNode this[string aKey] + { + get { return new JSONLazyCreator(this, aKey); } + set { Set(new JSONObject()).Add(aKey, value); } + } + + public override void Add(JSONNode aItem) + { + Set(new JSONArray()).Add(aItem); + } + + public override void Add(string aKey, JSONNode aItem) + { + Set(new JSONObject()).Add(aKey, aItem); + } + + public static bool operator ==(JSONLazyCreator a, object b) + { + if (b == null) + return true; + return System.Object.ReferenceEquals(a, b); + } + + public static bool operator !=(JSONLazyCreator a, object b) + { + return !(a == b); + } + + public override bool Equals(object obj) + { + if (obj == null) + return true; + return System.Object.ReferenceEquals(this, obj); + } + + public override int GetHashCode() + { + return 0; + } + + public override int AsInt + { + get { Set(new JSONNumber(0)); return 0; } + set { Set(new JSONNumber(value)); } + } + + public override float AsFloat + { + get { Set(new JSONNumber(0.0f)); return 0.0f; } + set { Set(new JSONNumber(value)); } + } + + public override double AsDouble + { + get { Set(new JSONNumber(0.0)); return 0.0; } + set { Set(new JSONNumber(value)); } + } + + public override long AsLong + { + get + { + if (longAsString) + Set(new JSONString("0")); + else + Set(new JSONNumber(0.0)); + return 0L; + } + set + { + if (longAsString) + Set(new JSONString(value.ToString())); + else + Set(new JSONNumber(value)); + } + } + + public override bool AsBool + { + get { Set(new JSONBool(false)); return false; } + set { Set(new JSONBool(value)); } + } + + public override JSONArray AsArray + { + get { return Set(new JSONArray()); } + } + + public override JSONObject AsObject + { + get { return Set(new JSONObject()); } + } + internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) + { + aSB.Append("null"); + } + } + // End of JSONLazyCreator + + public static class JSON + { + public static JSONNode Parse(string aJSON) + { + return JSONNode.Parse(aJSON); + } + } +} diff --git a/Assets/Oculus/VR/ThirdParty/SimpleJSON.cs.meta b/Assets/Oculus/VR/ThirdParty/SimpleJSON.cs.meta new file mode 100644 index 0000000..042b0f4 --- /dev/null +++ b/Assets/Oculus/VR/ThirdParty/SimpleJSON.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0139b31452e91b94787e54aa18f7b7f0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/ThirdParty/SimpleJSONUnity.cs b/Assets/Oculus/VR/ThirdParty/SimpleJSONUnity.cs new file mode 100644 index 0000000..c7aaa0f --- /dev/null +++ b/Assets/Oculus/VR/ThirdParty/SimpleJSONUnity.cs @@ -0,0 +1,370 @@ +#region License and information +/* * * * * + * + * Unity extension for the SimpleJSON framework. It does only work together with + * the SimpleJSON.cs + * It provides several helpers and conversion operators to serialize/deserialize + * common Unity types such as Vector2/3/4, Rect, RectOffset, Quaternion and + * Matrix4x4 as JSONObject or JSONArray. + * This extension will add 3 static settings to the JSONNode class: + * ( VectorContainerType, QuaternionContainerType, RectContainerType ) which + * control what node type should be used for serializing the given type. So a + * Vector3 as array would look like [12,32,24] and {"x":12, "y":32, "z":24} as + * object. + * + * + * The MIT License (MIT) + * + * Copyright (c) 2012-2017 Markus Göbel (Bunny83) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * * * * */ + +#endregion License and information + +using UnityEngine; + +// renaming the namespace to avoid conflict +namespace OVRSimpleJSON // SimpleJSON +{ + public enum JSONContainerType { Array, Object } + public partial class JSONNode + { + public static JSONContainerType VectorContainerType = JSONContainerType.Array; + public static JSONContainerType QuaternionContainerType = JSONContainerType.Array; + public static JSONContainerType RectContainerType = JSONContainerType.Array; + private static JSONNode GetContainer(JSONContainerType aType) + { + if (aType == JSONContainerType.Array) + return new JSONArray(); + return new JSONObject(); + } + + #region implicit conversion operators + public static implicit operator JSONNode(Vector2 aVec) + { + JSONNode n = GetContainer(VectorContainerType); + n.WriteVector2(aVec); + return n; + } + public static implicit operator JSONNode(Vector3 aVec) + { + JSONNode n = GetContainer(VectorContainerType); + n.WriteVector3(aVec); + return n; + } + public static implicit operator JSONNode(Vector4 aVec) + { + JSONNode n = GetContainer(VectorContainerType); + n.WriteVector4(aVec); + return n; + } + public static implicit operator JSONNode(Quaternion aRot) + { + JSONNode n = GetContainer(QuaternionContainerType); + n.WriteQuaternion(aRot); + return n; + } + public static implicit operator JSONNode(Rect aRect) + { + JSONNode n = GetContainer(RectContainerType); + n.WriteRect(aRect); + return n; + } + public static implicit operator JSONNode(RectOffset aRect) + { + JSONNode n = GetContainer(RectContainerType); + n.WriteRectOffset(aRect); + return n; + } + + public static implicit operator Vector2(JSONNode aNode) + { + return aNode.ReadVector2(); + } + public static implicit operator Vector3(JSONNode aNode) + { + return aNode.ReadVector3(); + } + public static implicit operator Vector4(JSONNode aNode) + { + return aNode.ReadVector4(); + } + public static implicit operator Quaternion(JSONNode aNode) + { + return aNode.ReadQuaternion(); + } + public static implicit operator Rect(JSONNode aNode) + { + return aNode.ReadRect(); + } + public static implicit operator RectOffset(JSONNode aNode) + { + return aNode.ReadRectOffset(); + } + #endregion implicit conversion operators + + #region Vector2 + public Vector2 ReadVector2(Vector2 aDefault) + { + if (IsObject) + return new Vector2(this["x"].AsFloat, this["y"].AsFloat); + if (IsArray) + return new Vector2(this[0].AsFloat, this[1].AsFloat); + return aDefault; + } + public Vector2 ReadVector2(string aXName, string aYName) + { + if (IsObject) + { + return new Vector2(this[aXName].AsFloat, this[aYName].AsFloat); + } + return Vector2.zero; + } + + public Vector2 ReadVector2() + { + return ReadVector2(Vector2.zero); + } + public JSONNode WriteVector2(Vector2 aVec, string aXName = "x", string aYName = "y") + { + if (IsObject) + { + Inline = true; + this[aXName].AsFloat = aVec.x; + this[aYName].AsFloat = aVec.y; + } + else if (IsArray) + { + Inline = true; + this[0].AsFloat = aVec.x; + this[1].AsFloat = aVec.y; + } + return this; + } + #endregion Vector2 + + #region Vector3 + public Vector3 ReadVector3(Vector3 aDefault) + { + if (IsObject) + return new Vector3(this["x"].AsFloat, this["y"].AsFloat, this["z"].AsFloat); + if (IsArray) + return new Vector3(this[0].AsFloat, this[1].AsFloat, this[2].AsFloat); + return aDefault; + } + public Vector3 ReadVector3(string aXName, string aYName, string aZName) + { + if (IsObject) + return new Vector3(this[aXName].AsFloat, this[aYName].AsFloat, this[aZName].AsFloat); + return Vector3.zero; + } + public Vector3 ReadVector3() + { + return ReadVector3(Vector3.zero); + } + public JSONNode WriteVector3(Vector3 aVec, string aXName = "x", string aYName = "y", string aZName = "z") + { + if (IsObject) + { + Inline = true; + this[aXName].AsFloat = aVec.x; + this[aYName].AsFloat = aVec.y; + this[aZName].AsFloat = aVec.z; + } + else if (IsArray) + { + Inline = true; + this[0].AsFloat = aVec.x; + this[1].AsFloat = aVec.y; + this[2].AsFloat = aVec.z; + } + return this; + } + #endregion Vector3 + + #region Vector4 + public Vector4 ReadVector4(Vector4 aDefault) + { + if (IsObject) + return new Vector4(this["x"].AsFloat, this["y"].AsFloat, this["z"].AsFloat, this["w"].AsFloat); + if (IsArray) + return new Vector4(this[0].AsFloat, this[1].AsFloat, this[2].AsFloat, this[3].AsFloat); + return aDefault; + } + public Vector4 ReadVector4() + { + return ReadVector4(Vector4.zero); + } + public JSONNode WriteVector4(Vector4 aVec) + { + if (IsObject) + { + Inline = true; + this["x"].AsFloat = aVec.x; + this["y"].AsFloat = aVec.y; + this["z"].AsFloat = aVec.z; + this["w"].AsFloat = aVec.w; + } + else if (IsArray) + { + Inline = true; + this[0].AsFloat = aVec.x; + this[1].AsFloat = aVec.y; + this[2].AsFloat = aVec.z; + this[3].AsFloat = aVec.w; + } + return this; + } + #endregion Vector4 + + #region Quaternion + public Quaternion ReadQuaternion(Quaternion aDefault) + { + if (IsObject) + return new Quaternion(this["x"].AsFloat, this["y"].AsFloat, this["z"].AsFloat, this["w"].AsFloat); + if (IsArray) + return new Quaternion(this[0].AsFloat, this[1].AsFloat, this[2].AsFloat, this[3].AsFloat); + return aDefault; + } + public Quaternion ReadQuaternion() + { + return ReadQuaternion(Quaternion.identity); + } + public JSONNode WriteQuaternion(Quaternion aRot) + { + if (IsObject) + { + Inline = true; + this["x"].AsFloat = aRot.x; + this["y"].AsFloat = aRot.y; + this["z"].AsFloat = aRot.z; + this["w"].AsFloat = aRot.w; + } + else if (IsArray) + { + Inline = true; + this[0].AsFloat = aRot.x; + this[1].AsFloat = aRot.y; + this[2].AsFloat = aRot.z; + this[3].AsFloat = aRot.w; + } + return this; + } + #endregion Quaternion + + #region Rect + public Rect ReadRect(Rect aDefault) + { + if (IsObject) + return new Rect(this["x"].AsFloat, this["y"].AsFloat, this["width"].AsFloat, this["height"].AsFloat); + if (IsArray) + return new Rect(this[0].AsFloat, this[1].AsFloat, this[2].AsFloat, this[3].AsFloat); + return aDefault; + } + public Rect ReadRect() + { + return ReadRect(new Rect()); + } + public JSONNode WriteRect(Rect aRect) + { + if (IsObject) + { + Inline = true; + this["x"].AsFloat = aRect.x; + this["y"].AsFloat = aRect.y; + this["width"].AsFloat = aRect.width; + this["height"].AsFloat = aRect.height; + } + else if (IsArray) + { + Inline = true; + this[0].AsFloat = aRect.x; + this[1].AsFloat = aRect.y; + this[2].AsFloat = aRect.width; + this[3].AsFloat = aRect.height; + } + return this; + } + #endregion Rect + + #region RectOffset + public RectOffset ReadRectOffset(RectOffset aDefault) + { + if (this is JSONObject) + return new RectOffset(this["left"].AsInt, this["right"].AsInt, this["top"].AsInt, this["bottom"].AsInt); + if (this is JSONArray) + return new RectOffset(this[0].AsInt, this[1].AsInt, this[2].AsInt, this[3].AsInt); + return aDefault; + } + public RectOffset ReadRectOffset() + { + return ReadRectOffset(new RectOffset()); + } + public JSONNode WriteRectOffset(RectOffset aRect) + { + if (IsObject) + { + Inline = true; + this["left"].AsInt = aRect.left; + this["right"].AsInt = aRect.right; + this["top"].AsInt = aRect.top; + this["bottom"].AsInt = aRect.bottom; + } + else if (IsArray) + { + Inline = true; + this[0].AsInt = aRect.left; + this[1].AsInt = aRect.right; + this[2].AsInt = aRect.top; + this[3].AsInt = aRect.bottom; + } + return this; + } + #endregion RectOffset + + #region Matrix4x4 + public Matrix4x4 ReadMatrix() + { + Matrix4x4 result = Matrix4x4.identity; + if (IsArray) + { + for (int i = 0; i < 16; i++) + { + result[i] = this[i].AsFloat; + } + } + return result; + } + public JSONNode WriteMatrix(Matrix4x4 aMatrix) + { + if (IsArray) + { + Inline = true; + for (int i = 0; i < 16; i++) + { + this[i].AsFloat = aMatrix[i]; + } + } + return this; + } + #endregion Matrix4x4 + } +} diff --git a/Assets/Oculus/VR/ThirdParty/SimpleJSONUnity.cs.meta b/Assets/Oculus/VR/ThirdParty/SimpleJSONUnity.cs.meta new file mode 100644 index 0000000..09e430a --- /dev/null +++ b/Assets/Oculus/VR/ThirdParty/SimpleJSONUnity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d45c5e402883c0048a1a69b7a1ca8901 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Oculus/VR/ThirdParty/openvr_api.cs b/Assets/Oculus/VR/ThirdParty/openvr_api.cs new file mode 100644 index 0000000..51bec27 --- /dev/null +++ b/Assets/Oculus/VR/ThirdParty/openvr_api.cs @@ -0,0 +1,6032 @@ +//======= Copyright (c) Valve Corporation, All rights reserved. =============== +// +// Purpose: This file contains C#/managed code bindings for the OpenVR interfaces +// This file is auto-generated, do not edit it. +// +//============================================================================= + +using System; +using System.Runtime.InteropServices; + +namespace OVR.OpenVR +{ + +[StructLayout(LayoutKind.Sequential)] +public struct IVRSystem +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetRecommendedRenderTargetSize(ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRecommendedRenderTargetSize GetRecommendedRenderTargetSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix44_t _GetProjectionMatrix(EVREye eEye, float fNearZ, float fFarZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetProjectionMatrix GetProjectionMatrix; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetProjectionRaw(EVREye eEye, ref float pfLeft, ref float pfRight, ref float pfTop, ref float pfBottom); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetProjectionRaw GetProjectionRaw; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ComputeDistortion(EVREye eEye, float fU, float fV, ref DistortionCoordinates_t pDistortionCoordinates); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ComputeDistortion ComputeDistortion; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetEyeToHeadTransform(EVREye eEye); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEyeToHeadTransform GetEyeToHeadTransform; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetTimeSinceLastVsync(ref float pfSecondsSinceLastVsync, ref ulong pulFrameCounter); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTimeSinceLastVsync GetTimeSinceLastVsync; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetD3D9AdapterIndex(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetD3D9AdapterIndex GetD3D9AdapterIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDXGIOutputInfo(ref int pnAdapterIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDXGIOutputInfo GetDXGIOutputInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetOutputDevice(ref ulong pnDevice, ETextureType textureType, IntPtr pInstance); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOutputDevice GetOutputDevice; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsDisplayOnDesktop(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsDisplayOnDesktop IsDisplayOnDesktop; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _SetDisplayVisibility(bool bIsVisibleOnDesktop); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDisplayVisibility SetDisplayVisibility; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, [In, Out] TrackedDevicePose_t[] pTrackedDevicePoseArray, uint unTrackedDevicePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDeviceToAbsoluteTrackingPose GetDeviceToAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ResetSeatedZeroPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ResetSeatedZeroPose ResetSeatedZeroPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetSeatedZeroPoseToStandingAbsoluteTrackingPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSeatedZeroPoseToStandingAbsoluteTrackingPose GetSeatedZeroPoseToStandingAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetRawZeroPoseToStandingAbsoluteTrackingPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRawZeroPoseToStandingAbsoluteTrackingPose GetRawZeroPoseToStandingAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass, [In, Out] uint[] punTrackedDeviceIndexArray, uint unTrackedDeviceIndexArrayCount, uint unRelativeToTrackedDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSortedTrackedDeviceIndicesOfClass GetSortedTrackedDeviceIndicesOfClass; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EDeviceActivityLevel _GetTrackedDeviceActivityLevel(uint unDeviceId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceActivityLevel GetTrackedDeviceActivityLevel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ApplyTransform(ref TrackedDevicePose_t pOutputPose, ref TrackedDevicePose_t pTrackedDevicePose, ref HmdMatrix34_t pTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ApplyTransform ApplyTransform; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole unDeviceType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceIndexForControllerRole GetTrackedDeviceIndexForControllerRole; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackedControllerRole _GetControllerRoleForTrackedDeviceIndex(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerRoleForTrackedDeviceIndex GetControllerRoleForTrackedDeviceIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackedDeviceClass _GetTrackedDeviceClass(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceClass GetTrackedDeviceClass; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsTrackedDeviceConnected(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsTrackedDeviceConnected IsTrackedDeviceConnected; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetBoolTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBoolTrackedDeviceProperty GetBoolTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFloatTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFloatTrackedDeviceProperty GetFloatTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetInt32TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetInt32TrackedDeviceProperty GetInt32TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetUint64TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetUint64TrackedDeviceProperty GetUint64TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetMatrix34TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMatrix34TrackedDeviceProperty GetMatrix34TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetArrayTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, uint propType, IntPtr pBuffer, uint unBufferSize, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetArrayTrackedDeviceProperty GetArrayTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetStringTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, System.Text.StringBuilder pchValue, uint unBufferSize, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetStringTrackedDeviceProperty GetStringTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetPropErrorNameFromEnum(ETrackedPropertyError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPropErrorNameFromEnum GetPropErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEvent(ref VREvent_t pEvent, uint uncbVREvent); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextEvent PollNextEvent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEventWithPose(ETrackingUniverseOrigin eOrigin, ref VREvent_t pEvent, uint uncbVREvent, ref TrackedDevicePose_t pTrackedDevicePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextEventWithPose PollNextEventWithPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetEventTypeNameFromEnum(EVREventType eType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEventTypeNameFromEnum GetEventTypeNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HiddenAreaMesh_t _GetHiddenAreaMesh(EVREye eEye, EHiddenAreaMeshType type); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetHiddenAreaMesh GetHiddenAreaMesh; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerState(uint unControllerDeviceIndex, ref VRControllerState_t pControllerState, uint unControllerStateSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerState GetControllerState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStateWithPose(ETrackingUniverseOrigin eOrigin, uint unControllerDeviceIndex, ref VRControllerState_t pControllerState, uint unControllerStateSize, ref TrackedDevicePose_t pTrackedDevicePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerStateWithPose GetControllerStateWithPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _TriggerHapticPulse(uint unControllerDeviceIndex, uint unAxisId, ushort usDurationMicroSec); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _TriggerHapticPulse TriggerHapticPulse; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetButtonIdNameFromEnum(EVRButtonId eButtonId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetButtonIdNameFromEnum GetButtonIdNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetControllerAxisTypeNameFromEnum(EVRControllerAxisType eAxisType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerAxisTypeNameFromEnum GetControllerAxisTypeNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsInputAvailable(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsInputAvailable IsInputAvailable; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsSteamVRDrawingControllers(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsSteamVRDrawingControllers IsSteamVRDrawingControllers; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ShouldApplicationPause(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShouldApplicationPause ShouldApplicationPause; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ShouldApplicationReduceRenderingWork(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShouldApplicationReduceRenderingWork ShouldApplicationReduceRenderingWork; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _DriverDebugRequest(uint unDeviceIndex, string pchRequest, System.Text.StringBuilder pchResponseBuffer, uint unResponseBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _DriverDebugRequest DriverDebugRequest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRFirmwareError _PerformFirmwareUpdate(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PerformFirmwareUpdate PerformFirmwareUpdate; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _AcknowledgeQuit_Exiting(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcknowledgeQuit_Exiting AcknowledgeQuit_Exiting; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _AcknowledgeQuit_UserPrompt(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcknowledgeQuit_UserPrompt AcknowledgeQuit_UserPrompt; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRExtendedDisplay +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetWindowBounds(ref int pnX, ref int pnY, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWindowBounds GetWindowBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetEyeOutputViewport(EVREye eEye, ref uint pnX, ref uint pnY, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEyeOutputViewport GetEyeOutputViewport; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDXGIOutputInfo(ref int pnAdapterIndex, ref int pnAdapterOutputIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDXGIOutputInfo GetDXGIOutputInfo; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRTrackedCamera +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetCameraErrorNameFromEnum(EVRTrackedCameraError eCameraError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraErrorNameFromEnum GetCameraErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _HasCamera(uint nDeviceIndex, ref bool pHasCamera); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HasCamera HasCamera; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraFrameSize(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref uint pnWidth, ref uint pnHeight, ref uint pnFrameBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraFrameSize GetCameraFrameSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraIntrinsics(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref HmdVector2_t pFocalLength, ref HmdVector2_t pCenter); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraIntrinsics GetCameraIntrinsics; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraProjection(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, ref HmdMatrix44_t pProjection); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraProjection GetCameraProjection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _AcquireVideoStreamingService(uint nDeviceIndex, ref ulong pHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcquireVideoStreamingService AcquireVideoStreamingService; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _ReleaseVideoStreamingService(ulong hTrackedCamera); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseVideoStreamingService ReleaseVideoStreamingService; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamFrameBuffer(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, IntPtr pFrameBuffer, uint nFrameBufferSize, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamFrameBuffer GetVideoStreamFrameBuffer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureSize(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref VRTextureBounds_t pTextureBounds, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureSize GetVideoStreamTextureSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureD3D11(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, IntPtr pD3D11DeviceOrResource, ref IntPtr ppD3D11ShaderResourceView, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureD3D11 GetVideoStreamTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureGL(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, ref uint pglTextureId, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureGL GetVideoStreamTextureGL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _ReleaseVideoStreamTextureGL(ulong hTrackedCamera, uint glTextureId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseVideoStreamTextureGL ReleaseVideoStreamTextureGL; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRApplications +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _AddApplicationManifest(string pchApplicationManifestFullPath, bool bTemporary); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AddApplicationManifest AddApplicationManifest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _RemoveApplicationManifest(string pchApplicationManifestFullPath); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveApplicationManifest RemoveApplicationManifest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsApplicationInstalled(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsApplicationInstalled IsApplicationInstalled; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationCount GetApplicationCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetApplicationKeyByIndex(uint unApplicationIndex, System.Text.StringBuilder pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationKeyByIndex GetApplicationKeyByIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetApplicationKeyByProcessId(uint unProcessId, System.Text.StringBuilder pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationKeyByProcessId GetApplicationKeyByProcessId; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchApplication(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchApplication LaunchApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchTemplateApplication(string pchTemplateAppKey, string pchNewAppKey, [In, Out] AppOverrideKeys_t[] pKeys, uint unKeys); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchTemplateApplication LaunchTemplateApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchApplicationFromMimeType(string pchMimeType, string pchArgs); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchApplicationFromMimeType LaunchApplicationFromMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchDashboardOverlay(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchDashboardOverlay LaunchDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CancelApplicationLaunch(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CancelApplicationLaunch CancelApplicationLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _IdentifyApplication(uint unProcessId, string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IdentifyApplication IdentifyApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationProcessId(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationProcessId GetApplicationProcessId; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetApplicationsErrorNameFromEnum(EVRApplicationError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsErrorNameFromEnum GetApplicationsErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationPropertyString(string pchAppKey, EVRApplicationProperty eProperty, System.Text.StringBuilder pchPropertyValueBuffer, uint unPropertyValueBufferLen, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyString GetApplicationPropertyString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationPropertyBool(string pchAppKey, EVRApplicationProperty eProperty, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyBool GetApplicationPropertyBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetApplicationPropertyUint64(string pchAppKey, EVRApplicationProperty eProperty, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyUint64 GetApplicationPropertyUint64; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _SetApplicationAutoLaunch(string pchAppKey, bool bAutoLaunch); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetApplicationAutoLaunch SetApplicationAutoLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationAutoLaunch(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationAutoLaunch GetApplicationAutoLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _SetDefaultApplicationForMimeType(string pchAppKey, string pchMimeType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDefaultApplicationForMimeType SetDefaultApplicationForMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetDefaultApplicationForMimeType(string pchMimeType, System.Text.StringBuilder pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDefaultApplicationForMimeType GetDefaultApplicationForMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationSupportedMimeTypes(string pchAppKey, System.Text.StringBuilder pchMimeTypesBuffer, uint unMimeTypesBuffer); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationSupportedMimeTypes GetApplicationSupportedMimeTypes; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationsThatSupportMimeType(string pchMimeType, System.Text.StringBuilder pchAppKeysThatSupportBuffer, uint unAppKeysThatSupportBuffer); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsThatSupportMimeType GetApplicationsThatSupportMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationLaunchArguments(uint unHandle, System.Text.StringBuilder pchArgs, uint unArgs); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationLaunchArguments GetApplicationLaunchArguments; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetStartingApplication(System.Text.StringBuilder pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetStartingApplication GetStartingApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationTransitionState _GetTransitionState(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTransitionState GetTransitionState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _PerformApplicationPrelaunchCheck(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PerformApplicationPrelaunchCheck PerformApplicationPrelaunchCheck; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetApplicationsTransitionStateNameFromEnum(EVRApplicationTransitionState state); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsTransitionStateNameFromEnum GetApplicationsTransitionStateNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsQuitUserPromptRequested(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsQuitUserPromptRequested IsQuitUserPromptRequested; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchInternalProcess(string pchBinaryPath, string pchArguments, string pchWorkingDirectory); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchInternalProcess LaunchInternalProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetCurrentSceneProcessId(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentSceneProcessId GetCurrentSceneProcessId; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRChaperone +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ChaperoneCalibrationState _GetCalibrationState(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCalibrationState GetCalibrationState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetPlayAreaSize(ref float pSizeX, ref float pSizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPlayAreaSize GetPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetPlayAreaRect(ref HmdQuad_t rect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPlayAreaRect GetPlayAreaRect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReloadInfo(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReloadInfo ReloadInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetSceneColor(HmdColor_t color); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetSceneColor SetSceneColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetBoundsColor(ref HmdColor_t pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, ref HmdColor_t pOutputCameraColor); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBoundsColor GetBoundsColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _AreBoundsVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AreBoundsVisible AreBoundsVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceBoundsVisible(bool bForce); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceBoundsVisible ForceBoundsVisible; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRChaperoneSetup +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CommitWorkingCopy(EChaperoneConfigFile configFile); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CommitWorkingCopy CommitWorkingCopy; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RevertWorkingCopy(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RevertWorkingCopy RevertWorkingCopy; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingPlayAreaSize(ref float pSizeX, ref float pSizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingPlayAreaSize GetWorkingPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingPlayAreaRect(ref HmdQuad_t rect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingPlayAreaRect GetWorkingPlayAreaRect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingCollisionBoundsInfo GetWorkingCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveCollisionBoundsInfo GetLiveCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingSeatedZeroPoseToRawTrackingPose GetWorkingSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatStandingZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingStandingZeroPoseToRawTrackingPose GetWorkingStandingZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingPlayAreaSize(float sizeX, float sizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingPlayAreaSize SetWorkingPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, uint unQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingCollisionBoundsInfo SetWorkingCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingSeatedZeroPoseToRawTrackingPose SetWorkingSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatStandingZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingStandingZeroPoseToRawTrackingPose SetWorkingStandingZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReloadFromDisk(EChaperoneConfigFile configFile); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReloadFromDisk ReloadFromDisk; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveSeatedZeroPoseToRawTrackingPose GetLiveSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingCollisionBoundsTagsInfo([In, Out] byte[] pTagsBuffer, uint unTagCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingCollisionBoundsTagsInfo SetWorkingCollisionBoundsTagsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveCollisionBoundsTagsInfo([In, Out] byte[] pTagsBuffer, ref uint punTagCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveCollisionBoundsTagsInfo GetLiveCollisionBoundsTagsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _SetWorkingPhysicalBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, uint unQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingPhysicalBoundsInfo SetWorkingPhysicalBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLivePhysicalBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLivePhysicalBoundsInfo GetLivePhysicalBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ExportLiveToBuffer(System.Text.StringBuilder pBuffer, ref uint pnBufferLength); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ExportLiveToBuffer ExportLiveToBuffer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ImportFromBufferToWorking(string pBuffer, uint nImportFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ImportFromBufferToWorking ImportFromBufferToWorking; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRCompositor +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetTrackingSpace(ETrackingUniverseOrigin eOrigin); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetTrackingSpace SetTrackingSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackingUniverseOrigin _GetTrackingSpace(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackingSpace GetTrackingSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _WaitGetPoses([In, Out] TrackedDevicePose_t[] pRenderPoseArray, uint unRenderPoseArrayCount, [In, Out] TrackedDevicePose_t[] pGamePoseArray, uint unGamePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _WaitGetPoses WaitGetPoses; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetLastPoses([In, Out] TrackedDevicePose_t[] pRenderPoseArray, uint unRenderPoseArrayCount, [In, Out] TrackedDevicePose_t[] pGamePoseArray, uint unGamePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastPoses GetLastPoses; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetLastPoseForTrackedDeviceIndex(uint unDeviceIndex, ref TrackedDevicePose_t pOutputPose, ref TrackedDevicePose_t pOutputGamePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastPoseForTrackedDeviceIndex GetLastPoseForTrackedDeviceIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _Submit(EVREye eEye, ref Texture_t pTexture, ref VRTextureBounds_t pBounds, EVRSubmitFlags nSubmitFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Submit Submit; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ClearLastSubmittedFrame(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearLastSubmittedFrame ClearLastSubmittedFrame; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _PostPresentHandoff(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PostPresentHandoff PostPresentHandoff; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetFrameTiming(ref Compositor_FrameTiming pTiming, uint unFramesAgo); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTiming GetFrameTiming; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetFrameTimings(ref Compositor_FrameTiming pTiming, uint nFrames); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTimings GetFrameTimings; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFrameTimeRemaining(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTimeRemaining GetFrameTimeRemaining; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetCumulativeStats(ref Compositor_CumulativeStats pStats, uint nStatsSizeInBytes); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCumulativeStats GetCumulativeStats; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FadeToColor(float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FadeToColor FadeToColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdColor_t _GetCurrentFadeColor(bool bBackground); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentFadeColor GetCurrentFadeColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FadeGrid(float fSeconds, bool bFadeIn); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FadeGrid FadeGrid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetCurrentGridAlpha(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentGridAlpha GetCurrentGridAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _SetSkyboxOverride([In, Out] Texture_t[] pTextures, uint unTextureCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetSkyboxOverride SetSkyboxOverride; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ClearSkyboxOverride(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearSkyboxOverride ClearSkyboxOverride; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorBringToFront(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorBringToFront CompositorBringToFront; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorGoToBack(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorGoToBack CompositorGoToBack; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorQuit(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorQuit CompositorQuit; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsFullscreen(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsFullscreen IsFullscreen; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetCurrentSceneFocusProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentSceneFocusProcess GetCurrentSceneFocusProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetLastFrameRenderer(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastFrameRenderer GetLastFrameRenderer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CanRenderScene(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CanRenderScene CanRenderScene; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ShowMirrorWindow(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowMirrorWindow ShowMirrorWindow; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _HideMirrorWindow(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideMirrorWindow HideMirrorWindow; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsMirrorWindowVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsMirrorWindowVisible IsMirrorWindowVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorDumpImages(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorDumpImages CompositorDumpImages; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ShouldAppRenderWithLowResources(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShouldAppRenderWithLowResources ShouldAppRenderWithLowResources; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceInterleavedReprojectionOn(bool bOverride); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceInterleavedReprojectionOn ForceInterleavedReprojectionOn; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceReconnectProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceReconnectProcess ForceReconnectProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SuspendRendering(bool bSuspend); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SuspendRendering SuspendRendering; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetMirrorTextureD3D11(EVREye eEye, IntPtr pD3D11DeviceOrResource, ref IntPtr ppD3D11ShaderResourceView); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMirrorTextureD3D11 GetMirrorTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReleaseMirrorTextureD3D11(IntPtr pD3D11ShaderResourceView); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseMirrorTextureD3D11 ReleaseMirrorTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetMirrorTextureGL(EVREye eEye, ref uint pglTextureId, IntPtr pglSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMirrorTextureGL GetMirrorTextureGL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ReleaseSharedGLTexture(uint glTextureId, IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseSharedGLTexture ReleaseSharedGLTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _LockGLSharedTextureForAccess(IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LockGLSharedTextureForAccess LockGLSharedTextureForAccess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _UnlockGLSharedTextureForAccess(IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _UnlockGLSharedTextureForAccess UnlockGLSharedTextureForAccess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetVulkanInstanceExtensionsRequired(System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVulkanInstanceExtensionsRequired GetVulkanInstanceExtensionsRequired; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetVulkanDeviceExtensionsRequired(IntPtr pPhysicalDevice, System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVulkanDeviceExtensionsRequired GetVulkanDeviceExtensionsRequired; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetExplicitTimingMode(EVRCompositorTimingMode eTimingMode); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetExplicitTimingMode SetExplicitTimingMode; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _SubmitExplicitTimingData(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SubmitExplicitTimingData SubmitExplicitTimingData; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVROverlay +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _FindOverlay(string pchOverlayKey, ref ulong pOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FindOverlay FindOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _CreateOverlay(string pchOverlayKey, string pchOverlayName, ref ulong pOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateOverlay CreateOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _DestroyOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _DestroyOverlay DestroyOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetHighQualityOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetHighQualityOverlay SetHighQualityOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetHighQualityOverlay(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetHighQualityOverlay GetHighQualityOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayKey(ulong ulOverlayHandle, System.Text.StringBuilder pchValue, uint unBufferSize, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayKey GetOverlayKey; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayName(ulong ulOverlayHandle, System.Text.StringBuilder pchValue, uint unBufferSize, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayName GetOverlayName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayName(ulong ulOverlayHandle, string pchName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayName SetOverlayName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayImageData(ulong ulOverlayHandle, IntPtr pvBuffer, uint unBufferSize, ref uint punWidth, ref uint punHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayImageData GetOverlayImageData; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetOverlayErrorNameFromEnum(EVROverlayError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayErrorNameFromEnum GetOverlayErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRenderingPid(ulong ulOverlayHandle, uint unPID); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRenderingPid SetOverlayRenderingPid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayRenderingPid(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayRenderingPid GetOverlayRenderingPid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayFlag(ulong ulOverlayHandle, VROverlayFlags eOverlayFlag, bool bEnabled); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayFlag SetOverlayFlag; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayFlag(ulong ulOverlayHandle, VROverlayFlags eOverlayFlag, ref bool pbEnabled); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayFlag GetOverlayFlag; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayColor(ulong ulOverlayHandle, float fRed, float fGreen, float fBlue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayColor SetOverlayColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayColor(ulong ulOverlayHandle, ref float pfRed, ref float pfGreen, ref float pfBlue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayColor GetOverlayColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayAlpha(ulong ulOverlayHandle, float fAlpha); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayAlpha SetOverlayAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayAlpha(ulong ulOverlayHandle, ref float pfAlpha); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayAlpha GetOverlayAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTexelAspect(ulong ulOverlayHandle, float fTexelAspect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTexelAspect SetOverlayTexelAspect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTexelAspect(ulong ulOverlayHandle, ref float pfTexelAspect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTexelAspect GetOverlayTexelAspect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlaySortOrder(ulong ulOverlayHandle, uint unSortOrder); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlaySortOrder SetOverlaySortOrder; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlaySortOrder(ulong ulOverlayHandle, ref uint punSortOrder); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlaySortOrder GetOverlaySortOrder; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayWidthInMeters(ulong ulOverlayHandle, float fWidthInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayWidthInMeters SetOverlayWidthInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayWidthInMeters(ulong ulOverlayHandle, ref float pfWidthInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayWidthInMeters GetOverlayWidthInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayAutoCurveDistanceRangeInMeters SetOverlayAutoCurveDistanceRangeInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, ref float pfMinDistanceInMeters, ref float pfMaxDistanceInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayAutoCurveDistanceRangeInMeters GetOverlayAutoCurveDistanceRangeInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTextureColorSpace(ulong ulOverlayHandle, EColorSpace eTextureColorSpace); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTextureColorSpace SetOverlayTextureColorSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureColorSpace(ulong ulOverlayHandle, ref EColorSpace peTextureColorSpace); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureColorSpace GetOverlayTextureColorSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTextureBounds(ulong ulOverlayHandle, ref VRTextureBounds_t pOverlayTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTextureBounds SetOverlayTextureBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureBounds(ulong ulOverlayHandle, ref VRTextureBounds_t pOverlayTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureBounds GetOverlayTextureBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayRenderModel(ulong ulOverlayHandle, System.Text.StringBuilder pchValue, uint unBufferSize, ref HmdColor_t pColor, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayRenderModel GetOverlayRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRenderModel(ulong ulOverlayHandle, string pchRenderModel, ref HmdColor_t pColor); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRenderModel SetOverlayRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformType(ulong ulOverlayHandle, ref VROverlayTransformType peTransformType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformType GetOverlayTransformType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformAbsolute(ulong ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformAbsolute SetOverlayTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformAbsolute(ulong ulOverlayHandle, ref ETrackingUniverseOrigin peTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformAbsolute GetOverlayTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle, uint unTrackedDevice, ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformTrackedDeviceRelative SetOverlayTransformTrackedDeviceRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle, ref uint punTrackedDevice, ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformTrackedDeviceRelative GetOverlayTransformTrackedDeviceRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle, uint unDeviceIndex, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformTrackedDeviceComponent SetOverlayTransformTrackedDeviceComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle, ref uint punDeviceIndex, System.Text.StringBuilder pchComponentName, uint unComponentNameSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformTrackedDeviceComponent GetOverlayTransformTrackedDeviceComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformOverlayRelative(ulong ulOverlayHandle, ref ulong ulOverlayHandleParent, ref HmdMatrix34_t pmatParentOverlayToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformOverlayRelative GetOverlayTransformOverlayRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformOverlayRelative(ulong ulOverlayHandle, ulong ulOverlayHandleParent, ref HmdMatrix34_t pmatParentOverlayToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformOverlayRelative SetOverlayTransformOverlayRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowOverlay ShowOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _HideOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideOverlay HideOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsOverlayVisible(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsOverlayVisible IsOverlayVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetTransformForOverlayCoordinates(ulong ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, HmdVector2_t coordinatesInOverlay, ref HmdMatrix34_t pmatTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTransformForOverlayCoordinates GetTransformForOverlayCoordinates; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextOverlayEvent(ulong ulOverlayHandle, ref VREvent_t pEvent, uint uncbVREvent); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextOverlayEvent PollNextOverlayEvent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayInputMethod(ulong ulOverlayHandle, ref VROverlayInputMethod peInputMethod); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayInputMethod GetOverlayInputMethod; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayInputMethod(ulong ulOverlayHandle, VROverlayInputMethod eInputMethod); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayInputMethod SetOverlayInputMethod; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayMouseScale(ulong ulOverlayHandle, ref HmdVector2_t pvecMouseScale); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayMouseScale GetOverlayMouseScale; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayMouseScale(ulong ulOverlayHandle, ref HmdVector2_t pvecMouseScale); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayMouseScale SetOverlayMouseScale; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ComputeOverlayIntersection(ulong ulOverlayHandle, ref VROverlayIntersectionParams_t pParams, ref VROverlayIntersectionResults_t pResults); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ComputeOverlayIntersection ComputeOverlayIntersection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsHoverTargetOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsHoverTargetOverlay IsHoverTargetOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetGamepadFocusOverlay(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetGamepadFocusOverlay GetGamepadFocusOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetGamepadFocusOverlay(ulong ulNewFocusOverlay); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetGamepadFocusOverlay SetGamepadFocusOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayNeighbor(EOverlayDirection eDirection, ulong ulFrom, ulong ulTo); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayNeighbor SetOverlayNeighbor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _MoveGamepadFocusToNeighbor(EOverlayDirection eDirection, ulong ulFrom); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _MoveGamepadFocusToNeighbor MoveGamepadFocusToNeighbor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayDualAnalogTransform(ulong ulOverlay, EDualAnalogWhich eWhich, IntPtr vCenter, float fRadius); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayDualAnalogTransform SetOverlayDualAnalogTransform; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayDualAnalogTransform(ulong ulOverlay, EDualAnalogWhich eWhich, ref HmdVector2_t pvCenter, ref float pfRadius); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayDualAnalogTransform GetOverlayDualAnalogTransform; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTexture(ulong ulOverlayHandle, ref Texture_t pTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTexture SetOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ClearOverlayTexture(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearOverlayTexture ClearOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRaw(ulong ulOverlayHandle, IntPtr pvBuffer, uint unWidth, uint unHeight, uint unDepth); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRaw SetOverlayRaw; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayFromFile(ulong ulOverlayHandle, string pchFilePath); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayFromFile SetOverlayFromFile; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTexture(ulong ulOverlayHandle, ref IntPtr pNativeTextureHandle, IntPtr pNativeTextureRef, ref uint pWidth, ref uint pHeight, ref uint pNativeFormat, ref ETextureType pAPIType, ref EColorSpace pColorSpace, ref VRTextureBounds_t pTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTexture GetOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ReleaseNativeOverlayHandle(ulong ulOverlayHandle, IntPtr pNativeTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseNativeOverlayHandle ReleaseNativeOverlayHandle; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureSize(ulong ulOverlayHandle, ref uint pWidth, ref uint pHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureSize GetOverlayTextureSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _CreateDashboardOverlay(string pchOverlayKey, string pchOverlayFriendlyName, ref ulong pMainHandle, ref ulong pThumbnailHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateDashboardOverlay CreateDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsDashboardVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsDashboardVisible IsDashboardVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsActiveDashboardOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsActiveDashboardOverlay IsActiveDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetDashboardOverlaySceneProcess(ulong ulOverlayHandle, uint unProcessId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDashboardOverlaySceneProcess SetDashboardOverlaySceneProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetDashboardOverlaySceneProcess(ulong ulOverlayHandle, ref uint punProcessId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDashboardOverlaySceneProcess GetDashboardOverlaySceneProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ShowDashboard(string pchOverlayToShow); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowDashboard ShowDashboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetPrimaryDashboardDevice(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPrimaryDashboardDevice GetPrimaryDashboardDevice; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowKeyboard(int eInputMode, int eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText, bool bUseMinimalMode, ulong uUserValue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowKeyboard ShowKeyboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowKeyboardForOverlay(ulong ulOverlayHandle, int eInputMode, int eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText, bool bUseMinimalMode, ulong uUserValue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowKeyboardForOverlay ShowKeyboardForOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetKeyboardText(System.Text.StringBuilder pchText, uint cchText); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetKeyboardText GetKeyboardText; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _HideKeyboard(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideKeyboard HideKeyboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetKeyboardTransformAbsolute(ETrackingUniverseOrigin eTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToKeyboardTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetKeyboardTransformAbsolute SetKeyboardTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetKeyboardPositionForOverlay(ulong ulOverlayHandle, HmdRect2_t avoidRect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetKeyboardPositionForOverlay SetKeyboardPositionForOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayIntersectionMask(ulong ulOverlayHandle, ref VROverlayIntersectionMaskPrimitive_t pMaskPrimitives, uint unNumMaskPrimitives, uint unPrimitiveSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayIntersectionMask SetOverlayIntersectionMask; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayFlags(ulong ulOverlayHandle, ref uint pFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayFlags GetOverlayFlags; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate VRMessageOverlayResponse _ShowMessageOverlay(string pchText, string pchCaption, string pchButton0Text, string pchButton1Text, string pchButton2Text, string pchButton3Text); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowMessageOverlay ShowMessageOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CloseMessageOverlay(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CloseMessageOverlay CloseMessageOverlay; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRRenderModels +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadRenderModel_Async(string pchRenderModelName, ref IntPtr ppRenderModel); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadRenderModel_Async LoadRenderModel_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeRenderModel(IntPtr pRenderModel); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeRenderModel FreeRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadTexture_Async(int textureId, ref IntPtr ppTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadTexture_Async LoadTexture_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeTexture(IntPtr pTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeTexture FreeTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadTextureD3D11_Async(int textureId, IntPtr pD3D11Device, ref IntPtr ppD3D11Texture2D); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadTextureD3D11_Async LoadTextureD3D11_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadIntoTextureD3D11_Async(int textureId, IntPtr pDstTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadIntoTextureD3D11_Async LoadIntoTextureD3D11_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeTextureD3D11(IntPtr pD3D11Texture2D); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeTextureD3D11 FreeTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelName(uint unRenderModelIndex, System.Text.StringBuilder pchRenderModelName, uint unRenderModelNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelName GetRenderModelName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelCount GetRenderModelCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentCount(string pchRenderModelName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentCount GetComponentCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentName(string pchRenderModelName, uint unComponentIndex, System.Text.StringBuilder pchComponentName, uint unComponentNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentName GetComponentName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetComponentButtonMask(string pchRenderModelName, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentButtonMask GetComponentButtonMask; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentRenderModelName(string pchRenderModelName, string pchComponentName, System.Text.StringBuilder pchComponentRenderModelName, uint unComponentRenderModelNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentRenderModelName GetComponentRenderModelName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentStateForDevicePath(string pchRenderModelName, string pchComponentName, ulong devicePath, ref RenderModel_ControllerMode_State_t pState, ref RenderModel_ComponentState_t pComponentState); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentStateForDevicePath GetComponentStateForDevicePath; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentState(string pchRenderModelName, string pchComponentName, ref VRControllerState_t pControllerState, ref RenderModel_ControllerMode_State_t pState, ref RenderModel_ComponentState_t pComponentState); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentState GetComponentState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _RenderModelHasComponent(string pchRenderModelName, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RenderModelHasComponent RenderModelHasComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelThumbnailURL(string pchRenderModelName, System.Text.StringBuilder pchThumbnailURL, uint unThumbnailURLLen, ref EVRRenderModelError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelThumbnailURL GetRenderModelThumbnailURL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelOriginalPath(string pchRenderModelName, System.Text.StringBuilder pchOriginalPath, uint unOriginalPathLen, ref EVRRenderModelError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelOriginalPath GetRenderModelOriginalPath; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetRenderModelErrorNameFromEnum(EVRRenderModelError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelErrorNameFromEnum GetRenderModelErrorNameFromEnum; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRNotifications +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRNotificationError _CreateNotification(ulong ulOverlayHandle, ulong ulUserValue, EVRNotificationType type, string pchText, EVRNotificationStyle style, ref NotificationBitmap_t pImage, ref uint pNotificationId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateNotification CreateNotification; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRNotificationError _RemoveNotification(uint notificationId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveNotification RemoveNotification; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRSettings +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetSettingsErrorNameFromEnum(EVRSettingsError eError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSettingsErrorNameFromEnum GetSettingsErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _Sync(bool bForce, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Sync Sync; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetBool(string pchSection, string pchSettingsKey, bool bValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetBool SetBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetInt32(string pchSection, string pchSettingsKey, int nValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetInt32 SetInt32; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetFloat(string pchSection, string pchSettingsKey, float flValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetFloat SetFloat; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetString(string pchSection, string pchSettingsKey, string pchValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetString SetString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetBool(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBool GetBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetInt32(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetInt32 GetInt32; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFloat(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFloat GetFloat; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetString(string pchSection, string pchSettingsKey, System.Text.StringBuilder pchValue, uint unValueLen, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetString GetString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RemoveSection(string pchSection, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveSection RemoveSection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RemoveKeyInSection(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveKeyInSection RemoveKeyInSection; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRScreenshots +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _RequestScreenshot(ref uint pOutScreenshotHandle, EVRScreenshotType type, string pchPreviewFilename, string pchVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RequestScreenshot RequestScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _HookScreenshot([In, Out] EVRScreenshotType[] pSupportedTypes, int numTypes); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HookScreenshot HookScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotType _GetScreenshotPropertyType(uint screenshotHandle, ref EVRScreenshotError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetScreenshotPropertyType GetScreenshotPropertyType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetScreenshotPropertyFilename(uint screenshotHandle, EVRScreenshotPropertyFilenames filenameType, System.Text.StringBuilder pchFilename, uint cchFilename, ref EVRScreenshotError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetScreenshotPropertyFilename GetScreenshotPropertyFilename; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _UpdateScreenshotProgress(uint screenshotHandle, float flProgress); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _UpdateScreenshotProgress UpdateScreenshotProgress; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _TakeStereoScreenshot(ref uint pOutScreenshotHandle, string pchPreviewFilename, string pchVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _TakeStereoScreenshot TakeStereoScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _SubmitScreenshot(uint screenshotHandle, EVRScreenshotType type, string pchSourcePreviewFilename, string pchSourceVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SubmitScreenshot SubmitScreenshot; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRResources +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _LoadSharedResource(string pchResourceName, string pchBuffer, uint unBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadSharedResource LoadSharedResource; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetResourceFullPath(string pchResourceName, string pchResourceTypeDirectory, System.Text.StringBuilder pchPathBuffer, uint unBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetResourceFullPath GetResourceFullPath; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRDriverManager +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetDriverCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDriverCount GetDriverCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetDriverName(uint nDriver, System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDriverName GetDriverName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetDriverHandle(string pchDriverName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDriverHandle GetDriverHandle; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRInput +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _SetActionManifestPath(string pchActionManifestPath); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetActionManifestPath SetActionManifestPath; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetActionSetHandle(string pchActionSetName, ref ulong pHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetActionSetHandle GetActionSetHandle; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetActionHandle(string pchActionName, ref ulong pHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetActionHandle GetActionHandle; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetInputSourceHandle(string pchInputSourcePath, ref ulong pHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetInputSourceHandle GetInputSourceHandle; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _UpdateActionState([In, Out] VRActiveActionSet_t[] pSets, uint unSizeOfVRSelectedActionSet_t, uint unSetCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _UpdateActionState UpdateActionState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetDigitalActionData(ulong action, ref InputDigitalActionData_t pActionData, uint unActionDataSize, ulong ulRestrictToDevice); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDigitalActionData GetDigitalActionData; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetAnalogActionData(ulong action, ref InputAnalogActionData_t pActionData, uint unActionDataSize, ulong ulRestrictToDevice); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetAnalogActionData GetAnalogActionData; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetPoseActionData(ulong action, ETrackingUniverseOrigin eOrigin, float fPredictedSecondsFromNow, ref InputPoseActionData_t pActionData, uint unActionDataSize, ulong ulRestrictToDevice); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPoseActionData GetPoseActionData; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetSkeletalActionData(ulong action, ref InputSkeletalActionData_t pActionData, uint unActionDataSize, ulong ulRestrictToDevice); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSkeletalActionData GetSkeletalActionData; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetSkeletalBoneData(ulong action, EVRSkeletalTransformSpace eTransformSpace, EVRSkeletalMotionRange eMotionRange, [In, Out] VRBoneTransform_t[] pTransformArray, uint unTransformArrayCount, ulong ulRestrictToDevice); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSkeletalBoneData GetSkeletalBoneData; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetSkeletalBoneDataCompressed(ulong action, EVRSkeletalTransformSpace eTransformSpace, EVRSkeletalMotionRange eMotionRange, IntPtr pvCompressedData, uint unCompressedSize, ref uint punRequiredCompressedSize, ulong ulRestrictToDevice); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSkeletalBoneDataCompressed GetSkeletalBoneDataCompressed; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _DecompressSkeletalBoneData(IntPtr pvCompressedBuffer, uint unCompressedBufferSize, ref EVRSkeletalTransformSpace peTransformSpace, [In, Out] VRBoneTransform_t[] pTransformArray, uint unTransformArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _DecompressSkeletalBoneData DecompressSkeletalBoneData; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _TriggerHapticVibrationAction(ulong action, float fStartSecondsFromNow, float fDurationSeconds, float fFrequency, float fAmplitude, ulong ulRestrictToDevice); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _TriggerHapticVibrationAction TriggerHapticVibrationAction; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetActionOrigins(ulong actionSetHandle, ulong digitalActionHandle, [In, Out] ulong[] originsOut, uint originOutCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetActionOrigins GetActionOrigins; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetOriginLocalizedName(ulong origin, System.Text.StringBuilder pchNameArray, uint unNameArraySize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOriginLocalizedName GetOriginLocalizedName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _GetOriginTrackedDeviceInfo(ulong origin, ref InputOriginInfo_t pOriginInfo, uint unOriginInfoSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOriginTrackedDeviceInfo GetOriginTrackedDeviceInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _ShowActionOrigins(ulong actionSetHandle, ulong ulActionHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowActionOrigins ShowActionOrigins; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRInputError _ShowBindingsForActionSet([In, Out] VRActiveActionSet_t[] pSets, uint unSizeOfVRSelectedActionSet_t, uint unSetCount, ulong originToHighlight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowBindingsForActionSet ShowBindingsForActionSet; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRIOBuffer +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EIOBufferError _Open(string pchPath, EIOBufferMode mode, uint unElementSize, uint unElements, ref ulong pulBuffer); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Open Open; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EIOBufferError _Close(ulong ulBuffer); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Close Close; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EIOBufferError _Read(ulong ulBuffer, IntPtr pDst, uint unBytes, ref uint punRead); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Read Read; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EIOBufferError _Write(ulong ulBuffer, IntPtr pSrc, uint unBytes); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Write Write; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _PropertyContainer(ulong ulBuffer); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PropertyContainer PropertyContainer; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRSpatialAnchors +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRSpatialAnchorError _CreateSpatialAnchorFromDescriptor(string pchDescriptor, ref uint pHandleOut); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateSpatialAnchorFromDescriptor CreateSpatialAnchorFromDescriptor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRSpatialAnchorError _CreateSpatialAnchorFromPose(uint unDeviceIndex, ETrackingUniverseOrigin eOrigin, ref SpatialAnchorPose_t pPose, ref uint pHandleOut); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateSpatialAnchorFromPose CreateSpatialAnchorFromPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRSpatialAnchorError _GetSpatialAnchorPose(uint unHandle, ETrackingUniverseOrigin eOrigin, ref SpatialAnchorPose_t pPoseOut); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSpatialAnchorPose GetSpatialAnchorPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRSpatialAnchorError _GetSpatialAnchorDescriptor(uint unHandle, System.Text.StringBuilder pchDescriptorOut, ref uint punDescriptorBufferLenInOut); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSpatialAnchorDescriptor GetSpatialAnchorDescriptor; + +} + + +public class CVRSystem +{ + IVRSystem FnTable; + internal CVRSystem(IntPtr pInterface) + { + FnTable = (IVRSystem)Marshal.PtrToStructure(pInterface, typeof(IVRSystem)); + } + public void GetRecommendedRenderTargetSize(ref uint pnWidth,ref uint pnHeight) + { + pnWidth = 0; + pnHeight = 0; + FnTable.GetRecommendedRenderTargetSize(ref pnWidth,ref pnHeight); + } + public HmdMatrix44_t GetProjectionMatrix(EVREye eEye,float fNearZ,float fFarZ) + { + HmdMatrix44_t result = FnTable.GetProjectionMatrix(eEye,fNearZ,fFarZ); + return result; + } + public void GetProjectionRaw(EVREye eEye,ref float pfLeft,ref float pfRight,ref float pfTop,ref float pfBottom) + { + pfLeft = 0; + pfRight = 0; + pfTop = 0; + pfBottom = 0; + FnTable.GetProjectionRaw(eEye,ref pfLeft,ref pfRight,ref pfTop,ref pfBottom); + } + public bool ComputeDistortion(EVREye eEye,float fU,float fV,ref DistortionCoordinates_t pDistortionCoordinates) + { + bool result = FnTable.ComputeDistortion(eEye,fU,fV,ref pDistortionCoordinates); + return result; + } + public HmdMatrix34_t GetEyeToHeadTransform(EVREye eEye) + { + HmdMatrix34_t result = FnTable.GetEyeToHeadTransform(eEye); + return result; + } + public bool GetTimeSinceLastVsync(ref float pfSecondsSinceLastVsync,ref ulong pulFrameCounter) + { + pfSecondsSinceLastVsync = 0; + pulFrameCounter = 0; + bool result = FnTable.GetTimeSinceLastVsync(ref pfSecondsSinceLastVsync,ref pulFrameCounter); + return result; + } + public int GetD3D9AdapterIndex() + { + int result = FnTable.GetD3D9AdapterIndex(); + return result; + } + public void GetDXGIOutputInfo(ref int pnAdapterIndex) + { + pnAdapterIndex = 0; + FnTable.GetDXGIOutputInfo(ref pnAdapterIndex); + } + public void GetOutputDevice(ref ulong pnDevice,ETextureType textureType,IntPtr pInstance) + { + pnDevice = 0; + FnTable.GetOutputDevice(ref pnDevice,textureType,pInstance); + } + public bool IsDisplayOnDesktop() + { + bool result = FnTable.IsDisplayOnDesktop(); + return result; + } + public bool SetDisplayVisibility(bool bIsVisibleOnDesktop) + { + bool result = FnTable.SetDisplayVisibility(bIsVisibleOnDesktop); + return result; + } + public void GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin eOrigin,float fPredictedSecondsToPhotonsFromNow,TrackedDevicePose_t [] pTrackedDevicePoseArray) + { + FnTable.GetDeviceToAbsoluteTrackingPose(eOrigin,fPredictedSecondsToPhotonsFromNow,pTrackedDevicePoseArray,(uint) pTrackedDevicePoseArray.Length); + } + public void ResetSeatedZeroPose() + { + FnTable.ResetSeatedZeroPose(); + } + public HmdMatrix34_t GetSeatedZeroPoseToStandingAbsoluteTrackingPose() + { + HmdMatrix34_t result = FnTable.GetSeatedZeroPoseToStandingAbsoluteTrackingPose(); + return result; + } + public HmdMatrix34_t GetRawZeroPoseToStandingAbsoluteTrackingPose() + { + HmdMatrix34_t result = FnTable.GetRawZeroPoseToStandingAbsoluteTrackingPose(); + return result; + } + public uint GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass,uint [] punTrackedDeviceIndexArray,uint unRelativeToTrackedDeviceIndex) + { + uint result = FnTable.GetSortedTrackedDeviceIndicesOfClass(eTrackedDeviceClass,punTrackedDeviceIndexArray,(uint) punTrackedDeviceIndexArray.Length,unRelativeToTrackedDeviceIndex); + return result; + } + public EDeviceActivityLevel GetTrackedDeviceActivityLevel(uint unDeviceId) + { + EDeviceActivityLevel result = FnTable.GetTrackedDeviceActivityLevel(unDeviceId); + return result; + } + public void ApplyTransform(ref TrackedDevicePose_t pOutputPose,ref TrackedDevicePose_t pTrackedDevicePose,ref HmdMatrix34_t pTransform) + { + FnTable.ApplyTransform(ref pOutputPose,ref pTrackedDevicePose,ref pTransform); + } + public uint GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole unDeviceType) + { + uint result = FnTable.GetTrackedDeviceIndexForControllerRole(unDeviceType); + return result; + } + public ETrackedControllerRole GetControllerRoleForTrackedDeviceIndex(uint unDeviceIndex) + { + ETrackedControllerRole result = FnTable.GetControllerRoleForTrackedDeviceIndex(unDeviceIndex); + return result; + } + public ETrackedDeviceClass GetTrackedDeviceClass(uint unDeviceIndex) + { + ETrackedDeviceClass result = FnTable.GetTrackedDeviceClass(unDeviceIndex); + return result; + } + public bool IsTrackedDeviceConnected(uint unDeviceIndex) + { + bool result = FnTable.IsTrackedDeviceConnected(unDeviceIndex); + return result; + } + public bool GetBoolTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + bool result = FnTable.GetBoolTrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public float GetFloatTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + float result = FnTable.GetFloatTrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public int GetInt32TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + int result = FnTable.GetInt32TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public ulong GetUint64TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + ulong result = FnTable.GetUint64TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public HmdMatrix34_t GetMatrix34TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + HmdMatrix34_t result = FnTable.GetMatrix34TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public uint GetArrayTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,uint propType,IntPtr pBuffer,uint unBufferSize,ref ETrackedPropertyError pError) + { + uint result = FnTable.GetArrayTrackedDeviceProperty(unDeviceIndex,prop,propType,pBuffer,unBufferSize,ref pError); + return result; + } + public uint GetStringTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,System.Text.StringBuilder pchValue,uint unBufferSize,ref ETrackedPropertyError pError) + { + uint result = FnTable.GetStringTrackedDeviceProperty(unDeviceIndex,prop,pchValue,unBufferSize,ref pError); + return result; + } + public string GetPropErrorNameFromEnum(ETrackedPropertyError error) + { + IntPtr result = FnTable.GetPropErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEventPacked(ref VREvent_t_Packed pEvent,uint uncbVREvent); + [StructLayout(LayoutKind.Explicit)] + struct PollNextEventUnion + { + [FieldOffset(0)] + public IVRSystem._PollNextEvent pPollNextEvent; + [FieldOffset(0)] + public _PollNextEventPacked pPollNextEventPacked; + } + public bool PollNextEvent(ref VREvent_t pEvent,uint uncbVREvent) + { +#if !UNITY_METRO + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + PollNextEventUnion u; + VREvent_t_Packed event_packed = new VREvent_t_Packed(); + u.pPollNextEventPacked = null; + u.pPollNextEvent = FnTable.PollNextEvent; + bool packed_result = u.pPollNextEventPacked(ref event_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VREvent_t_Packed))); + + event_packed.Unpack(ref pEvent); + return packed_result; + } +#endif + bool result = FnTable.PollNextEvent(ref pEvent,uncbVREvent); + return result; + } + public bool PollNextEventWithPose(ETrackingUniverseOrigin eOrigin,ref VREvent_t pEvent,uint uncbVREvent,ref TrackedDevicePose_t pTrackedDevicePose) + { + bool result = FnTable.PollNextEventWithPose(eOrigin,ref pEvent,uncbVREvent,ref pTrackedDevicePose); + return result; + } + public string GetEventTypeNameFromEnum(EVREventType eType) + { + IntPtr result = FnTable.GetEventTypeNameFromEnum(eType); + return Marshal.PtrToStringAnsi(result); + } + public HiddenAreaMesh_t GetHiddenAreaMesh(EVREye eEye,EHiddenAreaMeshType type) + { + HiddenAreaMesh_t result = FnTable.GetHiddenAreaMesh(eEye,type); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStatePacked(uint unControllerDeviceIndex,ref VRControllerState_t_Packed pControllerState,uint unControllerStateSize); + [StructLayout(LayoutKind.Explicit)] + struct GetControllerStateUnion + { + [FieldOffset(0)] + public IVRSystem._GetControllerState pGetControllerState; + [FieldOffset(0)] + public _GetControllerStatePacked pGetControllerStatePacked; + } + public bool GetControllerState(uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize) + { +#if !UNITY_METRO + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetControllerStateUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetControllerStatePacked = null; + u.pGetControllerState = FnTable.GetControllerState; + bool packed_result = u.pGetControllerStatePacked(unControllerDeviceIndex,ref state_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t_Packed))); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } +#endif + bool result = FnTable.GetControllerState(unControllerDeviceIndex,ref pControllerState,unControllerStateSize); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStateWithPosePacked(ETrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref VRControllerState_t_Packed pControllerState,uint unControllerStateSize,ref TrackedDevicePose_t pTrackedDevicePose); + [StructLayout(LayoutKind.Explicit)] + struct GetControllerStateWithPoseUnion + { + [FieldOffset(0)] + public IVRSystem._GetControllerStateWithPose pGetControllerStateWithPose; + [FieldOffset(0)] + public _GetControllerStateWithPosePacked pGetControllerStateWithPosePacked; + } + public bool GetControllerStateWithPose(ETrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize,ref TrackedDevicePose_t pTrackedDevicePose) + { +#if !UNITY_METRO + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetControllerStateWithPoseUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetControllerStateWithPosePacked = null; + u.pGetControllerStateWithPose = FnTable.GetControllerStateWithPose; + bool packed_result = u.pGetControllerStateWithPosePacked(eOrigin,unControllerDeviceIndex,ref state_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t_Packed)),ref pTrackedDevicePose); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } +#endif + bool result = FnTable.GetControllerStateWithPose(eOrigin,unControllerDeviceIndex,ref pControllerState,unControllerStateSize,ref pTrackedDevicePose); + return result; + } + public void TriggerHapticPulse(uint unControllerDeviceIndex,uint unAxisId,ushort usDurationMicroSec) + { + FnTable.TriggerHapticPulse(unControllerDeviceIndex,unAxisId,usDurationMicroSec); + } + public string GetButtonIdNameFromEnum(EVRButtonId eButtonId) + { + IntPtr result = FnTable.GetButtonIdNameFromEnum(eButtonId); + return Marshal.PtrToStringAnsi(result); + } + public string GetControllerAxisTypeNameFromEnum(EVRControllerAxisType eAxisType) + { + IntPtr result = FnTable.GetControllerAxisTypeNameFromEnum(eAxisType); + return Marshal.PtrToStringAnsi(result); + } + public bool IsInputAvailable() + { + bool result = FnTable.IsInputAvailable(); + return result; + } + public bool IsSteamVRDrawingControllers() + { + bool result = FnTable.IsSteamVRDrawingControllers(); + return result; + } + public bool ShouldApplicationPause() + { + bool result = FnTable.ShouldApplicationPause(); + return result; + } + public bool ShouldApplicationReduceRenderingWork() + { + bool result = FnTable.ShouldApplicationReduceRenderingWork(); + return result; + } + public uint DriverDebugRequest(uint unDeviceIndex,string pchRequest,System.Text.StringBuilder pchResponseBuffer,uint unResponseBufferSize) + { + uint result = FnTable.DriverDebugRequest(unDeviceIndex,pchRequest,pchResponseBuffer,unResponseBufferSize); + return result; + } + public EVRFirmwareError PerformFirmwareUpdate(uint unDeviceIndex) + { + EVRFirmwareError result = FnTable.PerformFirmwareUpdate(unDeviceIndex); + return result; + } + public void AcknowledgeQuit_Exiting() + { + FnTable.AcknowledgeQuit_Exiting(); + } + public void AcknowledgeQuit_UserPrompt() + { + FnTable.AcknowledgeQuit_UserPrompt(); + } +} + + +public class CVRExtendedDisplay +{ + IVRExtendedDisplay FnTable; + internal CVRExtendedDisplay(IntPtr pInterface) + { + FnTable = (IVRExtendedDisplay)Marshal.PtrToStructure(pInterface, typeof(IVRExtendedDisplay)); + } + public void GetWindowBounds(ref int pnX,ref int pnY,ref uint pnWidth,ref uint pnHeight) + { + pnX = 0; + pnY = 0; + pnWidth = 0; + pnHeight = 0; + FnTable.GetWindowBounds(ref pnX,ref pnY,ref pnWidth,ref pnHeight); + } + public void GetEyeOutputViewport(EVREye eEye,ref uint pnX,ref uint pnY,ref uint pnWidth,ref uint pnHeight) + { + pnX = 0; + pnY = 0; + pnWidth = 0; + pnHeight = 0; + FnTable.GetEyeOutputViewport(eEye,ref pnX,ref pnY,ref pnWidth,ref pnHeight); + } + public void GetDXGIOutputInfo(ref int pnAdapterIndex,ref int pnAdapterOutputIndex) + { + pnAdapterIndex = 0; + pnAdapterOutputIndex = 0; + FnTable.GetDXGIOutputInfo(ref pnAdapterIndex,ref pnAdapterOutputIndex); + } +} + + +public class CVRTrackedCamera +{ + IVRTrackedCamera FnTable; + internal CVRTrackedCamera(IntPtr pInterface) + { + FnTable = (IVRTrackedCamera)Marshal.PtrToStructure(pInterface, typeof(IVRTrackedCamera)); + } + public string GetCameraErrorNameFromEnum(EVRTrackedCameraError eCameraError) + { + IntPtr result = FnTable.GetCameraErrorNameFromEnum(eCameraError); + return Marshal.PtrToStringAnsi(result); + } + public EVRTrackedCameraError HasCamera(uint nDeviceIndex,ref bool pHasCamera) + { + pHasCamera = false; + EVRTrackedCameraError result = FnTable.HasCamera(nDeviceIndex,ref pHasCamera); + return result; + } + public EVRTrackedCameraError GetCameraFrameSize(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref uint pnWidth,ref uint pnHeight,ref uint pnFrameBufferSize) + { + pnWidth = 0; + pnHeight = 0; + pnFrameBufferSize = 0; + EVRTrackedCameraError result = FnTable.GetCameraFrameSize(nDeviceIndex,eFrameType,ref pnWidth,ref pnHeight,ref pnFrameBufferSize); + return result; + } + public EVRTrackedCameraError GetCameraIntrinsics(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref HmdVector2_t pFocalLength,ref HmdVector2_t pCenter) + { + EVRTrackedCameraError result = FnTable.GetCameraIntrinsics(nDeviceIndex,eFrameType,ref pFocalLength,ref pCenter); + return result; + } + public EVRTrackedCameraError GetCameraProjection(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,float flZNear,float flZFar,ref HmdMatrix44_t pProjection) + { + EVRTrackedCameraError result = FnTable.GetCameraProjection(nDeviceIndex,eFrameType,flZNear,flZFar,ref pProjection); + return result; + } + public EVRTrackedCameraError AcquireVideoStreamingService(uint nDeviceIndex,ref ulong pHandle) + { + pHandle = 0; + EVRTrackedCameraError result = FnTable.AcquireVideoStreamingService(nDeviceIndex,ref pHandle); + return result; + } + public EVRTrackedCameraError ReleaseVideoStreamingService(ulong hTrackedCamera) + { + EVRTrackedCameraError result = FnTable.ReleaseVideoStreamingService(hTrackedCamera); + return result; + } + public EVRTrackedCameraError GetVideoStreamFrameBuffer(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,IntPtr pFrameBuffer,uint nFrameBufferSize,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + EVRTrackedCameraError result = FnTable.GetVideoStreamFrameBuffer(hTrackedCamera,eFrameType,pFrameBuffer,nFrameBufferSize,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureSize(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref VRTextureBounds_t pTextureBounds,ref uint pnWidth,ref uint pnHeight) + { + pnWidth = 0; + pnHeight = 0; + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureSize(nDeviceIndex,eFrameType,ref pTextureBounds,ref pnWidth,ref pnHeight); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureD3D11(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,IntPtr pD3D11DeviceOrResource,ref IntPtr ppD3D11ShaderResourceView,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureD3D11(hTrackedCamera,eFrameType,pD3D11DeviceOrResource,ref ppD3D11ShaderResourceView,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureGL(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,ref uint pglTextureId,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + pglTextureId = 0; + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureGL(hTrackedCamera,eFrameType,ref pglTextureId,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError ReleaseVideoStreamTextureGL(ulong hTrackedCamera,uint glTextureId) + { + EVRTrackedCameraError result = FnTable.ReleaseVideoStreamTextureGL(hTrackedCamera,glTextureId); + return result; + } +} + + +public class CVRApplications +{ + IVRApplications FnTable; + internal CVRApplications(IntPtr pInterface) + { + FnTable = (IVRApplications)Marshal.PtrToStructure(pInterface, typeof(IVRApplications)); + } + public EVRApplicationError AddApplicationManifest(string pchApplicationManifestFullPath,bool bTemporary) + { + EVRApplicationError result = FnTable.AddApplicationManifest(pchApplicationManifestFullPath,bTemporary); + return result; + } + public EVRApplicationError RemoveApplicationManifest(string pchApplicationManifestFullPath) + { + EVRApplicationError result = FnTable.RemoveApplicationManifest(pchApplicationManifestFullPath); + return result; + } + public bool IsApplicationInstalled(string pchAppKey) + { + bool result = FnTable.IsApplicationInstalled(pchAppKey); + return result; + } + public uint GetApplicationCount() + { + uint result = FnTable.GetApplicationCount(); + return result; + } + public EVRApplicationError GetApplicationKeyByIndex(uint unApplicationIndex,System.Text.StringBuilder pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetApplicationKeyByIndex(unApplicationIndex,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationError GetApplicationKeyByProcessId(uint unProcessId,System.Text.StringBuilder pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetApplicationKeyByProcessId(unProcessId,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationError LaunchApplication(string pchAppKey) + { + EVRApplicationError result = FnTable.LaunchApplication(pchAppKey); + return result; + } + public EVRApplicationError LaunchTemplateApplication(string pchTemplateAppKey,string pchNewAppKey,AppOverrideKeys_t [] pKeys) + { + EVRApplicationError result = FnTable.LaunchTemplateApplication(pchTemplateAppKey,pchNewAppKey,pKeys,(uint) pKeys.Length); + return result; + } + public EVRApplicationError LaunchApplicationFromMimeType(string pchMimeType,string pchArgs) + { + EVRApplicationError result = FnTable.LaunchApplicationFromMimeType(pchMimeType,pchArgs); + return result; + } + public EVRApplicationError LaunchDashboardOverlay(string pchAppKey) + { + EVRApplicationError result = FnTable.LaunchDashboardOverlay(pchAppKey); + return result; + } + public bool CancelApplicationLaunch(string pchAppKey) + { + bool result = FnTable.CancelApplicationLaunch(pchAppKey); + return result; + } + public EVRApplicationError IdentifyApplication(uint unProcessId,string pchAppKey) + { + EVRApplicationError result = FnTable.IdentifyApplication(unProcessId,pchAppKey); + return result; + } + public uint GetApplicationProcessId(string pchAppKey) + { + uint result = FnTable.GetApplicationProcessId(pchAppKey); + return result; + } + public string GetApplicationsErrorNameFromEnum(EVRApplicationError error) + { + IntPtr result = FnTable.GetApplicationsErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } + public uint GetApplicationPropertyString(string pchAppKey,EVRApplicationProperty eProperty,System.Text.StringBuilder pchPropertyValueBuffer,uint unPropertyValueBufferLen,ref EVRApplicationError peError) + { + uint result = FnTable.GetApplicationPropertyString(pchAppKey,eProperty,pchPropertyValueBuffer,unPropertyValueBufferLen,ref peError); + return result; + } + public bool GetApplicationPropertyBool(string pchAppKey,EVRApplicationProperty eProperty,ref EVRApplicationError peError) + { + bool result = FnTable.GetApplicationPropertyBool(pchAppKey,eProperty,ref peError); + return result; + } + public ulong GetApplicationPropertyUint64(string pchAppKey,EVRApplicationProperty eProperty,ref EVRApplicationError peError) + { + ulong result = FnTable.GetApplicationPropertyUint64(pchAppKey,eProperty,ref peError); + return result; + } + public EVRApplicationError SetApplicationAutoLaunch(string pchAppKey,bool bAutoLaunch) + { + EVRApplicationError result = FnTable.SetApplicationAutoLaunch(pchAppKey,bAutoLaunch); + return result; + } + public bool GetApplicationAutoLaunch(string pchAppKey) + { + bool result = FnTable.GetApplicationAutoLaunch(pchAppKey); + return result; + } + public EVRApplicationError SetDefaultApplicationForMimeType(string pchAppKey,string pchMimeType) + { + EVRApplicationError result = FnTable.SetDefaultApplicationForMimeType(pchAppKey,pchMimeType); + return result; + } + public bool GetDefaultApplicationForMimeType(string pchMimeType,System.Text.StringBuilder pchAppKeyBuffer,uint unAppKeyBufferLen) + { + bool result = FnTable.GetDefaultApplicationForMimeType(pchMimeType,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public bool GetApplicationSupportedMimeTypes(string pchAppKey,System.Text.StringBuilder pchMimeTypesBuffer,uint unMimeTypesBuffer) + { + bool result = FnTable.GetApplicationSupportedMimeTypes(pchAppKey,pchMimeTypesBuffer,unMimeTypesBuffer); + return result; + } + public uint GetApplicationsThatSupportMimeType(string pchMimeType,System.Text.StringBuilder pchAppKeysThatSupportBuffer,uint unAppKeysThatSupportBuffer) + { + uint result = FnTable.GetApplicationsThatSupportMimeType(pchMimeType,pchAppKeysThatSupportBuffer,unAppKeysThatSupportBuffer); + return result; + } + public uint GetApplicationLaunchArguments(uint unHandle,System.Text.StringBuilder pchArgs,uint unArgs) + { + uint result = FnTable.GetApplicationLaunchArguments(unHandle,pchArgs,unArgs); + return result; + } + public EVRApplicationError GetStartingApplication(System.Text.StringBuilder pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetStartingApplication(pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationTransitionState GetTransitionState() + { + EVRApplicationTransitionState result = FnTable.GetTransitionState(); + return result; + } + public EVRApplicationError PerformApplicationPrelaunchCheck(string pchAppKey) + { + EVRApplicationError result = FnTable.PerformApplicationPrelaunchCheck(pchAppKey); + return result; + } + public string GetApplicationsTransitionStateNameFromEnum(EVRApplicationTransitionState state) + { + IntPtr result = FnTable.GetApplicationsTransitionStateNameFromEnum(state); + return Marshal.PtrToStringAnsi(result); + } + public bool IsQuitUserPromptRequested() + { + bool result = FnTable.IsQuitUserPromptRequested(); + return result; + } + public EVRApplicationError LaunchInternalProcess(string pchBinaryPath,string pchArguments,string pchWorkingDirectory) + { + EVRApplicationError result = FnTable.LaunchInternalProcess(pchBinaryPath,pchArguments,pchWorkingDirectory); + return result; + } + public uint GetCurrentSceneProcessId() + { + uint result = FnTable.GetCurrentSceneProcessId(); + return result; + } +} + + +public class CVRChaperone +{ + IVRChaperone FnTable; + internal CVRChaperone(IntPtr pInterface) + { + FnTable = (IVRChaperone)Marshal.PtrToStructure(pInterface, typeof(IVRChaperone)); + } + public ChaperoneCalibrationState GetCalibrationState() + { + ChaperoneCalibrationState result = FnTable.GetCalibrationState(); + return result; + } + public bool GetPlayAreaSize(ref float pSizeX,ref float pSizeZ) + { + pSizeX = 0; + pSizeZ = 0; + bool result = FnTable.GetPlayAreaSize(ref pSizeX,ref pSizeZ); + return result; + } + public bool GetPlayAreaRect(ref HmdQuad_t rect) + { + bool result = FnTable.GetPlayAreaRect(ref rect); + return result; + } + public void ReloadInfo() + { + FnTable.ReloadInfo(); + } + public void SetSceneColor(HmdColor_t color) + { + FnTable.SetSceneColor(color); + } + public void GetBoundsColor(ref HmdColor_t pOutputColorArray,int nNumOutputColors,float flCollisionBoundsFadeDistance,ref HmdColor_t pOutputCameraColor) + { + FnTable.GetBoundsColor(ref pOutputColorArray,nNumOutputColors,flCollisionBoundsFadeDistance,ref pOutputCameraColor); + } + public bool AreBoundsVisible() + { + bool result = FnTable.AreBoundsVisible(); + return result; + } + public void ForceBoundsVisible(bool bForce) + { + FnTable.ForceBoundsVisible(bForce); + } +} + + +public class CVRChaperoneSetup +{ + IVRChaperoneSetup FnTable; + internal CVRChaperoneSetup(IntPtr pInterface) + { + FnTable = (IVRChaperoneSetup)Marshal.PtrToStructure(pInterface, typeof(IVRChaperoneSetup)); + } + public bool CommitWorkingCopy(EChaperoneConfigFile configFile) + { + bool result = FnTable.CommitWorkingCopy(configFile); + return result; + } + public void RevertWorkingCopy() + { + FnTable.RevertWorkingCopy(); + } + public bool GetWorkingPlayAreaSize(ref float pSizeX,ref float pSizeZ) + { + pSizeX = 0; + pSizeZ = 0; + bool result = FnTable.GetWorkingPlayAreaSize(ref pSizeX,ref pSizeZ); + return result; + } + public bool GetWorkingPlayAreaRect(ref HmdQuad_t rect) + { + bool result = FnTable.GetWorkingPlayAreaRect(ref rect); + return result; + } + public bool GetWorkingCollisionBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetWorkingCollisionBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetWorkingCollisionBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool GetLiveCollisionBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetLiveCollisionBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetLiveCollisionBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool GetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetWorkingSeatedZeroPoseToRawTrackingPose(ref pmatSeatedZeroPoseToRawTrackingPose); + return result; + } + public bool GetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatStandingZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetWorkingStandingZeroPoseToRawTrackingPose(ref pmatStandingZeroPoseToRawTrackingPose); + return result; + } + public void SetWorkingPlayAreaSize(float sizeX,float sizeZ) + { + FnTable.SetWorkingPlayAreaSize(sizeX,sizeZ); + } + public void SetWorkingCollisionBoundsInfo(HmdQuad_t [] pQuadsBuffer) + { + FnTable.SetWorkingCollisionBoundsInfo(pQuadsBuffer,(uint) pQuadsBuffer.Length); + } + public void SetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatSeatedZeroPoseToRawTrackingPose) + { + FnTable.SetWorkingSeatedZeroPoseToRawTrackingPose(ref pMatSeatedZeroPoseToRawTrackingPose); + } + public void SetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatStandingZeroPoseToRawTrackingPose) + { + FnTable.SetWorkingStandingZeroPoseToRawTrackingPose(ref pMatStandingZeroPoseToRawTrackingPose); + } + public void ReloadFromDisk(EChaperoneConfigFile configFile) + { + FnTable.ReloadFromDisk(configFile); + } + public bool GetLiveSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetLiveSeatedZeroPoseToRawTrackingPose(ref pmatSeatedZeroPoseToRawTrackingPose); + return result; + } + public void SetWorkingCollisionBoundsTagsInfo(byte [] pTagsBuffer) + { + FnTable.SetWorkingCollisionBoundsTagsInfo(pTagsBuffer,(uint) pTagsBuffer.Length); + } + public bool GetLiveCollisionBoundsTagsInfo(out byte [] pTagsBuffer) + { + uint punTagCount = 0; + bool result = FnTable.GetLiveCollisionBoundsTagsInfo(null,ref punTagCount); + pTagsBuffer= new byte[punTagCount]; + result = FnTable.GetLiveCollisionBoundsTagsInfo(pTagsBuffer,ref punTagCount); + return result; + } + public bool SetWorkingPhysicalBoundsInfo(HmdQuad_t [] pQuadsBuffer) + { + bool result = FnTable.SetWorkingPhysicalBoundsInfo(pQuadsBuffer,(uint) pQuadsBuffer.Length); + return result; + } + public bool GetLivePhysicalBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetLivePhysicalBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetLivePhysicalBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool ExportLiveToBuffer(System.Text.StringBuilder pBuffer,ref uint pnBufferLength) + { + pnBufferLength = 0; + bool result = FnTable.ExportLiveToBuffer(pBuffer,ref pnBufferLength); + return result; + } + public bool ImportFromBufferToWorking(string pBuffer,uint nImportFlags) + { + bool result = FnTable.ImportFromBufferToWorking(pBuffer,nImportFlags); + return result; + } +} + + +public class CVRCompositor +{ + IVRCompositor FnTable; + internal CVRCompositor(IntPtr pInterface) + { + FnTable = (IVRCompositor)Marshal.PtrToStructure(pInterface, typeof(IVRCompositor)); + } + public void SetTrackingSpace(ETrackingUniverseOrigin eOrigin) + { + FnTable.SetTrackingSpace(eOrigin); + } + public ETrackingUniverseOrigin GetTrackingSpace() + { + ETrackingUniverseOrigin result = FnTable.GetTrackingSpace(); + return result; + } + public EVRCompositorError WaitGetPoses(TrackedDevicePose_t [] pRenderPoseArray,TrackedDevicePose_t [] pGamePoseArray) + { + EVRCompositorError result = FnTable.WaitGetPoses(pRenderPoseArray,(uint) pRenderPoseArray.Length,pGamePoseArray,(uint) pGamePoseArray.Length); + return result; + } + public EVRCompositorError GetLastPoses(TrackedDevicePose_t [] pRenderPoseArray,TrackedDevicePose_t [] pGamePoseArray) + { + EVRCompositorError result = FnTable.GetLastPoses(pRenderPoseArray,(uint) pRenderPoseArray.Length,pGamePoseArray,(uint) pGamePoseArray.Length); + return result; + } + public EVRCompositorError GetLastPoseForTrackedDeviceIndex(uint unDeviceIndex,ref TrackedDevicePose_t pOutputPose,ref TrackedDevicePose_t pOutputGamePose) + { + EVRCompositorError result = FnTable.GetLastPoseForTrackedDeviceIndex(unDeviceIndex,ref pOutputPose,ref pOutputGamePose); + return result; + } + public EVRCompositorError Submit(EVREye eEye,ref Texture_t pTexture,ref VRTextureBounds_t pBounds,EVRSubmitFlags nSubmitFlags) + { + EVRCompositorError result = FnTable.Submit(eEye,ref pTexture,ref pBounds,nSubmitFlags); + return result; + } + public void ClearLastSubmittedFrame() + { + FnTable.ClearLastSubmittedFrame(); + } + public void PostPresentHandoff() + { + FnTable.PostPresentHandoff(); + } + public bool GetFrameTiming(ref Compositor_FrameTiming pTiming,uint unFramesAgo) + { + bool result = FnTable.GetFrameTiming(ref pTiming,unFramesAgo); + return result; + } + public uint GetFrameTimings(ref Compositor_FrameTiming pTiming,uint nFrames) + { + uint result = FnTable.GetFrameTimings(ref pTiming,nFrames); + return result; + } + public float GetFrameTimeRemaining() + { + float result = FnTable.GetFrameTimeRemaining(); + return result; + } + public void GetCumulativeStats(ref Compositor_CumulativeStats pStats,uint nStatsSizeInBytes) + { + FnTable.GetCumulativeStats(ref pStats,nStatsSizeInBytes); + } + public void FadeToColor(float fSeconds,float fRed,float fGreen,float fBlue,float fAlpha,bool bBackground) + { + FnTable.FadeToColor(fSeconds,fRed,fGreen,fBlue,fAlpha,bBackground); + } + public HmdColor_t GetCurrentFadeColor(bool bBackground) + { + HmdColor_t result = FnTable.GetCurrentFadeColor(bBackground); + return result; + } + public void FadeGrid(float fSeconds,bool bFadeIn) + { + FnTable.FadeGrid(fSeconds,bFadeIn); + } + public float GetCurrentGridAlpha() + { + float result = FnTable.GetCurrentGridAlpha(); + return result; + } + public EVRCompositorError SetSkyboxOverride(Texture_t [] pTextures) + { + EVRCompositorError result = FnTable.SetSkyboxOverride(pTextures,(uint) pTextures.Length); + return result; + } + public void ClearSkyboxOverride() + { + FnTable.ClearSkyboxOverride(); + } + public void CompositorBringToFront() + { + FnTable.CompositorBringToFront(); + } + public void CompositorGoToBack() + { + FnTable.CompositorGoToBack(); + } + public void CompositorQuit() + { + FnTable.CompositorQuit(); + } + public bool IsFullscreen() + { + bool result = FnTable.IsFullscreen(); + return result; + } + public uint GetCurrentSceneFocusProcess() + { + uint result = FnTable.GetCurrentSceneFocusProcess(); + return result; + } + public uint GetLastFrameRenderer() + { + uint result = FnTable.GetLastFrameRenderer(); + return result; + } + public bool CanRenderScene() + { + bool result = FnTable.CanRenderScene(); + return result; + } + public void ShowMirrorWindow() + { + FnTable.ShowMirrorWindow(); + } + public void HideMirrorWindow() + { + FnTable.HideMirrorWindow(); + } + public bool IsMirrorWindowVisible() + { + bool result = FnTable.IsMirrorWindowVisible(); + return result; + } + public void CompositorDumpImages() + { + FnTable.CompositorDumpImages(); + } + public bool ShouldAppRenderWithLowResources() + { + bool result = FnTable.ShouldAppRenderWithLowResources(); + return result; + } + public void ForceInterleavedReprojectionOn(bool bOverride) + { + FnTable.ForceInterleavedReprojectionOn(bOverride); + } + public void ForceReconnectProcess() + { + FnTable.ForceReconnectProcess(); + } + public void SuspendRendering(bool bSuspend) + { + FnTable.SuspendRendering(bSuspend); + } + public EVRCompositorError GetMirrorTextureD3D11(EVREye eEye,IntPtr pD3D11DeviceOrResource,ref IntPtr ppD3D11ShaderResourceView) + { + EVRCompositorError result = FnTable.GetMirrorTextureD3D11(eEye,pD3D11DeviceOrResource,ref ppD3D11ShaderResourceView); + return result; + } + public void ReleaseMirrorTextureD3D11(IntPtr pD3D11ShaderResourceView) + { + FnTable.ReleaseMirrorTextureD3D11(pD3D11ShaderResourceView); + } + public EVRCompositorError GetMirrorTextureGL(EVREye eEye,ref uint pglTextureId,IntPtr pglSharedTextureHandle) + { + pglTextureId = 0; + EVRCompositorError result = FnTable.GetMirrorTextureGL(eEye,ref pglTextureId,pglSharedTextureHandle); + return result; + } + public bool ReleaseSharedGLTexture(uint glTextureId,IntPtr glSharedTextureHandle) + { + bool result = FnTable.ReleaseSharedGLTexture(glTextureId,glSharedTextureHandle); + return result; + } + public void LockGLSharedTextureForAccess(IntPtr glSharedTextureHandle) + { + FnTable.LockGLSharedTextureForAccess(glSharedTextureHandle); + } + public void UnlockGLSharedTextureForAccess(IntPtr glSharedTextureHandle) + { + FnTable.UnlockGLSharedTextureForAccess(glSharedTextureHandle); + } + public uint GetVulkanInstanceExtensionsRequired(System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetVulkanInstanceExtensionsRequired(pchValue,unBufferSize); + return result; + } + public uint GetVulkanDeviceExtensionsRequired(IntPtr pPhysicalDevice,System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetVulkanDeviceExtensionsRequired(pPhysicalDevice,pchValue,unBufferSize); + return result; + } + public void SetExplicitTimingMode(EVRCompositorTimingMode eTimingMode) + { + FnTable.SetExplicitTimingMode(eTimingMode); + } + public EVRCompositorError SubmitExplicitTimingData() + { + EVRCompositorError result = FnTable.SubmitExplicitTimingData(); + return result; + } +} + + +public class CVROverlay +{ + IVROverlay FnTable; + internal CVROverlay(IntPtr pInterface) + { + FnTable = (IVROverlay)Marshal.PtrToStructure(pInterface, typeof(IVROverlay)); + } + public EVROverlayError FindOverlay(string pchOverlayKey,ref ulong pOverlayHandle) + { + pOverlayHandle = 0; + EVROverlayError result = FnTable.FindOverlay(pchOverlayKey,ref pOverlayHandle); + return result; + } + public EVROverlayError CreateOverlay(string pchOverlayKey,string pchOverlayName,ref ulong pOverlayHandle) + { + pOverlayHandle = 0; + EVROverlayError result = FnTable.CreateOverlay(pchOverlayKey,pchOverlayName,ref pOverlayHandle); + return result; + } + public EVROverlayError DestroyOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.DestroyOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError SetHighQualityOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.SetHighQualityOverlay(ulOverlayHandle); + return result; + } + public ulong GetHighQualityOverlay() + { + ulong result = FnTable.GetHighQualityOverlay(); + return result; + } + public uint GetOverlayKey(ulong ulOverlayHandle,System.Text.StringBuilder pchValue,uint unBufferSize,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayKey(ulOverlayHandle,pchValue,unBufferSize,ref pError); + return result; + } + public uint GetOverlayName(ulong ulOverlayHandle,System.Text.StringBuilder pchValue,uint unBufferSize,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayName(ulOverlayHandle,pchValue,unBufferSize,ref pError); + return result; + } + public EVROverlayError SetOverlayName(ulong ulOverlayHandle,string pchName) + { + EVROverlayError result = FnTable.SetOverlayName(ulOverlayHandle,pchName); + return result; + } + public EVROverlayError GetOverlayImageData(ulong ulOverlayHandle,IntPtr pvBuffer,uint unBufferSize,ref uint punWidth,ref uint punHeight) + { + punWidth = 0; + punHeight = 0; + EVROverlayError result = FnTable.GetOverlayImageData(ulOverlayHandle,pvBuffer,unBufferSize,ref punWidth,ref punHeight); + return result; + } + public string GetOverlayErrorNameFromEnum(EVROverlayError error) + { + IntPtr result = FnTable.GetOverlayErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } + public EVROverlayError SetOverlayRenderingPid(ulong ulOverlayHandle,uint unPID) + { + EVROverlayError result = FnTable.SetOverlayRenderingPid(ulOverlayHandle,unPID); + return result; + } + public uint GetOverlayRenderingPid(ulong ulOverlayHandle) + { + uint result = FnTable.GetOverlayRenderingPid(ulOverlayHandle); + return result; + } + public EVROverlayError SetOverlayFlag(ulong ulOverlayHandle,VROverlayFlags eOverlayFlag,bool bEnabled) + { + EVROverlayError result = FnTable.SetOverlayFlag(ulOverlayHandle,eOverlayFlag,bEnabled); + return result; + } + public EVROverlayError GetOverlayFlag(ulong ulOverlayHandle,VROverlayFlags eOverlayFlag,ref bool pbEnabled) + { + pbEnabled = false; + EVROverlayError result = FnTable.GetOverlayFlag(ulOverlayHandle,eOverlayFlag,ref pbEnabled); + return result; + } + public EVROverlayError SetOverlayColor(ulong ulOverlayHandle,float fRed,float fGreen,float fBlue) + { + EVROverlayError result = FnTable.SetOverlayColor(ulOverlayHandle,fRed,fGreen,fBlue); + return result; + } + public EVROverlayError GetOverlayColor(ulong ulOverlayHandle,ref float pfRed,ref float pfGreen,ref float pfBlue) + { + pfRed = 0; + pfGreen = 0; + pfBlue = 0; + EVROverlayError result = FnTable.GetOverlayColor(ulOverlayHandle,ref pfRed,ref pfGreen,ref pfBlue); + return result; + } + public EVROverlayError SetOverlayAlpha(ulong ulOverlayHandle,float fAlpha) + { + EVROverlayError result = FnTable.SetOverlayAlpha(ulOverlayHandle,fAlpha); + return result; + } + public EVROverlayError GetOverlayAlpha(ulong ulOverlayHandle,ref float pfAlpha) + { + pfAlpha = 0; + EVROverlayError result = FnTable.GetOverlayAlpha(ulOverlayHandle,ref pfAlpha); + return result; + } + public EVROverlayError SetOverlayTexelAspect(ulong ulOverlayHandle,float fTexelAspect) + { + EVROverlayError result = FnTable.SetOverlayTexelAspect(ulOverlayHandle,fTexelAspect); + return result; + } + public EVROverlayError GetOverlayTexelAspect(ulong ulOverlayHandle,ref float pfTexelAspect) + { + pfTexelAspect = 0; + EVROverlayError result = FnTable.GetOverlayTexelAspect(ulOverlayHandle,ref pfTexelAspect); + return result; + } + public EVROverlayError SetOverlaySortOrder(ulong ulOverlayHandle,uint unSortOrder) + { + EVROverlayError result = FnTable.SetOverlaySortOrder(ulOverlayHandle,unSortOrder); + return result; + } + public EVROverlayError GetOverlaySortOrder(ulong ulOverlayHandle,ref uint punSortOrder) + { + punSortOrder = 0; + EVROverlayError result = FnTable.GetOverlaySortOrder(ulOverlayHandle,ref punSortOrder); + return result; + } + public EVROverlayError SetOverlayWidthInMeters(ulong ulOverlayHandle,float fWidthInMeters) + { + EVROverlayError result = FnTable.SetOverlayWidthInMeters(ulOverlayHandle,fWidthInMeters); + return result; + } + public EVROverlayError GetOverlayWidthInMeters(ulong ulOverlayHandle,ref float pfWidthInMeters) + { + pfWidthInMeters = 0; + EVROverlayError result = FnTable.GetOverlayWidthInMeters(ulOverlayHandle,ref pfWidthInMeters); + return result; + } + public EVROverlayError SetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle,float fMinDistanceInMeters,float fMaxDistanceInMeters) + { + EVROverlayError result = FnTable.SetOverlayAutoCurveDistanceRangeInMeters(ulOverlayHandle,fMinDistanceInMeters,fMaxDistanceInMeters); + return result; + } + public EVROverlayError GetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle,ref float pfMinDistanceInMeters,ref float pfMaxDistanceInMeters) + { + pfMinDistanceInMeters = 0; + pfMaxDistanceInMeters = 0; + EVROverlayError result = FnTable.GetOverlayAutoCurveDistanceRangeInMeters(ulOverlayHandle,ref pfMinDistanceInMeters,ref pfMaxDistanceInMeters); + return result; + } + public EVROverlayError SetOverlayTextureColorSpace(ulong ulOverlayHandle,EColorSpace eTextureColorSpace) + { + EVROverlayError result = FnTable.SetOverlayTextureColorSpace(ulOverlayHandle,eTextureColorSpace); + return result; + } + public EVROverlayError GetOverlayTextureColorSpace(ulong ulOverlayHandle,ref EColorSpace peTextureColorSpace) + { + EVROverlayError result = FnTable.GetOverlayTextureColorSpace(ulOverlayHandle,ref peTextureColorSpace); + return result; + } + public EVROverlayError SetOverlayTextureBounds(ulong ulOverlayHandle,ref VRTextureBounds_t pOverlayTextureBounds) + { + EVROverlayError result = FnTable.SetOverlayTextureBounds(ulOverlayHandle,ref pOverlayTextureBounds); + return result; + } + public EVROverlayError GetOverlayTextureBounds(ulong ulOverlayHandle,ref VRTextureBounds_t pOverlayTextureBounds) + { + EVROverlayError result = FnTable.GetOverlayTextureBounds(ulOverlayHandle,ref pOverlayTextureBounds); + return result; + } + public uint GetOverlayRenderModel(ulong ulOverlayHandle,System.Text.StringBuilder pchValue,uint unBufferSize,ref HmdColor_t pColor,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayRenderModel(ulOverlayHandle,pchValue,unBufferSize,ref pColor,ref pError); + return result; + } + public EVROverlayError SetOverlayRenderModel(ulong ulOverlayHandle,string pchRenderModel,ref HmdColor_t pColor) + { + EVROverlayError result = FnTable.SetOverlayRenderModel(ulOverlayHandle,pchRenderModel,ref pColor); + return result; + } + public EVROverlayError GetOverlayTransformType(ulong ulOverlayHandle,ref VROverlayTransformType peTransformType) + { + EVROverlayError result = FnTable.GetOverlayTransformType(ulOverlayHandle,ref peTransformType); + return result; + } + public EVROverlayError SetOverlayTransformAbsolute(ulong ulOverlayHandle,ETrackingUniverseOrigin eTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformAbsolute(ulOverlayHandle,eTrackingOrigin,ref pmatTrackingOriginToOverlayTransform); + return result; + } + public EVROverlayError GetOverlayTransformAbsolute(ulong ulOverlayHandle,ref ETrackingUniverseOrigin peTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform) + { + EVROverlayError result = FnTable.GetOverlayTransformAbsolute(ulOverlayHandle,ref peTrackingOrigin,ref pmatTrackingOriginToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle,uint unTrackedDevice,ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformTrackedDeviceRelative(ulOverlayHandle,unTrackedDevice,ref pmatTrackedDeviceToOverlayTransform); + return result; + } + public EVROverlayError GetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle,ref uint punTrackedDevice,ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform) + { + punTrackedDevice = 0; + EVROverlayError result = FnTable.GetOverlayTransformTrackedDeviceRelative(ulOverlayHandle,ref punTrackedDevice,ref pmatTrackedDeviceToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle,uint unDeviceIndex,string pchComponentName) + { + EVROverlayError result = FnTable.SetOverlayTransformTrackedDeviceComponent(ulOverlayHandle,unDeviceIndex,pchComponentName); + return result; + } + public EVROverlayError GetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle,ref uint punDeviceIndex,System.Text.StringBuilder pchComponentName,uint unComponentNameSize) + { + punDeviceIndex = 0; + EVROverlayError result = FnTable.GetOverlayTransformTrackedDeviceComponent(ulOverlayHandle,ref punDeviceIndex,pchComponentName,unComponentNameSize); + return result; + } + public EVROverlayError GetOverlayTransformOverlayRelative(ulong ulOverlayHandle,ref ulong ulOverlayHandleParent,ref HmdMatrix34_t pmatParentOverlayToOverlayTransform) + { + ulOverlayHandleParent = 0; + EVROverlayError result = FnTable.GetOverlayTransformOverlayRelative(ulOverlayHandle,ref ulOverlayHandleParent,ref pmatParentOverlayToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformOverlayRelative(ulong ulOverlayHandle,ulong ulOverlayHandleParent,ref HmdMatrix34_t pmatParentOverlayToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformOverlayRelative(ulOverlayHandle,ulOverlayHandleParent,ref pmatParentOverlayToOverlayTransform); + return result; + } + public EVROverlayError ShowOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.ShowOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError HideOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.HideOverlay(ulOverlayHandle); + return result; + } + public bool IsOverlayVisible(ulong ulOverlayHandle) + { + bool result = FnTable.IsOverlayVisible(ulOverlayHandle); + return result; + } + public EVROverlayError GetTransformForOverlayCoordinates(ulong ulOverlayHandle,ETrackingUniverseOrigin eTrackingOrigin,HmdVector2_t coordinatesInOverlay,ref HmdMatrix34_t pmatTransform) + { + EVROverlayError result = FnTable.GetTransformForOverlayCoordinates(ulOverlayHandle,eTrackingOrigin,coordinatesInOverlay,ref pmatTransform); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextOverlayEventPacked(ulong ulOverlayHandle,ref VREvent_t_Packed pEvent,uint uncbVREvent); + [StructLayout(LayoutKind.Explicit)] + struct PollNextOverlayEventUnion + { + [FieldOffset(0)] + public IVROverlay._PollNextOverlayEvent pPollNextOverlayEvent; + [FieldOffset(0)] + public _PollNextOverlayEventPacked pPollNextOverlayEventPacked; + } + public bool PollNextOverlayEvent(ulong ulOverlayHandle,ref VREvent_t pEvent,uint uncbVREvent) + { +#if !UNITY_METRO + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + PollNextOverlayEventUnion u; + VREvent_t_Packed event_packed = new VREvent_t_Packed(); + u.pPollNextOverlayEventPacked = null; + u.pPollNextOverlayEvent = FnTable.PollNextOverlayEvent; + bool packed_result = u.pPollNextOverlayEventPacked(ulOverlayHandle,ref event_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VREvent_t_Packed))); + + event_packed.Unpack(ref pEvent); + return packed_result; + } +#endif + bool result = FnTable.PollNextOverlayEvent(ulOverlayHandle,ref pEvent,uncbVREvent); + return result; + } + public EVROverlayError GetOverlayInputMethod(ulong ulOverlayHandle,ref VROverlayInputMethod peInputMethod) + { + EVROverlayError result = FnTable.GetOverlayInputMethod(ulOverlayHandle,ref peInputMethod); + return result; + } + public EVROverlayError SetOverlayInputMethod(ulong ulOverlayHandle,VROverlayInputMethod eInputMethod) + { + EVROverlayError result = FnTable.SetOverlayInputMethod(ulOverlayHandle,eInputMethod); + return result; + } + public EVROverlayError GetOverlayMouseScale(ulong ulOverlayHandle,ref HmdVector2_t pvecMouseScale) + { + EVROverlayError result = FnTable.GetOverlayMouseScale(ulOverlayHandle,ref pvecMouseScale); + return result; + } + public EVROverlayError SetOverlayMouseScale(ulong ulOverlayHandle,ref HmdVector2_t pvecMouseScale) + { + EVROverlayError result = FnTable.SetOverlayMouseScale(ulOverlayHandle,ref pvecMouseScale); + return result; + } + public bool ComputeOverlayIntersection(ulong ulOverlayHandle,ref VROverlayIntersectionParams_t pParams,ref VROverlayIntersectionResults_t pResults) + { + bool result = FnTable.ComputeOverlayIntersection(ulOverlayHandle,ref pParams,ref pResults); + return result; + } + public bool IsHoverTargetOverlay(ulong ulOverlayHandle) + { + bool result = FnTable.IsHoverTargetOverlay(ulOverlayHandle); + return result; + } + public ulong GetGamepadFocusOverlay() + { + ulong result = FnTable.GetGamepadFocusOverlay(); + return result; + } + public EVROverlayError SetGamepadFocusOverlay(ulong ulNewFocusOverlay) + { + EVROverlayError result = FnTable.SetGamepadFocusOverlay(ulNewFocusOverlay); + return result; + } + public EVROverlayError SetOverlayNeighbor(EOverlayDirection eDirection,ulong ulFrom,ulong ulTo) + { + EVROverlayError result = FnTable.SetOverlayNeighbor(eDirection,ulFrom,ulTo); + return result; + } + public EVROverlayError MoveGamepadFocusToNeighbor(EOverlayDirection eDirection,ulong ulFrom) + { + EVROverlayError result = FnTable.MoveGamepadFocusToNeighbor(eDirection,ulFrom); + return result; + } + public EVROverlayError SetOverlayDualAnalogTransform(ulong ulOverlay,EDualAnalogWhich eWhich,IntPtr vCenter,float fRadius) + { + EVROverlayError result = FnTable.SetOverlayDualAnalogTransform(ulOverlay,eWhich,vCenter,fRadius); + return result; + } + public EVROverlayError GetOverlayDualAnalogTransform(ulong ulOverlay,EDualAnalogWhich eWhich,ref HmdVector2_t pvCenter,ref float pfRadius) + { + pfRadius = 0; + EVROverlayError result = FnTable.GetOverlayDualAnalogTransform(ulOverlay,eWhich,ref pvCenter,ref pfRadius); + return result; + } + public EVROverlayError SetOverlayTexture(ulong ulOverlayHandle,ref Texture_t pTexture) + { + EVROverlayError result = FnTable.SetOverlayTexture(ulOverlayHandle,ref pTexture); + return result; + } + public EVROverlayError ClearOverlayTexture(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.ClearOverlayTexture(ulOverlayHandle); + return result; + } + public EVROverlayError SetOverlayRaw(ulong ulOverlayHandle,IntPtr pvBuffer,uint unWidth,uint unHeight,uint unDepth) + { + EVROverlayError result = FnTable.SetOverlayRaw(ulOverlayHandle,pvBuffer,unWidth,unHeight,unDepth); + return result; + } + public EVROverlayError SetOverlayFromFile(ulong ulOverlayHandle,string pchFilePath) + { + EVROverlayError result = FnTable.SetOverlayFromFile(ulOverlayHandle,pchFilePath); + return result; + } + public EVROverlayError GetOverlayTexture(ulong ulOverlayHandle,ref IntPtr pNativeTextureHandle,IntPtr pNativeTextureRef,ref uint pWidth,ref uint pHeight,ref uint pNativeFormat,ref ETextureType pAPIType,ref EColorSpace pColorSpace,ref VRTextureBounds_t pTextureBounds) + { + pWidth = 0; + pHeight = 0; + pNativeFormat = 0; + EVROverlayError result = FnTable.GetOverlayTexture(ulOverlayHandle,ref pNativeTextureHandle,pNativeTextureRef,ref pWidth,ref pHeight,ref pNativeFormat,ref pAPIType,ref pColorSpace,ref pTextureBounds); + return result; + } + public EVROverlayError ReleaseNativeOverlayHandle(ulong ulOverlayHandle,IntPtr pNativeTextureHandle) + { + EVROverlayError result = FnTable.ReleaseNativeOverlayHandle(ulOverlayHandle,pNativeTextureHandle); + return result; + } + public EVROverlayError GetOverlayTextureSize(ulong ulOverlayHandle,ref uint pWidth,ref uint pHeight) + { + pWidth = 0; + pHeight = 0; + EVROverlayError result = FnTable.GetOverlayTextureSize(ulOverlayHandle,ref pWidth,ref pHeight); + return result; + } + public EVROverlayError CreateDashboardOverlay(string pchOverlayKey,string pchOverlayFriendlyName,ref ulong pMainHandle,ref ulong pThumbnailHandle) + { + pMainHandle = 0; + pThumbnailHandle = 0; + EVROverlayError result = FnTable.CreateDashboardOverlay(pchOverlayKey,pchOverlayFriendlyName,ref pMainHandle,ref pThumbnailHandle); + return result; + } + public bool IsDashboardVisible() + { + bool result = FnTable.IsDashboardVisible(); + return result; + } + public bool IsActiveDashboardOverlay(ulong ulOverlayHandle) + { + bool result = FnTable.IsActiveDashboardOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError SetDashboardOverlaySceneProcess(ulong ulOverlayHandle,uint unProcessId) + { + EVROverlayError result = FnTable.SetDashboardOverlaySceneProcess(ulOverlayHandle,unProcessId); + return result; + } + public EVROverlayError GetDashboardOverlaySceneProcess(ulong ulOverlayHandle,ref uint punProcessId) + { + punProcessId = 0; + EVROverlayError result = FnTable.GetDashboardOverlaySceneProcess(ulOverlayHandle,ref punProcessId); + return result; + } + public void ShowDashboard(string pchOverlayToShow) + { + FnTable.ShowDashboard(pchOverlayToShow); + } + public uint GetPrimaryDashboardDevice() + { + uint result = FnTable.GetPrimaryDashboardDevice(); + return result; + } + public EVROverlayError ShowKeyboard(int eInputMode,int eLineInputMode,string pchDescription,uint unCharMax,string pchExistingText,bool bUseMinimalMode,ulong uUserValue) + { + EVROverlayError result = FnTable.ShowKeyboard(eInputMode,eLineInputMode,pchDescription,unCharMax,pchExistingText,bUseMinimalMode,uUserValue); + return result; + } + public EVROverlayError ShowKeyboardForOverlay(ulong ulOverlayHandle,int eInputMode,int eLineInputMode,string pchDescription,uint unCharMax,string pchExistingText,bool bUseMinimalMode,ulong uUserValue) + { + EVROverlayError result = FnTable.ShowKeyboardForOverlay(ulOverlayHandle,eInputMode,eLineInputMode,pchDescription,unCharMax,pchExistingText,bUseMinimalMode,uUserValue); + return result; + } + public uint GetKeyboardText(System.Text.StringBuilder pchText,uint cchText) + { + uint result = FnTable.GetKeyboardText(pchText,cchText); + return result; + } + public void HideKeyboard() + { + FnTable.HideKeyboard(); + } + public void SetKeyboardTransformAbsolute(ETrackingUniverseOrigin eTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToKeyboardTransform) + { + FnTable.SetKeyboardTransformAbsolute(eTrackingOrigin,ref pmatTrackingOriginToKeyboardTransform); + } + public void SetKeyboardPositionForOverlay(ulong ulOverlayHandle,HmdRect2_t avoidRect) + { + FnTable.SetKeyboardPositionForOverlay(ulOverlayHandle,avoidRect); + } + public EVROverlayError SetOverlayIntersectionMask(ulong ulOverlayHandle,ref VROverlayIntersectionMaskPrimitive_t pMaskPrimitives,uint unNumMaskPrimitives,uint unPrimitiveSize) + { + EVROverlayError result = FnTable.SetOverlayIntersectionMask(ulOverlayHandle,ref pMaskPrimitives,unNumMaskPrimitives,unPrimitiveSize); + return result; + } + public EVROverlayError GetOverlayFlags(ulong ulOverlayHandle,ref uint pFlags) + { + pFlags = 0; + EVROverlayError result = FnTable.GetOverlayFlags(ulOverlayHandle,ref pFlags); + return result; + } + public VRMessageOverlayResponse ShowMessageOverlay(string pchText,string pchCaption,string pchButton0Text,string pchButton1Text,string pchButton2Text,string pchButton3Text) + { + VRMessageOverlayResponse result = FnTable.ShowMessageOverlay(pchText,pchCaption,pchButton0Text,pchButton1Text,pchButton2Text,pchButton3Text); + return result; + } + public void CloseMessageOverlay() + { + FnTable.CloseMessageOverlay(); + } +} + + +public class CVRRenderModels +{ + IVRRenderModels FnTable; + internal CVRRenderModels(IntPtr pInterface) + { + FnTable = (IVRRenderModels)Marshal.PtrToStructure(pInterface, typeof(IVRRenderModels)); + } + public EVRRenderModelError LoadRenderModel_Async(string pchRenderModelName,ref IntPtr ppRenderModel) + { + EVRRenderModelError result = FnTable.LoadRenderModel_Async(pchRenderModelName,ref ppRenderModel); + return result; + } + public void FreeRenderModel(IntPtr pRenderModel) + { + FnTable.FreeRenderModel(pRenderModel); + } + public EVRRenderModelError LoadTexture_Async(int textureId,ref IntPtr ppTexture) + { + EVRRenderModelError result = FnTable.LoadTexture_Async(textureId,ref ppTexture); + return result; + } + public void FreeTexture(IntPtr pTexture) + { + FnTable.FreeTexture(pTexture); + } + public EVRRenderModelError LoadTextureD3D11_Async(int textureId,IntPtr pD3D11Device,ref IntPtr ppD3D11Texture2D) + { + EVRRenderModelError result = FnTable.LoadTextureD3D11_Async(textureId,pD3D11Device,ref ppD3D11Texture2D); + return result; + } + public EVRRenderModelError LoadIntoTextureD3D11_Async(int textureId,IntPtr pDstTexture) + { + EVRRenderModelError result = FnTable.LoadIntoTextureD3D11_Async(textureId,pDstTexture); + return result; + } + public void FreeTextureD3D11(IntPtr pD3D11Texture2D) + { + FnTable.FreeTextureD3D11(pD3D11Texture2D); + } + public uint GetRenderModelName(uint unRenderModelIndex,System.Text.StringBuilder pchRenderModelName,uint unRenderModelNameLen) + { + uint result = FnTable.GetRenderModelName(unRenderModelIndex,pchRenderModelName,unRenderModelNameLen); + return result; + } + public uint GetRenderModelCount() + { + uint result = FnTable.GetRenderModelCount(); + return result; + } + public uint GetComponentCount(string pchRenderModelName) + { + uint result = FnTable.GetComponentCount(pchRenderModelName); + return result; + } + public uint GetComponentName(string pchRenderModelName,uint unComponentIndex,System.Text.StringBuilder pchComponentName,uint unComponentNameLen) + { + uint result = FnTable.GetComponentName(pchRenderModelName,unComponentIndex,pchComponentName,unComponentNameLen); + return result; + } + public ulong GetComponentButtonMask(string pchRenderModelName,string pchComponentName) + { + ulong result = FnTable.GetComponentButtonMask(pchRenderModelName,pchComponentName); + return result; + } + public uint GetComponentRenderModelName(string pchRenderModelName,string pchComponentName,System.Text.StringBuilder pchComponentRenderModelName,uint unComponentRenderModelNameLen) + { + uint result = FnTable.GetComponentRenderModelName(pchRenderModelName,pchComponentName,pchComponentRenderModelName,unComponentRenderModelNameLen); + return result; + } + public bool GetComponentStateForDevicePath(string pchRenderModelName,string pchComponentName,ulong devicePath,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState) + { + bool result = FnTable.GetComponentStateForDevicePath(pchRenderModelName,pchComponentName,devicePath,ref pState,ref pComponentState); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentStatePacked(string pchRenderModelName,string pchComponentName,ref VRControllerState_t_Packed pControllerState,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState); + [StructLayout(LayoutKind.Explicit)] + struct GetComponentStateUnion + { + [FieldOffset(0)] + public IVRRenderModels._GetComponentState pGetComponentState; + [FieldOffset(0)] + public _GetComponentStatePacked pGetComponentStatePacked; + } + public bool GetComponentState(string pchRenderModelName,string pchComponentName,ref VRControllerState_t pControllerState,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState) + { +#if !UNITY_METRO + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetComponentStateUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetComponentStatePacked = null; + u.pGetComponentState = FnTable.GetComponentState; + bool packed_result = u.pGetComponentStatePacked(pchRenderModelName,pchComponentName,ref state_packed,ref pState,ref pComponentState); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } +#endif + bool result = FnTable.GetComponentState(pchRenderModelName,pchComponentName,ref pControllerState,ref pState,ref pComponentState); + return result; + } + public bool RenderModelHasComponent(string pchRenderModelName,string pchComponentName) + { + bool result = FnTable.RenderModelHasComponent(pchRenderModelName,pchComponentName); + return result; + } + public uint GetRenderModelThumbnailURL(string pchRenderModelName,System.Text.StringBuilder pchThumbnailURL,uint unThumbnailURLLen,ref EVRRenderModelError peError) + { + uint result = FnTable.GetRenderModelThumbnailURL(pchRenderModelName,pchThumbnailURL,unThumbnailURLLen,ref peError); + return result; + } + public uint GetRenderModelOriginalPath(string pchRenderModelName,System.Text.StringBuilder pchOriginalPath,uint unOriginalPathLen,ref EVRRenderModelError peError) + { + uint result = FnTable.GetRenderModelOriginalPath(pchRenderModelName,pchOriginalPath,unOriginalPathLen,ref peError); + return result; + } + public string GetRenderModelErrorNameFromEnum(EVRRenderModelError error) + { + IntPtr result = FnTable.GetRenderModelErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } +} + + +public class CVRNotifications +{ + IVRNotifications FnTable; + internal CVRNotifications(IntPtr pInterface) + { + FnTable = (IVRNotifications)Marshal.PtrToStructure(pInterface, typeof(IVRNotifications)); + } + public EVRNotificationError CreateNotification(ulong ulOverlayHandle,ulong ulUserValue,EVRNotificationType type,string pchText,EVRNotificationStyle style,ref NotificationBitmap_t pImage,ref uint pNotificationId) + { + pNotificationId = 0; + EVRNotificationError result = FnTable.CreateNotification(ulOverlayHandle,ulUserValue,type,pchText,style,ref pImage,ref pNotificationId); + return result; + } + public EVRNotificationError RemoveNotification(uint notificationId) + { + EVRNotificationError result = FnTable.RemoveNotification(notificationId); + return result; + } +} + + +public class CVRSettings +{ + IVRSettings FnTable; + internal CVRSettings(IntPtr pInterface) + { + FnTable = (IVRSettings)Marshal.PtrToStructure(pInterface, typeof(IVRSettings)); + } + public string GetSettingsErrorNameFromEnum(EVRSettingsError eError) + { + IntPtr result = FnTable.GetSettingsErrorNameFromEnum(eError); + return Marshal.PtrToStringAnsi(result); + } + public bool Sync(bool bForce,ref EVRSettingsError peError) + { + bool result = FnTable.Sync(bForce,ref peError); + return result; + } + public void SetBool(string pchSection,string pchSettingsKey,bool bValue,ref EVRSettingsError peError) + { + FnTable.SetBool(pchSection,pchSettingsKey,bValue,ref peError); + } + public void SetInt32(string pchSection,string pchSettingsKey,int nValue,ref EVRSettingsError peError) + { + FnTable.SetInt32(pchSection,pchSettingsKey,nValue,ref peError); + } + public void SetFloat(string pchSection,string pchSettingsKey,float flValue,ref EVRSettingsError peError) + { + FnTable.SetFloat(pchSection,pchSettingsKey,flValue,ref peError); + } + public void SetString(string pchSection,string pchSettingsKey,string pchValue,ref EVRSettingsError peError) + { + FnTable.SetString(pchSection,pchSettingsKey,pchValue,ref peError); + } + public bool GetBool(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + bool result = FnTable.GetBool(pchSection,pchSettingsKey,ref peError); + return result; + } + public int GetInt32(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + int result = FnTable.GetInt32(pchSection,pchSettingsKey,ref peError); + return result; + } + public float GetFloat(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + float result = FnTable.GetFloat(pchSection,pchSettingsKey,ref peError); + return result; + } + public void GetString(string pchSection,string pchSettingsKey,System.Text.StringBuilder pchValue,uint unValueLen,ref EVRSettingsError peError) + { + FnTable.GetString(pchSection,pchSettingsKey,pchValue,unValueLen,ref peError); + } + public void RemoveSection(string pchSection,ref EVRSettingsError peError) + { + FnTable.RemoveSection(pchSection,ref peError); + } + public void RemoveKeyInSection(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + FnTable.RemoveKeyInSection(pchSection,pchSettingsKey,ref peError); + } +} + + +public class CVRScreenshots +{ + IVRScreenshots FnTable; + internal CVRScreenshots(IntPtr pInterface) + { + FnTable = (IVRScreenshots)Marshal.PtrToStructure(pInterface, typeof(IVRScreenshots)); + } + public EVRScreenshotError RequestScreenshot(ref uint pOutScreenshotHandle,EVRScreenshotType type,string pchPreviewFilename,string pchVRFilename) + { + pOutScreenshotHandle = 0; + EVRScreenshotError result = FnTable.RequestScreenshot(ref pOutScreenshotHandle,type,pchPreviewFilename,pchVRFilename); + return result; + } + public EVRScreenshotError HookScreenshot(EVRScreenshotType [] pSupportedTypes) + { + EVRScreenshotError result = FnTable.HookScreenshot(pSupportedTypes,(int) pSupportedTypes.Length); + return result; + } + public EVRScreenshotType GetScreenshotPropertyType(uint screenshotHandle,ref EVRScreenshotError pError) + { + EVRScreenshotType result = FnTable.GetScreenshotPropertyType(screenshotHandle,ref pError); + return result; + } + public uint GetScreenshotPropertyFilename(uint screenshotHandle,EVRScreenshotPropertyFilenames filenameType,System.Text.StringBuilder pchFilename,uint cchFilename,ref EVRScreenshotError pError) + { + uint result = FnTable.GetScreenshotPropertyFilename(screenshotHandle,filenameType,pchFilename,cchFilename,ref pError); + return result; + } + public EVRScreenshotError UpdateScreenshotProgress(uint screenshotHandle,float flProgress) + { + EVRScreenshotError result = FnTable.UpdateScreenshotProgress(screenshotHandle,flProgress); + return result; + } + public EVRScreenshotError TakeStereoScreenshot(ref uint pOutScreenshotHandle,string pchPreviewFilename,string pchVRFilename) + { + pOutScreenshotHandle = 0; + EVRScreenshotError result = FnTable.TakeStereoScreenshot(ref pOutScreenshotHandle,pchPreviewFilename,pchVRFilename); + return result; + } + public EVRScreenshotError SubmitScreenshot(uint screenshotHandle,EVRScreenshotType type,string pchSourcePreviewFilename,string pchSourceVRFilename) + { + EVRScreenshotError result = FnTable.SubmitScreenshot(screenshotHandle,type,pchSourcePreviewFilename,pchSourceVRFilename); + return result; + } +} + + +public class CVRResources +{ + IVRResources FnTable; + internal CVRResources(IntPtr pInterface) + { + FnTable = (IVRResources)Marshal.PtrToStructure(pInterface, typeof(IVRResources)); + } + public uint LoadSharedResource(string pchResourceName,string pchBuffer,uint unBufferLen) + { + uint result = FnTable.LoadSharedResource(pchResourceName,pchBuffer,unBufferLen); + return result; + } + public uint GetResourceFullPath(string pchResourceName,string pchResourceTypeDirectory,System.Text.StringBuilder pchPathBuffer,uint unBufferLen) + { + uint result = FnTable.GetResourceFullPath(pchResourceName,pchResourceTypeDirectory,pchPathBuffer,unBufferLen); + return result; + } +} + + +public class CVRDriverManager +{ + IVRDriverManager FnTable; + internal CVRDriverManager(IntPtr pInterface) + { + FnTable = (IVRDriverManager)Marshal.PtrToStructure(pInterface, typeof(IVRDriverManager)); + } + public uint GetDriverCount() + { + uint result = FnTable.GetDriverCount(); + return result; + } + public uint GetDriverName(uint nDriver,System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetDriverName(nDriver,pchValue,unBufferSize); + return result; + } + public ulong GetDriverHandle(string pchDriverName) + { + ulong result = FnTable.GetDriverHandle(pchDriverName); + return result; + } +} + + +public class CVRInput +{ + IVRInput FnTable; + internal CVRInput(IntPtr pInterface) + { + FnTable = (IVRInput)Marshal.PtrToStructure(pInterface, typeof(IVRInput)); + } + public EVRInputError SetActionManifestPath(string pchActionManifestPath) + { + EVRInputError result = FnTable.SetActionManifestPath(pchActionManifestPath); + return result; + } + public EVRInputError GetActionSetHandle(string pchActionSetName,ref ulong pHandle) + { + pHandle = 0; + EVRInputError result = FnTable.GetActionSetHandle(pchActionSetName,ref pHandle); + return result; + } + public EVRInputError GetActionHandle(string pchActionName,ref ulong pHandle) + { + pHandle = 0; + EVRInputError result = FnTable.GetActionHandle(pchActionName,ref pHandle); + return result; + } + public EVRInputError GetInputSourceHandle(string pchInputSourcePath,ref ulong pHandle) + { + pHandle = 0; + EVRInputError result = FnTable.GetInputSourceHandle(pchInputSourcePath,ref pHandle); + return result; + } + public EVRInputError UpdateActionState(VRActiveActionSet_t [] pSets,uint unSizeOfVRSelectedActionSet_t) + { + EVRInputError result = FnTable.UpdateActionState(pSets,unSizeOfVRSelectedActionSet_t,(uint) pSets.Length); + return result; + } + public EVRInputError GetDigitalActionData(ulong action,ref InputDigitalActionData_t pActionData,uint unActionDataSize,ulong ulRestrictToDevice) + { + EVRInputError result = FnTable.GetDigitalActionData(action,ref pActionData,unActionDataSize,ulRestrictToDevice); + return result; + } + public EVRInputError GetAnalogActionData(ulong action,ref InputAnalogActionData_t pActionData,uint unActionDataSize,ulong ulRestrictToDevice) + { + EVRInputError result = FnTable.GetAnalogActionData(action,ref pActionData,unActionDataSize,ulRestrictToDevice); + return result; + } + public EVRInputError GetPoseActionData(ulong action,ETrackingUniverseOrigin eOrigin,float fPredictedSecondsFromNow,ref InputPoseActionData_t pActionData,uint unActionDataSize,ulong ulRestrictToDevice) + { + EVRInputError result = FnTable.GetPoseActionData(action,eOrigin,fPredictedSecondsFromNow,ref pActionData,unActionDataSize,ulRestrictToDevice); + return result; + } + public EVRInputError GetSkeletalActionData(ulong action,ref InputSkeletalActionData_t pActionData,uint unActionDataSize,ulong ulRestrictToDevice) + { + EVRInputError result = FnTable.GetSkeletalActionData(action,ref pActionData,unActionDataSize,ulRestrictToDevice); + return result; + } + public EVRInputError GetSkeletalBoneData(ulong action,EVRSkeletalTransformSpace eTransformSpace,EVRSkeletalMotionRange eMotionRange,VRBoneTransform_t [] pTransformArray,ulong ulRestrictToDevice) + { + EVRInputError result = FnTable.GetSkeletalBoneData(action,eTransformSpace,eMotionRange,pTransformArray,(uint) pTransformArray.Length,ulRestrictToDevice); + return result; + } + public EVRInputError GetSkeletalBoneDataCompressed(ulong action,EVRSkeletalTransformSpace eTransformSpace,EVRSkeletalMotionRange eMotionRange,IntPtr pvCompressedData,uint unCompressedSize,ref uint punRequiredCompressedSize,ulong ulRestrictToDevice) + { + punRequiredCompressedSize = 0; + EVRInputError result = FnTable.GetSkeletalBoneDataCompressed(action,eTransformSpace,eMotionRange,pvCompressedData,unCompressedSize,ref punRequiredCompressedSize,ulRestrictToDevice); + return result; + } + public EVRInputError DecompressSkeletalBoneData(IntPtr pvCompressedBuffer,uint unCompressedBufferSize,ref EVRSkeletalTransformSpace peTransformSpace,VRBoneTransform_t [] pTransformArray) + { + EVRInputError result = FnTable.DecompressSkeletalBoneData(pvCompressedBuffer,unCompressedBufferSize,ref peTransformSpace,pTransformArray,(uint) pTransformArray.Length); + return result; + } + public EVRInputError TriggerHapticVibrationAction(ulong action,float fStartSecondsFromNow,float fDurationSeconds,float fFrequency,float fAmplitude,ulong ulRestrictToDevice) + { + EVRInputError result = FnTable.TriggerHapticVibrationAction(action,fStartSecondsFromNow,fDurationSeconds,fFrequency,fAmplitude,ulRestrictToDevice); + return result; + } + public EVRInputError GetActionOrigins(ulong actionSetHandle,ulong digitalActionHandle,ulong [] originsOut) + { + EVRInputError result = FnTable.GetActionOrigins(actionSetHandle,digitalActionHandle,originsOut,(uint) originsOut.Length); + return result; + } + public EVRInputError GetOriginLocalizedName(ulong origin,System.Text.StringBuilder pchNameArray,uint unNameArraySize) + { + EVRInputError result = FnTable.GetOriginLocalizedName(origin,pchNameArray,unNameArraySize); + return result; + } + public EVRInputError GetOriginTrackedDeviceInfo(ulong origin,ref InputOriginInfo_t pOriginInfo,uint unOriginInfoSize) + { + EVRInputError result = FnTable.GetOriginTrackedDeviceInfo(origin,ref pOriginInfo,unOriginInfoSize); + return result; + } + public EVRInputError ShowActionOrigins(ulong actionSetHandle,ulong ulActionHandle) + { + EVRInputError result = FnTable.ShowActionOrigins(actionSetHandle,ulActionHandle); + return result; + } + public EVRInputError ShowBindingsForActionSet(VRActiveActionSet_t [] pSets,uint unSizeOfVRSelectedActionSet_t,ulong originToHighlight) + { + EVRInputError result = FnTable.ShowBindingsForActionSet(pSets,unSizeOfVRSelectedActionSet_t,(uint) pSets.Length,originToHighlight); + return result; + } +} + + +public class CVRIOBuffer +{ + IVRIOBuffer FnTable; + internal CVRIOBuffer(IntPtr pInterface) + { + FnTable = (IVRIOBuffer)Marshal.PtrToStructure(pInterface, typeof(IVRIOBuffer)); + } + public EIOBufferError Open(string pchPath,EIOBufferMode mode,uint unElementSize,uint unElements,ref ulong pulBuffer) + { + pulBuffer = 0; + EIOBufferError result = FnTable.Open(pchPath,mode,unElementSize,unElements,ref pulBuffer); + return result; + } + public EIOBufferError Close(ulong ulBuffer) + { + EIOBufferError result = FnTable.Close(ulBuffer); + return result; + } + public EIOBufferError Read(ulong ulBuffer,IntPtr pDst,uint unBytes,ref uint punRead) + { + punRead = 0; + EIOBufferError result = FnTable.Read(ulBuffer,pDst,unBytes,ref punRead); + return result; + } + public EIOBufferError Write(ulong ulBuffer,IntPtr pSrc,uint unBytes) + { + EIOBufferError result = FnTable.Write(ulBuffer,pSrc,unBytes); + return result; + } + public ulong PropertyContainer(ulong ulBuffer) + { + ulong result = FnTable.PropertyContainer(ulBuffer); + return result; + } +} + + +public class CVRSpatialAnchors +{ + IVRSpatialAnchors FnTable; + internal CVRSpatialAnchors(IntPtr pInterface) + { + FnTable = (IVRSpatialAnchors)Marshal.PtrToStructure(pInterface, typeof(IVRSpatialAnchors)); + } + public EVRSpatialAnchorError CreateSpatialAnchorFromDescriptor(string pchDescriptor,ref uint pHandleOut) + { + pHandleOut = 0; + EVRSpatialAnchorError result = FnTable.CreateSpatialAnchorFromDescriptor(pchDescriptor,ref pHandleOut); + return result; + } + public EVRSpatialAnchorError CreateSpatialAnchorFromPose(uint unDeviceIndex,ETrackingUniverseOrigin eOrigin,ref SpatialAnchorPose_t pPose,ref uint pHandleOut) + { + pHandleOut = 0; + EVRSpatialAnchorError result = FnTable.CreateSpatialAnchorFromPose(unDeviceIndex,eOrigin,ref pPose,ref pHandleOut); + return result; + } + public EVRSpatialAnchorError GetSpatialAnchorPose(uint unHandle,ETrackingUniverseOrigin eOrigin,ref SpatialAnchorPose_t pPoseOut) + { + EVRSpatialAnchorError result = FnTable.GetSpatialAnchorPose(unHandle,eOrigin,ref pPoseOut); + return result; + } + public EVRSpatialAnchorError GetSpatialAnchorDescriptor(uint unHandle,System.Text.StringBuilder pchDescriptorOut,ref uint punDescriptorBufferLenInOut) + { + punDescriptorBufferLenInOut = 0; + EVRSpatialAnchorError result = FnTable.GetSpatialAnchorDescriptor(unHandle,pchDescriptorOut,ref punDescriptorBufferLenInOut); + return result; + } +} + + +public class OpenVRInterop +{ + [DllImportAttribute("openvr_api", EntryPoint = "VR_InitInternal", CallingConvention = CallingConvention.Cdecl)] + internal static extern uint InitInternal(ref EVRInitError peError, EVRApplicationType eApplicationType); + [DllImportAttribute("openvr_api", EntryPoint = "VR_InitInternal2", CallingConvention = CallingConvention.Cdecl)] + internal static extern uint InitInternal2(ref EVRInitError peError, EVRApplicationType eApplicationType,[In, MarshalAs(UnmanagedType.LPStr)] string pStartupInfo); + [DllImportAttribute("openvr_api", EntryPoint = "VR_ShutdownInternal", CallingConvention = CallingConvention.Cdecl)] + internal static extern void ShutdownInternal(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsHmdPresent", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsHmdPresent(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsRuntimeInstalled", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsRuntimeInstalled(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetStringForHmdError", CallingConvention = CallingConvention.Cdecl)] + internal static extern IntPtr GetStringForHmdError(EVRInitError error); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetGenericInterface", CallingConvention = CallingConvention.Cdecl)] + internal static extern IntPtr GetGenericInterface([In, MarshalAs(UnmanagedType.LPStr)] string pchInterfaceVersion, ref EVRInitError peError); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsInterfaceVersionValid", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsInterfaceVersionValid([In, MarshalAs(UnmanagedType.LPStr)] string pchInterfaceVersion); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetInitToken", CallingConvention = CallingConvention.Cdecl)] + internal static extern uint GetInitToken(); +} + + +public enum EVREye +{ + Eye_Left = 0, + Eye_Right = 1, +} +public enum ETextureType +{ + Invalid = -1, + DirectX = 0, + OpenGL = 1, + Vulkan = 2, + IOSurface = 3, + DirectX12 = 4, + DXGISharedHandle = 5, + Metal = 6, +} +public enum EColorSpace +{ + Auto = 0, + Gamma = 1, + Linear = 2, +} +public enum ETrackingResult +{ + Uninitialized = 1, + Calibrating_InProgress = 100, + Calibrating_OutOfRange = 101, + Running_OK = 200, + Running_OutOfRange = 201, +} +public enum ETrackedDeviceClass +{ + Invalid = 0, + HMD = 1, + Controller = 2, + GenericTracker = 3, + TrackingReference = 4, + DisplayRedirect = 5, + Max = 6, +} +public enum ETrackedControllerRole +{ + Invalid = 0, + LeftHand = 1, + RightHand = 2, + OptOut = 3, + Max = 4, +} +public enum ETrackingUniverseOrigin +{ + TrackingUniverseSeated = 0, + TrackingUniverseStanding = 1, + TrackingUniverseRawAndUncalibrated = 2, +} +public enum ETrackedDeviceProperty +{ + Prop_Invalid = 0, + Prop_TrackingSystemName_String = 1000, + Prop_ModelNumber_String = 1001, + Prop_SerialNumber_String = 1002, + Prop_RenderModelName_String = 1003, + Prop_WillDriftInYaw_Bool = 1004, + Prop_ManufacturerName_String = 1005, + Prop_TrackingFirmwareVersion_String = 1006, + Prop_HardwareRevision_String = 1007, + Prop_AllWirelessDongleDescriptions_String = 1008, + Prop_ConnectedWirelessDongle_String = 1009, + Prop_DeviceIsWireless_Bool = 1010, + Prop_DeviceIsCharging_Bool = 1011, + Prop_DeviceBatteryPercentage_Float = 1012, + Prop_StatusDisplayTransform_Matrix34 = 1013, + Prop_Firmware_UpdateAvailable_Bool = 1014, + Prop_Firmware_ManualUpdate_Bool = 1015, + Prop_Firmware_ManualUpdateURL_String = 1016, + Prop_HardwareRevision_Uint64 = 1017, + Prop_FirmwareVersion_Uint64 = 1018, + Prop_FPGAVersion_Uint64 = 1019, + Prop_VRCVersion_Uint64 = 1020, + Prop_RadioVersion_Uint64 = 1021, + Prop_DongleVersion_Uint64 = 1022, + Prop_BlockServerShutdown_Bool = 1023, + Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + Prop_ContainsProximitySensor_Bool = 1025, + Prop_DeviceProvidesBatteryStatus_Bool = 1026, + Prop_DeviceCanPowerOff_Bool = 1027, + Prop_Firmware_ProgrammingTarget_String = 1028, + Prop_DeviceClass_Int32 = 1029, + Prop_HasCamera_Bool = 1030, + Prop_DriverVersion_String = 1031, + Prop_Firmware_ForceUpdateRequired_Bool = 1032, + Prop_ViveSystemButtonFixRequired_Bool = 1033, + Prop_ParentDriver_Uint64 = 1034, + Prop_ResourceRoot_String = 1035, + Prop_RegisteredDeviceType_String = 1036, + Prop_InputProfilePath_String = 1037, + Prop_NeverTracked_Bool = 1038, + Prop_NumCameras_Int32 = 1039, + Prop_CameraFrameLayout_Int32 = 1040, + Prop_ReportsTimeSinceVSync_Bool = 2000, + Prop_SecondsFromVsyncToPhotons_Float = 2001, + Prop_DisplayFrequency_Float = 2002, + Prop_UserIpdMeters_Float = 2003, + Prop_CurrentUniverseId_Uint64 = 2004, + Prop_PreviousUniverseId_Uint64 = 2005, + Prop_DisplayFirmwareVersion_Uint64 = 2006, + Prop_IsOnDesktop_Bool = 2007, + Prop_DisplayMCType_Int32 = 2008, + Prop_DisplayMCOffset_Float = 2009, + Prop_DisplayMCScale_Float = 2010, + Prop_EdidVendorID_Int32 = 2011, + Prop_DisplayMCImageLeft_String = 2012, + Prop_DisplayMCImageRight_String = 2013, + Prop_DisplayGCBlackClamp_Float = 2014, + Prop_EdidProductID_Int32 = 2015, + Prop_CameraToHeadTransform_Matrix34 = 2016, + Prop_DisplayGCType_Int32 = 2017, + Prop_DisplayGCOffset_Float = 2018, + Prop_DisplayGCScale_Float = 2019, + Prop_DisplayGCPrescale_Float = 2020, + Prop_DisplayGCImage_String = 2021, + Prop_LensCenterLeftU_Float = 2022, + Prop_LensCenterLeftV_Float = 2023, + Prop_LensCenterRightU_Float = 2024, + Prop_LensCenterRightV_Float = 2025, + Prop_UserHeadToEyeDepthMeters_Float = 2026, + Prop_CameraFirmwareVersion_Uint64 = 2027, + Prop_CameraFirmwareDescription_String = 2028, + Prop_DisplayFPGAVersion_Uint64 = 2029, + Prop_DisplayBootloaderVersion_Uint64 = 2030, + Prop_DisplayHardwareVersion_Uint64 = 2031, + Prop_AudioFirmwareVersion_Uint64 = 2032, + Prop_CameraCompatibilityMode_Int32 = 2033, + Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + Prop_DisplaySuppressed_Bool = 2036, + Prop_DisplayAllowNightMode_Bool = 2037, + Prop_DisplayMCImageWidth_Int32 = 2038, + Prop_DisplayMCImageHeight_Int32 = 2039, + Prop_DisplayMCImageNumChannels_Int32 = 2040, + Prop_DisplayMCImageData_Binary = 2041, + Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + Prop_DriverProvidedChaperonePath_String = 2048, + Prop_ExpectedTrackingReferenceCount_Int32 = 2049, + Prop_ExpectedControllerCount_Int32 = 2050, + Prop_NamedIconPathControllerLeftDeviceOff_String = 2051, + Prop_NamedIconPathControllerRightDeviceOff_String = 2052, + Prop_NamedIconPathTrackingReferenceDeviceOff_String = 2053, + Prop_DoNotApplyPrediction_Bool = 2054, + Prop_CameraToHeadTransforms_Matrix34_Array = 2055, + Prop_DistortionMeshResolution_Int32 = 2056, + Prop_DriverIsDrawingControllers_Bool = 2057, + Prop_DriverRequestsApplicationPause_Bool = 2058, + Prop_DriverRequestsReducedRendering_Bool = 2059, + Prop_MinimumIpdStepMeters_Float = 2060, + Prop_AudioBridgeFirmwareVersion_Uint64 = 2061, + Prop_ImageBridgeFirmwareVersion_Uint64 = 2062, + Prop_ImuToHeadTransform_Matrix34 = 2063, + Prop_ImuFactoryGyroBias_Vector3 = 2064, + Prop_ImuFactoryGyroScale_Vector3 = 2065, + Prop_ImuFactoryAccelerometerBias_Vector3 = 2066, + Prop_ImuFactoryAccelerometerScale_Vector3 = 2067, + Prop_ConfigurationIncludesLighthouse20Features_Bool = 2069, + Prop_DriverRequestedMuraCorrectionMode_Int32 = 2200, + Prop_DriverRequestedMuraFeather_InnerLeft_Int32 = 2201, + Prop_DriverRequestedMuraFeather_InnerRight_Int32 = 2202, + Prop_DriverRequestedMuraFeather_InnerTop_Int32 = 2203, + Prop_DriverRequestedMuraFeather_InnerBottom_Int32 = 2204, + Prop_DriverRequestedMuraFeather_OuterLeft_Int32 = 2205, + Prop_DriverRequestedMuraFeather_OuterRight_Int32 = 2206, + Prop_DriverRequestedMuraFeather_OuterTop_Int32 = 2207, + Prop_DriverRequestedMuraFeather_OuterBottom_Int32 = 2208, + Prop_AttachedDeviceId_String = 3000, + Prop_SupportedButtons_Uint64 = 3001, + Prop_Axis0Type_Int32 = 3002, + Prop_Axis1Type_Int32 = 3003, + Prop_Axis2Type_Int32 = 3004, + Prop_Axis3Type_Int32 = 3005, + Prop_Axis4Type_Int32 = 3006, + Prop_ControllerRoleHint_Int32 = 3007, + Prop_FieldOfViewLeftDegrees_Float = 4000, + Prop_FieldOfViewRightDegrees_Float = 4001, + Prop_FieldOfViewTopDegrees_Float = 4002, + Prop_FieldOfViewBottomDegrees_Float = 4003, + Prop_TrackingRangeMinimumMeters_Float = 4004, + Prop_TrackingRangeMaximumMeters_Float = 4005, + Prop_ModeLabel_String = 4006, + Prop_IconPathName_String = 5000, + Prop_NamedIconPathDeviceOff_String = 5001, + Prop_NamedIconPathDeviceSearching_String = 5002, + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, + Prop_NamedIconPathDeviceReady_String = 5004, + Prop_NamedIconPathDeviceReadyAlert_String = 5005, + Prop_NamedIconPathDeviceNotReady_String = 5006, + Prop_NamedIconPathDeviceStandby_String = 5007, + Prop_NamedIconPathDeviceAlertLow_String = 5008, + Prop_DisplayHiddenArea_Binary_Start = 5100, + Prop_DisplayHiddenArea_Binary_End = 5150, + Prop_ParentContainer = 5151, + Prop_UserConfigPath_String = 6000, + Prop_InstallPath_String = 6001, + Prop_HasDisplayComponent_Bool = 6002, + Prop_HasControllerComponent_Bool = 6003, + Prop_HasCameraComponent_Bool = 6004, + Prop_HasDriverDirectModeComponent_Bool = 6005, + Prop_HasVirtualDisplayComponent_Bool = 6006, + Prop_HasSpatialAnchorsSupport_Bool = 6007, + Prop_ControllerType_String = 7000, + Prop_LegacyInputProfile_String = 7001, + Prop_VendorSpecific_Reserved_Start = 10000, + Prop_VendorSpecific_Reserved_End = 10999, + Prop_TrackedDeviceProperty_Max = 1000000, +} +public enum ETrackedPropertyError +{ + TrackedProp_Success = 0, + TrackedProp_WrongDataType = 1, + TrackedProp_WrongDeviceClass = 2, + TrackedProp_BufferTooSmall = 3, + TrackedProp_UnknownProperty = 4, + TrackedProp_InvalidDevice = 5, + TrackedProp_CouldNotContactServer = 6, + TrackedProp_ValueNotProvidedByDevice = 7, + TrackedProp_StringExceedsMaximumLength = 8, + TrackedProp_NotYetAvailable = 9, + TrackedProp_PermissionDenied = 10, + TrackedProp_InvalidOperation = 11, + TrackedProp_CannotWriteToWildcards = 12, +} +public enum EVRSubmitFlags +{ + Submit_Default = 0, + Submit_LensDistortionAlreadyApplied = 1, + Submit_GlRenderBuffer = 2, + Submit_Reserved = 4, + Submit_TextureWithPose = 8, + Submit_TextureWithDepth = 16, +} +public enum EVRState +{ + Undefined = -1, + Off = 0, + Searching = 1, + Searching_Alert = 2, + Ready = 3, + Ready_Alert = 4, + NotReady = 5, + Standby = 6, + Ready_Alert_Low = 7, +} +public enum EVREventType +{ + VREvent_None = 0, + VREvent_TrackedDeviceActivated = 100, + VREvent_TrackedDeviceDeactivated = 101, + VREvent_TrackedDeviceUpdated = 102, + VREvent_TrackedDeviceUserInteractionStarted = 103, + VREvent_TrackedDeviceUserInteractionEnded = 104, + VREvent_IpdChanged = 105, + VREvent_EnterStandbyMode = 106, + VREvent_LeaveStandbyMode = 107, + VREvent_TrackedDeviceRoleChanged = 108, + VREvent_WatchdogWakeUpRequested = 109, + VREvent_LensDistortionChanged = 110, + VREvent_PropertyChanged = 111, + VREvent_WirelessDisconnect = 112, + VREvent_WirelessReconnect = 113, + VREvent_ButtonPress = 200, + VREvent_ButtonUnpress = 201, + VREvent_ButtonTouch = 202, + VREvent_ButtonUntouch = 203, + VREvent_DualAnalog_Press = 250, + VREvent_DualAnalog_Unpress = 251, + VREvent_DualAnalog_Touch = 252, + VREvent_DualAnalog_Untouch = 253, + VREvent_DualAnalog_Move = 254, + VREvent_DualAnalog_ModeSwitch1 = 255, + VREvent_DualAnalog_ModeSwitch2 = 256, + VREvent_DualAnalog_Cancel = 257, + VREvent_MouseMove = 300, + VREvent_MouseButtonDown = 301, + VREvent_MouseButtonUp = 302, + VREvent_FocusEnter = 303, + VREvent_FocusLeave = 304, + VREvent_Scroll = 305, + VREvent_TouchPadMove = 306, + VREvent_OverlayFocusChanged = 307, + VREvent_InputFocusCaptured = 400, + VREvent_InputFocusReleased = 401, + VREvent_SceneFocusLost = 402, + VREvent_SceneFocusGained = 403, + VREvent_SceneApplicationChanged = 404, + VREvent_SceneFocusChanged = 405, + VREvent_InputFocusChanged = 406, + VREvent_SceneApplicationSecondaryRenderingStarted = 407, + VREvent_SceneApplicationUsingWrongGraphicsAdapter = 408, + VREvent_ActionBindingReloaded = 409, + VREvent_HideRenderModels = 410, + VREvent_ShowRenderModels = 411, + VREvent_ConsoleOpened = 420, + VREvent_ConsoleClosed = 421, + VREvent_OverlayShown = 500, + VREvent_OverlayHidden = 501, + VREvent_DashboardActivated = 502, + VREvent_DashboardDeactivated = 503, + VREvent_DashboardThumbSelected = 504, + VREvent_DashboardRequested = 505, + VREvent_ResetDashboard = 506, + VREvent_RenderToast = 507, + VREvent_ImageLoaded = 508, + VREvent_ShowKeyboard = 509, + VREvent_HideKeyboard = 510, + VREvent_OverlayGamepadFocusGained = 511, + VREvent_OverlayGamepadFocusLost = 512, + VREvent_OverlaySharedTextureChanged = 513, + VREvent_ScreenshotTriggered = 516, + VREvent_ImageFailed = 517, + VREvent_DashboardOverlayCreated = 518, + VREvent_SwitchGamepadFocus = 519, + VREvent_RequestScreenshot = 520, + VREvent_ScreenshotTaken = 521, + VREvent_ScreenshotFailed = 522, + VREvent_SubmitScreenshotToDashboard = 523, + VREvent_ScreenshotProgressToDashboard = 524, + VREvent_PrimaryDashboardDeviceChanged = 525, + VREvent_RoomViewShown = 526, + VREvent_RoomViewHidden = 527, + VREvent_Notification_Shown = 600, + VREvent_Notification_Hidden = 601, + VREvent_Notification_BeginInteraction = 602, + VREvent_Notification_Destroyed = 603, + VREvent_Quit = 700, + VREvent_ProcessQuit = 701, + VREvent_QuitAborted_UserPrompt = 702, + VREvent_QuitAcknowledged = 703, + VREvent_DriverRequestedQuit = 704, + VREvent_ChaperoneDataHasChanged = 800, + VREvent_ChaperoneUniverseHasChanged = 801, + VREvent_ChaperoneTempDataHasChanged = 802, + VREvent_ChaperoneSettingsHaveChanged = 803, + VREvent_SeatedZeroPoseReset = 804, + VREvent_AudioSettingsHaveChanged = 820, + VREvent_BackgroundSettingHasChanged = 850, + VREvent_CameraSettingsHaveChanged = 851, + VREvent_ReprojectionSettingHasChanged = 852, + VREvent_ModelSkinSettingsHaveChanged = 853, + VREvent_EnvironmentSettingsHaveChanged = 854, + VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, + VREvent_SteamVRSectionSettingChanged = 857, + VREvent_LighthouseSectionSettingChanged = 858, + VREvent_NullSectionSettingChanged = 859, + VREvent_UserInterfaceSectionSettingChanged = 860, + VREvent_NotificationsSectionSettingChanged = 861, + VREvent_KeyboardSectionSettingChanged = 862, + VREvent_PerfSectionSettingChanged = 863, + VREvent_DashboardSectionSettingChanged = 864, + VREvent_WebInterfaceSectionSettingChanged = 865, + VREvent_TrackersSectionSettingChanged = 866, + VREvent_StatusUpdate = 900, + VREvent_WebInterface_InstallDriverCompleted = 950, + VREvent_MCImageUpdated = 1000, + VREvent_FirmwareUpdateStarted = 1100, + VREvent_FirmwareUpdateFinished = 1101, + VREvent_KeyboardClosed = 1200, + VREvent_KeyboardCharInput = 1201, + VREvent_KeyboardDone = 1202, + VREvent_ApplicationTransitionStarted = 1300, + VREvent_ApplicationTransitionAborted = 1301, + VREvent_ApplicationTransitionNewAppStarted = 1302, + VREvent_ApplicationListUpdated = 1303, + VREvent_ApplicationMimeTypeLoad = 1304, + VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + VREvent_ProcessConnected = 1306, + VREvent_ProcessDisconnected = 1307, + VREvent_Compositor_MirrorWindowShown = 1400, + VREvent_Compositor_MirrorWindowHidden = 1401, + VREvent_Compositor_ChaperoneBoundsShown = 1410, + VREvent_Compositor_ChaperoneBoundsHidden = 1411, + VREvent_TrackedCamera_StartVideoStream = 1500, + VREvent_TrackedCamera_StopVideoStream = 1501, + VREvent_TrackedCamera_PauseVideoStream = 1502, + VREvent_TrackedCamera_ResumeVideoStream = 1503, + VREvent_TrackedCamera_EditingSurface = 1550, + VREvent_PerformanceTest_EnableCapture = 1600, + VREvent_PerformanceTest_DisableCapture = 1601, + VREvent_PerformanceTest_FidelityLevel = 1602, + VREvent_MessageOverlay_Closed = 1650, + VREvent_MessageOverlayCloseRequested = 1651, + VREvent_Input_HapticVibration = 1700, + VREvent_Input_BindingLoadFailed = 1701, + VREvent_Input_BindingLoadSuccessful = 1702, + VREvent_Input_ActionManifestReloaded = 1703, + VREvent_Input_ActionManifestLoadFailed = 1704, + VREvent_SpatialAnchors_PoseUpdated = 1800, + VREvent_SpatialAnchors_DescriptorUpdated = 1801, + VREvent_SpatialAnchors_RequestPoseUpdate = 1802, + VREvent_SpatialAnchors_RequestDescriptorUpdate = 1803, + VREvent_VendorSpecific_Reserved_Start = 10000, + VREvent_VendorSpecific_Reserved_End = 19999, +} +public enum EDeviceActivityLevel +{ + k_EDeviceActivityLevel_Unknown = -1, + k_EDeviceActivityLevel_Idle = 0, + k_EDeviceActivityLevel_UserInteraction = 1, + k_EDeviceActivityLevel_UserInteraction_Timeout = 2, + k_EDeviceActivityLevel_Standby = 3, +} +public enum EVRButtonId +{ + k_EButton_System = 0, + k_EButton_ApplicationMenu = 1, + k_EButton_Grip = 2, + k_EButton_DPad_Left = 3, + k_EButton_DPad_Up = 4, + k_EButton_DPad_Right = 5, + k_EButton_DPad_Down = 6, + k_EButton_A = 7, + k_EButton_ProximitySensor = 31, + k_EButton_Axis0 = 32, + k_EButton_Axis1 = 33, + k_EButton_Axis2 = 34, + k_EButton_Axis3 = 35, + k_EButton_Axis4 = 36, + k_EButton_SteamVR_Touchpad = 32, + k_EButton_SteamVR_Trigger = 33, + k_EButton_Dashboard_Back = 2, + k_EButton_Knuckles_A = 2, + k_EButton_Knuckles_B = 1, + k_EButton_Knuckles_JoyStick = 35, + k_EButton_Max = 64, +} +public enum EVRMouseButton +{ + Left = 1, + Right = 2, + Middle = 4, +} +public enum EDualAnalogWhich +{ + k_EDualAnalog_Left = 0, + k_EDualAnalog_Right = 1, +} +public enum EVRInputError +{ + None = 0, + NameNotFound = 1, + WrongType = 2, + InvalidHandle = 3, + InvalidParam = 4, + NoSteam = 5, + MaxCapacityReached = 6, + IPCError = 7, + NoActiveActionSet = 8, + InvalidDevice = 9, + InvalidSkeleton = 10, + InvalidBoneCount = 11, + InvalidCompressedData = 12, + NoData = 13, + BufferTooSmall = 14, + MismatchedActionManifest = 15, + MissingSkeletonData = 16, +} +public enum EVRSpatialAnchorError +{ + Success = 0, + Internal = 1, + UnknownHandle = 2, + ArrayTooSmall = 3, + InvalidDescriptorChar = 4, + NotYetAvailable = 5, + NotAvailableInThisUniverse = 6, + PermanentlyUnavailable = 7, + WrongDriver = 8, + DescriptorTooLong = 9, + Unknown = 10, + NoRoomCalibration = 11, + InvalidArgument = 12, + UnknownDriver = 13, +} +public enum EHiddenAreaMeshType +{ + k_eHiddenAreaMesh_Standard = 0, + k_eHiddenAreaMesh_Inverse = 1, + k_eHiddenAreaMesh_LineLoop = 2, + k_eHiddenAreaMesh_Max = 3, +} +public enum EVRControllerAxisType +{ + k_eControllerAxis_None = 0, + k_eControllerAxis_TrackPad = 1, + k_eControllerAxis_Joystick = 2, + k_eControllerAxis_Trigger = 3, +} +public enum EVRControllerEventOutputType +{ + ControllerEventOutput_OSEvents = 0, + ControllerEventOutput_VREvents = 1, +} +public enum ECollisionBoundsStyle +{ + COLLISION_BOUNDS_STYLE_BEGINNER = 0, + COLLISION_BOUNDS_STYLE_INTERMEDIATE = 1, + COLLISION_BOUNDS_STYLE_SQUARES = 2, + COLLISION_BOUNDS_STYLE_ADVANCED = 3, + COLLISION_BOUNDS_STYLE_NONE = 4, + COLLISION_BOUNDS_STYLE_COUNT = 5, +} +public enum EVROverlayError +{ + None = 0, + UnknownOverlay = 10, + InvalidHandle = 11, + PermissionDenied = 12, + OverlayLimitExceeded = 13, + WrongVisibilityType = 14, + KeyTooLong = 15, + NameTooLong = 16, + KeyInUse = 17, + WrongTransformType = 18, + InvalidTrackedDevice = 19, + InvalidParameter = 20, + ThumbnailCantBeDestroyed = 21, + ArrayTooSmall = 22, + RequestFailed = 23, + InvalidTexture = 24, + UnableToLoadFile = 25, + KeyboardAlreadyInUse = 26, + NoNeighbor = 27, + TooManyMaskPrimitives = 29, + BadMaskPrimitive = 30, + TextureAlreadyLocked = 31, + TextureLockCapacityReached = 32, + TextureNotLocked = 33, +} +public enum EVRApplicationType +{ + VRApplication_Other = 0, + VRApplication_Scene = 1, + VRApplication_Overlay = 2, + VRApplication_Background = 3, + VRApplication_Utility = 4, + VRApplication_VRMonitor = 5, + VRApplication_SteamWatchdog = 6, + VRApplication_Bootstrapper = 7, + VRApplication_Max = 8, +} +public enum EVRFirmwareError +{ + None = 0, + Success = 1, + Fail = 2, +} +public enum EVRNotificationError +{ + OK = 0, + InvalidNotificationId = 100, + NotificationQueueFull = 101, + InvalidOverlayHandle = 102, + SystemWithUserValueAlreadyExists = 103, +} +public enum EVRSkeletalMotionRange +{ + WithController = 0, + WithoutController = 1, +} +public enum EVRInitError +{ + None = 0, + Unknown = 1, + Init_InstallationNotFound = 100, + Init_InstallationCorrupt = 101, + Init_VRClientDLLNotFound = 102, + Init_FileNotFound = 103, + Init_FactoryNotFound = 104, + Init_InterfaceNotFound = 105, + Init_InvalidInterface = 106, + Init_UserConfigDirectoryInvalid = 107, + Init_HmdNotFound = 108, + Init_NotInitialized = 109, + Init_PathRegistryNotFound = 110, + Init_NoConfigPath = 111, + Init_NoLogPath = 112, + Init_PathRegistryNotWritable = 113, + Init_AppInfoInitFailed = 114, + Init_Retry = 115, + Init_InitCanceledByUser = 116, + Init_AnotherAppLaunching = 117, + Init_SettingsInitFailed = 118, + Init_ShuttingDown = 119, + Init_TooManyObjects = 120, + Init_NoServerForBackgroundApp = 121, + Init_NotSupportedWithCompositor = 122, + Init_NotAvailableToUtilityApps = 123, + Init_Internal = 124, + Init_HmdDriverIdIsNone = 125, + Init_HmdNotFoundPresenceFailed = 126, + Init_VRMonitorNotFound = 127, + Init_VRMonitorStartupFailed = 128, + Init_LowPowerWatchdogNotSupported = 129, + Init_InvalidApplicationType = 130, + Init_NotAvailableToWatchdogApps = 131, + Init_WatchdogDisabledInSettings = 132, + Init_VRDashboardNotFound = 133, + Init_VRDashboardStartupFailed = 134, + Init_VRHomeNotFound = 135, + Init_VRHomeStartupFailed = 136, + Init_RebootingBusy = 137, + Init_FirmwareUpdateBusy = 138, + Init_FirmwareRecoveryBusy = 139, + Init_USBServiceBusy = 140, + Init_VRWebHelperStartupFailed = 141, + Init_TrackerManagerInitFailed = 142, + Driver_Failed = 200, + Driver_Unknown = 201, + Driver_HmdUnknown = 202, + Driver_NotLoaded = 203, + Driver_RuntimeOutOfDate = 204, + Driver_HmdInUse = 205, + Driver_NotCalibrated = 206, + Driver_CalibrationInvalid = 207, + Driver_HmdDisplayNotFound = 208, + Driver_TrackedDeviceInterfaceUnknown = 209, + Driver_HmdDriverIdOutOfBounds = 211, + Driver_HmdDisplayMirrored = 212, + IPC_ServerInitFailed = 300, + IPC_ConnectFailed = 301, + IPC_SharedStateInitFailed = 302, + IPC_CompositorInitFailed = 303, + IPC_MutexInitFailed = 304, + IPC_Failed = 305, + IPC_CompositorConnectFailed = 306, + IPC_CompositorInvalidConnectResponse = 307, + IPC_ConnectFailedAfterMultipleAttempts = 308, + Compositor_Failed = 400, + Compositor_D3D11HardwareRequired = 401, + Compositor_FirmwareRequiresUpdate = 402, + Compositor_OverlayInitFailed = 403, + Compositor_ScreenshotsInitFailed = 404, + Compositor_UnableToCreateDevice = 405, + VendorSpecific_UnableToConnectToOculusRuntime = 1000, + VendorSpecific_WindowsNotInDevMode = 1001, + VendorSpecific_HmdFound_CantOpenDevice = 1101, + VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + VendorSpecific_HmdFound_NoStoredConfig = 1103, + VendorSpecific_HmdFound_ConfigTooBig = 1104, + VendorSpecific_HmdFound_ConfigTooSmall = 1105, + VendorSpecific_HmdFound_UnableToInitZLib = 1106, + VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + VendorSpecific_HmdFound_UserDataAddressRange = 1111, + VendorSpecific_HmdFound_UserDataError = 1112, + VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + Steam_SteamInstallationNotFound = 2000, +} +public enum EVRScreenshotType +{ + None = 0, + Mono = 1, + Stereo = 2, + Cubemap = 3, + MonoPanorama = 4, + StereoPanorama = 5, +} +public enum EVRScreenshotPropertyFilenames +{ + Preview = 0, + VR = 1, +} +public enum EVRTrackedCameraError +{ + None = 0, + OperationFailed = 100, + InvalidHandle = 101, + InvalidFrameHeaderVersion = 102, + OutOfHandles = 103, + IPCFailure = 104, + NotSupportedForThisDevice = 105, + SharedMemoryFailure = 106, + FrameBufferingFailure = 107, + StreamSetupFailure = 108, + InvalidGLTextureId = 109, + InvalidSharedTextureHandle = 110, + FailedToGetGLTextureId = 111, + SharedTextureFailure = 112, + NoFrameAvailable = 113, + InvalidArgument = 114, + InvalidFrameBufferSize = 115, +} +public enum EVRTrackedCameraFrameLayout +{ + Mono = 1, + Stereo = 2, + VerticalLayout = 16, + HorizontalLayout = 32, +} +public enum EVRTrackedCameraFrameType +{ + Distorted = 0, + Undistorted = 1, + MaximumUndistorted = 2, + MAX_CAMERA_FRAME_TYPES = 3, +} +public enum EVSync +{ + None = 0, + WaitRender = 1, + NoWaitRender = 2, +} +public enum EVRMuraCorrectionMode +{ + Default = 0, + NoCorrection = 1, +} +public enum Imu_OffScaleFlags +{ + OffScale_AccelX = 1, + OffScale_AccelY = 2, + OffScale_AccelZ = 4, + OffScale_GyroX = 8, + OffScale_GyroY = 16, + OffScale_GyroZ = 32, +} +public enum EVRApplicationError +{ + None = 0, + AppKeyAlreadyExists = 100, + NoManifest = 101, + NoApplication = 102, + InvalidIndex = 103, + UnknownApplication = 104, + IPCFailed = 105, + ApplicationAlreadyRunning = 106, + InvalidManifest = 107, + InvalidApplication = 108, + LaunchFailed = 109, + ApplicationAlreadyStarting = 110, + LaunchInProgress = 111, + OldApplicationQuitting = 112, + TransitionAborted = 113, + IsTemplate = 114, + SteamVRIsExiting = 115, + BufferTooSmall = 200, + PropertyNotSet = 201, + UnknownProperty = 202, + InvalidParameter = 203, +} +public enum EVRApplicationProperty +{ + Name_String = 0, + LaunchType_String = 11, + WorkingDirectory_String = 12, + BinaryPath_String = 13, + Arguments_String = 14, + URL_String = 15, + Description_String = 50, + NewsURL_String = 51, + ImagePath_String = 52, + Source_String = 53, + ActionManifestURL_String = 54, + IsDashboardOverlay_Bool = 60, + IsTemplate_Bool = 61, + IsInstanced_Bool = 62, + IsInternal_Bool = 63, + WantsCompositorPauseInStandby_Bool = 64, + LastLaunchTime_Uint64 = 70, +} +public enum EVRApplicationTransitionState +{ + VRApplicationTransition_None = 0, + VRApplicationTransition_OldAppQuitSent = 10, + VRApplicationTransition_WaitingForExternalLaunch = 11, + VRApplicationTransition_NewAppLaunched = 20, +} +public enum ChaperoneCalibrationState +{ + OK = 1, + Warning = 100, + Warning_BaseStationMayHaveMoved = 101, + Warning_BaseStationRemoved = 102, + Warning_SeatedBoundsInvalid = 103, + Error = 200, + Error_BaseStationUninitialized = 201, + Error_BaseStationConflict = 202, + Error_PlayAreaInvalid = 203, + Error_CollisionBoundsInvalid = 204, +} +public enum EChaperoneConfigFile +{ + Live = 1, + Temp = 2, +} +public enum EChaperoneImportFlags +{ + EChaperoneImport_BoundsOnly = 1, +} +public enum EVRCompositorError +{ + None = 0, + RequestFailed = 1, + IncompatibleVersion = 100, + DoNotHaveFocus = 101, + InvalidTexture = 102, + IsNotSceneApplication = 103, + TextureIsOnWrongDevice = 104, + TextureUsesUnsupportedFormat = 105, + SharedTexturesNotSupported = 106, + IndexOutOfRange = 107, + AlreadySubmitted = 108, + InvalidBounds = 109, +} +public enum EVRCompositorTimingMode +{ + Implicit = 0, + Explicit_RuntimePerformsPostPresentHandoff = 1, + Explicit_ApplicationPerformsPostPresentHandoff = 2, +} +public enum VROverlayInputMethod +{ + None = 0, + Mouse = 1, + DualAnalog = 2, +} +public enum VROverlayTransformType +{ + VROverlayTransform_Absolute = 0, + VROverlayTransform_TrackedDeviceRelative = 1, + VROverlayTransform_SystemOverlay = 2, + VROverlayTransform_TrackedComponent = 3, +} +public enum VROverlayFlags +{ + None = 0, + Curved = 1, + RGSS4X = 2, + NoDashboardTab = 3, + AcceptsGamepadEvents = 4, + ShowGamepadFocus = 5, + SendVRScrollEvents = 6, + SendVRTouchpadEvents = 7, + ShowTouchPadScrollWheel = 8, + TransferOwnershipToInternalProcess = 9, + SideBySide_Parallel = 10, + SideBySide_Crossed = 11, + Panorama = 12, + StereoPanorama = 13, + SortWithNonSceneOverlays = 14, + VisibleInDashboard = 15, +} +public enum VRMessageOverlayResponse +{ + ButtonPress_0 = 0, + ButtonPress_1 = 1, + ButtonPress_2 = 2, + ButtonPress_3 = 3, + CouldntFindSystemOverlay = 4, + CouldntFindOrCreateClientOverlay = 5, + ApplicationQuit = 6, +} +public enum EGamepadTextInputMode +{ + k_EGamepadTextInputModeNormal = 0, + k_EGamepadTextInputModePassword = 1, + k_EGamepadTextInputModeSubmit = 2, +} +public enum EGamepadTextInputLineMode +{ + k_EGamepadTextInputLineModeSingleLine = 0, + k_EGamepadTextInputLineModeMultipleLines = 1, +} +public enum EOverlayDirection +{ + Up = 0, + Down = 1, + Left = 2, + Right = 3, + Count = 4, +} +public enum EVROverlayIntersectionMaskPrimitiveType +{ + OverlayIntersectionPrimitiveType_Rectangle = 0, + OverlayIntersectionPrimitiveType_Circle = 1, +} +public enum EVRRenderModelError +{ + None = 0, + Loading = 100, + NotSupported = 200, + InvalidArg = 300, + InvalidModel = 301, + NoShapes = 302, + MultipleShapes = 303, + TooManyVertices = 304, + MultipleTextures = 305, + BufferTooSmall = 306, + NotEnoughNormals = 307, + NotEnoughTexCoords = 308, + InvalidTexture = 400, +} +public enum EVRComponentProperty +{ + IsStatic = 1, + IsVisible = 2, + IsTouched = 4, + IsPressed = 8, + IsScrolled = 16, +} +public enum EVRNotificationType +{ + Transient = 0, + Persistent = 1, + Transient_SystemWithUserValue = 2, +} +public enum EVRNotificationStyle +{ + None = 0, + Application = 100, + Contact_Disabled = 200, + Contact_Enabled = 201, + Contact_Active = 202, +} +public enum EVRSettingsError +{ + None = 0, + IPCFailed = 1, + WriteFailed = 2, + ReadFailed = 3, + JsonParseFailed = 4, + UnsetSettingHasNoDefault = 5, +} +public enum EVRScreenshotError +{ + None = 0, + RequestFailed = 1, + IncompatibleVersion = 100, + NotFound = 101, + BufferTooSmall = 102, + ScreenshotAlreadyInProgress = 108, +} +public enum EVRSkeletalTransformSpace +{ + Model = 0, + Parent = 1, + Additive = 2, +} +public enum EVRInputFilterCancelType +{ + VRInputFilterCancel_Timers = 0, + VRInputFilterCancel_Momentum = 1, +} +public enum EIOBufferError +{ + IOBuffer_Success = 0, + IOBuffer_OperationFailed = 100, + IOBuffer_InvalidHandle = 101, + IOBuffer_InvalidArgument = 102, + IOBuffer_PathExists = 103, + IOBuffer_PathDoesNotExist = 104, + IOBuffer_Permission = 105, +} +public enum EIOBufferMode +{ + Read = 1, + Write = 2, + Create = 512, +} + +[StructLayout(LayoutKind.Explicit)] public struct VREvent_Data_t +{ + [FieldOffset(0)] public VREvent_Reserved_t reserved; + [FieldOffset(0)] public VREvent_Controller_t controller; + [FieldOffset(0)] public VREvent_Mouse_t mouse; + [FieldOffset(0)] public VREvent_Scroll_t scroll; + [FieldOffset(0)] public VREvent_Process_t process; + [FieldOffset(0)] public VREvent_Notification_t notification; + [FieldOffset(0)] public VREvent_Overlay_t overlay; + [FieldOffset(0)] public VREvent_Status_t status; + [FieldOffset(0)] public VREvent_Ipd_t ipd; + [FieldOffset(0)] public VREvent_Chaperone_t chaperone; + [FieldOffset(0)] public VREvent_PerformanceTest_t performanceTest; + [FieldOffset(0)] public VREvent_TouchPadMove_t touchPadMove; + [FieldOffset(0)] public VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; + [FieldOffset(0)] public VREvent_Screenshot_t screenshot; + [FieldOffset(0)] public VREvent_ScreenshotProgress_t screenshotProgress; + [FieldOffset(0)] public VREvent_ApplicationLaunch_t applicationLaunch; + [FieldOffset(0)] public VREvent_EditingCameraSurface_t cameraSurface; + [FieldOffset(0)] public VREvent_MessageOverlay_t messageOverlay; + [FieldOffset(0)] public VREvent_Property_t property; + [FieldOffset(0)] public VREvent_DualAnalog_t dualAnalog; + [FieldOffset(0)] public VREvent_HapticVibration_t hapticVibration; + [FieldOffset(0)] public VREvent_WebConsole_t webConsole; + [FieldOffset(0)] public VREvent_InputBindingLoad_t inputBinding; + [FieldOffset(0)] public VREvent_SpatialAnchor_t spatialAnchor; + [FieldOffset(0)] public VREvent_Keyboard_t keyboard; // This has to be at the end due to a mono bug +} + + +[StructLayout(LayoutKind.Explicit)] public struct VROverlayIntersectionMaskPrimitive_Data_t +{ + [FieldOffset(0)] public IntersectionMaskRectangle_t m_Rectangle; + [FieldOffset(0)] public IntersectionMaskCircle_t m_Circle; +} + +[StructLayout(LayoutKind.Sequential)] public struct HmdMatrix34_t +{ + public float m0; //float[3][4] + public float m1; + public float m2; + public float m3; + public float m4; + public float m5; + public float m6; + public float m7; + public float m8; + public float m9; + public float m10; + public float m11; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdMatrix33_t +{ + public float m0; //float[3][3] + public float m1; + public float m2; + public float m3; + public float m4; + public float m5; + public float m6; + public float m7; + public float m8; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdMatrix44_t +{ + public float m0; //float[4][4] + public float m1; + public float m2; + public float m3; + public float m4; + public float m5; + public float m6; + public float m7; + public float m8; + public float m9; + public float m10; + public float m11; + public float m12; + public float m13; + public float m14; + public float m15; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector3_t +{ + public float v0; //float[3] + public float v1; + public float v2; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector4_t +{ + public float v0; //float[4] + public float v1; + public float v2; + public float v3; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector3d_t +{ + public double v0; //double[3] + public double v1; + public double v2; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector2_t +{ + public float v0; //float[2] + public float v1; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdQuaternion_t +{ + public double w; + public double x; + public double y; + public double z; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdQuaternionf_t +{ + public float w; + public float x; + public float y; + public float z; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdColor_t +{ + public float r; + public float g; + public float b; + public float a; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdQuad_t +{ + public HmdVector3_t vCorners0; //HmdVector3_t[4] + public HmdVector3_t vCorners1; + public HmdVector3_t vCorners2; + public HmdVector3_t vCorners3; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdRect2_t +{ + public HmdVector2_t vTopLeft; + public HmdVector2_t vBottomRight; +} +[StructLayout(LayoutKind.Sequential)] public struct DistortionCoordinates_t +{ + public float rfRed0; //float[2] + public float rfRed1; + public float rfGreen0; //float[2] + public float rfGreen1; + public float rfBlue0; //float[2] + public float rfBlue1; +} +[StructLayout(LayoutKind.Sequential)] public struct Texture_t +{ + public IntPtr handle; // void * + public ETextureType eType; + public EColorSpace eColorSpace; +} +[StructLayout(LayoutKind.Sequential)] public struct TrackedDevicePose_t +{ + public HmdMatrix34_t mDeviceToAbsoluteTracking; + public HmdVector3_t vVelocity; + public HmdVector3_t vAngularVelocity; + public ETrackingResult eTrackingResult; + [MarshalAs(UnmanagedType.I1)] + public bool bPoseIsValid; + [MarshalAs(UnmanagedType.I1)] + public bool bDeviceIsConnected; +} +[StructLayout(LayoutKind.Sequential)] public struct VRTextureBounds_t +{ + public float uMin; + public float vMin; + public float uMax; + public float vMax; +} +[StructLayout(LayoutKind.Sequential)] public struct VRTextureWithPose_t +{ + public HmdMatrix34_t mDeviceToAbsoluteTracking; +} +[StructLayout(LayoutKind.Sequential)] public struct VRTextureDepthInfo_t +{ + public IntPtr handle; // void * + public HmdMatrix44_t mProjection; + public HmdVector2_t vRange; +} +[StructLayout(LayoutKind.Sequential)] public struct VRTextureWithDepth_t +{ + public VRTextureDepthInfo_t depth; +} +[StructLayout(LayoutKind.Sequential)] public struct VRTextureWithPoseAndDepth_t +{ + public VRTextureDepthInfo_t depth; +} +[StructLayout(LayoutKind.Sequential)] public struct VRVulkanTextureData_t +{ + public ulong m_nImage; + public IntPtr m_pDevice; // struct VkDevice_T * + public IntPtr m_pPhysicalDevice; // struct VkPhysicalDevice_T * + public IntPtr m_pInstance; // struct VkInstance_T * + public IntPtr m_pQueue; // struct VkQueue_T * + public uint m_nQueueFamilyIndex; + public uint m_nWidth; + public uint m_nHeight; + public uint m_nFormat; + public uint m_nSampleCount; +} +[StructLayout(LayoutKind.Sequential)] public struct D3D12TextureData_t +{ + public IntPtr m_pResource; // struct ID3D12Resource * + public IntPtr m_pCommandQueue; // struct ID3D12CommandQueue * + public uint m_nNodeMask; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Controller_t +{ + public uint button; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Mouse_t +{ + public float x; + public float y; + public uint button; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Scroll_t +{ + public float xdelta; + public float ydelta; + public uint repeatCount; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_TouchPadMove_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bFingerDown; + public float flSecondsFingerDown; + public float fValueXFirst; + public float fValueYFirst; + public float fValueXRaw; + public float fValueYRaw; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Notification_t +{ + public ulong ulUserValue; + public uint notificationId; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Process_t +{ + public uint pid; + public uint oldPid; + [MarshalAs(UnmanagedType.I1)] + public bool bForced; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Overlay_t +{ + public ulong overlayHandle; + public ulong devicePath; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Status_t +{ + public uint statusState; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Keyboard_t +{ + public byte cNewInput0,cNewInput1,cNewInput2,cNewInput3,cNewInput4,cNewInput5,cNewInput6,cNewInput7; + public string cNewInput + { + get + { + var stringBuilder = new System.Text.StringBuilder(8); + stringBuilder.Append(cNewInput0); + stringBuilder.Append(cNewInput1); + stringBuilder.Append(cNewInput2); + stringBuilder.Append(cNewInput3); + stringBuilder.Append(cNewInput4); + stringBuilder.Append(cNewInput5); + stringBuilder.Append(cNewInput6); + stringBuilder.Append(cNewInput7); + return stringBuilder.ToString(); + } + } + public ulong uUserValue; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Ipd_t +{ + public float ipdMeters; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Chaperone_t +{ + public ulong m_nPreviousUniverse; + public ulong m_nCurrentUniverse; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Reserved_t +{ + public ulong reserved0; + public ulong reserved1; + public ulong reserved2; + public ulong reserved3; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_PerformanceTest_t +{ + public uint m_nFidelityLevel; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_SeatedZeroPoseReset_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bResetBySystemMenu; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Screenshot_t +{ + public uint handle; + public uint type; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_ScreenshotProgress_t +{ + public float progress; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_ApplicationLaunch_t +{ + public uint pid; + public uint unArgsHandle; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_EditingCameraSurface_t +{ + public ulong overlayHandle; + public uint nVisualMode; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_MessageOverlay_t +{ + public uint unVRMessageOverlayResponse; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Property_t +{ + public ulong container; + public ETrackedDeviceProperty prop; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_DualAnalog_t +{ + public float x; + public float y; + public float transformedX; + public float transformedY; + public EDualAnalogWhich which; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_HapticVibration_t +{ + public ulong containerHandle; + public ulong componentHandle; + public float fDurationSeconds; + public float fFrequency; + public float fAmplitude; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_WebConsole_t +{ + public ulong webConsoleHandle; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_InputBindingLoad_t +{ + public ulong ulAppContainer; + public ulong pathMessage; + public ulong pathUrl; + public ulong pathControllerType; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_InputActionManifestLoad_t +{ + public ulong pathAppKey; + public ulong pathMessage; + public ulong pathMessageParam; + public ulong pathManifestPath; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_SpatialAnchor_t +{ + public uint unHandle; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_t +{ + public uint eventType; + public uint trackedDeviceIndex; + public float eventAgeSeconds; + public VREvent_Data_t data; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct VREvent_t_Packed +{ + public uint eventType; + public uint trackedDeviceIndex; + public float eventAgeSeconds; + public VREvent_Data_t data; + public VREvent_t_Packed(VREvent_t unpacked) + { + this.eventType = unpacked.eventType; + this.trackedDeviceIndex = unpacked.trackedDeviceIndex; + this.eventAgeSeconds = unpacked.eventAgeSeconds; + this.data = unpacked.data; + } + public void Unpack(ref VREvent_t unpacked) + { + unpacked.eventType = this.eventType; + unpacked.trackedDeviceIndex = this.trackedDeviceIndex; + unpacked.eventAgeSeconds = this.eventAgeSeconds; + unpacked.data = this.data; + } +} +[StructLayout(LayoutKind.Sequential)] public struct HiddenAreaMesh_t +{ + public IntPtr pVertexData; // const struct vr::HmdVector2_t * + public uint unTriangleCount; +} +[StructLayout(LayoutKind.Sequential)] public struct VRControllerAxis_t +{ + public float x; + public float y; +} +[StructLayout(LayoutKind.Sequential)] public struct VRControllerState_t +{ + public uint unPacketNum; + public ulong ulButtonPressed; + public ulong ulButtonTouched; + public VRControllerAxis_t rAxis0; //VRControllerAxis_t[5] + public VRControllerAxis_t rAxis1; + public VRControllerAxis_t rAxis2; + public VRControllerAxis_t rAxis3; + public VRControllerAxis_t rAxis4; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct VRControllerState_t_Packed +{ + public uint unPacketNum; + public ulong ulButtonPressed; + public ulong ulButtonTouched; + public VRControllerAxis_t rAxis0; //VRControllerAxis_t[5] + public VRControllerAxis_t rAxis1; + public VRControllerAxis_t rAxis2; + public VRControllerAxis_t rAxis3; + public VRControllerAxis_t rAxis4; + public VRControllerState_t_Packed(VRControllerState_t unpacked) + { + this.unPacketNum = unpacked.unPacketNum; + this.ulButtonPressed = unpacked.ulButtonPressed; + this.ulButtonTouched = unpacked.ulButtonTouched; + this.rAxis0 = unpacked.rAxis0; + this.rAxis1 = unpacked.rAxis1; + this.rAxis2 = unpacked.rAxis2; + this.rAxis3 = unpacked.rAxis3; + this.rAxis4 = unpacked.rAxis4; + } + public void Unpack(ref VRControllerState_t unpacked) + { + unpacked.unPacketNum = this.unPacketNum; + unpacked.ulButtonPressed = this.ulButtonPressed; + unpacked.ulButtonTouched = this.ulButtonTouched; + unpacked.rAxis0 = this.rAxis0; + unpacked.rAxis1 = this.rAxis1; + unpacked.rAxis2 = this.rAxis2; + unpacked.rAxis3 = this.rAxis3; + unpacked.rAxis4 = this.rAxis4; + } +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_OverlaySettings +{ + public uint size; + [MarshalAs(UnmanagedType.I1)] + public bool curved; + [MarshalAs(UnmanagedType.I1)] + public bool antialias; + public float scale; + public float distance; + public float alpha; + public float uOffset; + public float vOffset; + public float uScale; + public float vScale; + public float gridDivs; + public float gridWidth; + public float gridScale; + public HmdMatrix44_t transform; +} +[StructLayout(LayoutKind.Sequential)] public struct VRBoneTransform_t +{ + public HmdVector4_t position; + public HmdQuaternionf_t orientation; +} +[StructLayout(LayoutKind.Sequential)] public struct CameraVideoStreamFrameHeader_t +{ + public EVRTrackedCameraFrameType eFrameType; + public uint nWidth; + public uint nHeight; + public uint nBytesPerPixel; + public uint nFrameSequence; + public TrackedDevicePose_t standingTrackedDevicePose; +} +[StructLayout(LayoutKind.Sequential)] public struct DriverDirectMode_FrameTiming +{ + public uint m_nSize; + public uint m_nNumFramePresents; + public uint m_nNumMisPresented; + public uint m_nNumDroppedFrames; + public uint m_nReprojectionFlags; +} +[StructLayout(LayoutKind.Sequential)] public struct ImuSample_t +{ + public double fSampleTime; + public HmdVector3d_t vAccel; + public HmdVector3d_t vGyro; + public uint unOffScaleFlags; +} +[StructLayout(LayoutKind.Sequential)] public struct AppOverrideKeys_t +{ + public IntPtr pchKey; // const char * + public IntPtr pchValue; // const char * +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_FrameTiming +{ + public uint m_nSize; + public uint m_nFrameIndex; + public uint m_nNumFramePresents; + public uint m_nNumMisPresented; + public uint m_nNumDroppedFrames; + public uint m_nReprojectionFlags; + public double m_flSystemTimeInSeconds; + public float m_flPreSubmitGpuMs; + public float m_flPostSubmitGpuMs; + public float m_flTotalRenderGpuMs; + public float m_flCompositorRenderGpuMs; + public float m_flCompositorRenderCpuMs; + public float m_flCompositorIdleCpuMs; + public float m_flClientFrameIntervalMs; + public float m_flPresentCallCpuMs; + public float m_flWaitForPresentCpuMs; + public float m_flSubmitFrameMs; + public float m_flWaitGetPosesCalledMs; + public float m_flNewPosesReadyMs; + public float m_flNewFrameReadyMs; + public float m_flCompositorUpdateStartMs; + public float m_flCompositorUpdateEndMs; + public float m_flCompositorRenderStartMs; + public TrackedDevicePose_t m_HmdPose; +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_CumulativeStats +{ + public uint m_nPid; + public uint m_nNumFramePresents; + public uint m_nNumDroppedFrames; + public uint m_nNumReprojectedFrames; + public uint m_nNumFramePresentsOnStartup; + public uint m_nNumDroppedFramesOnStartup; + public uint m_nNumReprojectedFramesOnStartup; + public uint m_nNumLoading; + public uint m_nNumFramePresentsLoading; + public uint m_nNumDroppedFramesLoading; + public uint m_nNumReprojectedFramesLoading; + public uint m_nNumTimedOut; + public uint m_nNumFramePresentsTimedOut; + public uint m_nNumDroppedFramesTimedOut; + public uint m_nNumReprojectedFramesTimedOut; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionParams_t +{ + public HmdVector3_t vSource; + public HmdVector3_t vDirection; + public ETrackingUniverseOrigin eOrigin; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionResults_t +{ + public HmdVector3_t vPoint; + public HmdVector3_t vNormal; + public HmdVector2_t vUVs; + public float fDistance; +} +[StructLayout(LayoutKind.Sequential)] public struct IntersectionMaskRectangle_t +{ + public float m_flTopLeftX; + public float m_flTopLeftY; + public float m_flWidth; + public float m_flHeight; +} +[StructLayout(LayoutKind.Sequential)] public struct IntersectionMaskCircle_t +{ + public float m_flCenterX; + public float m_flCenterY; + public float m_flRadius; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionMaskPrimitive_t +{ + public EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType; + public VROverlayIntersectionMaskPrimitive_Data_t m_Primitive; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_ComponentState_t +{ + public HmdMatrix34_t mTrackingToComponentRenderModel; + public HmdMatrix34_t mTrackingToComponentLocal; + public uint uProperties; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_Vertex_t +{ + public HmdVector3_t vPosition; + public HmdVector3_t vNormal; + public float rfTextureCoord0; //float[2] + public float rfTextureCoord1; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_TextureMap_t +{ + public ushort unWidth; + public ushort unHeight; + public IntPtr rubTextureMapData; // const uint8_t * +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct RenderModel_TextureMap_t_Packed +{ + public ushort unWidth; + public ushort unHeight; + public IntPtr rubTextureMapData; // const uint8_t * + public RenderModel_TextureMap_t_Packed(RenderModel_TextureMap_t unpacked) + { + this.unWidth = unpacked.unWidth; + this.unHeight = unpacked.unHeight; + this.rubTextureMapData = unpacked.rubTextureMapData; + } + public void Unpack(ref RenderModel_TextureMap_t unpacked) + { + unpacked.unWidth = this.unWidth; + unpacked.unHeight = this.unHeight; + unpacked.rubTextureMapData = this.rubTextureMapData; + } +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_t +{ + public IntPtr rVertexData; // const struct vr::RenderModel_Vertex_t * + public uint unVertexCount; + public IntPtr rIndexData; // const uint16_t * + public uint unTriangleCount; + public int diffuseTextureId; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct RenderModel_t_Packed +{ + public IntPtr rVertexData; // const struct vr::RenderModel_Vertex_t * + public uint unVertexCount; + public IntPtr rIndexData; // const uint16_t * + public uint unTriangleCount; + public int diffuseTextureId; + public RenderModel_t_Packed(RenderModel_t unpacked) + { + this.rVertexData = unpacked.rVertexData; + this.unVertexCount = unpacked.unVertexCount; + this.rIndexData = unpacked.rIndexData; + this.unTriangleCount = unpacked.unTriangleCount; + this.diffuseTextureId = unpacked.diffuseTextureId; + } + public void Unpack(ref RenderModel_t unpacked) + { + unpacked.rVertexData = this.rVertexData; + unpacked.unVertexCount = this.unVertexCount; + unpacked.rIndexData = this.rIndexData; + unpacked.unTriangleCount = this.unTriangleCount; + unpacked.diffuseTextureId = this.diffuseTextureId; + } +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_ControllerMode_State_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bScrollWheelVisible; +} +[StructLayout(LayoutKind.Sequential)] public struct NotificationBitmap_t +{ + public IntPtr m_pImageData; // void * + public int m_nWidth; + public int m_nHeight; + public int m_nBytesPerPixel; +} +[StructLayout(LayoutKind.Sequential)] public struct CVRSettingHelper +{ + public IntPtr m_pSettings; // class vr::IVRSettings * +} +[StructLayout(LayoutKind.Sequential)] public struct InputAnalogActionData_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bActive; + public ulong activeOrigin; + public float x; + public float y; + public float z; + public float deltaX; + public float deltaY; + public float deltaZ; + public float fUpdateTime; +} +[StructLayout(LayoutKind.Sequential)] public struct InputDigitalActionData_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bActive; + public ulong activeOrigin; + [MarshalAs(UnmanagedType.I1)] + public bool bState; + [MarshalAs(UnmanagedType.I1)] + public bool bChanged; + public float fUpdateTime; +} +[StructLayout(LayoutKind.Sequential)] public struct InputPoseActionData_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bActive; + public ulong activeOrigin; + public TrackedDevicePose_t pose; +} +[StructLayout(LayoutKind.Sequential)] public struct InputSkeletalActionData_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bActive; + public ulong activeOrigin; + public uint boneCount; +} +[StructLayout(LayoutKind.Sequential)] public struct InputOriginInfo_t +{ + public ulong devicePath; + public uint trackedDeviceIndex; + public byte rchRenderModelComponentName0,rchRenderModelComponentName1,rchRenderModelComponentName2,rchRenderModelComponentName3,rchRenderModelComponentName4,rchRenderModelComponentName5,rchRenderModelComponentName6,rchRenderModelComponentName7,rchRenderModelComponentName8,rchRenderModelComponentName9,rchRenderModelComponentName10,rchRenderModelComponentName11,rchRenderModelComponentName12,rchRenderModelComponentName13,rchRenderModelComponentName14,rchRenderModelComponentName15,rchRenderModelComponentName16,rchRenderModelComponentName17,rchRenderModelComponentName18,rchRenderModelComponentName19,rchRenderModelComponentName20,rchRenderModelComponentName21,rchRenderModelComponentName22,rchRenderModelComponentName23,rchRenderModelComponentName24,rchRenderModelComponentName25,rchRenderModelComponentName26,rchRenderModelComponentName27,rchRenderModelComponentName28,rchRenderModelComponentName29,rchRenderModelComponentName30,rchRenderModelComponentName31,rchRenderModelComponentName32,rchRenderModelComponentName33,rchRenderModelComponentName34,rchRenderModelComponentName35,rchRenderModelComponentName36,rchRenderModelComponentName37,rchRenderModelComponentName38,rchRenderModelComponentName39,rchRenderModelComponentName40,rchRenderModelComponentName41,rchRenderModelComponentName42,rchRenderModelComponentName43,rchRenderModelComponentName44,rchRenderModelComponentName45,rchRenderModelComponentName46,rchRenderModelComponentName47,rchRenderModelComponentName48,rchRenderModelComponentName49,rchRenderModelComponentName50,rchRenderModelComponentName51,rchRenderModelComponentName52,rchRenderModelComponentName53,rchRenderModelComponentName54,rchRenderModelComponentName55,rchRenderModelComponentName56,rchRenderModelComponentName57,rchRenderModelComponentName58,rchRenderModelComponentName59,rchRenderModelComponentName60,rchRenderModelComponentName61,rchRenderModelComponentName62,rchRenderModelComponentName63,rchRenderModelComponentName64,rchRenderModelComponentName65,rchRenderModelComponentName66,rchRenderModelComponentName67,rchRenderModelComponentName68,rchRenderModelComponentName69,rchRenderModelComponentName70,rchRenderModelComponentName71,rchRenderModelComponentName72,rchRenderModelComponentName73,rchRenderModelComponentName74,rchRenderModelComponentName75,rchRenderModelComponentName76,rchRenderModelComponentName77,rchRenderModelComponentName78,rchRenderModelComponentName79,rchRenderModelComponentName80,rchRenderModelComponentName81,rchRenderModelComponentName82,rchRenderModelComponentName83,rchRenderModelComponentName84,rchRenderModelComponentName85,rchRenderModelComponentName86,rchRenderModelComponentName87,rchRenderModelComponentName88,rchRenderModelComponentName89,rchRenderModelComponentName90,rchRenderModelComponentName91,rchRenderModelComponentName92,rchRenderModelComponentName93,rchRenderModelComponentName94,rchRenderModelComponentName95,rchRenderModelComponentName96,rchRenderModelComponentName97,rchRenderModelComponentName98,rchRenderModelComponentName99,rchRenderModelComponentName100,rchRenderModelComponentName101,rchRenderModelComponentName102,rchRenderModelComponentName103,rchRenderModelComponentName104,rchRenderModelComponentName105,rchRenderModelComponentName106,rchRenderModelComponentName107,rchRenderModelComponentName108,rchRenderModelComponentName109,rchRenderModelComponentName110,rchRenderModelComponentName111,rchRenderModelComponentName112,rchRenderModelComponentName113,rchRenderModelComponentName114,rchRenderModelComponentName115,rchRenderModelComponentName116,rchRenderModelComponentName117,rchRenderModelComponentName118,rchRenderModelComponentName119,rchRenderModelComponentName120,rchRenderModelComponentName121,rchRenderModelComponentName122,rchRenderModelComponentName123,rchRenderModelComponentName124,rchRenderModelComponentName125,rchRenderModelComponentName126,rchRenderModelComponentName127; + public string rchRenderModelComponentName + { + get + { + var stringBuilder = new System.Text.StringBuilder(128); + stringBuilder.Append(rchRenderModelComponentName0); + stringBuilder.Append(rchRenderModelComponentName1); + stringBuilder.Append(rchRenderModelComponentName2); + stringBuilder.Append(rchRenderModelComponentName3); + stringBuilder.Append(rchRenderModelComponentName4); + stringBuilder.Append(rchRenderModelComponentName5); + stringBuilder.Append(rchRenderModelComponentName6); + stringBuilder.Append(rchRenderModelComponentName7); + stringBuilder.Append(rchRenderModelComponentName8); + stringBuilder.Append(rchRenderModelComponentName9); + stringBuilder.Append(rchRenderModelComponentName10); + stringBuilder.Append(rchRenderModelComponentName11); + stringBuilder.Append(rchRenderModelComponentName12); + stringBuilder.Append(rchRenderModelComponentName13); + stringBuilder.Append(rchRenderModelComponentName14); + stringBuilder.Append(rchRenderModelComponentName15); + stringBuilder.Append(rchRenderModelComponentName16); + stringBuilder.Append(rchRenderModelComponentName17); + stringBuilder.Append(rchRenderModelComponentName18); + stringBuilder.Append(rchRenderModelComponentName19); + stringBuilder.Append(rchRenderModelComponentName20); + stringBuilder.Append(rchRenderModelComponentName21); + stringBuilder.Append(rchRenderModelComponentName22); + stringBuilder.Append(rchRenderModelComponentName23); + stringBuilder.Append(rchRenderModelComponentName24); + stringBuilder.Append(rchRenderModelComponentName25); + stringBuilder.Append(rchRenderModelComponentName26); + stringBuilder.Append(rchRenderModelComponentName27); + stringBuilder.Append(rchRenderModelComponentName28); + stringBuilder.Append(rchRenderModelComponentName29); + stringBuilder.Append(rchRenderModelComponentName30); + stringBuilder.Append(rchRenderModelComponentName31); + stringBuilder.Append(rchRenderModelComponentName32); + stringBuilder.Append(rchRenderModelComponentName33); + stringBuilder.Append(rchRenderModelComponentName34); + stringBuilder.Append(rchRenderModelComponentName35); + stringBuilder.Append(rchRenderModelComponentName36); + stringBuilder.Append(rchRenderModelComponentName37); + stringBuilder.Append(rchRenderModelComponentName38); + stringBuilder.Append(rchRenderModelComponentName39); + stringBuilder.Append(rchRenderModelComponentName40); + stringBuilder.Append(rchRenderModelComponentName41); + stringBuilder.Append(rchRenderModelComponentName42); + stringBuilder.Append(rchRenderModelComponentName43); + stringBuilder.Append(rchRenderModelComponentName44); + stringBuilder.Append(rchRenderModelComponentName45); + stringBuilder.Append(rchRenderModelComponentName46); + stringBuilder.Append(rchRenderModelComponentName47); + stringBuilder.Append(rchRenderModelComponentName48); + stringBuilder.Append(rchRenderModelComponentName49); + stringBuilder.Append(rchRenderModelComponentName50); + stringBuilder.Append(rchRenderModelComponentName51); + stringBuilder.Append(rchRenderModelComponentName52); + stringBuilder.Append(rchRenderModelComponentName53); + stringBuilder.Append(rchRenderModelComponentName54); + stringBuilder.Append(rchRenderModelComponentName55); + stringBuilder.Append(rchRenderModelComponentName56); + stringBuilder.Append(rchRenderModelComponentName57); + stringBuilder.Append(rchRenderModelComponentName58); + stringBuilder.Append(rchRenderModelComponentName59); + stringBuilder.Append(rchRenderModelComponentName60); + stringBuilder.Append(rchRenderModelComponentName61); + stringBuilder.Append(rchRenderModelComponentName62); + stringBuilder.Append(rchRenderModelComponentName63); + stringBuilder.Append(rchRenderModelComponentName64); + stringBuilder.Append(rchRenderModelComponentName65); + stringBuilder.Append(rchRenderModelComponentName66); + stringBuilder.Append(rchRenderModelComponentName67); + stringBuilder.Append(rchRenderModelComponentName68); + stringBuilder.Append(rchRenderModelComponentName69); + stringBuilder.Append(rchRenderModelComponentName70); + stringBuilder.Append(rchRenderModelComponentName71); + stringBuilder.Append(rchRenderModelComponentName72); + stringBuilder.Append(rchRenderModelComponentName73); + stringBuilder.Append(rchRenderModelComponentName74); + stringBuilder.Append(rchRenderModelComponentName75); + stringBuilder.Append(rchRenderModelComponentName76); + stringBuilder.Append(rchRenderModelComponentName77); + stringBuilder.Append(rchRenderModelComponentName78); + stringBuilder.Append(rchRenderModelComponentName79); + stringBuilder.Append(rchRenderModelComponentName80); + stringBuilder.Append(rchRenderModelComponentName81); + stringBuilder.Append(rchRenderModelComponentName82); + stringBuilder.Append(rchRenderModelComponentName83); + stringBuilder.Append(rchRenderModelComponentName84); + stringBuilder.Append(rchRenderModelComponentName85); + stringBuilder.Append(rchRenderModelComponentName86); + stringBuilder.Append(rchRenderModelComponentName87); + stringBuilder.Append(rchRenderModelComponentName88); + stringBuilder.Append(rchRenderModelComponentName89); + stringBuilder.Append(rchRenderModelComponentName90); + stringBuilder.Append(rchRenderModelComponentName91); + stringBuilder.Append(rchRenderModelComponentName92); + stringBuilder.Append(rchRenderModelComponentName93); + stringBuilder.Append(rchRenderModelComponentName94); + stringBuilder.Append(rchRenderModelComponentName95); + stringBuilder.Append(rchRenderModelComponentName96); + stringBuilder.Append(rchRenderModelComponentName97); + stringBuilder.Append(rchRenderModelComponentName98); + stringBuilder.Append(rchRenderModelComponentName99); + stringBuilder.Append(rchRenderModelComponentName100); + stringBuilder.Append(rchRenderModelComponentName101); + stringBuilder.Append(rchRenderModelComponentName102); + stringBuilder.Append(rchRenderModelComponentName103); + stringBuilder.Append(rchRenderModelComponentName104); + stringBuilder.Append(rchRenderModelComponentName105); + stringBuilder.Append(rchRenderModelComponentName106); + stringBuilder.Append(rchRenderModelComponentName107); + stringBuilder.Append(rchRenderModelComponentName108); + stringBuilder.Append(rchRenderModelComponentName109); + stringBuilder.Append(rchRenderModelComponentName110); + stringBuilder.Append(rchRenderModelComponentName111); + stringBuilder.Append(rchRenderModelComponentName112); + stringBuilder.Append(rchRenderModelComponentName113); + stringBuilder.Append(rchRenderModelComponentName114); + stringBuilder.Append(rchRenderModelComponentName115); + stringBuilder.Append(rchRenderModelComponentName116); + stringBuilder.Append(rchRenderModelComponentName117); + stringBuilder.Append(rchRenderModelComponentName118); + stringBuilder.Append(rchRenderModelComponentName119); + stringBuilder.Append(rchRenderModelComponentName120); + stringBuilder.Append(rchRenderModelComponentName121); + stringBuilder.Append(rchRenderModelComponentName122); + stringBuilder.Append(rchRenderModelComponentName123); + stringBuilder.Append(rchRenderModelComponentName124); + stringBuilder.Append(rchRenderModelComponentName125); + stringBuilder.Append(rchRenderModelComponentName126); + stringBuilder.Append(rchRenderModelComponentName127); + return stringBuilder.ToString(); + } + } +} +[StructLayout(LayoutKind.Sequential)] public struct VRActiveActionSet_t +{ + public ulong ulActionSet; + public ulong ulRestrictedToDevice; + public ulong ulSecondaryActionSet; + public uint unPadding; + public int nPriority; +} +[StructLayout(LayoutKind.Sequential)] public struct SpatialAnchorPose_t +{ + public HmdMatrix34_t mAnchorToAbsoluteTracking; +} +[StructLayout(LayoutKind.Sequential)] public struct COpenVRContext +{ + public IntPtr m_pVRSystem; // class vr::IVRSystem * + public IntPtr m_pVRChaperone; // class vr::IVRChaperone * + public IntPtr m_pVRChaperoneSetup; // class vr::IVRChaperoneSetup * + public IntPtr m_pVRCompositor; // class vr::IVRCompositor * + public IntPtr m_pVROverlay; // class vr::IVROverlay * + public IntPtr m_pVRResources; // class vr::IVRResources * + public IntPtr m_pVRRenderModels; // class vr::IVRRenderModels * + public IntPtr m_pVRExtendedDisplay; // class vr::IVRExtendedDisplay * + public IntPtr m_pVRSettings; // class vr::IVRSettings * + public IntPtr m_pVRApplications; // class vr::IVRApplications * + public IntPtr m_pVRTrackedCamera; // class vr::IVRTrackedCamera * + public IntPtr m_pVRScreenshots; // class vr::IVRScreenshots * + public IntPtr m_pVRDriverManager; // class vr::IVRDriverManager * + public IntPtr m_pVRInput; // class vr::IVRInput * + public IntPtr m_pVRIOBuffer; // class vr::IVRIOBuffer * + public IntPtr m_pVRSpatialAnchors; // class vr::IVRSpatialAnchors * +} + +public class OpenVR +{ + + public static uint InitInternal(ref EVRInitError peError, EVRApplicationType eApplicationType) + { + return OpenVRInterop.InitInternal(ref peError, eApplicationType); + } + + public static uint InitInternal2(ref EVRInitError peError, EVRApplicationType eApplicationType, string pchStartupInfo) + { + return OpenVRInterop.InitInternal2(ref peError, eApplicationType, pchStartupInfo); + } + + public static void ShutdownInternal() + { + OpenVRInterop.ShutdownInternal(); + } + + public static bool IsHmdPresent() + { + return OpenVRInterop.IsHmdPresent(); + } + + public static bool IsRuntimeInstalled() + { + return OpenVRInterop.IsRuntimeInstalled(); + } + + public static string GetStringForHmdError(EVRInitError error) + { + return Marshal.PtrToStringAnsi(OpenVRInterop.GetStringForHmdError(error)); + } + + public static IntPtr GetGenericInterface(string pchInterfaceVersion, ref EVRInitError peError) + { + return OpenVRInterop.GetGenericInterface(pchInterfaceVersion, ref peError); + } + + public static bool IsInterfaceVersionValid(string pchInterfaceVersion) + { + return OpenVRInterop.IsInterfaceVersionValid(pchInterfaceVersion); + } + + public static uint GetInitToken() + { + return OpenVRInterop.GetInitToken(); + } + + public const uint k_nDriverNone = 4294967295; + public const uint k_unMaxDriverDebugResponseSize = 32768; + public const uint k_unTrackedDeviceIndex_Hmd = 0; + public const uint k_unMaxTrackedDeviceCount = 64; + public const uint k_unTrackedDeviceIndexOther = 4294967294; + public const uint k_unTrackedDeviceIndexInvalid = 4294967295; + public const ulong k_ulInvalidPropertyContainer = 0; + public const uint k_unInvalidPropertyTag = 0; + public const ulong k_ulInvalidDriverHandle = 0; + public const uint k_unFloatPropertyTag = 1; + public const uint k_unInt32PropertyTag = 2; + public const uint k_unUint64PropertyTag = 3; + public const uint k_unBoolPropertyTag = 4; + public const uint k_unStringPropertyTag = 5; + public const uint k_unHmdMatrix34PropertyTag = 20; + public const uint k_unHmdMatrix44PropertyTag = 21; + public const uint k_unHmdVector3PropertyTag = 22; + public const uint k_unHmdVector4PropertyTag = 23; + public const uint k_unHiddenAreaPropertyTag = 30; + public const uint k_unPathHandleInfoTag = 31; + public const uint k_unActionPropertyTag = 32; + public const uint k_unInputValuePropertyTag = 33; + public const uint k_unWildcardPropertyTag = 34; + public const uint k_unHapticVibrationPropertyTag = 35; + public const uint k_unSkeletonPropertyTag = 36; + public const uint k_unSpatialAnchorPosePropertyTag = 40; + public const uint k_unOpenVRInternalReserved_Start = 1000; + public const uint k_unOpenVRInternalReserved_End = 10000; + public const uint k_unMaxPropertyStringSize = 32768; + public const ulong k_ulInvalidActionHandle = 0; + public const ulong k_ulInvalidActionSetHandle = 0; + public const ulong k_ulInvalidInputValueHandle = 0; + public const uint k_unControllerStateAxisCount = 5; + public const ulong k_ulOverlayHandleInvalid = 0; + public const uint k_unScreenshotHandleInvalid = 0; + public const string IVRSystem_Version = "IVRSystem_019"; + public const string IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; + public const string IVRTrackedCamera_Version = "IVRTrackedCamera_003"; + public const uint k_unMaxApplicationKeyLength = 128; + public const string k_pch_MimeType_HomeApp = "vr/home"; + public const string k_pch_MimeType_GameTheater = "vr/game_theater"; + public const string IVRApplications_Version = "IVRApplications_006"; + public const string IVRChaperone_Version = "IVRChaperone_003"; + public const string IVRChaperoneSetup_Version = "IVRChaperoneSetup_005"; + public const string IVRCompositor_Version = "IVRCompositor_022"; + public const uint k_unVROverlayMaxKeyLength = 128; + public const uint k_unVROverlayMaxNameLength = 128; + public const uint k_unMaxOverlayCount = 64; + public const uint k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; + public const string IVROverlay_Version = "IVROverlay_018"; + public const string k_pch_Controller_Component_GDC2015 = "gdc2015"; + public const string k_pch_Controller_Component_Base = "base"; + public const string k_pch_Controller_Component_Tip = "tip"; + public const string k_pch_Controller_Component_HandGrip = "handgrip"; + public const string k_pch_Controller_Component_Status = "status"; + public const string IVRRenderModels_Version = "IVRRenderModels_006"; + public const uint k_unNotificationTextMaxSize = 256; + public const string IVRNotifications_Version = "IVRNotifications_002"; + public const uint k_unMaxSettingsKeyLength = 128; + public const string IVRSettings_Version = "IVRSettings_002"; + public const string k_pch_SteamVR_Section = "steamvr"; + public const string k_pch_SteamVR_RequireHmd_String = "requireHmd"; + public const string k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; + public const string k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; + public const string k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; + public const string k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; + public const string k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; + public const string k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; + public const string k_pch_SteamVR_SendSystemButtonToAllApps_Bool = "sendSystemButtonToAllApps"; + public const string k_pch_SteamVR_LogLevel_Int32 = "loglevel"; + public const string k_pch_SteamVR_IPD_Float = "ipd"; + public const string k_pch_SteamVR_Background_String = "background"; + public const string k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; + public const string k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; + public const string k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; + public const string k_pch_SteamVR_GridColor_String = "gridColor"; + public const string k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; + public const string k_pch_SteamVR_ShowStage_Bool = "showStage"; + public const string k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; + public const string k_pch_SteamVR_DirectMode_Bool = "directMode"; + public const string k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; + public const string k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; + public const string k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; + public const string k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; + public const string k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; + public const string k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; + public const string k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; + public const string k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; + public const string k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; + public const string k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; + public const string k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; + public const string k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; + public const string k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; + public const string k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; + public const string k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; + public const string k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; + public const string k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; + public const string k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; + public const string k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; + public const string k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; + public const string k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; + public const string k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + public const string k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; + public const string k_pch_SteamVR_SupersampleManualOverride_Bool = "supersampleManualOverride"; + public const string k_pch_SteamVR_EnableLinuxVulkanAsync_Bool = "enableLinuxVulkanAsync"; + public const string k_pch_SteamVR_AllowDisplayLockedMode_Bool = "allowDisplayLockedMode"; + public const string k_pch_SteamVR_HaveStartedTutorialForNativeChaperoneDriver_Bool = "haveStartedTutorialForNativeChaperoneDriver"; + public const string k_pch_SteamVR_ForceWindows32bitVRMonitor = "forceWindows32BitVRMonitor"; + public const string k_pch_SteamVR_DebugInput = "debugInput"; + public const string k_pch_SteamVR_LegacyInputRebinding = "legacyInputRebinding"; + public const string k_pch_SteamVR_DebugInputBinding = "debugInputBinding"; + public const string k_pch_SteamVR_InputBindingUIBlock = "inputBindingUI"; + public const string k_pch_SteamVR_RenderCameraMode = "renderCameraMode"; + public const string k_pch_Lighthouse_Section = "driver_lighthouse"; + public const string k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; + public const string k_pch_Lighthouse_DisableIMUExceptHMD_Bool = "disableimuexcepthmd"; + public const string k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; + public const string k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; + public const string k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; + public const string k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; + public const string k_pch_Lighthouse_EnableBluetooth_Bool = "enableBluetooth"; + public const string k_pch_Lighthouse_PowerManagedBaseStations_String = "PowerManagedBaseStations"; + public const string k_pch_Null_Section = "driver_null"; + public const string k_pch_Null_SerialNumber_String = "serialNumber"; + public const string k_pch_Null_ModelNumber_String = "modelNumber"; + public const string k_pch_Null_WindowX_Int32 = "windowX"; + public const string k_pch_Null_WindowY_Int32 = "windowY"; + public const string k_pch_Null_WindowWidth_Int32 = "windowWidth"; + public const string k_pch_Null_WindowHeight_Int32 = "windowHeight"; + public const string k_pch_Null_RenderWidth_Int32 = "renderWidth"; + public const string k_pch_Null_RenderHeight_Int32 = "renderHeight"; + public const string k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; + public const string k_pch_Null_DisplayFrequency_Float = "displayFrequency"; + public const string k_pch_UserInterface_Section = "userinterface"; + public const string k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; + public const string k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; + public const string k_pch_UserInterface_Screenshots_Bool = "screenshots"; + public const string k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; + public const string k_pch_Notifications_Section = "notifications"; + public const string k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; + public const string k_pch_Keyboard_Section = "keyboard"; + public const string k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; + public const string k_pch_Keyboard_ScaleX = "ScaleX"; + public const string k_pch_Keyboard_ScaleY = "ScaleY"; + public const string k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; + public const string k_pch_Keyboard_OffsetRightX = "OffsetRightX"; + public const string k_pch_Keyboard_OffsetY = "OffsetY"; + public const string k_pch_Keyboard_Smoothing = "Smoothing"; + public const string k_pch_Perf_Section = "perfcheck"; + public const string k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; + public const string k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; + public const string k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; + public const string k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; + public const string k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; + public const string k_pch_Perf_TestData_Float = "perfTestData"; + public const string k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; + public const string k_pch_CollisionBounds_Section = "collisionBounds"; + public const string k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; + public const string k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; + public const string k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; + public const string k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; + public const string k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; + public const string k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; + public const string k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; + public const string k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; + public const string k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; + public const string k_pch_Camera_Section = "camera"; + public const string k_pch_Camera_EnableCamera_Bool = "enableCamera"; + public const string k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; + public const string k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; + public const string k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; + public const string k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; + public const string k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; + public const string k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; + public const string k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; + public const string k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; + public const string k_pch_Camera_RoomViewMode_Int32 = "cameraRoomViewMode"; + public const string k_pch_audio_Section = "audio"; + public const string k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; + public const string k_pch_audio_OnRecordDevice_String = "onRecordDevice"; + public const string k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; + public const string k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; + public const string k_pch_audio_OffRecordDevice_String = "offRecordDevice"; + public const string k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; + public const string k_pch_Power_Section = "power"; + public const string k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; + public const string k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; + public const string k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; + public const string k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; + public const string k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + public const string k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby"; + public const string k_pch_Dashboard_Section = "dashboard"; + public const string k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; + public const string k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; + public const string k_pch_Dashboard_EnableWebUI = "webUI"; + public const string k_pch_Dashboard_EnableWebUIDevTools = "webUIDevTools"; + public const string k_pch_Dashboard_EnableWebUIDashboardReplacement = "webUIDashboard"; + public const string k_pch_modelskin_Section = "modelskins"; + public const string k_pch_Driver_Enable_Bool = "enable"; + public const string k_pch_WebInterface_Section = "WebInterface"; + public const string k_pch_WebInterface_WebEnable_Bool = "WebEnable"; + public const string k_pch_WebInterface_WebPort_String = "WebPort"; + public const string k_pch_TrackingOverride_Section = "TrackingOverrides"; + public const string k_pch_App_BindingAutosaveURLSuffix_String = "AutosaveURL"; + public const string k_pch_App_BindingCurrentURLSuffix_String = "CurrentURL"; + public const string k_pch_App_NeedToUpdateAutosaveSuffix_Bool = "NeedToUpdateAutosave"; + public const string k_pch_App_ActionManifestURL_String = "ActionManifestURL"; + public const string k_pch_Trackers_Section = "trackers"; + public const string IVRScreenshots_Version = "IVRScreenshots_001"; + public const string IVRResources_Version = "IVRResources_001"; + public const string IVRDriverManager_Version = "IVRDriverManager_001"; + public const uint k_unMaxActionNameLength = 64; + public const uint k_unMaxActionSetNameLength = 64; + public const uint k_unMaxActionOriginCount = 16; + public const string IVRInput_Version = "IVRInput_004"; + public const ulong k_ulInvalidIOBufferHandle = 0; + public const string IVRIOBuffer_Version = "IVRIOBuffer_001"; + public const uint k_ulInvalidSpatialAnchorHandle = 0; + public const string IVRSpatialAnchors_Version = "IVRSpatialAnchors_001"; + + static uint VRToken { get; set; } + + const string FnTable_Prefix = "FnTable:"; + + class COpenVRContext + { + public COpenVRContext() { Clear(); } + + public void Clear() + { + m_pVRSystem = null; + m_pVRChaperone = null; + m_pVRChaperoneSetup = null; + m_pVRCompositor = null; + m_pVROverlay = null; + m_pVRRenderModels = null; + m_pVRExtendedDisplay = null; + m_pVRSettings = null; + m_pVRApplications = null; + m_pVRScreenshots = null; + m_pVRTrackedCamera = null; + m_pVRInput = null; + m_pVRSpatialAnchors = null; + } + + void CheckClear() + { + if (VRToken != GetInitToken()) + { + Clear(); + VRToken = GetInitToken(); + } + } + + public CVRSystem VRSystem() + { + CheckClear(); + if (m_pVRSystem == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRSystem_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRSystem = new CVRSystem(pInterface); + } + return m_pVRSystem; + } + + public CVRChaperone VRChaperone() + { + CheckClear(); + if (m_pVRChaperone == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRChaperone_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRChaperone = new CVRChaperone(pInterface); + } + return m_pVRChaperone; + } + + public CVRChaperoneSetup VRChaperoneSetup() + { + CheckClear(); + if (m_pVRChaperoneSetup == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRChaperoneSetup_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRChaperoneSetup = new CVRChaperoneSetup(pInterface); + } + return m_pVRChaperoneSetup; + } + + public CVRCompositor VRCompositor() + { + CheckClear(); + if (m_pVRCompositor == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRCompositor_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRCompositor = new CVRCompositor(pInterface); + } + return m_pVRCompositor; + } + + public CVROverlay VROverlay() + { + CheckClear(); + if (m_pVROverlay == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVROverlay_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVROverlay = new CVROverlay(pInterface); + } + return m_pVROverlay; + } + + public CVRRenderModels VRRenderModels() + { + CheckClear(); + if (m_pVRRenderModels == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRRenderModels_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRRenderModels = new CVRRenderModels(pInterface); + } + return m_pVRRenderModels; + } + + public CVRExtendedDisplay VRExtendedDisplay() + { + CheckClear(); + if (m_pVRExtendedDisplay == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRExtendedDisplay_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRExtendedDisplay = new CVRExtendedDisplay(pInterface); + } + return m_pVRExtendedDisplay; + } + + public CVRSettings VRSettings() + { + CheckClear(); + if (m_pVRSettings == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRSettings_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRSettings = new CVRSettings(pInterface); + } + return m_pVRSettings; + } + + public CVRApplications VRApplications() + { + CheckClear(); + if (m_pVRApplications == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRApplications_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRApplications = new CVRApplications(pInterface); + } + return m_pVRApplications; + } + + public CVRScreenshots VRScreenshots() + { + CheckClear(); + if (m_pVRScreenshots == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRScreenshots_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRScreenshots = new CVRScreenshots(pInterface); + } + return m_pVRScreenshots; + } + + public CVRTrackedCamera VRTrackedCamera() + { + CheckClear(); + if (m_pVRTrackedCamera == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRTrackedCamera_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRTrackedCamera = new CVRTrackedCamera(pInterface); + } + return m_pVRTrackedCamera; + } + + public CVRInput VRInput() + { + CheckClear(); + if (m_pVRInput == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRInput_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRInput = new CVRInput(pInterface); + } + return m_pVRInput; + } + + public CVRSpatialAnchors VRSpatialAnchors() + { + CheckClear(); + if (m_pVRSpatialAnchors == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix + IVRSpatialAnchors_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRSpatialAnchors = new CVRSpatialAnchors(pInterface); + } + return m_pVRSpatialAnchors; + } + + private CVRSystem m_pVRSystem; + private CVRChaperone m_pVRChaperone; + private CVRChaperoneSetup m_pVRChaperoneSetup; + private CVRCompositor m_pVRCompositor; + private CVROverlay m_pVROverlay; + private CVRRenderModels m_pVRRenderModels; + private CVRExtendedDisplay m_pVRExtendedDisplay; + private CVRSettings m_pVRSettings; + private CVRApplications m_pVRApplications; + private CVRScreenshots m_pVRScreenshots; + private CVRTrackedCamera m_pVRTrackedCamera; + private CVRInput m_pVRInput; + private CVRSpatialAnchors m_pVRSpatialAnchors; + }; + + private static COpenVRContext _OpenVRInternal_ModuleContext = null; + static COpenVRContext OpenVRInternal_ModuleContext + { + get + { + if (_OpenVRInternal_ModuleContext == null) + _OpenVRInternal_ModuleContext = new COpenVRContext(); + return _OpenVRInternal_ModuleContext; + } + } + + public static CVRSystem System { get { return OpenVRInternal_ModuleContext.VRSystem(); } } + public static CVRChaperone Chaperone { get { return OpenVRInternal_ModuleContext.VRChaperone(); } } + public static CVRChaperoneSetup ChaperoneSetup { get { return OpenVRInternal_ModuleContext.VRChaperoneSetup(); } } + public static CVRCompositor Compositor { get { return OpenVRInternal_ModuleContext.VRCompositor(); } } + public static CVROverlay Overlay { get { return OpenVRInternal_ModuleContext.VROverlay(); } } + public static CVRRenderModels RenderModels { get { return OpenVRInternal_ModuleContext.VRRenderModels(); } } + public static CVRExtendedDisplay ExtendedDisplay { get { return OpenVRInternal_ModuleContext.VRExtendedDisplay(); } } + public static CVRSettings Settings { get { return OpenVRInternal_ModuleContext.VRSettings(); } } + public static CVRApplications Applications { get { return OpenVRInternal_ModuleContext.VRApplications(); } } + public static CVRScreenshots Screenshots { get { return OpenVRInternal_ModuleContext.VRScreenshots(); } } + public static CVRTrackedCamera TrackedCamera { get { return OpenVRInternal_ModuleContext.VRTrackedCamera(); } } + public static CVRInput Input { get { return OpenVRInternal_ModuleContext.VRInput(); } } + public static CVRSpatialAnchors SpatialAnchors { get { return OpenVRInternal_ModuleContext.VRSpatialAnchors(); } } + + /** Finds the active installation of vrclient.dll and initializes it */ + public static CVRSystem Init(ref EVRInitError peError, EVRApplicationType eApplicationType = EVRApplicationType.VRApplication_Scene, string pchStartupInfo= "") + { + try + { + VRToken = InitInternal2(ref peError, eApplicationType, pchStartupInfo); + } + catch (EntryPointNotFoundException) + { + VRToken = InitInternal(ref peError, eApplicationType); + } + + OpenVRInternal_ModuleContext.Clear(); + + if (peError != EVRInitError.None) + return null; + + bool bInterfaceValid = IsInterfaceVersionValid(IVRSystem_Version); + if (!bInterfaceValid) + { + ShutdownInternal(); + peError = EVRInitError.Init_InterfaceNotFound; + return null; + } + + return OpenVR.System; + } + + /** unloads vrclient.dll. Any interface pointers from the interface are + * invalid after this point */ + public static void Shutdown() + { + ShutdownInternal(); + } + +} + + + +} + diff --git a/Assets/Oculus/VR/ThirdParty/openvr_api.cs.meta b/Assets/Oculus/VR/ThirdParty/openvr_api.cs.meta new file mode 100644 index 0000000..5d8ede7 --- /dev/null +++ b/Assets/Oculus/VR/ThirdParty/openvr_api.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4c67f43f52cf38445a66e0ccabcd3ce1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta new file mode 100644 index 0000000..9aee697 --- /dev/null +++ b/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9336a09ecbcffef46a6ab4e0b59d703d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes.meta b/Assets/Scenes.meta new file mode 100644 index 0000000..8bc75dd --- /dev/null +++ b/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2f3a0276d3ced9644a5e2860c1ab2ce4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Main.meta b/Assets/Scenes/Main.meta new file mode 100644 index 0000000..e0750c0 --- /dev/null +++ b/Assets/Scenes/Main.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0733968e7ad8ff543b8ac514f5a0d55a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity new file mode 100644 index 0000000..ab8c59c --- /dev/null +++ b/Assets/Scenes/Main.unity @@ -0,0 +1,690 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 1 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 10 + m_AtlasSize: 512 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 256 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 112000000, guid: 865a2b91d9c24344cbc7201afdfc065b, + type: 2} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &112711653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 112711654} + - component: {fileID: 112711655} + m_Layer: 0 + m_Name: Monolith + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &112711654 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 112711653} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &112711655 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 112711653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5d96993c613bbe2419e922467c254f3d, type: 3} + m_Name: + m_EditorClassIdentifier: + input: + rig: {fileID: 162671504} + head: {fileID: 370173446} + leftHanded: 0 + mainCon: + trigger: + down: 0 + held: 0 + up: 0 + one: + down: 0 + held: 0 + up: 0 + two: + down: 0 + held: 0 + up: 0 + offCon: + trigger: + down: 0 + held: 0 + up: 0 + one: + down: 0 + held: 0 + up: 0 + two: + down: 0 + held: 0 + up: 0 + twistCursor: {x: 0, y: 0, z: 0} + pixelgon: + vectors: [] + assetSpace: + folderPath: C:/dofdev/Pixelgon/Assets/AssetSpace + name: draft + toolNewVector: + cursorPos: {x: 0, y: 0, z: 0} + vector: [] + toolEditVector: + cursorPos: {x: 0, y: 0, z: 0} + selecting: 0 + moving: 0 + fromCorner: {x: 0, y: 0, z: 0} + toCorner: {x: 0, y: 0, z: 0} + selected: + toolEraser: + cursorPos: {x: 0, y: 0, z: 0} + selected: + stretchSilo: + structure: {x: 0, y: 0, z: 0} + render: + polyVector: + vectorScale: 0.2 + meshJoint: {fileID: -5658524651756503351, guid: dc6240c783ee7974e8811c10e071e0cc, + type: 3} + meshVector: {fileID: -3149996399109167922, guid: dc6240c783ee7974e8811c10e071e0cc, + type: 3} + matVector: {fileID: 2100000, guid: 2ed3922fd675db6428789df9f6b481aa, type: 2} + meshOriel: {fileID: -9071155252399151903, guid: dc6240c783ee7974e8811c10e071e0cc, + type: 3} + meshAxis: {fileID: -6029220463044473203, guid: dc6240c783ee7974e8811c10e071e0cc, + type: 3} + meshCursor: {fileID: 4575378312840820631, guid: dc6240c783ee7974e8811c10e071e0cc, + type: 3} + meshJointSelect: {fileID: -3971694286724400003, guid: dc6240c783ee7974e8811c10e071e0cc, + type: 3} + matOriel: {fileID: 2100000, guid: cb32a15bb95b4e742934a8a6189de671, type: 2} + matCursor: {fileID: 2100000, guid: bc96986534497c74fa9005a553555117, type: 2} + matUnlit: {fileID: 2100000, guid: 16bc6a8dc30e9184aae9597dfb7e7a2f, type: 2} + matQuad: {fileID: 2100000, guid: cac4176fae540bb4babebf99ead4d488, type: 2} + matVertexLit: {fileID: 2100000, guid: 262bfa3f5d11ba44db0c4a3f69e6808a, type: 2} + matSelect: {fileID: 2100000, guid: 6e36f9266828f5e468e68993117d2d6d, type: 2} + meshToolNewVector: {fileID: 6254183033293086303, guid: dc6240c783ee7974e8811c10e071e0cc, + type: 3} + meshToolEditVector: {fileID: -915222330901656287, guid: dc6240c783ee7974e8811c10e071e0cc, + type: 3} + meshBoxSelect: {fileID: -9071155252399151903, guid: dc6240c783ee7974e8811c10e071e0cc, + type: 3} + meshToolEraser: {fileID: -2868880653068191277, guid: dc6240c783ee7974e8811c10e071e0cc, + type: 3} + scene: 0 +--- !u!1 &162671503 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 162671504} + m_Layer: 0 + m_Name: Rig + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &162671504 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 162671503} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.6666} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 370173446} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &370173443 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 370173446} + - component: {fileID: 370173445} + - component: {fileID: 370173444} + - component: {fileID: 370173447} + m_Layer: 0 + m_Name: Head + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &370173444 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 370173443} + m_Enabled: 1 +--- !u!20 &370173445 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 370173443} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.5, g: 0.5, b: 0.5, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.01 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &370173446 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 370173443} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 162671504} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &370173447 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 370173443} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7e933e81d3c20c74ea6fdc708a67e3a5, type: 3} + m_Name: + m_EditorClassIdentifier: + queueAhead: 1 + useRecommendedMSAALevel: 1 + _monoscopic: 0 + enableAdaptiveResolution: 0 + minRenderScale: 0.7 + maxRenderScale: 1 + _headPoseRelativeOffsetRotation: {x: 0, y: 0, z: 0} + _headPoseRelativeOffsetTranslation: {x: 0, y: 0, z: 0} + profilerTcpPort: 32419 + expandMixedRealityCapturePropertySheet: 0 + enableMixedReality: 0 + compositionMethod: 0 + extraHiddenLayers: + serializedVersion: 2 + m_Bits: 0 + externalCompositionBackdropColorRift: {r: 0, g: 1, b: 0, a: 1} + externalCompositionBackdropColorQuest: {r: 0, g: 0, b: 0, a: 0} + capturingCameraDevice: 0 + flipCameraFrameHorizontally: 0 + flipCameraFrameVertically: 0 + handPoseStateLatency: 0 + sandwichCompositionRenderLatency: 0 + sandwichCompositionBufferedFrames: 8 + chromaKeyColor: {r: 0, g: 1, b: 0, a: 1} + chromaKeySimilarity: 0.6 + chromaKeySmoothRange: 0.03 + chromaKeySpillRange: 0.06 + useDynamicLighting: 0 + depthQuality: 1 + dynamicLightingSmoothFactor: 8 + dynamicLightingDepthVariationClampingValue: 0.001 + virtualGreenScreenType: 0 + virtualGreenScreenTopY: 10 + virtualGreenScreenBottomY: -10 + virtualGreenScreenApplyDepthCulling: 0 + virtualGreenScreenDepthTolerance: 0.2 + mrcActivationMode: 0 + _trackingOriginType: 0 + usePositionTracking: 1 + useRotationTracking: 1 + useIPDInPositionTracking: 1 + resetTrackerOnLoad: 0 + AllowRecenter: 1 + _reorientHMDOnControllerRecenter: 1 + LateControllerUpdate: 1 +--- !u!1 &381735145 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 381735150} + - component: {fileID: 381735149} + - component: {fileID: 381735148} + - component: {fileID: 381735147} + - component: {fileID: 381735146} + m_Layer: 0 + m_Name: Tool + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!54 &381735146 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 381735145} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!64 &381735147 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 381735145} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Convex: 1 + m_CookingOptions: 30 + m_Mesh: {fileID: 6254183033293086303, guid: dc6240c783ee7974e8811c10e071e0cc, type: 3} +--- !u!23 &381735148 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 381735145} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 262bfa3f5d11ba44db0c4a3f69e6808a, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &381735149 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 381735145} + m_Mesh: {fileID: 6254183033293086303, guid: dc6240c783ee7974e8811c10e071e0cc, type: 3} +--- !u!4 &381735150 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 381735145} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &913361947 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 913361948} + - component: {fileID: 913361950} + - component: {fileID: 913361949} + m_Layer: 0 + m_Name: Planar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &913361948 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 913361947} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &913361949 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 913361947} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: cac4176fae540bb4babebf99ead4d488, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &913361950 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 913361947} + m_Mesh: {fileID: 4300012, guid: 84c37137326e7b943a87be7ae2a7ea19, type: 3} +--- !u!1 &1464358247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1464358250} + - component: {fileID: 1464358249} + - component: {fileID: 1464358248} + m_Layer: 0 + m_Name: ColorCube Temp + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!23 &1464358248 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1464358247} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: c3de9a0e70a4a1d47a89c83a47c292d1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1464358249 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1464358247} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1464358250 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1464358247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.25, y: -0.16, z: -0.1} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Scenes/Main.unity.meta b/Assets/Scenes/Main.unity.meta new file mode 100644 index 0000000..a052785 --- /dev/null +++ b/Assets/Scenes/Main.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6c6eb4352a9beaf4aa1ca0f2fad9fc53 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Main/LightingData.asset b/Assets/Scenes/Main/LightingData.asset new file mode 100644 index 0000000..1db115b Binary files /dev/null and b/Assets/Scenes/Main/LightingData.asset differ diff --git a/Assets/Scenes/Main/LightingData.asset.meta b/Assets/Scenes/Main/LightingData.asset.meta new file mode 100644 index 0000000..b9de33a --- /dev/null +++ b/Assets/Scenes/Main/LightingData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 865a2b91d9c24344cbc7201afdfc065b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts.meta b/Assets/Scripts.meta new file mode 100644 index 0000000..016eab5 --- /dev/null +++ b/Assets/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ac3ea0df49c82b242983f8aa2a614b06 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/AssetSpace.cs b/Assets/Scripts/AssetSpace.cs new file mode 100644 index 0000000..fa5f8c4 --- /dev/null +++ b/Assets/Scripts/AssetSpace.cs @@ -0,0 +1,284 @@ +using UnityEngine; +using System; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; +using System.Collections; +using System.Collections.Generic; +using SerializableTypes; + +[Serializable] +public class AssetSpace +{ + public string folderPath = "C:/dofdev/Pixelgon/Assets/AssetSpace"; + public string name = "draft"; + + public List loadedNames = new List(); + public Dictionary assets = new Dictionary(); + + public void Init(PolyVector polyVector) + { + // Update Mesh Dictionary + // loop through files in folder + loadedNames.Clear(); + assets.Clear(); + + string[] filePaths = Directory.GetFiles(folderPath, "*.pixelgon", SearchOption.TopDirectoryOnly); + for (int i = 0; i < filePaths.Length; i++) + { + name = Path.GetFileNameWithoutExtension(filePaths[i]); + loadedNames.Add(name); + Pixelgon pgon = Load(); + Mesh mesh = new Mesh(); + mesh = polyVector.ToMesh(pgon.vectors); + Asset asset = new Asset(); + asset.mesh = mesh; + assets.Add(name, asset); + } + + // load draft.space file + } + + string held = null; + Vector3 grabOffset; + public void Frame(Input input, Render render) + { + // instead of a rigid uniform list + // make it a space where you can lay things out + float closest = 1000f; + for (int i = 0; i < loadedNames.Count; i++) + { + Asset asset = assets[loadedNames[i]]; + Graphics.DrawMesh(asset.mesh, + asset.pos, asset.rot, + render.polyVector.matVector, 0 + ); + + if (input.mainCon.trigger.down) + { + float reachDist = Vector3.Distance(asset.pos, input.twistCursor); + if (reachDist < closest) + { + held = loadedNames[i]; + closest = reachDist; + grabOffset = asset.pos - input.twistCursor; + } + } + } + + if (input.mainCon.trigger.held) + { + if (held != null) + { + if (input.mainCon.one.up) + { + grabOffset = assets[held].pos - input.twistCursor; + } + + if (input.mainCon.one.held) + { + assets[held].rot = Quaternion.LookRotation(input.twistCursor - assets[held].pos); + } + else + { + assets[held].pos = input.twistCursor + grabOffset; + } + } + } + else + { + held = null; + } + + // where to store persistent position and rotation? + // needs to be saved in the .pixelgon file then + // can assetspace have its own save file instead? + // store the name pos and rotation ++animationPath + // Later you can have multiple persistent spaces + + + // stream lining features *just manually do it in the unity inspector for now + // and switch to editing a certain object + // buttons in the oriel? + + // set name + // asset names (no renaming just save new or over, manually delete the deprecated) + // save + // load + + // recordable motion paths + // control over time + } + + public void Save(Pixelgon pixelgon) + { + string destination = folderPath + "/" + name + ".pixelgon"; + FileStream file; + + if (File.Exists(destination)) file = File.OpenWrite(destination); + else file = File.Create(destination); + + BinaryFormatter bf = new BinaryFormatter(); + FPixelgon fPixelgon = new FPixelgon(); + fPixelgon.vectors = new SVector3[pixelgon.vectors.Count]; + for (int i = 0; i < pixelgon.vectors.Count; i++) + { + SVector3 vec3 = pixelgon.vectors[i]; + fPixelgon.vectors[i] = vec3; + } + bf.Serialize(file, fPixelgon); + file.Close(); + } + + public Pixelgon Load() + { + string destination = folderPath + "/" + name + ".pixelgon"; + FileStream file; + + if (File.Exists(destination)) file = File.OpenRead(destination); + else + { + Debug.LogError("File not found"); + return null; + } + + BinaryFormatter bf = new BinaryFormatter(); + FPixelgon fPixelgon = (FPixelgon)bf.Deserialize(file); + Pixelgon pixelgon = new Pixelgon(); + for (int i = 0; i < fPixelgon.vectors.Length; i++) + { + Vector3 vec3 = fPixelgon.vectors[i]; + pixelgon.vectors.Add(vec3); + } + file.Close(); + return pixelgon; + } +} + +[Serializable] +public class Asset +{ + public Mesh mesh; + public Vector3 pos; + public Quaternion rot; +} + +[Serializable] +public class FAssetSpace +{ + // public class Placement + // { + // public SerializableVector3 pos + // } +} + +[Serializable] +public class FPixelgon +{ + public SVector3[] vectors; +} + +namespace SerializableTypes +{ + /// Serializable version of UnityEngine.Vector3. + [Serializable] + public struct SVector3 + { + public float x; + public float y; + public float z; + + public SVector3(float x, float y, float z) + { + this.x = x; + this.y = y; + this.z = z; + } + + public override string ToString() + => $"[x, y, z]"; + + public static implicit operator Vector3(SVector3 s) + => new Vector3(s.x, s.y, s.z); + + public static implicit operator SVector3(Vector3 v) + => new SVector3(v.x, v.y, v.z); + + + public static SVector3 operator +(SVector3 a, SVector3 b) + => new SVector3(a.x + b.x, a.y + b.y, a.z + b.z); + + public static SVector3 operator -(SVector3 a, SVector3 b) + => new SVector3(a.x - b.x, a.y - b.y, a.z - b.z); + + public static SVector3 operator -(SVector3 a) + => new SVector3(-a.x, -a.y, -a.z); + + public static SVector3 operator *(SVector3 a, float m) + => new SVector3(a.x * m, a.y * m, a.z * m); + + public static SVector3 operator *(float m, SVector3 a) + => new SVector3(a.x * m, a.y * m, a.z * m); + + public static SVector3 operator /(SVector3 a, float d) + => new SVector3(a.x / d, a.y / d, a.z / d); + } + + /// Serializable version of UnityEngine.Quaternion. + [Serializable] + public struct SQuaternion + { + public float x; + public float y; + public float z; + public float w; + + public SQuaternion(float x, float y, float z, float w) + { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + public override string ToString() + => $"[{x}, {y}, {z}, {w}]"; + + public static implicit operator Quaternion(SQuaternion s) + => new Quaternion(s.x, s.y, s.z, s.w); + + public static implicit operator SQuaternion(Quaternion q) + => new SQuaternion(q.x, q.y, q.z, q.w); + } + + /// Serializable version of UnityEngine.Color32 without transparency. + [Serializable] + public struct SColor32 + { + public byte r; + public byte g; + public byte b; + + public SColor32(byte r, byte g, byte b) + { + this.r = r; + this.g = g; + this.b = b; + } + + public SColor32(Color32 c) + { + r = c.r; + g = c.g; + b = c.b; + } + + public override string ToString() + => $"[{r}, {g}, {b}]"; + + public static implicit operator Color32(SColor32 rValue) + => new Color32(rValue.r, rValue.g, rValue.b, a: byte.MaxValue); + + public static implicit operator SColor32(Color32 rValue) + => new SColor32(rValue.r, rValue.g, rValue.b); + } +} \ No newline at end of file diff --git a/Assets/Scripts/AssetSpace.cs.meta b/Assets/Scripts/AssetSpace.cs.meta new file mode 100644 index 0000000..bc80033 --- /dev/null +++ b/Assets/Scripts/AssetSpace.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5608255c01ff56d42a0c3b82a017df73 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ColorCube.cs b/Assets/Scripts/ColorCube.cs new file mode 100644 index 0000000..8b6b229 --- /dev/null +++ b/Assets/Scripts/ColorCube.cs @@ -0,0 +1,51 @@ +using UnityEngine; +using UnityEditor; +using System; + +[Serializable] +public class ColorCube +{ + + // Texture Generation Credit (unity) + + // [MenuItem("ColorCube/Texture")] + // static void CreateTexture() + // { + // // Configure the texture + // int size = 32; + // TextureFormat format = TextureFormat.RGBA32; + // TextureWrapMode wrapMode = TextureWrapMode.Clamp; + + // // Create the texture and apply the configuration + // Texture3D texture = new Texture3D(size, size, size, format, false); + // texture.wrapMode = wrapMode; + + // // Create a 3-dimensional array to store color data + // Color[] colors = new Color[size * size * size]; + + // // Populate the array so that the x, y, and z values of the texture will map to red, blue, and green colors + // float inverseResolution = 1.0f / (size - 1.0f); + // for (int z = 0; z < size; z++) + // { + // int zOffset = z * size * size; + // for (int y = 0; y < size; y++) + // { + // int yOffset = y * size; + // for (int x = 0; x < size; x++) + // { + // colors[x + yOffset + zOffset] = new Color(x * inverseResolution, + // y * inverseResolution, z * inverseResolution, 1.0f); + // } + // } + // } + + // // Copy the color values to the texture + // texture.SetPixels(colors); + + // // Apply the changes to the texture and upload the updated texture to the GPU + // texture.Apply(); + + // // Save the texture to your Unity Project + // AssetDatabase.CreateAsset(texture, "Assets/Example3DTexture.asset"); + // } +} \ No newline at end of file diff --git a/Assets/Scripts/ColorCube.cs.meta b/Assets/Scripts/ColorCube.cs.meta new file mode 100644 index 0000000..9e3011c --- /dev/null +++ b/Assets/Scripts/ColorCube.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 81eaddfe5e4e44d4e97326bf8d4fd738 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Input.cs b/Assets/Scripts/Input.cs new file mode 100644 index 0000000..da0a5fe --- /dev/null +++ b/Assets/Scripts/Input.cs @@ -0,0 +1,153 @@ +using System; +using UnityEngine; + +[Serializable] +public class Input +{ + public OculusInject oculusInject; + + // have to use a transform for the head (and put it in a rig :/) + public Transform rig, head; + + // two controllers (chiral) + public bool leftHanded; // tells the input injector the handedness + public Con mainCon, offCon; + + [HideInInspector] + public Vector3 twistCursor; + + Vector3 mainCalibDir; + float calibDist; + public void Frame() + { + oculusInject.Frame(this); + + // Calibrate/Recenter + if (offCon.one.held) // temporary mapping + { + rig.position = -head.localPosition; // that zeros us out for an offset + rig.position += head.localRotation * Vector3.back * 0.666f; + + mainCalibDir = Vector3.zero - WorldPos(mainCon).normalized; // Vector3.zero == center? + calibDist = Vector3.Distance(Vector3.zero, WorldPos(mainCon)); + } + + float zValue = Vector3.Angle( + offCon.physical.Rot() * Vector3.up, + WorldPos(mainCon) - WorldPos(offCon) + ) / 90f; // 0in - 1neutral - 2out + + twistCursor = WorldPos(mainCon) + mainCon.physical.Rot() * mainCalibDir * calibDist * zValue; + } + + public Vector3 WorldPos(Con con) + { + return rig.TransformPoint(con.physical.Pos()); + } +} + +[Serializable] +public class Con +{ + public Physical physical; + public Btn trigger, one, two; + + [Serializable] + public class Btn + { + public bool down, held, up; + } +} + +[Serializable] +public class Physical +{ + Vector3 pos, posVel; + Quaternion rot, rotVel; + + public Vector3 Pos() { return pos; } + public Vector3 PosVel() { return posVel; } + public Quaternion Rot() { return rot; } + public Quaternion RotVel() { return rotVel; } + + float lastSet = 0; + public void Set(Vector3 pos, Quaternion rot, float delta) + { + // Vel time since last set? and throw away anything = 0 or greater then x + float setDelta = Time.time - lastSet; + if (setDelta == 0 || setDelta > 1) + { + this.posVel = Vector3.zero; + this.rotVel = Quaternion.identity; + } + else + { + this.posVel = (pos - this.pos) / delta; + this.rotVel = Quaternion.SlerpUnclamped(Quaternion.identity, rot * Quaternion.Inverse(this.rot), 1 / delta); + } + + this.pos = pos; + this.rot = rot; + lastSet = Time.time; + } +} + +[Serializable] +public class OculusInject +{ + float lastTime, delta; + public void Frame(Input input) + { + delta = Time.time - lastTime; + + Controller(input.offCon, input.leftHanded ? OVRInput.Controller.RTouch : OVRInput.Controller.LTouch); + Controller(input.mainCon, input.leftHanded ? OVRInput.Controller.LTouch : OVRInput.Controller.RTouch); + + lastTime = Time.time; + } + + void Controller(Con con, OVRInput.Controller touchCon) + { + con.physical.Set( + OVRInput.GetLocalControllerPosition(touchCon), + OVRInput.GetLocalControllerRotation(touchCon), + delta + ); + + con.trigger.down = con.trigger.up = false; + if (OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger, touchCon)) + { + if (!con.trigger.held) { con.trigger.down = true; } + con.trigger.held = true; + } + else + { + if (con.trigger.held) { con.trigger.up = true; } + con.trigger.held = false; + } + + con.one.down = con.one.up = false; + if (OVRInput.Get(OVRInput.Button.One, touchCon)) + { + if (!con.one.held) { con.one.down = true; } + con.one.held = true; + } + else + { + if (con.one.held) { con.one.up = true; } + con.one.held = false; + } + + con.two.down = con.two.up = false; + if (OVRInput.Get(OVRInput.Button.Two, touchCon)) + { + if (!con.two.held) { con.two.down = true; } + con.two.held = true; + } + else + { + if (con.two.held) { con.two.up = true; } + con.two.held = false; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Input.cs.meta b/Assets/Scripts/Input.cs.meta new file mode 100644 index 0000000..6170e36 --- /dev/null +++ b/Assets/Scripts/Input.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c302d04d6317b25449cdcede0465b281 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Monolith.cs b/Assets/Scripts/Monolith.cs new file mode 100644 index 0000000..5168e29 --- /dev/null +++ b/Assets/Scripts/Monolith.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using NaughtyAttributes; + +public enum Scene { AssetSpace, Pixelgon, StretchSilo } +public class Monolith : MonoBehaviour +{ + public Input input; // INPUT + public Pixelgon pixelgon; // DATA + public AssetSpace assetSpace; + + [Button] public void Save() { assetSpace.Save(pixelgon); } + [Button] public void Load() { pixelgon = assetSpace.Load(); } + + // Tools/Systems + // public ToolNewQuad toolNewQuad; + public ToolNewVector toolNewVector; + public ToolEditVector toolEditVector; + public ToolEraser toolEraser; + + // stretch-silo + public StretchSilo stretchSilo; + + public Render render; // VIEW + + void Start() + { + assetSpace.Init(render.polyVector); + } + + public Scene scene; + int toolIndex = 0; + void Update() + { + input.Frame(); + + switch (scene) + { + case Scene.AssetSpace: + assetSpace.Frame(input, render); + break; + + case Scene.Pixelgon: + // toolNewQuad.Frame(input, pixelgon); + // render.ToolNewQuad(toolNewQuad); + if (input.offCon.two.down) + { + toolNewVector.Reset(); + toolEditVector.Reset(); + toolEraser.Reset(); + if (toolIndex < 2) + { + toolIndex++; + } + else + { + toolIndex = 0; + } + } + + switch (toolIndex) + { + case 0: + toolNewVector.Frame(input, pixelgon); + render.ToolNewVector(toolNewVector); + break; + case 1: + toolEditVector.Frame(input, pixelgon); + render.ToolEditVector(toolEditVector); + break; + case 2: + toolEraser.Frame(input, pixelgon); + render.ToolEraser(toolEraser); + break; + } + + render.Pixelgon(pixelgon); + break; + + case Scene.StretchSilo: + render.StretchSilo(stretchSilo, assetSpace); + break; + } + + render.Frame(input); + } +} + +public static class StaticMethods +{ + public static List DeleteLoose(List vectors) + { + int length = 0; + for (int i = vectors.Count - 1; i >= 0; i--) + { + if (vectors[i] != Vector3.zero) + { + length++; + } + else + { + if (length == 1) + { + vectors.RemoveAt(i + 1); + } + + length = 0; + } + } + + return vectors; + } + + public static bool Inside(float from, float to, float x) + { + if (from < to) + { + return x > from && x < to; + } + else + { + return x > to && x < from; + } + } + + public static Vector3 EdgeSnap(Vector3 a, Vector3 b, Vector3 c) + { + Quaternion perspective = Quaternion.LookRotation(b - a); + Vector3 pA = Quaternion.Inverse(perspective) * a; + Vector3 pB = Quaternion.Inverse(perspective) * b; + Vector3 pC = Quaternion.Inverse(perspective) * c; + + // XY + float dist = Vector2.Distance(pC, pA); // pA & pB interchangeable + + // Z + if (pC.z < pA.z || pC.z > pB.z) // outside + { + dist += Mathf.Min(Mathf.Abs(pC.z - pA.z), Mathf.Abs(pC.z - pB.z)); + } + + // snapping margin, where is this variable? + // idk becuase this snapping system will be reused in tools and quads + // scalable 0-1 * design (0 == no snapping) set parameter in ORIEL UI + if (dist < 0.02f) + { + pC.x = pA.x; + pC.y = pA.y; + + pC.z = Mathf.Clamp(pC.z, pA.z, pB.z); + + return perspective * pC; + } + + return c; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Monolith.cs.meta b/Assets/Scripts/Monolith.cs.meta new file mode 100644 index 0000000..6fc3b4d --- /dev/null +++ b/Assets/Scripts/Monolith.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5d96993c613bbe2419e922467c254f3d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Pixelgon.cs b/Assets/Scripts/Pixelgon.cs new file mode 100644 index 0000000..d3d9280 --- /dev/null +++ b/Assets/Scripts/Pixelgon.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[Serializable] +public class Pixelgon +{ + // public List quads = new List(); // one material, one texture, map uv accordingly + public List vectors = new List(); // mapped to one List with null break vectors +} \ No newline at end of file diff --git a/Assets/Scripts/Pixelgon.cs.meta b/Assets/Scripts/Pixelgon.cs.meta new file mode 100644 index 0000000..7b3ff65 --- /dev/null +++ b/Assets/Scripts/Pixelgon.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bb4f575f64524374eaf00c830301ca4d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/PolyVector.cs b/Assets/Scripts/PolyVector.cs new file mode 100644 index 0000000..964e906 --- /dev/null +++ b/Assets/Scripts/PolyVector.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[Serializable] +public class PolyVector +{ + public float vectorScale = 1f; + public Mesh meshJoint, meshVector; + public Material matVector; + + List j4 = new List(); + List v4 = new List(); + int length; + public void AddVectors(List vectors) + { + // vectors.Add(Vector3.zero); // break at end + length = 0; + for (int i = 0; i < vectors.Count; i++) + { + if (vectors[i] == Vector3.zero) + { + length = 0; + } + else + { + Matrix4x4 newJoint = new Matrix4x4(); + newJoint.SetTRS(vectors[i], + Quaternion.identity, + Vector3.one * vectorScale + ); + j4.Add(newJoint); + + if (length > 0 && vectors[i] != vectors[i - 1]) // *-*-* + { + Matrix4x4 m4 = new Matrix4x4(); + m4.SetTRS(vectors[i - 1], + Quaternion.LookRotation(vectors[i] - vectors[i - 1]), + new Vector3(vectorScale, vectorScale, Vector3.Distance(vectors[i - 1], vectors[i])) + ); + v4.Add(m4); + } + length++; + } + } + } + + public void Frame() + { + // trim before render + // v4.RemoveRange(vCount - 1, v4.Count - vCount); + Graphics.DrawMeshInstanced(meshJoint, 0, matVector, j4); + j4.Clear(); + Graphics.DrawMeshInstanced(meshVector, 0, matVector, v4); + v4.Clear(); + } + + public Mesh ToMesh(List vectors) + { + List js = new List(); + List vs = new List(); + + length = 0; + for (int i = 0; i < vectors.Count; i++) + { + if (vectors[i] == Vector3.zero) + { + length = 0; + } + else + { + Matrix4x4 newJoint = new Matrix4x4(); + newJoint.SetTRS(vectors[i], + Quaternion.identity, + Vector3.one * vectorScale + ); + js.Add(newJoint); + + if (length > 0 && vectors[i] != vectors[i - 1]) // *-*-* + { + Matrix4x4 newVector = new Matrix4x4(); + newVector.SetTRS(vectors[i - 1], + Quaternion.LookRotation(vectors[i] - vectors[i - 1]), + new Vector3(vectorScale, vectorScale, Vector3.Distance(vectors[i - 1], vectors[i])) + ); + vs.Add(newVector); + } + length++; + } + } + + CombineInstance[] combI = new CombineInstance[js.Count + vs.Count]; + for (int i = 0; i < js.Count; i++) + { + combI[i].mesh = meshJoint; + combI[i].transform = js[i]; + } + + Debug.Log(vs.Count); + for (int i = 0; i < vs.Count; i++) + { + combI[js.Count + i].mesh = meshVector; + combI[js.Count + i].transform = vs[i]; + } + + Mesh mesh = new Mesh(); + mesh.CombineMeshes(combI, true, true); + return mesh; + } +} diff --git a/Assets/Scripts/PolyVector.cs.meta b/Assets/Scripts/PolyVector.cs.meta new file mode 100644 index 0000000..531f315 --- /dev/null +++ b/Assets/Scripts/PolyVector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1fe70314713f33949911dcedece552a7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Render.cs b/Assets/Scripts/Render.cs new file mode 100644 index 0000000..7bbf3ed --- /dev/null +++ b/Assets/Scripts/Render.cs @@ -0,0 +1,193 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[Serializable] +public class Render +{ + public PolyVector polyVector; + public Mesh meshOriel, meshAxis, meshCursor, meshJointSelect; + public Material matOriel, matCursor, matUnlit, matQuad, matVertexLit, matSelect; + + List selectedJoints = new List(); + Matrix4x4 orielM4 = new Matrix4x4(); + Matrix4x4 axisM4 = new Matrix4x4(); + public void Pixelgon(Pixelgon pixelgon) + { + orielM4.SetTRS(Vector3.zero, Quaternion.identity, new Vector3(0.6f, 0.4f, 0.4f)); + Graphics.DrawMesh(meshOriel, orielM4, matOriel, 0); + + axisM4.SetTRS(Vector3.zero, Quaternion.identity, Vector3.one * 0.2f); + Graphics.DrawMesh(meshAxis, axisM4, matUnlit, 0); + + polyVector.AddVectors(pixelgon.vectors); + + for (int i = 0; i < selectedJoints.Count; i++) + { + Graphics.DrawMesh(meshJointSelect, + pixelgon.vectors[selectedJoints[i]], + Quaternion.identity, + matSelect, 0 + ); + } + selectedJoints.Clear(); + + // Now for pixels! + // float pixelsPerMeter = 24; + // int texDiameter = Mathf.RoundToInt( + // planar.InverseTransformPoint(quad[furthest]).magnitude * 2 * pixelsPerMeter + // ); + // if (texDiameter % 2 != 0) // Round up to Even + // { + // texDiameter++; + // } + + // // TextureFormat.Alpha8 for revolutionary pallette painting + // Texture2D tex = new Texture2D(texDiameter, texDiameter); + // tex.filterMode = FilterMode.Point; + + // int count = 0; + // for (int y = 0; y < texDiameter; y++) // Draw tiled placeholder texture + // { + // count++; + // for (int x = 0; x < texDiameter; x++) + // { + // if ((count++ % 2) == 0) + // { + // tex.SetPixel(x, y, new Color32(255, 255, 255, 255)); + // } + // else + // { + // tex.SetPixel(x, y, new Color32(0, 0, 0, 255)); + // } + // } + // } + + // tex.Apply(); + // quadMaterial.mainTexture = tex; + } + + + public Mesh meshToolNewVector; + public void ToolNewVector(ToolNewVector toolNewVector) + { + Graphics.DrawMesh(meshToolNewVector, + toolNewVector.cursorPos, + Quaternion.identity, + matVertexLit, 0 + ); + + polyVector.AddVectors(toolNewVector.vector); + } + + public Mesh meshToolEditVector, meshBoxSelect; + public void ToolEditVector(ToolEditVector toolEditVector) + { + Graphics.DrawMesh(meshToolEditVector, + toolEditVector.cursorPos, + Quaternion.identity, + matVertexLit, 0 + ); + + + if (toolEditVector.selecting) + { + Matrix4x4 boxMatrix = new Matrix4x4(); + boxMatrix.SetTRS( + Vector3.Lerp(toolEditVector.fromCorner, toolEditVector.toCorner, 0.5f), + Quaternion.identity, + new Vector3(toolEditVector.toCorner.x - toolEditVector.fromCorner.x, + toolEditVector.toCorner.y - toolEditVector.fromCorner.y, + toolEditVector.toCorner.z - toolEditVector.fromCorner.z + ) + ); Graphics.DrawMesh(meshBoxSelect, boxMatrix, matSelect, 0); + } + + selectedJoints.AddRange(toolEditVector.selected); + } + + public Mesh meshToolEraser; + public void ToolEraser(ToolEraser toolEraser) + { + Graphics.DrawMesh(meshToolEraser, + toolEraser.cursorPos, + Quaternion.identity, + matVertexLit, 0 + ); + + selectedJoints.AddRange(toolEraser.selected); + } + + // public void ToolNewQuad(ToolNewQuad toolNewQuad) + // { + // int indexQuad = toolNewQuad.indexQuad; + // Vector3[] quad = toolNewQuad.quad; + + // // Render cursor + // Graphics.DrawMesh(meshCursor, + // toolNewQuad.cursorPos, Quaternion.identity, + // matCursor, 0 + // ); + + // Graphics.DrawMesh(toolNewQuad.mesh, + // Vector3.zero, Quaternion.identity, + // matQuad, 0 + // ); + + // if (indexQuad > 0 && indexQuad < 4) + // { + // polyVector.Draw(quad); + + // if (indexQuad > 1) + // { + // polyVector.Draw(new Vector3[2] { quad[0], toolNewQuad.cursorPos }); + // } + + // if (indexQuad == 3) + // { + // if (Vector3.Distance(quad[0], quad[2]) < Vector3.Distance(quad[1], quad[3])) + // { + // polyVector.Draw(new Vector3[2] { quad[0], quad[2] }); + // } + // else + // { + // polyVector.Draw(new Vector3[2] { quad[1], quad[3] }); + // } + // } + // } + // } + + public void StretchSilo(StretchSilo stretchSilo, AssetSpace assetSpace) + { + Graphics.DrawMesh(assetSpace.assets["draft"].mesh, + stretchSilo.structure, + Quaternion.identity, + polyVector.matVector, 0 + ); + } + + public void Frame(Input input) + { + Graphics.DrawMesh(meshCursor, + input.WorldPos(input.mainCon), + Quaternion.identity, + matCursor, 0 + ); + + Graphics.DrawMesh(meshCursor, + input.WorldPos(input.offCon), + Quaternion.identity, + matCursor, 0 + ); + + Graphics.DrawMesh(meshCursor, + input.twistCursor, + Quaternion.identity, + matCursor, 0 + ); + + + polyVector.Frame(); + } +} \ No newline at end of file diff --git a/Assets/Scripts/Render.cs.meta b/Assets/Scripts/Render.cs.meta new file mode 100644 index 0000000..8ea8bd0 --- /dev/null +++ b/Assets/Scripts/Render.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b1613a8f7fa61484fa2cf54cf152457e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Stretch Silo.meta b/Assets/Scripts/Stretch Silo.meta new file mode 100644 index 0000000..a9ff45c --- /dev/null +++ b/Assets/Scripts/Stretch Silo.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d4bbe74052dd758418b64463acb8fb55 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Stretch Silo/StretchSilo.cs b/Assets/Scripts/Stretch Silo/StretchSilo.cs new file mode 100644 index 0000000..f5a77d9 --- /dev/null +++ b/Assets/Scripts/Stretch Silo/StretchSilo.cs @@ -0,0 +1,10 @@ +using UnityEngine; +using System; +using System.Collections; +using System.Collections.Generic; + +[Serializable] +public class StretchSilo +{ + public Vector3 structure; +} \ No newline at end of file diff --git a/Assets/Scripts/Stretch Silo/StretchSilo.cs.meta b/Assets/Scripts/Stretch Silo/StretchSilo.cs.meta new file mode 100644 index 0000000..6e7b459 --- /dev/null +++ b/Assets/Scripts/Stretch Silo/StretchSilo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 339a56c306dd128468a4766260325d84 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Tools.meta b/Assets/Scripts/Tools.meta new file mode 100644 index 0000000..910695e --- /dev/null +++ b/Assets/Scripts/Tools.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9ed18f028ed6a6941bc634378638a4f0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Tools/ToolEditVector.cs b/Assets/Scripts/Tools/ToolEditVector.cs new file mode 100644 index 0000000..1aea66c --- /dev/null +++ b/Assets/Scripts/Tools/ToolEditVector.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[Serializable] +public class ToolEditVector +{ + [HideInInspector] + public Vector3 cursorPos; + [HideInInspector] + public bool selecting, moving; + [HideInInspector] + public Vector3 fromCorner, toCorner; + [HideInInspector] + public List selected = new List(); + + Vector3 moveFrom, oldCursorPos; + + public void Reset() + { + // for resetting the tool (when swapping around, initializing, etc) + selecting = false; + moving = false; + selected.Clear(); + } + + public void Frame(Input input, Pixelgon pixelgon) + { + cursorPos = input.twistCursor; + + if (!selecting) + { + if (!moving && input.mainCon.trigger.down) + { + // box select from corner anchor + fromCorner = toCorner = cursorPos; + selecting = true; + } + } + else + { + // box select opposite corner drag + toCorner = cursorPos; + + if (input.mainCon.two.down) + { + // cancel + selecting = false; + } + else if (input.mainCon.trigger.up) + { + int selCount = 0; + for (int i = 0; i < pixelgon.vectors.Count; i++) + { + if (pixelgon.vectors[i] != Vector3.zero) + { + if ( + StaticMethods.Inside(fromCorner.x, toCorner.x, pixelgon.vectors[i].x) && + StaticMethods.Inside(fromCorner.y, toCorner.y, pixelgon.vectors[i].y) && + StaticMethods.Inside(fromCorner.z, toCorner.z, pixelgon.vectors[i].z) + ) + { + if (!selected.Contains(i)) + { + selected.Add(i); + } + selCount++; + } + } + } + + if (selCount == 0) + { + selected.Clear(); + } + + selecting = false; + } + } + + + // do some housekeeping ^-^ + + // pixelgon undo for move back + // how to remove? + // ToolEraser (handles joint, vector and quad removal) + // put these and more into quire + + + if (selected.Count > 0) + { + if (!moving) + { + if (!selecting && input.mainCon.one.down) + { + moveFrom = oldCursorPos = cursorPos; + moving = true; + } + } + else + { + Vector3 move = cursorPos - oldCursorPos; + oldCursorPos = cursorPos; + + for (int i = 0; i < selected.Count; i++) + { + pixelgon.vectors[selected[i]] += move; + } + + if (input.mainCon.two.down) + { + Vector3 delta = cursorPos - moveFrom; + for (int i = 0; i < selected.Count; i++) + { + pixelgon.vectors[selected[i]] -= delta; + } + + moving = false; + } + else if (input.mainCon.one.up) + { + moving = false; + } + } + } + + + + + + // use just the selected[0] for snapping + + // int length = 0; + // for (int i = 0; i < pixelgon.vectors.Count; i++) + // { + // if (pixelgon.vectors[i] == Vector3.zero) + // { + // length = 0; + // } + // else + // { + // if (length > 0) + // { + // cursorPos = StaticMethods.EdgeSnap( + // pixelgon.vectors[i - 1], + // pixelgon.vectors[i], + // input.twistCursor + // ); + // if (cursorPos != input.twistCursor) + // { + // break; + // } + // } + + // length++; + // } + // } + } +} diff --git a/Assets/Scripts/Tools/ToolEditVector.cs.meta b/Assets/Scripts/Tools/ToolEditVector.cs.meta new file mode 100644 index 0000000..eaa4db6 --- /dev/null +++ b/Assets/Scripts/Tools/ToolEditVector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 346bbe836f2bdc8428794cf0fdaf0f02 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Tools/ToolEraser.cs b/Assets/Scripts/Tools/ToolEraser.cs new file mode 100644 index 0000000..a53c15e --- /dev/null +++ b/Assets/Scripts/Tools/ToolEraser.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[Serializable] +public class ToolEraser +{ + [HideInInspector] + public Vector3 cursorPos; + [HideInInspector] + public List selected = new List(); + + public void Reset() + { + // for resetting the tool (when swapping around, initializing, etc) + selected.Clear(); + } + + public void Frame(Input input, Pixelgon pixelgon) + { + cursorPos = input.twistCursor; + + if (input.mainCon.trigger.held) + { + selected.Clear(); + int length = 0; + for (int i = 0; i < pixelgon.vectors.Count; i++) + { + if (pixelgon.vectors[i] == Vector3.zero) + { + length = 0; + } + else + { + if (length > 0) + { + cursorPos = StaticMethods.EdgeSnap( + pixelgon.vectors[i - 1], + pixelgon.vectors[i], + input.twistCursor + ); + if (cursorPos != input.twistCursor) + { + if (cursorPos == pixelgon.vectors[i - 1]) + { + selected.Add(i - 1); + break; + } + if (cursorPos == pixelgon.vectors[i]) + { + selected.Add(i); + break; + } + + selected.Add(i - 1); + selected.Add(i); + + break; + } + } + + length++; + } + } + } + + if (selected.Count > 0 && input.mainCon.one.down) + { + if (selected.Count == 1) + { + pixelgon.vectors.RemoveAt(selected[0]); + } + else + { + pixelgon.vectors.Insert(selected[1], Vector3.zero); + } + + pixelgon.vectors = StaticMethods.DeleteLoose(pixelgon.vectors); + Reset(); + } + } +} diff --git a/Assets/Scripts/Tools/ToolEraser.cs.meta b/Assets/Scripts/Tools/ToolEraser.cs.meta new file mode 100644 index 0000000..143c7cc --- /dev/null +++ b/Assets/Scripts/Tools/ToolEraser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3d28dc1ee694694aab379916dff4cea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Tools/ToolNewQuad.cs b/Assets/Scripts/Tools/ToolNewQuad.cs new file mode 100644 index 0000000..3dd85f4 --- /dev/null +++ b/Assets/Scripts/Tools/ToolNewQuad.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[Serializable] +public class ToolNewQuad +{ + public Transform planar; + + [HideInInspector] + public Vector3 cursorPos; + [HideInInspector] + public Mesh mesh; + [HideInInspector] + public Vector3[] quad = new Vector3[4]; + [HideInInspector] + public int indexQuad = 0; + + int[] tris = new int[6]; + Vector2[] uvs = new Vector2[4]; + + public void Frame(Input input, Pixelgon pixelgon) + { + List quads = new List(); + // pixelgon.quads; // for convenience + cursorPos = input.twistCursor; // can do more ^-^ + + // vertice snapping + if (input.mainCon.one.held) + { + Vector3 closestVertice = Vector3.one * 666; // lol + for (int i = 0; i < quads.Count; i++) + { + for (int j = 0; j < quads[i].vertices.Length; j++) + { + if ((quads[i].vertices[j] - cursorPos).sqrMagnitude < + (closestVertice - cursorPos).sqrMagnitude) + { + closestVertice = quads[i].vertices[j]; + } + } + } + + if ((closestVertice - cursorPos).magnitude < 0.02f) // hard coded + { + cursorPos = closestVertice; + } + } + + planar.position = (quad[0] + quad[1] + quad[2] + quad[3]) / 4; + + switch (indexQuad) + { + case (0): + if (input.mainCon.trigger.down) + { + for (int i = 0; i < quad.Length; i++) + { + quad[i] = cursorPos; + } + + indexQuad++; + } + break; + case (1): + quad[indexQuad] = cursorPos; + + if (input.mainCon.trigger.down) + { + indexQuad++; + } + break; + case (2): + quad[indexQuad] = cursorPos; + + if (input.mainCon.trigger.down) + { + indexQuad++; + } + break; + case (3): + Vector3 v3 = Vector3.Cross(quad[0] - quad[1], quad[2] - quad[1]).normalized; + planar.rotation = Quaternion.LookRotation(v3, quad[2] - quad[1]); + cursorPos = planar.InverseTransformPoint(cursorPos); + cursorPos.z = 0; + cursorPos = planar.TransformPoint(cursorPos); + + quad[indexQuad] = cursorPos; + + if (input.mainCon.trigger.down) + { + // w/triangle seam between the two closest points + if (Vector3.Distance(quad[0], quad[2]) < Vector3.Distance(quad[1], quad[3])) + { + tris[0] = 0; tris[3] = 2; + tris[1] = 1; tris[4] = 3; + tris[2] = 2; tris[5] = 0; + } + else + { + tris[0] = 0; tris[3] = 3; + tris[1] = 1; tris[4] = 1; + tris[2] = 3; tris[5] = 2; + } + + int furthest = 0; + for (int i = 1; i < quad.Length; i++) + { + if ((quad[i] - planar.position).magnitude > + (quad[furthest] - planar.position).magnitude) + { + furthest = i; + } + } + + float scale = planar.InverseTransformPoint(quad[furthest]).magnitude; + + for (int i = 0; i < quad.Length; i++) + { + uvs[i] = ((Vector2)planar.InverseTransformPoint( + quad[i]) / (scale * 2)) + new Vector2(0.5f, 0.5f + ); + } + + mesh = new Mesh(); + mesh.SetVertices(quad); + mesh.SetTriangles(tris, 0); + mesh.SetUVs(0, uvs); + + quads.Add(mesh); + + indexQuad = 0; + } + break; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Tools/ToolNewQuad.cs.meta b/Assets/Scripts/Tools/ToolNewQuad.cs.meta new file mode 100644 index 0000000..af70729 --- /dev/null +++ b/Assets/Scripts/Tools/ToolNewQuad.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: de589d3f72a8e094ead0fa5fa663f603 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Tools/ToolNewVector.cs b/Assets/Scripts/Tools/ToolNewVector.cs new file mode 100644 index 0000000..2ee3ef0 --- /dev/null +++ b/Assets/Scripts/Tools/ToolNewVector.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[Serializable] +public class ToolNewVector +{ + [HideInInspector] + public Vector3 cursorPos; + [HideInInspector] + public List vector = new List(); + + public void Reset() + { + // for resetting the tool (when swapping around, initializing, etc) + vector.Clear(); + } + + public void Frame(Input input, Pixelgon pixelgon) + { + cursorPos = input.twistCursor; + + int length = 0; + for (int i = 0; i < pixelgon.vectors.Count; i++) + { + if (pixelgon.vectors[i] == Vector3.zero) + { + length = 0; + } + else + { + if (length > 0) + { + cursorPos = StaticMethods.EdgeSnap( + pixelgon.vectors[i - 1], + pixelgon.vectors[i], + input.twistCursor + ); + if (cursorPos != input.twistCursor) + { + break; + } + } + + length++; + } + } + + if (input.mainCon.trigger.down) + { + vector.Add(cursorPos); + vector.Add(cursorPos); // -> vector + } + + if (vector.Count > 0) + { + if (input.mainCon.trigger.held) + { + if (input.mainCon.one.down) + { + vector.Add(cursorPos); + } + + if (input.mainCon.two.down) + { + if (vector.Count > 2) + { + vector.RemoveAt(vector.Count - 1); + } + else + { + vector.Clear(); + } + } + + vector[vector.Count - 1] = cursorPos; + } + + if (input.mainCon.trigger.up) + { + vector.Insert(0, Vector3.zero); + vector.Add(Vector3.zero); + pixelgon.vectors.AddRange(vector); + vector.Clear(); + } + } + } +} diff --git a/Assets/Scripts/Tools/ToolNewVector.cs.meta b/Assets/Scripts/Tools/ToolNewVector.cs.meta new file mode 100644 index 0000000..f404e3b --- /dev/null +++ b/Assets/Scripts/Tools/ToolNewVector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f46dfa17e528c14cab7fca73b45231f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source.meta b/Assets/Source.meta new file mode 100644 index 0000000..458b388 --- /dev/null +++ b/Assets/Source.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a5b4216e803c33a4fb96579e8f0d4bef +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters.meta b/Assets/Source/Converters.meta new file mode 100644 index 0000000..ba313d8 --- /dev/null +++ b/Assets/Source/Converters.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1b1ed4807593b5042b522b04c705a36c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/Unity.meta b/Assets/Source/Converters/Unity.meta new file mode 100644 index 0000000..3e993dd --- /dev/null +++ b/Assets/Source/Converters/Unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c9b1df9bbef7286479721c8d6f6f5a72 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/Unity/AnimationCurve_DirectConverter.cs b/Assets/Source/Converters/Unity/AnimationCurve_DirectConverter.cs new file mode 100644 index 0000000..76409c2 --- /dev/null +++ b/Assets/Source/Converters/Unity/AnimationCurve_DirectConverter.cs @@ -0,0 +1,47 @@ +#if !NO_UNITY +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace FullSerializer { + partial class fsConverterRegistrar { + public static Internal.DirectConverters.AnimationCurve_DirectConverter Register_AnimationCurve_DirectConverter; + } +} + +namespace FullSerializer.Internal.DirectConverters { + public class AnimationCurve_DirectConverter : fsDirectConverter { + protected override fsResult DoSerialize(AnimationCurve model, Dictionary serialized) { + var result = fsResult.Success; + + result += SerializeMember(serialized, null, "keys", model.keys); + result += SerializeMember(serialized, null, "preWrapMode", model.preWrapMode); + result += SerializeMember(serialized, null, "postWrapMode", model.postWrapMode); + + return result; + } + + protected override fsResult DoDeserialize(Dictionary data, ref AnimationCurve model) { + var result = fsResult.Success; + + var t0 = model.keys; + result += DeserializeMember(data, null, "keys", out t0); + model.keys = t0; + + var t1 = model.preWrapMode; + result += DeserializeMember(data, null, "preWrapMode", out t1); + model.preWrapMode = t1; + + var t2 = model.postWrapMode; + result += DeserializeMember(data, null, "postWrapMode", out t2); + model.postWrapMode = t2; + + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return new AnimationCurve(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Source/Converters/Unity/AnimationCurve_DirectConverter.cs.meta b/Assets/Source/Converters/Unity/AnimationCurve_DirectConverter.cs.meta new file mode 100644 index 0000000..c8dc1fe --- /dev/null +++ b/Assets/Source/Converters/Unity/AnimationCurve_DirectConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2476f8660fdb77f4cbe97b4c53e760fd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/Unity/Bounds_DirectConverter.cs b/Assets/Source/Converters/Unity/Bounds_DirectConverter.cs new file mode 100644 index 0000000..134b5d4 --- /dev/null +++ b/Assets/Source/Converters/Unity/Bounds_DirectConverter.cs @@ -0,0 +1,42 @@ +#if !NO_UNITY +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace FullSerializer { + partial class fsConverterRegistrar { + public static Internal.DirectConverters.Bounds_DirectConverter Register_Bounds_DirectConverter; + } +} + +namespace FullSerializer.Internal.DirectConverters { + public class Bounds_DirectConverter : fsDirectConverter { + protected override fsResult DoSerialize(Bounds model, Dictionary serialized) { + var result = fsResult.Success; + + result += SerializeMember(serialized, null, "center", model.center); + result += SerializeMember(serialized, null, "size", model.size); + + return result; + } + + protected override fsResult DoDeserialize(Dictionary data, ref Bounds model) { + var result = fsResult.Success; + + var t0 = model.center; + result += DeserializeMember(data, null, "center", out t0); + model.center = t0; + + var t1 = model.size; + result += DeserializeMember(data, null, "size", out t1); + model.size = t1; + + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return new Bounds(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Source/Converters/Unity/Bounds_DirectConverter.cs.meta b/Assets/Source/Converters/Unity/Bounds_DirectConverter.cs.meta new file mode 100644 index 0000000..82f81e1 --- /dev/null +++ b/Assets/Source/Converters/Unity/Bounds_DirectConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 891b0567146e2334b880d3a41f3c26f1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/Unity/GUIStyleState_DirectConverter.cs b/Assets/Source/Converters/Unity/GUIStyleState_DirectConverter.cs new file mode 100644 index 0000000..0100d49 --- /dev/null +++ b/Assets/Source/Converters/Unity/GUIStyleState_DirectConverter.cs @@ -0,0 +1,42 @@ +#if !NO_UNITY +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace FullSerializer { + partial class fsConverterRegistrar { + public static Internal.DirectConverters.GUIStyleState_DirectConverter Register_GUIStyleState_DirectConverter; + } +} + +namespace FullSerializer.Internal.DirectConverters { + public class GUIStyleState_DirectConverter : fsDirectConverter { + protected override fsResult DoSerialize(GUIStyleState model, Dictionary serialized) { + var result = fsResult.Success; + + result += SerializeMember(serialized, null, "background", model.background); + result += SerializeMember(serialized, null, "textColor", model.textColor); + + return result; + } + + protected override fsResult DoDeserialize(Dictionary data, ref GUIStyleState model) { + var result = fsResult.Success; + + var t0 = model.background; + result += DeserializeMember(data, null, "background", out t0); + model.background = t0; + + var t2 = model.textColor; + result += DeserializeMember(data, null, "textColor", out t2); + model.textColor = t2; + + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return new GUIStyleState(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Source/Converters/Unity/GUIStyleState_DirectConverter.cs.meta b/Assets/Source/Converters/Unity/GUIStyleState_DirectConverter.cs.meta new file mode 100644 index 0000000..9d7405d --- /dev/null +++ b/Assets/Source/Converters/Unity/GUIStyleState_DirectConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd89cb6fc1667534fb89879ab916ad17 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/Unity/GUIStyle_DirectConverter.cs b/Assets/Source/Converters/Unity/GUIStyle_DirectConverter.cs new file mode 100644 index 0000000..cfb3b41 --- /dev/null +++ b/Assets/Source/Converters/Unity/GUIStyle_DirectConverter.cs @@ -0,0 +1,162 @@ +#if !NO_UNITY +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace FullSerializer { + partial class fsConverterRegistrar { + public static Internal.DirectConverters.GUIStyle_DirectConverter Register_GUIStyle_DirectConverter; + } +} + +namespace FullSerializer.Internal.DirectConverters { + public class GUIStyle_DirectConverter : fsDirectConverter { + protected override fsResult DoSerialize(GUIStyle model, Dictionary serialized) { + var result = fsResult.Success; + + result += SerializeMember(serialized, null, "active", model.active); + result += SerializeMember(serialized, null, "alignment", model.alignment); + result += SerializeMember(serialized, null, "border", model.border); + result += SerializeMember(serialized, null, "clipping", model.clipping); + result += SerializeMember(serialized, null, "contentOffset", model.contentOffset); + result += SerializeMember(serialized, null, "fixedHeight", model.fixedHeight); + result += SerializeMember(serialized, null, "fixedWidth", model.fixedWidth); + result += SerializeMember(serialized, null, "focused", model.focused); + result += SerializeMember(serialized, null, "font", model.font); + result += SerializeMember(serialized, null, "fontSize", model.fontSize); + result += SerializeMember(serialized, null, "fontStyle", model.fontStyle); + result += SerializeMember(serialized, null, "hover", model.hover); + result += SerializeMember(serialized, null, "imagePosition", model.imagePosition); + result += SerializeMember(serialized, null, "margin", model.margin); + result += SerializeMember(serialized, null, "name", model.name); + result += SerializeMember(serialized, null, "normal", model.normal); + result += SerializeMember(serialized, null, "onActive", model.onActive); + result += SerializeMember(serialized, null, "onFocused", model.onFocused); + result += SerializeMember(serialized, null, "onHover", model.onHover); + result += SerializeMember(serialized, null, "onNormal", model.onNormal); + result += SerializeMember(serialized, null, "overflow", model.overflow); + result += SerializeMember(serialized, null, "padding", model.padding); + result += SerializeMember(serialized, null, "richText", model.richText); + result += SerializeMember(serialized, null, "stretchHeight", model.stretchHeight); + result += SerializeMember(serialized, null, "stretchWidth", model.stretchWidth); + result += SerializeMember(serialized, null, "wordWrap", model.wordWrap); + + return result; + } + + protected override fsResult DoDeserialize(Dictionary data, ref GUIStyle model) { + var result = fsResult.Success; + + var t0 = model.active; + result += DeserializeMember(data, null, "active", out t0); + model.active = t0; + + var t2 = model.alignment; + result += DeserializeMember(data, null, "alignment", out t2); + model.alignment = t2; + + var t3 = model.border; + result += DeserializeMember(data, null, "border", out t3); + model.border = t3; + + var t4 = model.clipping; + result += DeserializeMember(data, null, "clipping", out t4); + model.clipping = t4; + + var t5 = model.contentOffset; + result += DeserializeMember(data, null, "contentOffset", out t5); + model.contentOffset = t5; + + var t6 = model.fixedHeight; + result += DeserializeMember(data, null, "fixedHeight", out t6); + model.fixedHeight = t6; + + var t7 = model.fixedWidth; + result += DeserializeMember(data, null, "fixedWidth", out t7); + model.fixedWidth = t7; + + var t8 = model.focused; + result += DeserializeMember(data, null, "focused", out t8); + model.focused = t8; + + var t9 = model.font; + result += DeserializeMember(data, null, "font", out t9); + model.font = t9; + + var t10 = model.fontSize; + result += DeserializeMember(data, null, "fontSize", out t10); + model.fontSize = t10; + + var t11 = model.fontStyle; + result += DeserializeMember(data, null, "fontStyle", out t11); + model.fontStyle = t11; + + var t12 = model.hover; + result += DeserializeMember(data, null, "hover", out t12); + model.hover = t12; + + var t13 = model.imagePosition; + result += DeserializeMember(data, null, "imagePosition", out t13); + model.imagePosition = t13; + + var t16 = model.margin; + result += DeserializeMember(data, null, "margin", out t16); + model.margin = t16; + + var t17 = model.name; + result += DeserializeMember(data, null, "name", out t17); + model.name = t17; + + var t18 = model.normal; + result += DeserializeMember(data, null, "normal", out t18); + model.normal = t18; + + var t19 = model.onActive; + result += DeserializeMember(data, null, "onActive", out t19); + model.onActive = t19; + + var t20 = model.onFocused; + result += DeserializeMember(data, null, "onFocused", out t20); + model.onFocused = t20; + + var t21 = model.onHover; + result += DeserializeMember(data, null, "onHover", out t21); + model.onHover = t21; + + var t22 = model.onNormal; + result += DeserializeMember(data, null, "onNormal", out t22); + model.onNormal = t22; + + var t23 = model.overflow; + result += DeserializeMember(data, null, "overflow", out t23); + model.overflow = t23; + + var t24 = model.padding; + result += DeserializeMember(data, null, "padding", out t24); + model.padding = t24; + + var t25 = model.richText; + result += DeserializeMember(data, null, "richText", out t25); + model.richText = t25; + + var t26 = model.stretchHeight; + result += DeserializeMember(data, null, "stretchHeight", out t26); + model.stretchHeight = t26; + + var t27 = model.stretchWidth; + result += DeserializeMember(data, null, "stretchWidth", out t27); + model.stretchWidth = t27; + + var t28 = model.wordWrap; + result += DeserializeMember(data, null, "wordWrap", out t28); + model.wordWrap = t28; + + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return new GUIStyle(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Source/Converters/Unity/GUIStyle_DirectConverter.cs.meta b/Assets/Source/Converters/Unity/GUIStyle_DirectConverter.cs.meta new file mode 100644 index 0000000..3354ca5 --- /dev/null +++ b/Assets/Source/Converters/Unity/GUIStyle_DirectConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 49fa198b11ff8fe4d96d54ab58be73fd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/Unity/Gradient_DirectConverter.cs b/Assets/Source/Converters/Unity/Gradient_DirectConverter.cs new file mode 100644 index 0000000..94742a4 --- /dev/null +++ b/Assets/Source/Converters/Unity/Gradient_DirectConverter.cs @@ -0,0 +1,42 @@ +#if !NO_UNITY +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace FullSerializer { + partial class fsConverterRegistrar { + public static Internal.DirectConverters.Gradient_DirectConverter Register_Gradient_DirectConverter; + } +} + +namespace FullSerializer.Internal.DirectConverters { + public class Gradient_DirectConverter : fsDirectConverter { + protected override fsResult DoSerialize(Gradient model, Dictionary serialized) { + var result = fsResult.Success; + + result += SerializeMember(serialized, null, "alphaKeys", model.alphaKeys); + result += SerializeMember(serialized, null, "colorKeys", model.colorKeys); + + return result; + } + + protected override fsResult DoDeserialize(Dictionary data, ref Gradient model) { + var result = fsResult.Success; + + var t0 = model.alphaKeys; + result += DeserializeMember(data, null, "alphaKeys", out t0); + model.alphaKeys = t0; + + var t1 = model.colorKeys; + result += DeserializeMember(data, null, "colorKeys", out t1); + model.colorKeys = t1; + + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return new Gradient(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Source/Converters/Unity/Gradient_DirectConverter.cs.meta b/Assets/Source/Converters/Unity/Gradient_DirectConverter.cs.meta new file mode 100644 index 0000000..afd0fb5 --- /dev/null +++ b/Assets/Source/Converters/Unity/Gradient_DirectConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bdeec5510c4eaad4fa61e836562c3d45 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/Unity/Keyframe_DirectConverter.cs b/Assets/Source/Converters/Unity/Keyframe_DirectConverter.cs new file mode 100644 index 0000000..34b3b58 --- /dev/null +++ b/Assets/Source/Converters/Unity/Keyframe_DirectConverter.cs @@ -0,0 +1,52 @@ +#if !NO_UNITY +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace FullSerializer { + partial class fsConverterRegistrar { + public static Internal.DirectConverters.Keyframe_DirectConverter Register_Keyframe_DirectConverter; + } +} + +namespace FullSerializer.Internal.DirectConverters { + public class Keyframe_DirectConverter : fsDirectConverter { + protected override fsResult DoSerialize(Keyframe model, Dictionary serialized) { + var result = fsResult.Success; + + result += SerializeMember(serialized, null, "time", model.time); + result += SerializeMember(serialized, null, "value", model.value); + result += SerializeMember(serialized, null, "inTangent", model.inTangent); + result += SerializeMember(serialized, null, "outTangent", model.outTangent); + + return result; + } + + protected override fsResult DoDeserialize(Dictionary data, ref Keyframe model) { + var result = fsResult.Success; + + var t0 = model.time; + result += DeserializeMember(data, null, "time", out t0); + model.time = t0; + + var t1 = model.value; + result += DeserializeMember(data, null, "value", out t1); + model.value = t1; + + var t3 = model.inTangent; + result += DeserializeMember(data, null, "inTangent", out t3); + model.inTangent = t3; + + var t4 = model.outTangent; + result += DeserializeMember(data, null, "outTangent", out t4); + model.outTangent = t4; + + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return new Keyframe(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Source/Converters/Unity/Keyframe_DirectConverter.cs.meta b/Assets/Source/Converters/Unity/Keyframe_DirectConverter.cs.meta new file mode 100644 index 0000000..a7ff1a0 --- /dev/null +++ b/Assets/Source/Converters/Unity/Keyframe_DirectConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e3ff33c51e3301d44b8d70f16d1eb169 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/Unity/LayerMask_DirectConverter.cs b/Assets/Source/Converters/Unity/LayerMask_DirectConverter.cs new file mode 100644 index 0000000..7dd794b --- /dev/null +++ b/Assets/Source/Converters/Unity/LayerMask_DirectConverter.cs @@ -0,0 +1,37 @@ +#if !NO_UNITY +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace FullSerializer { + partial class fsConverterRegistrar { + public static Internal.DirectConverters.LayerMask_DirectConverter Register_LayerMask_DirectConverter; + } +} + +namespace FullSerializer.Internal.DirectConverters { + public class LayerMask_DirectConverter : fsDirectConverter { + protected override fsResult DoSerialize(LayerMask model, Dictionary serialized) { + var result = fsResult.Success; + + result += SerializeMember(serialized, null, "value", model.value); + + return result; + } + + protected override fsResult DoDeserialize(Dictionary data, ref LayerMask model) { + var result = fsResult.Success; + + var t0 = model.value; + result += DeserializeMember(data, null, "value", out t0); + model.value = t0; + + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return new LayerMask(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Source/Converters/Unity/LayerMask_DirectConverter.cs.meta b/Assets/Source/Converters/Unity/LayerMask_DirectConverter.cs.meta new file mode 100644 index 0000000..725c35b --- /dev/null +++ b/Assets/Source/Converters/Unity/LayerMask_DirectConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ba002c4a5beab644b8b40ecc769956c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/Unity/RectOffset_DirectConverter.cs b/Assets/Source/Converters/Unity/RectOffset_DirectConverter.cs new file mode 100644 index 0000000..cb3e246 --- /dev/null +++ b/Assets/Source/Converters/Unity/RectOffset_DirectConverter.cs @@ -0,0 +1,52 @@ +#if !NO_UNITY +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace FullSerializer { + partial class fsConverterRegistrar { + public static Internal.DirectConverters.RectOffset_DirectConverter Register_RectOffset_DirectConverter; + } +} + +namespace FullSerializer.Internal.DirectConverters { + public class RectOffset_DirectConverter : fsDirectConverter { + protected override fsResult DoSerialize(RectOffset model, Dictionary serialized) { + var result = fsResult.Success; + + result += SerializeMember(serialized, null, "bottom", model.bottom); + result += SerializeMember(serialized, null, "left", model.left); + result += SerializeMember(serialized, null, "right", model.right); + result += SerializeMember(serialized, null, "top", model.top); + + return result; + } + + protected override fsResult DoDeserialize(Dictionary data, ref RectOffset model) { + var result = fsResult.Success; + + var t0 = model.bottom; + result += DeserializeMember(data, null, "bottom", out t0); + model.bottom = t0; + + var t2 = model.left; + result += DeserializeMember(data, null, "left", out t2); + model.left = t2; + + var t3 = model.right; + result += DeserializeMember(data, null, "right", out t3); + model.right = t3; + + var t4 = model.top; + result += DeserializeMember(data, null, "top", out t4); + model.top = t4; + + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return new RectOffset(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Source/Converters/Unity/RectOffset_DirectConverter.cs.meta b/Assets/Source/Converters/Unity/RectOffset_DirectConverter.cs.meta new file mode 100644 index 0000000..1a9c76b --- /dev/null +++ b/Assets/Source/Converters/Unity/RectOffset_DirectConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c677229cfd3fa6b4690b364b9529fc9e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/Unity/Rect_DirectConverter.cs b/Assets/Source/Converters/Unity/Rect_DirectConverter.cs new file mode 100644 index 0000000..4f506f2 --- /dev/null +++ b/Assets/Source/Converters/Unity/Rect_DirectConverter.cs @@ -0,0 +1,52 @@ +#if !NO_UNITY +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace FullSerializer { + partial class fsConverterRegistrar { + public static Internal.DirectConverters.Rect_DirectConverter Register_Rect_DirectConverter; + } +} + +namespace FullSerializer.Internal.DirectConverters { + public class Rect_DirectConverter : fsDirectConverter { + protected override fsResult DoSerialize(Rect model, Dictionary serialized) { + var result = fsResult.Success; + + result += SerializeMember(serialized, null, "xMin", model.xMin); + result += SerializeMember(serialized, null, "yMin", model.yMin); + result += SerializeMember(serialized, null, "xMax", model.xMax); + result += SerializeMember(serialized, null, "yMax", model.yMax); + + return result; + } + + protected override fsResult DoDeserialize(Dictionary data, ref Rect model) { + var result = fsResult.Success; + + var t0 = model.xMin; + result += DeserializeMember(data, null, "xMin", out t0); + model.xMin = t0; + + var t1 = model.yMin; + result += DeserializeMember(data, null, "yMin", out t1); + model.yMin = t1; + + var t2 = model.xMax; + result += DeserializeMember(data, null, "xMax", out t2); + model.xMax = t2; + + var t3 = model.yMax; + result += DeserializeMember(data, null, "yMax", out t3); + model.yMax = t3; + + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return new Rect(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Source/Converters/Unity/Rect_DirectConverter.cs.meta b/Assets/Source/Converters/Unity/Rect_DirectConverter.cs.meta new file mode 100644 index 0000000..0041b2b --- /dev/null +++ b/Assets/Source/Converters/Unity/Rect_DirectConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9c430350334bb384791e23b7f1b5bf9d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/Unity/UnityEvent_Converter.cs b/Assets/Source/Converters/Unity/UnityEvent_Converter.cs new file mode 100644 index 0000000..1aec155 --- /dev/null +++ b/Assets/Source/Converters/Unity/UnityEvent_Converter.cs @@ -0,0 +1,42 @@ +#if !NO_UNITY +using System; +using UnityEngine; +using UnityEngine.Events; + +namespace FullSerializer { + partial class fsConverterRegistrar { + public static Internal.Converters.UnityEvent_Converter Register_UnityEvent_Converter; + } +} + +namespace FullSerializer.Internal.Converters { + // The standard FS reflection converter has started causing Unity to crash when processing + // UnityEvent. We can send the serialization through JsonUtility which appears to work correctly + // instead. + // + // We have to support legacy serialization formats so importing works as expected. + public class UnityEvent_Converter : fsConverter { + public override bool CanProcess(Type type) { + return typeof(UnityEvent).Resolve().IsAssignableFrom(type) && type.IsGenericType == false; + } + + public override bool RequestCycleSupport(Type storageType) { + return false; + } + + public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + Type objectType = (Type)instance; + + fsResult result = fsResult.Success; + instance = JsonUtility.FromJson(fsJsonPrinter.CompressedJson(data), objectType); + return result; + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + fsResult result = fsResult.Success; + serialized = fsJsonParser.Parse(JsonUtility.ToJson(instance)); + return result; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Source/Converters/Unity/UnityEvent_Converter.cs.meta b/Assets/Source/Converters/Unity/UnityEvent_Converter.cs.meta new file mode 100644 index 0000000..d7c811d --- /dev/null +++ b/Assets/Source/Converters/Unity/UnityEvent_Converter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 45faf466f4f7d9c45b3f35d23689c56a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsArrayConverter.cs b/Assets/Source/Converters/fsArrayConverter.cs new file mode 100644 index 0000000..42cd08d --- /dev/null +++ b/Assets/Source/Converters/fsArrayConverter.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections; + +namespace FullSerializer.Internal { + public class fsArrayConverter : fsConverter { + public override bool CanProcess(Type type) { + return type.IsArray; + } + + public override bool RequestCycleSupport(Type storageType) { + return false; + } + + public override bool RequestInheritanceSupport(Type storageType) { + return false; + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + // note: IList[index] is **significantly** faster than Array.Get, so make sure we use + // that instead. + + IList arr = (Array)instance; + Type elementType = storageType.GetElementType(); + + var result = fsResult.Success; + + serialized = fsData.CreateList(arr.Count); + var serializedList = serialized.AsList; + + for (int i = 0; i < arr.Count; ++i) { + object item = arr[i]; + + fsData serializedItem; + + var itemResult = Serializer.TrySerialize(elementType, item, out serializedItem); + result.AddMessages(itemResult); + if (itemResult.Failed) continue; + + serializedList.Add(serializedItem); + } + + return result; + } + + public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + var result = fsResult.Success; + + // Verify that we actually have an List + if ((result += CheckType(data, fsDataType.Array)).Failed) { + return result; + } + + Type elementType = storageType.GetElementType(); + + var serializedList = data.AsList; + var list = new ArrayList(serializedList.Count); + int existingCount = list.Count; + + for (int i = 0; i < serializedList.Count; ++i) { + var serializedItem = serializedList[i]; + object deserialized = null; + if (i < existingCount) deserialized = list[i]; + + var itemResult = Serializer.TryDeserialize(serializedItem, elementType, ref deserialized); + result.AddMessages(itemResult); + if (itemResult.Failed) continue; + + if (i < existingCount) list[i] = deserialized; + else list.Add(deserialized); + } + + instance = list.ToArray(elementType); + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return fsMetaType.Get(Serializer.Config, storageType).CreateInstance(); + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsArrayConverter.cs.meta b/Assets/Source/Converters/fsArrayConverter.cs.meta new file mode 100644 index 0000000..0b7bd94 --- /dev/null +++ b/Assets/Source/Converters/fsArrayConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff26f497131ae3b4db5c02bf6ad36cbc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsDateConverter.cs b/Assets/Source/Converters/fsDateConverter.cs new file mode 100644 index 0000000..d3e3fee --- /dev/null +++ b/Assets/Source/Converters/fsDateConverter.cs @@ -0,0 +1,96 @@ +using System; +using System.Globalization; + +namespace FullSerializer.Internal { + /// + /// Supports serialization for DateTime, DateTimeOffset, and TimeSpan. + /// + public class fsDateConverter : fsConverter { + // The format strings that we use when serializing DateTime and DateTimeOffset types. + private const string DefaultDateTimeFormatString = @"o"; + private const string DateTimeOffsetFormatString = @"o"; + + private string DateTimeFormatString { + get { + return Serializer.Config.CustomDateTimeFormatString ?? DefaultDateTimeFormatString; + } + } + + public override bool CanProcess(Type type) { + return + type == typeof(DateTime) || + type == typeof(DateTimeOffset) || + type == typeof(TimeSpan); + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + if (instance is DateTime) { + var dateTime = (DateTime)instance; + serialized = new fsData(dateTime.ToString(DateTimeFormatString)); + return fsResult.Success; + } + + if (instance is DateTimeOffset) { + var dateTimeOffset = (DateTimeOffset)instance; + serialized = new fsData(dateTimeOffset.ToString(DateTimeOffsetFormatString)); + return fsResult.Success; + } + + if (instance is TimeSpan) { + var timeSpan = (TimeSpan)instance; + serialized = new fsData(timeSpan.ToString()); + return fsResult.Success; + } + + throw new InvalidOperationException("FullSerializer Internal Error -- Unexpected serialization type"); + } + + public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + if (data.IsString == false) { + return fsResult.Fail("Date deserialization requires a string, not " + data.Type); + } + + if (storageType == typeof(DateTime)) { + DateTime result; + if (DateTime.TryParse(data.AsString, null, DateTimeStyles.RoundtripKind, out result)) { + instance = result; + return fsResult.Success; + } + + // DateTime.TryParse can fail for some valid DateTime instances. Try to use Convert.ToDateTime. + if (fsGlobalConfig.AllowInternalExceptions) { + try { + instance = Convert.ToDateTime(data.AsString); + return fsResult.Success; + } catch (Exception e) { + return fsResult.Fail("Unable to parse " + data.AsString + " into a DateTime; got exception " + e); + } + } + + return fsResult.Fail("Unable to parse " + data.AsString + " into a DateTime"); + } + + if (storageType == typeof(DateTimeOffset)) { + DateTimeOffset result; + if (DateTimeOffset.TryParse(data.AsString, null, DateTimeStyles.RoundtripKind, out result)) { + instance = result; + return fsResult.Success; + } + + return fsResult.Fail("Unable to parse " + data.AsString + " into a DateTimeOffset"); + } + + if (storageType == typeof(TimeSpan)) { + TimeSpan result; + if (TimeSpan.TryParse(data.AsString, out result)) { + instance = result; + return fsResult.Success; + } + + return fsResult.Fail("Unable to parse " + data.AsString + " into a TimeSpan"); + } + + throw new InvalidOperationException("FullSerializer Internal Error -- Unexpected deserialization type"); + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsDateConverter.cs.meta b/Assets/Source/Converters/fsDateConverter.cs.meta new file mode 100644 index 0000000..31c579f --- /dev/null +++ b/Assets/Source/Converters/fsDateConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e3dcd313c5acdc442a22f755080c67a9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsDictionaryConverter.cs b/Assets/Source/Converters/fsDictionaryConverter.cs new file mode 100644 index 0000000..5f39875 --- /dev/null +++ b/Assets/Source/Converters/fsDictionaryConverter.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; + +namespace FullSerializer.Internal { + // While the generic IEnumerable converter can handle dictionaries, we process them separately here because + // we support a few more advanced use-cases with dictionaries, such as inline strings. Further, dictionary + // processing in general is a bit more advanced because a few of the collection implementations are buggy. + public class fsDictionaryConverter : fsConverter { + public override bool CanProcess(Type type) { + return typeof(IDictionary).IsAssignableFrom(type); + } + + public override object CreateInstance(fsData data, Type storageType) { + return fsMetaType.Get(Serializer.Config, storageType).CreateInstance(); + } + + public override fsResult TryDeserialize(fsData data, ref object instance_, Type storageType) { + var instance = (IDictionary)instance_; + var result = fsResult.Success; + + Type keyStorageType, valueStorageType; + GetKeyValueTypes(instance.GetType(), out keyStorageType, out valueStorageType); + + if (data.IsList) { + var list = data.AsList; + for (int i = 0; i < list.Count; ++i) { + var item = list[i]; + + fsData keyData, valueData; + if ((result += CheckType(item, fsDataType.Object)).Failed) return result; + if ((result += CheckKey(item, "Key", out keyData)).Failed) return result; + if ((result += CheckKey(item, "Value", out valueData)).Failed) return result; + + object keyInstance = null, valueInstance = null; + if ((result += Serializer.TryDeserialize(keyData, keyStorageType, ref keyInstance)).Failed) return result; + if ((result += Serializer.TryDeserialize(valueData, valueStorageType, ref valueInstance)).Failed) return result; + + AddItemToDictionary(instance, keyInstance, valueInstance); + } + } + else if (data.IsDictionary) { + foreach (var entry in data.AsDictionary) { + if (fsSerializer.IsReservedKeyword(entry.Key)) continue; + + fsData keyData = new fsData(entry.Key), valueData = entry.Value; + object keyInstance = null, valueInstance = null; + + if ((result += Serializer.TryDeserialize(keyData, keyStorageType, ref keyInstance)).Failed) return result; + if ((result += Serializer.TryDeserialize(valueData, valueStorageType, ref valueInstance)).Failed) return result; + + AddItemToDictionary(instance, keyInstance, valueInstance); + } + } + else { + return FailExpectedType(data, fsDataType.Array, fsDataType.Object); + } + + return result; + } + + public override fsResult TrySerialize(object instance_, out fsData serialized, Type storageType) { + serialized = fsData.Null; + + var result = fsResult.Success; + + var instance = (IDictionary)instance_; + + Type keyStorageType, valueStorageType; + GetKeyValueTypes(instance.GetType(), out keyStorageType, out valueStorageType); + + // No other way to iterate dictionaries and still have access to the key/value info + IDictionaryEnumerator enumerator = instance.GetEnumerator(); + + bool allStringKeys = true; + var serializedKeys = new List(instance.Count); + var serializedValues = new List(instance.Count); + while (enumerator.MoveNext()) { + fsData keyData, valueData; + if ((result += Serializer.TrySerialize(keyStorageType, enumerator.Key, out keyData)).Failed) return result; + if ((result += Serializer.TrySerialize(valueStorageType, enumerator.Value, out valueData)).Failed) return result; + + serializedKeys.Add(keyData); + serializedValues.Add(valueData); + + allStringKeys &= keyData.IsString; + } + + if (allStringKeys) { + serialized = fsData.CreateDictionary(); + var serializedDictionary = serialized.AsDictionary; + + for (int i = 0; i < serializedKeys.Count; ++i) { + fsData key = serializedKeys[i]; + fsData value = serializedValues[i]; + serializedDictionary[key.AsString] = value; + } + } + else { + serialized = fsData.CreateList(serializedKeys.Count); + var serializedList = serialized.AsList; + + for (int i = 0; i < serializedKeys.Count; ++i) { + fsData key = serializedKeys[i]; + fsData value = serializedValues[i]; + + var container = new Dictionary(); + container["Key"] = key; + container["Value"] = value; + serializedList.Add(new fsData(container)); + } + } + + return result; + } + + private fsResult AddItemToDictionary(IDictionary dictionary, object key, object value) { + // Because we're operating through the IDictionary interface by default (and not the + // generic one), we normally send items through IDictionary.Add(object, object). This + // works fine in the general case, except that the add method verifies that it's + // parameter types are proper types. However, mono is buggy and these type checks do + // not consider null a subtype of the parameter types, and exceptions get thrown. So, + // we have to special case adding null items via the generic functions (which do not + // do the null check), which is slow and messy. + // + // An example of a collection that fails deserialization without this method is + // `new SortedList { { 0, null } }`. (SortedDictionary is fine because + // it properly handles null values). + if (key == null || value == null) { + // Life would be much easier if we had MakeGenericType available, but we don't. So + // we're going to find the correct generic KeyValuePair type via a bit of trickery. + // All dictionaries extend ICollection>, so we just + // fetch the ICollection<> type with the proper generic arguments, and then we take + // the KeyValuePair<> generic argument, and whola! we have our proper generic type. + + var collectionType = fsReflectionUtility.GetInterface(dictionary.GetType(), typeof(ICollection<>)); + if (collectionType == null) { + return fsResult.Warn(dictionary.GetType() + " does not extend ICollection"); + } + + var keyValuePairType = collectionType.GetGenericArguments()[0]; + object keyValueInstance = Activator.CreateInstance(keyValuePairType, key, value); + MethodInfo add = collectionType.GetFlattenedMethod("Add"); + add.Invoke(dictionary, new object[] { keyValueInstance }); + return fsResult.Success; + } + + // We use the inline set methods instead of dictionary.Add; dictionary.Add will throw an exception + // if the key already exists. + dictionary[key] = value; + return fsResult.Success; + } + + private static void GetKeyValueTypes(Type dictionaryType, out Type keyStorageType, out Type valueStorageType) { + // All dictionaries extend IDictionary, so we just fetch the generic arguments from it + var interfaceType = fsReflectionUtility.GetInterface(dictionaryType, typeof(IDictionary<,>)); + if (interfaceType != null) { + var genericArgs = interfaceType.GetGenericArguments(); + keyStorageType = genericArgs[0]; + valueStorageType = genericArgs[1]; + } + + else { + // Fetching IDictionary<,> failed... we have to encode full type information :( + keyStorageType = typeof(object); + valueStorageType = typeof(object); + } + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsDictionaryConverter.cs.meta b/Assets/Source/Converters/fsDictionaryConverter.cs.meta new file mode 100644 index 0000000..8282a6b --- /dev/null +++ b/Assets/Source/Converters/fsDictionaryConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c1fd84fc9c6dda4088367b5859c04a5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsEnumConverter.cs b/Assets/Source/Converters/fsEnumConverter.cs new file mode 100644 index 0000000..66d6ecb --- /dev/null +++ b/Assets/Source/Converters/fsEnumConverter.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace FullSerializer.Internal { + /// + /// Serializes and deserializes enums by their current name. + /// + public class fsEnumConverter : fsConverter { + public override bool CanProcess(Type type) { + return type.Resolve().IsEnum; + } + + public override bool RequestCycleSupport(Type storageType) { + return false; + } + + public override bool RequestInheritanceSupport(Type storageType) { + return false; + } + + public override object CreateInstance(fsData data, Type storageType) { + // In .NET compact, Enum.ToObject(Type, Object) is defined but the overloads like + // Enum.ToObject(Type, int) are not -- so we get around this by boxing the value. + return Enum.ToObject(storageType, (object)0); + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + if (Serializer.Config.SerializeEnumsAsInteger) { + serialized = new fsData(Convert.ToInt64(instance)); + } + else if (fsPortableReflection.GetAttribute(storageType) != null) { + long instanceValue = Convert.ToInt64(instance); + var result = new StringBuilder(); + + bool first = true; + foreach (var value in Enum.GetValues(storageType)) { + long integralValue = Convert.ToInt64(value); + bool isSet = (instanceValue & integralValue) != 0; + + if (isSet) { + if (first == false) result.Append(","); + first = false; + result.Append(value.ToString()); + } + } + + serialized = new fsData(result.ToString()); + } + else { + serialized = new fsData(Enum.GetName(storageType, instance)); + } + return fsResult.Success; + } + + public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + if (data.IsString) { + string[] enumValues = data.AsString.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + + long instanceValue = 0; + for (int i = 0; i < enumValues.Length; ++i) { + string enumValue = enumValues[i]; + + // Verify that the enum name exists; Enum.TryParse is only available in .NET 4.0 + // and above :(. + if (ArrayContains(Enum.GetNames(storageType), enumValue) == false) { + return fsResult.Fail("Cannot find enum name " + enumValue + " on type " + storageType); + } + + long flagValue = (long)Convert.ChangeType(Enum.Parse(storageType, enumValue), typeof(long)); + instanceValue |= flagValue; + } + + instance = Enum.ToObject(storageType, (object)instanceValue); + return fsResult.Success; + } + + else if (data.IsInt64) { + int enumValue = (int)data.AsInt64; + + // In .NET compact, Enum.ToObject(Type, Object) is defined but the overloads like + // Enum.ToObject(Type, int) are not -- so we get around this by boxing the value. + instance = Enum.ToObject(storageType, (object)enumValue); + + return fsResult.Success; + } + + return fsResult.Fail("EnumConverter encountered an unknown JSON data type"); + } + + /// + /// Returns true if the given value is contained within the specified array. + /// + private static bool ArrayContains(T[] values, T value) { + // note: We don't use LINQ because this function will *not* allocate + for (int i = 0; i < values.Length; ++i) { + if (EqualityComparer.Default.Equals(values[i], value)) { + return true; + } + } + + return false; + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsEnumConverter.cs.meta b/Assets/Source/Converters/fsEnumConverter.cs.meta new file mode 100644 index 0000000..7ed8d51 --- /dev/null +++ b/Assets/Source/Converters/fsEnumConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c560df084b66b254ab5e9bdfc847c7bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsForwardConverter.cs b/Assets/Source/Converters/fsForwardConverter.cs new file mode 100644 index 0000000..f9b8f95 --- /dev/null +++ b/Assets/Source/Converters/fsForwardConverter.cs @@ -0,0 +1,86 @@ +using System; + +namespace FullSerializer { + /// + /// This allows you to forward serialization of an object to one of its members. For example, + /// + /// [fsForward("Values")] + /// struct Wrapper { + /// public int[] Values; + /// } + /// + /// Then `Wrapper` will be serialized into a JSON array of integers. It will be as if `Wrapper` + /// doesn't exist. + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct)] + public sealed class fsForwardAttribute : Attribute { + /// + /// The name of the member we should serialize as. + /// + public string MemberName; + + /// + /// Forward object serialization to an instance member. See class comment. + /// + /// The name of the member that we should serialize this object as. + public fsForwardAttribute(string memberName) { + MemberName = memberName; + } + } +} + +namespace FullSerializer.Internal { + public class fsForwardConverter : fsConverter { + private string _memberName; + + public fsForwardConverter(fsForwardAttribute attribute) { + _memberName = attribute.MemberName; + } + + public override bool CanProcess(Type type) { + throw new NotSupportedException("Please use the [fsForward(...)] attribute."); + } + + private fsResult GetProperty(object instance, out fsMetaProperty property) { + var properties = fsMetaType.Get(Serializer.Config, instance.GetType()).Properties; + for (int i = 0; i < properties.Length; ++i) { + if (properties[i].MemberName == _memberName) { + property = properties[i]; + return fsResult.Success; + } + } + + property = default(fsMetaProperty); + return fsResult.Fail("No property named \"" + _memberName + "\" on " + instance.GetType().CSharpName()); + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + serialized = fsData.Null; + var result = fsResult.Success; + + fsMetaProperty property; + if ((result += GetProperty(instance, out property)).Failed) return result; + + var actualInstance = property.Read(instance); + return Serializer.TrySerialize(property.StorageType, actualInstance, out serialized); + } + + public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + var result = fsResult.Success; + + fsMetaProperty property; + if ((result += GetProperty(instance, out property)).Failed) return result; + + object actualInstance = null; + if ((result += Serializer.TryDeserialize(data, property.StorageType, ref actualInstance)).Failed) + return result; + + property.Write(instance, actualInstance); + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return fsMetaType.Get(Serializer.Config, storageType).CreateInstance(); + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsForwardConverter.cs.meta b/Assets/Source/Converters/fsForwardConverter.cs.meta new file mode 100644 index 0000000..cd3c404 --- /dev/null +++ b/Assets/Source/Converters/fsForwardConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89892b3279cd6e249838f8b44cc0f838 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsGuidConverter.cs b/Assets/Source/Converters/fsGuidConverter.cs new file mode 100644 index 0000000..01d0b80 --- /dev/null +++ b/Assets/Source/Converters/fsGuidConverter.cs @@ -0,0 +1,39 @@ +using System; + +namespace FullSerializer.Internal { + /// + /// Serializes and deserializes guids. + /// + public class fsGuidConverter : fsConverter { + public override bool CanProcess(Type type) { + return type == typeof(Guid); + } + + public override bool RequestCycleSupport(Type storageType) { + return false; + } + + public override bool RequestInheritanceSupport(Type storageType) { + return false; + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + var guid = (Guid)instance; + serialized = new fsData(guid.ToString()); + return fsResult.Success; + } + + public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + if (data.IsString) { + instance = new Guid(data.AsString); + return fsResult.Success; + } + + return fsResult.Fail("fsGuidConverter encountered an unknown JSON data type"); + } + + public override object CreateInstance(fsData data, Type storageType) { + return new Guid(); + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsGuidConverter.cs.meta b/Assets/Source/Converters/fsGuidConverter.cs.meta new file mode 100644 index 0000000..e01bdc0 --- /dev/null +++ b/Assets/Source/Converters/fsGuidConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 09373a87560925948a4a8343e4edb9ab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsIEnumerableConverter.cs b/Assets/Source/Converters/fsIEnumerableConverter.cs new file mode 100644 index 0000000..b578adf --- /dev/null +++ b/Assets/Source/Converters/fsIEnumerableConverter.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; + +namespace FullSerializer.Internal { + /// + /// Provides serialization support for anything which extends from `IEnumerable` and has an `Add` method. + /// + public class fsIEnumerableConverter : fsConverter { + public override bool CanProcess(Type type) { + if (typeof(IEnumerable).IsAssignableFrom(type) == false) return false; + return GetAddMethod(type) != null; + } + + public override object CreateInstance(fsData data, Type storageType) { + return fsMetaType.Get(Serializer.Config, storageType).CreateInstance(); + } + + public override fsResult TrySerialize(object instance_, out fsData serialized, Type storageType) { + var instance = (IEnumerable)instance_; + var result = fsResult.Success; + + Type elementType = GetElementType(storageType); + + serialized = fsData.CreateList(HintSize(instance)); + var serializedList = serialized.AsList; + + foreach (object item in instance) { + fsData itemData; + + // note: We don't fail the entire deserialization even if the item failed + var itemResult = Serializer.TrySerialize(elementType, item, out itemData); + result.AddMessages(itemResult); + if (itemResult.Failed) continue; + + serializedList.Add(itemData); + } + + // Stacks iterate from back to front, which means when we deserialize we will deserialize + // the items in the wrong order, so the stack will get reversed. + if (IsStack(instance.GetType())) { + serializedList.Reverse(); + } + + return result; + } + + private bool IsStack(Type type) { + return type.Resolve().IsGenericType && + type.Resolve().GetGenericTypeDefinition() == typeof(Stack<>); + } + + public override fsResult TryDeserialize(fsData data, ref object instance_, Type storageType) { + var instance = (IEnumerable)instance_; + var result = fsResult.Success; + + if ((result += CheckType(data, fsDataType.Array)).Failed) return result; + + // For general strategy, instance may already have items in it. We will try to deserialize into + // the existing element. + var elementStorageType = GetElementType(storageType); + var addMethod = GetAddMethod(storageType); + var getMethod = storageType.GetFlattenedMethod("get_Item"); + var setMethod = storageType.GetFlattenedMethod("set_Item"); + if (setMethod == null) TryClear(storageType, instance); + var existingSize = TryGetExistingSize(storageType, instance); + + var serializedList = data.AsList; + for (int i = 0; i < serializedList.Count; ++i) { + var itemData = serializedList[i]; + object itemInstance = null; + if (getMethod != null && i < existingSize) { + itemInstance = getMethod.Invoke(instance, new object[] { i }); + } + + // note: We don't fail the entire deserialization even if the item failed + var itemResult = Serializer.TryDeserialize(itemData, elementStorageType, ref itemInstance); + result.AddMessages(itemResult); + if (itemResult.Failed) continue; + + if (setMethod != null && i < existingSize) { + setMethod.Invoke(instance, new object[] { i, itemInstance }); + } + else { + addMethod.Invoke(instance, new object[] { itemInstance }); + } + } + + return result; + } + + private static int HintSize(IEnumerable collection) { + if (collection is ICollection) { + return ((ICollection)collection).Count; + } + return 0; + } + + /// + /// Fetches the element type for objects inside of the collection. + /// + private static Type GetElementType(Type objectType) { + if (objectType.HasElementType) return objectType.GetElementType(); + + Type enumerableList = fsReflectionUtility.GetInterface(objectType, typeof(IEnumerable<>)); + if (enumerableList != null) return enumerableList.GetGenericArguments()[0]; + + return typeof(object); + } + + private static void TryClear(Type type, object instance) { + var clear = type.GetFlattenedMethod("Clear"); + if (clear != null) { + clear.Invoke(instance, null); + } + } + + private static int TryGetExistingSize(Type type, object instance) { + var count = type.GetFlattenedProperty("Count"); + if (count != null) { + return (int)count.GetGetMethod().Invoke(instance, null); + } + return 0; + } + + private static MethodInfo GetAddMethod(Type type) { + // There is a really good chance the type will extend ICollection{}, which will contain + // the add method we want. Just doing type.GetFlattenedMethod() may return the incorrect one -- + // for example, with dictionaries, it'll return Add(TKey, TValue), and we want + // Add(KeyValuePair). + Type collectionInterface = fsReflectionUtility.GetInterface(type, typeof(ICollection<>)); + if (collectionInterface != null) { + MethodInfo add = collectionInterface.GetDeclaredMethod("Add"); + if (add != null) return add; + } + + // Otherwise try and look up a general Add method. + return + type.GetFlattenedMethod("Add") ?? + type.GetFlattenedMethod("Push") ?? + type.GetFlattenedMethod("Enqueue"); + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsIEnumerableConverter.cs.meta b/Assets/Source/Converters/fsIEnumerableConverter.cs.meta new file mode 100644 index 0000000..3922170 --- /dev/null +++ b/Assets/Source/Converters/fsIEnumerableConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4a7fdd4014dc894458c54513809a2998 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsKeyValuePairConverter.cs b/Assets/Source/Converters/fsKeyValuePairConverter.cs new file mode 100644 index 0000000..2082d0e --- /dev/null +++ b/Assets/Source/Converters/fsKeyValuePairConverter.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace FullSerializer.Internal { + public class fsKeyValuePairConverter : fsConverter { + public override bool CanProcess(Type type) { + return + type.Resolve().IsGenericType && + type.GetGenericTypeDefinition() == typeof(KeyValuePair<,>); + } + + public override bool RequestCycleSupport(Type storageType) { + return false; + } + + public override bool RequestInheritanceSupport(Type storageType) { + return false; + } + + public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + var result = fsResult.Success; + + fsData keyData, valueData; + if ((result += CheckKey(data, "Key", out keyData)).Failed) return result; + if ((result += CheckKey(data, "Value", out valueData)).Failed) return result; + + var genericArguments = storageType.GetGenericArguments(); + Type keyType = genericArguments[0], valueType = genericArguments[1]; + + object keyObject = null, valueObject = null; + result.AddMessages(Serializer.TryDeserialize(keyData, keyType, ref keyObject)); + result.AddMessages(Serializer.TryDeserialize(valueData, valueType, ref valueObject)); + + instance = Activator.CreateInstance(storageType, keyObject, valueObject); + return result; + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + PropertyInfo keyProperty = storageType.GetDeclaredProperty("Key"); + PropertyInfo valueProperty = storageType.GetDeclaredProperty("Value"); + + object keyObject = keyProperty.GetValue(instance, null); + object valueObject = valueProperty.GetValue(instance, null); + + var genericArguments = storageType.GetGenericArguments(); + Type keyType = genericArguments[0], valueType = genericArguments[1]; + + var result = fsResult.Success; + + fsData keyData, valueData; + result.AddMessages(Serializer.TrySerialize(keyType, keyObject, out keyData)); + result.AddMessages(Serializer.TrySerialize(valueType, valueObject, out valueData)); + + serialized = fsData.CreateDictionary(); + if (keyData != null) serialized.AsDictionary["Key"] = keyData; + if (valueData != null) serialized.AsDictionary["Value"] = valueData; + + return result; + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsKeyValuePairConverter.cs.meta b/Assets/Source/Converters/fsKeyValuePairConverter.cs.meta new file mode 100644 index 0000000..53cd766 --- /dev/null +++ b/Assets/Source/Converters/fsKeyValuePairConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a3857f6e037d454194843e278772b9f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsNullableConverter.cs b/Assets/Source/Converters/fsNullableConverter.cs new file mode 100644 index 0000000..09c1223 --- /dev/null +++ b/Assets/Source/Converters/fsNullableConverter.cs @@ -0,0 +1,29 @@ +using System; + +namespace FullSerializer.Internal { + /// + /// The reflected converter will properly serialize nullable types. However, we do it here + /// instead as we can emit less serialization data. + /// + public class fsNullableConverter : fsConverter { + public override bool CanProcess(Type type) { + return + type.Resolve().IsGenericType && + type.GetGenericTypeDefinition() == typeof(Nullable<>); + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + // null is automatically serialized + return Serializer.TrySerialize(Nullable.GetUnderlyingType(storageType), instance, out serialized); + } + + public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + // null is automatically deserialized + return Serializer.TryDeserialize(data, Nullable.GetUnderlyingType(storageType), ref instance); + } + + public override object CreateInstance(fsData data, Type storageType) { + return storageType; + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsNullableConverter.cs.meta b/Assets/Source/Converters/fsNullableConverter.cs.meta new file mode 100644 index 0000000..00f380a --- /dev/null +++ b/Assets/Source/Converters/fsNullableConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 71d2abb9701478740b1fbb8720a63a24 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsPrimitiveConverter.cs b/Assets/Source/Converters/fsPrimitiveConverter.cs new file mode 100644 index 0000000..9ae68b0 --- /dev/null +++ b/Assets/Source/Converters/fsPrimitiveConverter.cs @@ -0,0 +1,125 @@ +using System; + +namespace FullSerializer.Internal { + public class fsPrimitiveConverter : fsConverter { + public override bool CanProcess(Type type) { + return + type.Resolve().IsPrimitive || + type == typeof(string) || + type == typeof(decimal); + } + + public override bool RequestCycleSupport(Type storageType) { + return false; + } + + public override bool RequestInheritanceSupport(Type storageType) { + return false; + } + + private static bool UseBool(Type type) { + return type == typeof(bool); + } + + private static bool UseInt64(Type type) { + return type == typeof(sbyte) || type == typeof(byte) || + type == typeof(Int16) || type == typeof(UInt16) || + type == typeof(Int32) || type == typeof(UInt32) || + type == typeof(Int64) || type == typeof(UInt64); + } + + private static bool UseDouble(Type type) { + return type == typeof(float) || + type == typeof(double) || + type == typeof(decimal); + } + + private static bool UseString(Type type) { + return type == typeof(string) || + type == typeof(char); + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + var instanceType = instance.GetType(); + + if (Serializer.Config.Serialize64BitIntegerAsString && (instanceType == typeof(Int64) || instanceType == typeof(UInt64))) { + serialized = new fsData((string)Convert.ChangeType(instance, typeof(string))); + return fsResult.Success; + } + + if (UseBool(instanceType)) { + serialized = new fsData((bool)instance); + return fsResult.Success; + } + + if (UseInt64(instanceType)) { + serialized = new fsData((Int64)Convert.ChangeType(instance, typeof(Int64))); + return fsResult.Success; + } + + if (UseDouble(instanceType)) { + // Casting from float to double introduces floating point jitter, ie, 0.1 becomes 0.100000001490116. + // Casting to decimal as an intermediate step removes the jitter. Not sure why. + if (instance.GetType() == typeof(float) && + // Decimal can't store float.MinValue/float.MaxValue/float.PositiveInfinity/float.NegativeInfinity/float.NaN - an exception gets thrown in that scenario. + (float)instance != float.MinValue && + (float)instance != float.MaxValue && + !float.IsInfinity((float)instance) && + !float.IsNaN((float)instance) + ) { + serialized = new fsData((double)(decimal)(float)instance); + return fsResult.Success; + } + + serialized = new fsData((double)Convert.ChangeType(instance, typeof(double))); + return fsResult.Success; + } + + if (UseString(instanceType)) { + serialized = new fsData((string)Convert.ChangeType(instance, typeof(string))); + return fsResult.Success; + } + + serialized = null; + return fsResult.Fail("Unhandled primitive type " + instance.GetType()); + } + + public override fsResult TryDeserialize(fsData storage, ref object instance, Type storageType) { + var result = fsResult.Success; + + if (UseBool(storageType)) { + if ((result += CheckType(storage, fsDataType.Boolean)).Succeeded) { + instance = storage.AsBool; + } + return result; + } + + if (UseDouble(storageType) || UseInt64(storageType)) { + if (storage.IsDouble) { + instance = Convert.ChangeType(storage.AsDouble, storageType); + } + else if (storage.IsInt64) { + instance = Convert.ChangeType(storage.AsInt64, storageType); + } + else if (Serializer.Config.Serialize64BitIntegerAsString && storage.IsString && + (storageType == typeof(Int64) || storageType == typeof(UInt64))) { + instance = Convert.ChangeType(storage.AsString, storageType); + } + else { + return fsResult.Fail(GetType().Name + " expected number but got " + storage.Type + " in " + storage); + } + return fsResult.Success; + } + + if (UseString(storageType)) { + if ((result += CheckType(storage, fsDataType.String)).Succeeded) { + instance = storage.AsString; + } + return result; + } + + return fsResult.Fail(GetType().Name + ": Bad data; expected bool, number, string, but got " + storage); + } + } +} + diff --git a/Assets/Source/Converters/fsPrimitiveConverter.cs.meta b/Assets/Source/Converters/fsPrimitiveConverter.cs.meta new file mode 100644 index 0000000..f6bfcf2 --- /dev/null +++ b/Assets/Source/Converters/fsPrimitiveConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 790de8a8a4ec95444ac95d5a812d69b3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsReflectedConverter.cs b/Assets/Source/Converters/fsReflectedConverter.cs new file mode 100644 index 0000000..76459ed --- /dev/null +++ b/Assets/Source/Converters/fsReflectedConverter.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections; + +#if !UNITY_EDITOR && UNITY_WSA +// For System.Reflection.TypeExtensions +using System.Reflection; +#endif + +namespace FullSerializer.Internal { + public class fsReflectedConverter : fsConverter { + public override bool CanProcess(Type type) { + if (type.Resolve().IsArray || + typeof(ICollection).IsAssignableFrom(type)) { + + return false; + } + + return true; + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + serialized = fsData.CreateDictionary(); + var result = fsResult.Success; + + fsMetaType metaType = fsMetaType.Get(Serializer.Config, instance.GetType()); + metaType.EmitAotData(); + + for (int i = 0; i < metaType.Properties.Length; ++i) { + fsMetaProperty property = metaType.Properties[i]; + if (property.CanRead == false) continue; + + fsData serializedData; + + var itemResult = Serializer.TrySerialize(property.StorageType, property.OverrideConverterType, + property.Read(instance), out serializedData); + result.AddMessages(itemResult); + if (itemResult.Failed) { + continue; + } + + serialized.AsDictionary[property.JsonName] = serializedData; + } + + return result; + } + + public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + var result = fsResult.Success; + + // Verify that we actually have an Object + if ((result += CheckType(data, fsDataType.Object)).Failed) { + return result; + } + + fsMetaType metaType = fsMetaType.Get(Serializer.Config, storageType); + metaType.EmitAotData(); + + for (int i = 0; i < metaType.Properties.Length; ++i) { + fsMetaProperty property = metaType.Properties[i]; + if (property.CanWrite == false) continue; + + fsData propertyData; + if (data.AsDictionary.TryGetValue(property.JsonName, out propertyData)) { + object deserializedValue = null; + + // We have to read in the existing value, since we need to support partial + // deserialization. However, this is bad for perf. + // TODO: Find a way to avoid this call when we are not doing a partial deserialization + // Maybe through a new property, ie, Serializer.IsPartialSerialization, which just + // gets set when starting a new serialization? We cannot pipe the information + // through CreateInstance unfortunately. + if (property.CanRead) { + deserializedValue = property.Read(instance); + } + + var itemResult = Serializer.TryDeserialize(propertyData, property.StorageType, + property.OverrideConverterType, ref deserializedValue); + result.AddMessages(itemResult); + if (itemResult.Failed) continue; + + property.Write(instance, deserializedValue); + } + } + + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + fsMetaType metaType = fsMetaType.Get(Serializer.Config, storageType); + return metaType.CreateInstance(); + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsReflectedConverter.cs.meta b/Assets/Source/Converters/fsReflectedConverter.cs.meta new file mode 100644 index 0000000..d13c2a3 --- /dev/null +++ b/Assets/Source/Converters/fsReflectedConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a23ca5511c2d3cc4692dfc7f11d9ed67 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsTypeConverter.cs b/Assets/Source/Converters/fsTypeConverter.cs new file mode 100644 index 0000000..71264eb --- /dev/null +++ b/Assets/Source/Converters/fsTypeConverter.cs @@ -0,0 +1,44 @@ +using System; + +#if !UNITY_EDITOR && UNITY_WSA +// For System.Reflection.TypeExtensions +using System.Reflection; +#endif + +namespace FullSerializer.Internal { + public class fsTypeConverter : fsConverter { + public override bool CanProcess(Type type) { + return typeof(Type).IsAssignableFrom(type); + } + + public override bool RequestCycleSupport(Type type) { + return false; + } + + public override bool RequestInheritanceSupport(Type type) { + return false; + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + var type = (Type)instance; + serialized = new fsData(type.FullName); + return fsResult.Success; + } + + public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + if (data.IsString == false) { + return fsResult.Fail("Type converter requires a string"); + } + + instance = fsTypeCache.GetType(data.AsString); + if (instance == null) { + return fsResult.Fail("Unable to find type " + data.AsString); + } + return fsResult.Success; + } + + public override object CreateInstance(fsData data, Type storageType) { + return storageType; + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsTypeConverter.cs.meta b/Assets/Source/Converters/fsTypeConverter.cs.meta new file mode 100644 index 0000000..0a3d846 --- /dev/null +++ b/Assets/Source/Converters/fsTypeConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aba11236805ed6b4a9f9616bc70a02d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Converters/fsWeakReferenceConverter.cs b/Assets/Source/Converters/fsWeakReferenceConverter.cs new file mode 100644 index 0000000..a7ceadd --- /dev/null +++ b/Assets/Source/Converters/fsWeakReferenceConverter.cs @@ -0,0 +1,65 @@ +using System; + +namespace FullSerializer.Internal { + /// + /// Serializes and deserializes WeakReferences. + /// + public class fsWeakReferenceConverter : fsConverter { + public override bool CanProcess(Type type) { + return type == typeof(WeakReference); + } + + public override bool RequestCycleSupport(Type storageType) { + return false; + } + + public override bool RequestInheritanceSupport(Type storageType) { + return false; + } + + public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + var weakRef = (WeakReference)instance; + + var result = fsResult.Success; + serialized = fsData.CreateDictionary(); + + if (weakRef.IsAlive) { + fsData data; + if ((result += Serializer.TrySerialize(weakRef.Target, out data)).Failed) { + return result; + } + + serialized.AsDictionary["Target"] = data; + serialized.AsDictionary["TrackResurrection"] = new fsData(weakRef.TrackResurrection); + } + + return result; + } + + public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + var result = fsResult.Success; + + if ((result += CheckType(data, fsDataType.Object)).Failed) return result; + + if (data.AsDictionary.ContainsKey("Target")) { + var targetData = data.AsDictionary["Target"]; + object targetInstance = null; + + if ((result += Serializer.TryDeserialize(targetData, typeof(object), ref targetInstance)).Failed) return result; + + bool trackResurrection = false; + if (data.AsDictionary.ContainsKey("TrackResurrection") && data.AsDictionary["TrackResurrection"].IsBool) { + trackResurrection = data.AsDictionary["TrackResurrection"].AsBool; + } + + instance = new WeakReference(targetInstance, trackResurrection); + } + + return result; + } + + public override object CreateInstance(fsData data, Type storageType) { + return new WeakReference(null); + } + } +} \ No newline at end of file diff --git a/Assets/Source/Converters/fsWeakReferenceConverter.cs.meta b/Assets/Source/Converters/fsWeakReferenceConverter.cs.meta new file mode 100644 index 0000000..3c62221 --- /dev/null +++ b/Assets/Source/Converters/fsWeakReferenceConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ebce9d110c1f6744f9a17efb7097f566 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Internal.meta b/Assets/Source/Internal.meta new file mode 100644 index 0000000..90ff9a3 --- /dev/null +++ b/Assets/Source/Internal.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3773692a867995d489411837599e3761 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Internal/fsCyclicReferenceManager.cs b/Assets/Source/Internal/fsCyclicReferenceManager.cs new file mode 100644 index 0000000..2a7e3ac --- /dev/null +++ b/Assets/Source/Internal/fsCyclicReferenceManager.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace FullSerializer.Internal { + public class fsCyclicReferenceManager { + // We use the default ReferenceEquals when comparing two objects because + // custom objects may override equals methods. These overriden equals may + // treat equals differently; we want to serialize/deserialize the object + // graph *identically* to how it currently exists. + class ObjectReferenceEqualityComparator : IEqualityComparer { + bool IEqualityComparer.Equals(object x, object y) { + return ReferenceEquals(x, y); + } + + int IEqualityComparer.GetHashCode(object obj) { + return RuntimeHelpers.GetHashCode(obj); + } + + public static readonly IEqualityComparer Instance = new ObjectReferenceEqualityComparator(); + } + + private Dictionary _objectIds = new Dictionary(ObjectReferenceEqualityComparator.Instance); + private int _nextId; + + private Dictionary _marked = new Dictionary(); + private int _depth; + + public void Enter() { + _depth++; + } + + public bool Exit() { + _depth--; + + if (_depth == 0) { + _objectIds = new Dictionary(ObjectReferenceEqualityComparator.Instance); + _nextId = 0; + _marked = new Dictionary(); + } + + if (_depth < 0) { + _depth = 0; + throw new InvalidOperationException("Internal Error - Mismatched Enter/Exit"); + } + + return _depth == 0; + } + + public object GetReferenceObject(int id) { + if (_marked.ContainsKey(id) == false) { + throw new InvalidOperationException("Internal Deserialization Error - Object " + + "definition has not been encountered for object with id=" + id + + "; have you reordered or modified the serialized data? If this is an issue " + + "with an unmodified Full Serializer implementation and unmodified serialization " + + "data, please report an issue with an included test case."); + } + + return _marked[id]; + } + + public void AddReferenceWithId(int id, object reference) { + _marked[id] = reference; + } + + public int GetReferenceId(object item) { + int id; + if (_objectIds.TryGetValue(item, out id) == false) { + id = _nextId++; + _objectIds[item] = id; + } + return id; + } + + public bool IsReference(object item) { + return _marked.ContainsKey(GetReferenceId(item)); + } + + public void MarkSerialized(object item) { + int referenceId = GetReferenceId(item); + + if (_marked.ContainsKey(referenceId)) { + throw new InvalidOperationException("Internal Error - " + item + + " has already been marked as serialized"); + } + + _marked[referenceId] = item; + } + } +} \ No newline at end of file diff --git a/Assets/Source/Internal/fsCyclicReferenceManager.cs.meta b/Assets/Source/Internal/fsCyclicReferenceManager.cs.meta new file mode 100644 index 0000000..e1f59f2 --- /dev/null +++ b/Assets/Source/Internal/fsCyclicReferenceManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c34d55229bfe53d47a9ea7cf23687186 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Internal/fsOption.cs b/Assets/Source/Internal/fsOption.cs new file mode 100644 index 0000000..02459e3 --- /dev/null +++ b/Assets/Source/Internal/fsOption.cs @@ -0,0 +1,37 @@ +using System; + +namespace FullSerializer.Internal { + /// + /// Simple option type. This is akin to nullable types. + /// + public struct fsOption { + private bool _hasValue; + private T _value; + + public bool HasValue { + get { return _hasValue; } + } + public bool IsEmpty { + get { return _hasValue == false; } + } + public T Value { + get { + if (IsEmpty) throw new InvalidOperationException("fsOption is empty"); + return _value; + } + } + + public fsOption(T value) { + _hasValue = true; + _value = value; + } + + public static fsOption Empty; + } + + public static class fsOption { + public static fsOption Just(T value) { + return new fsOption(value); + } + } +} \ No newline at end of file diff --git a/Assets/Source/Internal/fsOption.cs.meta b/Assets/Source/Internal/fsOption.cs.meta new file mode 100644 index 0000000..f19b7c8 --- /dev/null +++ b/Assets/Source/Internal/fsOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ec455db28b0ad7e4095c55696c9c630f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Internal/fsPortableReflection.cs b/Assets/Source/Internal/fsPortableReflection.cs new file mode 100644 index 0000000..e6c3df0 --- /dev/null +++ b/Assets/Source/Internal/fsPortableReflection.cs @@ -0,0 +1,400 @@ +#if !UNITY_EDITOR && UNITY_METRO && !ENABLE_IL2CPP +#define USE_TYPEINFO +#if !UNITY_WINRT_10_0 +#define USE_TYPEINFO_EXTENSIONS +#endif +#endif + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +#if USE_TYPEINFO +namespace System { + public static class AssemblyExtensions { +#if USE_TYPEINFO_EXTENSIONS + public static Type[] GetTypes(this Assembly assembly) { + TypeInfo[] infos = assembly.DefinedTypes.ToArray(); + Type[] types = new Type[infos.Length]; + for (int i = 0; i < infos.Length; ++i) { + types[i] = infos[i].AsType(); + } + return types; + } +#endif + + public static Type GetType(this Assembly assembly, string name, bool throwOnError) { + var types = assembly.GetTypes(); + for (int i = 0; i < types.Length; ++i) { + if (types[i].Name == name) { + return types[i]; + } + } + + if (throwOnError) throw new Exception("Type " + name + " was not found"); + return null; + } + } +} +#endif + +namespace FullSerializer.Internal { + /// + /// This wraps reflection types so that it is portable across different Unity runtimes. + /// + public static class fsPortableReflection { + public static Type[] EmptyTypes = { }; + +#region Attribute Queries +#if USE_TYPEINFO + public static TAttribute GetAttribute(Type type) + where TAttribute : Attribute { + + return GetAttribute(type.GetTypeInfo()); + } + + public static Attribute GetAttribute(Type type, Type attributeType) { + return GetAttribute(type.GetTypeInfo(), attributeType, /*shouldCache:*/false); + } + + public static bool HasAttribute(Type type, Type attributeType) { + return GetAttribute(type, attributeType) != null; + } +#endif + + /// + /// Returns true if the given attribute is defined on the given element. + /// + public static bool HasAttribute(MemberInfo element) { + return HasAttribute(element, typeof(TAttribute)); + } + + /// + /// Returns true if the given attribute is defined on the given element. + /// + public static bool HasAttribute(MemberInfo element, bool shouldCache) { + return HasAttribute(element, typeof(TAttribute), shouldCache); + } + + /// + /// Returns true if the given attribute is defined on the given element. + /// + public static bool HasAttribute(MemberInfo element, Type attributeType) { + return HasAttribute(element, attributeType, true); + } + + /// + /// Returns true if the given attribute is defined on the given element. + /// + public static bool HasAttribute(MemberInfo element, Type attributeType, bool shouldCache) { + return element.IsDefined(attributeType, true); + } + + /// + /// Fetches the given attribute from the given MemberInfo. This method applies caching + /// and is allocation free (after caching has been performed). + /// + /// The MemberInfo the get the attribute from. + /// The type of attribute to fetch. + /// The attribute or null. + public static Attribute GetAttribute(MemberInfo element, Type attributeType, bool shouldCache) { + var query = new AttributeQuery { + MemberInfo = element, + AttributeType = attributeType + }; + + Attribute attribute; + if (_cachedAttributeQueries.TryGetValue(query, out attribute) == false) { + var attributes = element.GetCustomAttributes(attributeType, /*inherit:*/ true); + if (attributes.Length > 0) + attribute = (Attribute)attributes[0]; + if (shouldCache) + _cachedAttributeQueries[query] = attribute; + } + + return attribute; + } + + /// + /// Fetches the given attribute from the given MemberInfo. + /// + /// The type of attribute to fetch. + /// The MemberInfo to get the attribute from. + /// Should this computation be cached? If this is the only time it will ever be done, don't bother caching. + /// The attribute or null. + public static TAttribute GetAttribute(MemberInfo element, bool shouldCache) + where TAttribute : Attribute { + + return (TAttribute)GetAttribute(element, typeof(TAttribute), shouldCache); + } + public static TAttribute GetAttribute(MemberInfo element) + where TAttribute : Attribute { + return GetAttribute(element, /*shouldCache:*/true); + } + private struct AttributeQuery { + public MemberInfo MemberInfo; + public Type AttributeType; + } + private static IDictionary _cachedAttributeQueries = + new Dictionary(new AttributeQueryComparator()); + private class AttributeQueryComparator : IEqualityComparer { + public bool Equals(AttributeQuery x, AttributeQuery y) { + return + x.MemberInfo == y.MemberInfo && + x.AttributeType == y.AttributeType; + } + + public int GetHashCode(AttributeQuery obj) { + return + obj.MemberInfo.GetHashCode() + + (17 * obj.AttributeType.GetHashCode()); + } + } +#endregion + +#if !USE_TYPEINFO + private static BindingFlags DeclaredFlags = + BindingFlags.NonPublic | + BindingFlags.Public | + BindingFlags.Instance | + BindingFlags.Static | + BindingFlags.DeclaredOnly; +#endif + + public static PropertyInfo GetDeclaredProperty(this Type type, string propertyName) { + var props = GetDeclaredProperties(type); + + for (int i = 0; i < props.Length; ++i) { + if (props[i].Name == propertyName) { + return props[i]; + } + } + + return null; + } + + public static MethodInfo GetDeclaredMethod(this Type type, string methodName) { + var methods = GetDeclaredMethods(type); + + for (int i = 0; i < methods.Length; ++i) { + if (methods[i].Name == methodName) { + return methods[i]; + } + } + + return null; + } + + + public static ConstructorInfo GetDeclaredConstructor(this Type type, Type[] parameters) { + var ctors = GetDeclaredConstructors(type); + + for (int i = 0; i < ctors.Length; ++i) { + var ctor = ctors[i]; + var ctorParams = ctor.GetParameters(); + + if (parameters.Length != ctorParams.Length) continue; + + for (int j = 0; j < ctorParams.Length; ++j) { + // require an exact match + if (ctorParams[j].ParameterType != parameters[j]) continue; + } + + return ctor; + } + + return null; + } + + public static ConstructorInfo[] GetDeclaredConstructors(this Type type) { +#if USE_TYPEINFO + return type.GetTypeInfo().DeclaredConstructors.ToArray(); +#else + return type.GetConstructors(DeclaredFlags); +#endif + } + + public static MemberInfo[] GetFlattenedMember(this Type type, string memberName) { + var result = new List(); + + while (type != null) { + var members = GetDeclaredMembers(type); + + for (int i = 0; i < members.Length; ++i) { + if (members[i].Name == memberName) { + result.Add(members[i]); + } + } + + type = type.Resolve().BaseType; + } + + return result.ToArray(); + } + + public static MethodInfo GetFlattenedMethod(this Type type, string methodName) { + while (type != null) { + var methods = GetDeclaredMethods(type); + + for (int i = 0; i < methods.Length; ++i) { + if (methods[i].Name == methodName) { + return methods[i]; + } + } + + type = type.Resolve().BaseType; + } + + return null; + } + + public static IEnumerable GetFlattenedMethods(this Type type, string methodName) { + while (type != null) { + var methods = GetDeclaredMethods(type); + + for (int i = 0; i < methods.Length; ++i) { + if (methods[i].Name == methodName) { + yield return methods[i]; + } + } + + type = type.Resolve().BaseType; + } + } + + public static PropertyInfo GetFlattenedProperty(this Type type, string propertyName) { + while (type != null) { + var properties = GetDeclaredProperties(type); + + for (int i = 0; i < properties.Length; ++i) { + if (properties[i].Name == propertyName) { + return properties[i]; + } + } + + type = type.Resolve().BaseType; + } + + return null; + } + + public static MemberInfo GetDeclaredMember(this Type type, string memberName) { + var members = GetDeclaredMembers(type); + + for (int i = 0; i < members.Length; ++i) { + if (members[i].Name == memberName) { + return members[i]; + } + } + + return null; + } + + public static MethodInfo[] GetDeclaredMethods(this Type type) { +#if USE_TYPEINFO + return type.GetTypeInfo().DeclaredMethods.ToArray(); +#else + return type.GetMethods(DeclaredFlags); +#endif + } + + public static PropertyInfo[] GetDeclaredProperties(this Type type) { +#if USE_TYPEINFO + return type.GetTypeInfo().DeclaredProperties.ToArray(); +#else + return type.GetProperties(DeclaredFlags); +#endif + } + + public static FieldInfo[] GetDeclaredFields(this Type type) { +#if USE_TYPEINFO + return type.GetTypeInfo().DeclaredFields.ToArray(); +#else + return type.GetFields(DeclaredFlags); +#endif + } + + public static MemberInfo[] GetDeclaredMembers(this Type type) { +#if USE_TYPEINFO + return type.GetTypeInfo().DeclaredMembers.ToArray(); +#else + return type.GetMembers(DeclaredFlags); +#endif + } + + public static MemberInfo AsMemberInfo(Type type) { +#if USE_TYPEINFO + return type.GetTypeInfo(); +#else + return type; +#endif + } + + public static bool IsType(MemberInfo member) { +#if USE_TYPEINFO + return member is TypeInfo; +#else + return member is Type; +#endif + } + + public static Type AsType(MemberInfo member) { +#if USE_TYPEINFO + return ((TypeInfo)member).AsType(); +#else + return (Type)member; +#endif + } + +#if USE_TYPEINFO + public static TypeInfo Resolve(this Type type) { + return type.GetTypeInfo(); + } +#else + public static Type Resolve(this Type type) { + return type; + } +#endif + + +#region Extensions + +#if USE_TYPEINFO_EXTENSIONS + public static bool IsAssignableFrom(this Type parent, Type child) { + return parent.GetTypeInfo().IsAssignableFrom(child.GetTypeInfo()); + } + + public static Type GetElementType(this Type type) { + return type.GetTypeInfo().GetElementType(); + } + + public static MethodInfo GetSetMethod(this PropertyInfo member, bool nonPublic = false) { + // only public requested but the set method is not public + if (nonPublic == false && member.SetMethod != null && member.SetMethod.IsPublic == false) return null; + + return member.SetMethod; + } + + public static MethodInfo GetGetMethod(this PropertyInfo member, bool nonPublic = false) { + // only public requested but the set method is not public + if (nonPublic == false && member.GetMethod != null && member.GetMethod.IsPublic == false) return null; + + return member.GetMethod; + } + + public static MethodInfo GetBaseDefinition(this MethodInfo method) { + return method.GetRuntimeBaseDefinition(); + } + + public static Type[] GetInterfaces(this Type type) { + return type.GetTypeInfo().ImplementedInterfaces.ToArray(); + } + + public static Type[] GetGenericArguments(this Type type) { + return type.GetTypeInfo().GenericTypeArguments.ToArray(); + } +#endif +#endregion + } +} \ No newline at end of file diff --git a/Assets/Source/Internal/fsPortableReflection.cs.meta b/Assets/Source/Internal/fsPortableReflection.cs.meta new file mode 100644 index 0000000..bebfe60 --- /dev/null +++ b/Assets/Source/Internal/fsPortableReflection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 917955f7b7d77724d8abc90bd462de25 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Internal/fsTypeExtensions.cs b/Assets/Source/Internal/fsTypeExtensions.cs new file mode 100644 index 0000000..b334121 --- /dev/null +++ b/Assets/Source/Internal/fsTypeExtensions.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +#if !UNITY_EDITOR && UNITY_WSA +// For System.Reflection.TypeExtensions +using System.Reflection; +// For Reflection Extensions in non-win10 builds. +using FullSerializer.Internal; +#endif + +namespace FullSerializer { + public static class fsTypeExtensions { + /// + /// Returns a pretty name for the type in the style of one that you'd see in C# without the namespace. + /// + public static string CSharpName(this Type type) { + return CSharpName(type, /*includeNamespace:*/false); + } + + public static string CSharpName(this Type type, bool includeNamespace, bool ensureSafeDeclarationName) { + var name = CSharpName(type, includeNamespace); + if (ensureSafeDeclarationName) name = name.Replace('>', '_').Replace('<', '_').Replace('.', '_'); + return name; + } + + /// + /// Returns a pretty name for the type in the style of one that you'd see in C#. + /// + /// Should the name include namespaces? + public static string CSharpName(this Type type, bool includeNamespace) { + // we special case some of the common type names + if (type == typeof(void)) return "void"; + if (type == typeof(int)) return "int"; + if (type == typeof(float)) return "float"; + if (type == typeof(bool)) return "bool"; + if (type == typeof(double)) return "double"; + if (type == typeof(string)) return "string"; + + // Generic parameter, ie, T in Okay + // We special-case this logic otherwise we will recurse on the T + if (type.IsGenericParameter) { + return type.ToString(); + } + + string name = ""; + + var genericArguments = (IEnumerable)type.GetGenericArguments(); + if (type.IsNested) { + name += type.DeclaringType.CSharpName() + "."; + + // The declaring type generic parameters are considered part of the nested types generic + // parameters so we need to remove them, otherwise it will get included again. + // + // Say we have type `class Parent { class Child {} }` + // If we did not do the removal, then we would output Parent.Child, but we really want + // to output Parent.Child + if (type.DeclaringType.GetGenericArguments().Length > 0) { + genericArguments = genericArguments.Skip(type.DeclaringType.GetGenericArguments().Length); + } + } + + if (genericArguments.Any() == false) { + name += type.Name; + } + else { + name += type.Name.Substring(0, type.Name.IndexOf('`')); + name += "<" + String.Join(",", genericArguments.Select(t => CSharpName(t, includeNamespace)).ToArray()) + ">"; + } + + if (includeNamespace && type.Namespace != null) { + name = type.Namespace + "." + name; + } + + return name; + } + } +} \ No newline at end of file diff --git a/Assets/Source/Internal/fsTypeExtensions.cs.meta b/Assets/Source/Internal/fsTypeExtensions.cs.meta new file mode 100644 index 0000000..6f6f0b9 --- /dev/null +++ b/Assets/Source/Internal/fsTypeExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 34f8987a390a2ee488a60e2bc91e9614 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Internal/fsVersionManager.cs b/Assets/Source/Internal/fsVersionManager.cs new file mode 100644 index 0000000..ac2a618 --- /dev/null +++ b/Assets/Source/Internal/fsVersionManager.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace FullSerializer.Internal { + public static class fsVersionManager { + private static readonly Dictionary> _cache = new Dictionary>(); + + public static fsResult GetVersionImportPath(string currentVersion, fsVersionedType targetVersion, out List path) { + path = new List(); + + if (GetVersionImportPathRecursive(path, currentVersion, targetVersion) == false) { + return fsResult.Fail("There is no migration path from \"" + currentVersion + "\" to \"" + targetVersion.VersionString + "\""); + } + + path.Add(targetVersion); + return fsResult.Success; + } + + private static bool GetVersionImportPathRecursive(List path, string currentVersion, fsVersionedType current) { + for (int i = 0; i < current.Ancestors.Length; ++i) { + fsVersionedType ancestor = current.Ancestors[i]; + + if (ancestor.VersionString == currentVersion || + GetVersionImportPathRecursive(path, currentVersion, ancestor)) { + + path.Add(ancestor); + return true; + } + } + + return false; + } + + public static fsOption GetVersionedType(Type type) { + fsOption optionalVersionedType; + + if (_cache.TryGetValue(type, out optionalVersionedType) == false) { + var attr = fsPortableReflection.GetAttribute(type); + + if (attr != null) { + if (string.IsNullOrEmpty(attr.VersionString) == false || attr.PreviousModels != null) { + // Version string must be provided + if (attr.PreviousModels != null && string.IsNullOrEmpty(attr.VersionString)) { + throw new Exception("fsObject attribute on " + type + " contains a PreviousModels specifier - it must also include a VersionString modifier"); + } + + // Map the ancestor types into versioned types + fsVersionedType[] ancestors = new fsVersionedType[attr.PreviousModels != null ? attr.PreviousModels.Length : 0]; + for (int i = 0; i < ancestors.Length; ++i) { + fsOption ancestorType = GetVersionedType(attr.PreviousModels[i]); + if (ancestorType.IsEmpty) { + throw new Exception("Unable to create versioned type for ancestor " + ancestorType + "; please add an [fsObject(VersionString=\"...\")] attribute"); + } + ancestors[i] = ancestorType.Value; + } + + // construct the actual versioned type instance + fsVersionedType versionedType = new fsVersionedType { + Ancestors = ancestors, + VersionString = attr.VersionString, + ModelType = type + }; + + // finally, verify that the versioned type passes some sanity checks + VerifyUniqueVersionStrings(versionedType); + VerifyConstructors(versionedType); + + optionalVersionedType = fsOption.Just(versionedType); + } + } + + _cache[type] = optionalVersionedType; + } + + return optionalVersionedType; + } + + /// + /// Verifies that the given type has constructors to migrate from all ancestor types. + /// + private static void VerifyConstructors(fsVersionedType type) { + ConstructorInfo[] publicConstructors = type.ModelType.GetDeclaredConstructors(); + + for (int i = 0; i < type.Ancestors.Length; ++i) { + Type requiredConstructorType = type.Ancestors[i].ModelType; + + bool found = false; + for (int j = 0; j < publicConstructors.Length; ++j) { + var parameters = publicConstructors[j].GetParameters(); + if (parameters.Length == 1 && parameters[0].ParameterType == requiredConstructorType) { + found = true; + break; + } + } + + if (found == false) { + throw new fsMissingVersionConstructorException(type.ModelType, requiredConstructorType); + } + } + } + + /// + /// Verifies that the given version graph contains only unique versions. + /// + private static void VerifyUniqueVersionStrings(fsVersionedType type) { + // simple tree traversal + + var found = new Dictionary(); + + var remaining = new Queue(); + remaining.Enqueue(type); + + while (remaining.Count > 0) { + fsVersionedType item = remaining.Dequeue(); + + // Verify we do not already have the version string. Take into account that we're not just + // comparing the same model twice, since we can have a valid import graph that has the same + // model multiple times. + if (found.ContainsKey(item.VersionString) && found[item.VersionString] != item.ModelType) { + throw new fsDuplicateVersionNameException(found[item.VersionString], item.ModelType, item.VersionString); + } + found[item.VersionString] = item.ModelType; + + // scan the ancestors as well + foreach (var ancestor in item.Ancestors) { + remaining.Enqueue(ancestor); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Source/Internal/fsVersionManager.cs.meta b/Assets/Source/Internal/fsVersionManager.cs.meta new file mode 100644 index 0000000..6c69697 --- /dev/null +++ b/Assets/Source/Internal/fsVersionManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6e2cbf05d62993b4c900b6f0568b5525 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Internal/fsVersionedType.cs b/Assets/Source/Internal/fsVersionedType.cs new file mode 100644 index 0000000..7bda5b7 --- /dev/null +++ b/Assets/Source/Internal/fsVersionedType.cs @@ -0,0 +1,49 @@ +using System; + +namespace FullSerializer.Internal { + public struct fsVersionedType { + /// + /// The direct ancestors that this type can import. + /// + public fsVersionedType[] Ancestors; + + /// + /// The identifying string that is unique among all ancestors. + /// + public string VersionString; + + /// + /// The modeling type that this versioned type maps back to. + /// + public Type ModelType; + + /// + /// Migrate from an instance of an ancestor. + /// + public object Migrate(object ancestorInstance) { + return Activator.CreateInstance(ModelType, ancestorInstance); + } + + public override string ToString() { + return "fsVersionedType [ModelType=" + ModelType + ", VersionString=" + VersionString + ", Ancestors.Length=" + Ancestors.Length + "]"; + } + + public static bool operator ==(fsVersionedType a, fsVersionedType b) { + return a.ModelType == b.ModelType; + } + + public static bool operator !=(fsVersionedType a, fsVersionedType b) { + return a.ModelType != b.ModelType; + } + + public override bool Equals(object obj) { + return + obj is fsVersionedType && + ModelType == ((fsVersionedType)obj).ModelType; + } + + public override int GetHashCode() { + return ModelType.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/Assets/Source/Internal/fsVersionedType.cs.meta b/Assets/Source/Internal/fsVersionedType.cs.meta new file mode 100644 index 0000000..34b5ea4 --- /dev/null +++ b/Assets/Source/Internal/fsVersionedType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 98a8b020907c059448da9798c38f201d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Reflection.meta b/Assets/Source/Reflection.meta new file mode 100644 index 0000000..3fbc63d --- /dev/null +++ b/Assets/Source/Reflection.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e45b6257da83c52429dcde2ab7b7c7e4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Reflection/fsMetaProperty.cs b/Assets/Source/Reflection/fsMetaProperty.cs new file mode 100644 index 0000000..1e7634e --- /dev/null +++ b/Assets/Source/Reflection/fsMetaProperty.cs @@ -0,0 +1,152 @@ +using System; +using System.Reflection; + +namespace FullSerializer.Internal { + /// + /// A property or field on a MetaType. This unifies the FieldInfo and PropertyInfo classes. + /// + public class fsMetaProperty { + internal fsMetaProperty(fsConfig config, FieldInfo field) { + _memberInfo = field; + StorageType = field.FieldType; + MemberName = field.Name; + IsPublic = field.IsPublic; + IsReadOnly = field.IsInitOnly; + CanRead = true; + CanWrite = true; + + CommonInitialize(config); + } + + internal fsMetaProperty(fsConfig config, PropertyInfo property) { + _memberInfo = property; + StorageType = property.PropertyType; + MemberName = property.Name; + IsPublic = (property.GetGetMethod() != null && property.GetGetMethod().IsPublic) && + (property.GetSetMethod() != null && property.GetSetMethod().IsPublic); + IsReadOnly = false; + CanRead = property.CanRead; + CanWrite = property.CanWrite; + + CommonInitialize(config); + } + + private void CommonInitialize(fsConfig config) { + var attr = fsPortableReflection.GetAttribute(_memberInfo); + if (attr != null) { + JsonName = attr.Name; + OverrideConverterType = attr.Converter; + } + + if (string.IsNullOrEmpty(JsonName)) { + JsonName = config.GetJsonNameFromMemberName(MemberName, _memberInfo); + } + } + + /// + /// Internal handle to the reflected member. + /// + private MemberInfo _memberInfo; + + /// + /// The type of value that is stored inside of the property. For example, for an int field, + /// StorageType will be typeof(int). + /// + public Type StorageType { + get; + private set; + } + + /// + /// A custom fsBaseConverter instance to use for this field/property, if requested. This will be + /// null if the default converter selection algorithm should be used. This is specified using the + /// [fsObject] annotation with the Converter field. + /// + public Type OverrideConverterType { + get; + private set; + } + + /// + /// Can this property be read? + /// + public bool CanRead { + get; + private set; + } + + /// + /// Can this property be written to? + /// + public bool CanWrite { + get; + private set; + } + + /// + /// The serialized name of the property, as it should appear in JSON. + /// + public string JsonName { + get; + private set; + } + + /// + /// The name of the actual member. + /// + public string MemberName { + get; + private set; + } + + /// + /// Is this member public? + /// + public bool IsPublic { + get; + private set; + } + + /// + /// Is this type readonly? We can modify readonly properties using reflection, but not + /// using generated C#. + /// + public bool IsReadOnly { + get; private set; + } + + /// + /// Writes a value to the property that this MetaProperty represents, using given object + /// instance as the context. + /// + public void Write(object context, object value) { + FieldInfo field = _memberInfo as FieldInfo; + PropertyInfo property = _memberInfo as PropertyInfo; + + if (field != null) { + field.SetValue(context, value); + } + + else if (property != null) { + MethodInfo setMethod = property.GetSetMethod(/*nonPublic:*/ true); + if (setMethod != null) { + setMethod.Invoke(context, new object[] { value }); + } + } + } + + /// + /// Reads a value from the property that this MetaProperty represents, using the given + /// object instance as the context. + /// + public object Read(object context) { + if (_memberInfo is PropertyInfo) { + return ((PropertyInfo)_memberInfo).GetValue(context, new object[] { }); + } + + else { + return ((FieldInfo)_memberInfo).GetValue(context); + } + } + } +} \ No newline at end of file diff --git a/Assets/Source/Reflection/fsMetaProperty.cs.meta b/Assets/Source/Reflection/fsMetaProperty.cs.meta new file mode 100644 index 0000000..47efe4d --- /dev/null +++ b/Assets/Source/Reflection/fsMetaProperty.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9bb14b7a131d5a44693d3005bd480781 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Reflection/fsMetaType.cs b/Assets/Source/Reflection/fsMetaType.cs new file mode 100644 index 0000000..34c7e58 --- /dev/null +++ b/Assets/Source/Reflection/fsMetaType.cs @@ -0,0 +1,336 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using FullSerializer.Internal; + +namespace FullSerializer { + /// + /// MetaType contains metadata about a type. This is used by the reflection serializer. + /// + public class fsMetaType { + private static Dictionary> _configMetaTypes = + new Dictionary>(); + + public static fsMetaType Get(fsConfig config, Type type) { + Dictionary metaTypes; + if (_configMetaTypes.TryGetValue(config, out metaTypes) == false) + metaTypes = _configMetaTypes[config] = new Dictionary(); + + fsMetaType metaType; + if (metaTypes.TryGetValue(type, out metaType) == false) { + metaType = new fsMetaType(config, type); + metaTypes[type] = metaType; + } + + return metaType; + } + + /// + /// Clears out the cached type results. Useful if some prior assumptions become invalid, ie, the default member + /// serialization mode. + /// + public static void ClearCache() { + _configMetaTypes = new Dictionary>(); + } + + private fsMetaType(fsConfig config, Type reflectedType) { + ReflectedType = reflectedType; + + List properties = new List(); + CollectProperties(config, properties, reflectedType); + Properties = properties.ToArray(); + } + + public Type ReflectedType; + + private static void CollectProperties(fsConfig config, List properties, Type reflectedType) { + // do we require a [SerializeField] or [fsProperty] attribute? + bool requireOptIn = config.DefaultMemberSerialization == fsMemberSerialization.OptIn; + bool requireOptOut = config.DefaultMemberSerialization == fsMemberSerialization.OptOut; + + fsObjectAttribute attr = fsPortableReflection.GetAttribute(reflectedType); + if (attr != null) { + requireOptIn = attr.MemberSerialization == fsMemberSerialization.OptIn; + requireOptOut = attr.MemberSerialization == fsMemberSerialization.OptOut; + } + + MemberInfo[] members = reflectedType.GetDeclaredMembers(); + foreach (var member in members) { + // We don't serialize members annotated with any of the ignore serialize attributes + if (config.IgnoreSerializeAttributes.Any(t => fsPortableReflection.HasAttribute(member, t))) { + continue; + } + + PropertyInfo property = member as PropertyInfo; + FieldInfo field = member as FieldInfo; + + // Early out if it's neither a field or a property, since we don't serialize anything else. + if (property == null && field == null) { + continue; + } + + // Skip properties if we don't want them, to avoid the cost of checking attributes. + if (property != null && !config.EnablePropertySerialization) { + continue; + } + + // If an opt-in annotation is required, then skip the property if it doesn't have one + // of the serialize attributes + if (requireOptIn && + !config.SerializeAttributes.Any(t => fsPortableReflection.HasAttribute(member, t))) { + + continue; + } + + // If an opt-out annotation is required, then skip the property *only if* it has one of + // the not serialize attributes + if (requireOptOut && + config.IgnoreSerializeAttributes.Any(t => fsPortableReflection.HasAttribute(member, t))) { + + continue; + } + + if (property != null) { + if (CanSerializeProperty(config, property, members, requireOptOut)) { + properties.Add(new fsMetaProperty(config, property)); + } + } + else if (field != null) { + if (CanSerializeField(config, field, requireOptOut)) { + properties.Add(new fsMetaProperty(config, field)); + } + } + } + + if (reflectedType.Resolve().BaseType != null) { + CollectProperties(config, properties, reflectedType.Resolve().BaseType); + } + } + + private static bool IsAutoProperty(PropertyInfo property, MemberInfo[] members) { + return + property.CanWrite && property.CanRead && + fsPortableReflection.HasAttribute( + property.GetGetMethod(), typeof(CompilerGeneratedAttribute), /*shouldCache:*/false); + } + + /// + /// Returns if the given property should be serialized. + /// + /// Should a property without any annotations be serialized? + private static bool CanSerializeProperty(fsConfig config, PropertyInfo property, MemberInfo[] members, bool annotationFreeValue) { + // We don't serialize delegates + if (typeof(Delegate).IsAssignableFrom(property.PropertyType)) { + return false; + } + + var publicGetMethod = property.GetGetMethod(/*nonPublic:*/ false); + var publicSetMethod = property.GetSetMethod(/*nonPublic:*/ false); + + // We do not bother to serialize static fields. + if ((publicGetMethod != null && publicGetMethod.IsStatic) || + (publicSetMethod != null && publicSetMethod.IsStatic)) { + return false; + } + + // Never serialize indexers. I can't think of a sane way to serialize/deserialize them, and they're normally wrappers around other fields anyway... + if (property.GetIndexParameters().Length > 0) { + return false; + } + + // If a property is annotated with one of the serializable attributes, then it should + // it should definitely be serialized. + // + // NOTE: We place this override check *after* the static check, because we *never* + // allow statics to be serialized. + if (config.SerializeAttributes.Any(t => fsPortableReflection.HasAttribute(property, t))) { + return true; + } + + // If the property cannot be both read and written to, we are not going to serialize it + // regardless of the default serialization mode + if (property.CanRead == false || property.CanWrite == false) { + return false; + } + + // Depending on the configuration options, check whether the property is automatic + // and if it has a public setter to determine whether it should be serialized + if ((publicGetMethod != null && (config.SerializeNonPublicSetProperties || publicSetMethod != null)) && + (config.SerializeNonAutoProperties || IsAutoProperty(property, members))) { + return true; + } + + + // Otherwise, we don't bother with serialization + return annotationFreeValue; + } + + private static bool CanSerializeField(fsConfig config, FieldInfo field, bool annotationFreeValue) { + // We don't serialize delegates + if (typeof(Delegate).IsAssignableFrom(field.FieldType)) { + return false; + } + + // We don't serialize compiler generated fields. + if (field.IsDefined(typeof(CompilerGeneratedAttribute), false)) { + return false; + } + + // We don't serialize static fields + if (field.IsStatic) { + return false; + } + + // We want to serialize any fields annotated with one of the serialize attributes. + // + // NOTE: This occurs *after* the static check, because we *never* want to serialize + // static fields. + if (config.SerializeAttributes.Any(t => fsPortableReflection.HasAttribute(field, t))) { + return true; + } + + // We use !IsPublic because that also checks for internal, protected, and private. + if (!annotationFreeValue && !field.IsPublic) { + return false; + } + + return true; + } + + /// + /// Attempt to emit an AOT compiled direct converter for this type. + /// + /// True if AOT data was emitted, false otherwise. + public bool EmitAotData() { + if (_hasEmittedAotData == false) { + _hasEmittedAotData = true; + + // NOTE: + // Even if the type has derived types, we can still generate a direct converter for it. + // Direct converters are not used for inherited types, so the reflected converter or something + // similar will be used for the derived type instead of our AOT compiled one. + + for (int i = 0; i < Properties.Length; ++i) { + // Cannot AOT compile since we need to public member access. + if (Properties[i].IsPublic == false) + return false; + // Cannot AOT compile since readonly members can only be modified using reflection. + if (Properties[i].IsReadOnly) + return false; + } + + // Cannot AOT compile since we need a default ctor. + if (HasDefaultConstructor == false) + return false; + + fsAotCompilationManager.AddAotCompilation(ReflectedType, Properties, _isDefaultConstructorPublic); + return true; + } + + return false; + } + private bool _hasEmittedAotData; + + public fsMetaProperty[] Properties { + get; + private set; + } + + /// + /// Returns true if the type represented by this metadata contains a default constructor. + /// + public bool HasDefaultConstructor { + get { + if (_hasDefaultConstructorCache.HasValue == false) { + // arrays are considered to have a default constructor + if (ReflectedType.Resolve().IsArray) { + _hasDefaultConstructorCache = true; + _isDefaultConstructorPublic = true; + } + + // value types (ie, structs) always have a default constructor + else if (ReflectedType.Resolve().IsValueType) { + _hasDefaultConstructorCache = true; + _isDefaultConstructorPublic = true; + } + + else { + // consider private constructors as well + var ctor = ReflectedType.GetDeclaredConstructor(fsPortableReflection.EmptyTypes); + _hasDefaultConstructorCache = ctor != null; + if (ctor != null) { + _isDefaultConstructorPublic = ctor.IsPublic; + } + } + } + + return _hasDefaultConstructorCache.Value; + } + } + private bool? _hasDefaultConstructorCache; + private bool _isDefaultConstructorPublic; + + /// + /// Creates a new instance of the type that this metadata points back to. If this type has a + /// default constructor, then Activator.CreateInstance will be used to construct the type + /// (or Array.CreateInstance if it an array). Otherwise, an uninitialized object created via + /// FormatterServices.GetSafeUninitializedObject is used to construct the instance. + /// + public object CreateInstance() { + if (ReflectedType.Resolve().IsInterface || ReflectedType.Resolve().IsAbstract) { + throw new Exception("Cannot create an instance of an interface or abstract type for " + ReflectedType); + } + +#if !NO_UNITY + // Unity requires special construction logic for types that derive from + // ScriptableObject. + if (typeof(UnityEngine.ScriptableObject).IsAssignableFrom(ReflectedType)) { + return UnityEngine.ScriptableObject.CreateInstance(ReflectedType); + } +#endif + + // Strings don't have default constructors but also fail when run through + // FormatterSerivces.GetSafeUninitializedObject + if (typeof(string) == ReflectedType) { + return string.Empty; + } + + if (HasDefaultConstructor == false) { +#if !UNITY_EDITOR && (UNITY_WEBPLAYER || UNITY_WP8 || UNITY_METRO) + throw new InvalidOperationException("The selected Unity platform requires " + + ReflectedType.FullName + " to have a default constructor. Please add one."); +#else + return System.Runtime.Serialization.FormatterServices.GetSafeUninitializedObject(ReflectedType); +#endif + } + + if (ReflectedType.Resolve().IsArray) { + // we have to start with a size zero array otherwise it will have invalid data + // inside of it + return Array.CreateInstance(ReflectedType.GetElementType(), 0); + } + + try { +#if (!UNITY_EDITOR && (UNITY_METRO)) + // In WinRT/WinStore builds, Activator.CreateInstance(..., true) is broken + return Activator.CreateInstance(ReflectedType); +#else + return Activator.CreateInstance(ReflectedType, /*nonPublic:*/ true); +#endif + } +#if (!UNITY_EDITOR && (UNITY_METRO)) == false + catch (MissingMethodException e) { + throw new InvalidOperationException("Unable to create instance of " + ReflectedType + "; there is no default constructor", e); + } +#endif + catch (TargetInvocationException e) { + throw new InvalidOperationException("Constructor of " + ReflectedType + " threw an exception when creating an instance", e); + } + catch (MemberAccessException e) { + throw new InvalidOperationException("Unable to access constructor of " + ReflectedType, e); + } + } + } +} \ No newline at end of file diff --git a/Assets/Source/Reflection/fsMetaType.cs.meta b/Assets/Source/Reflection/fsMetaType.cs.meta new file mode 100644 index 0000000..6ef9f54 --- /dev/null +++ b/Assets/Source/Reflection/fsMetaType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f5bc83526ccd76f4c877c4db426b7e9f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Reflection/fsReflectionUtility.cs b/Assets/Source/Reflection/fsReflectionUtility.cs new file mode 100644 index 0000000..9dc29e3 --- /dev/null +++ b/Assets/Source/Reflection/fsReflectionUtility.cs @@ -0,0 +1,49 @@ +using System; + +#if !UNITY_EDITOR && UNITY_WSA +// For System.Reflection.TypeExtensions +using System.Reflection; +#endif + +namespace FullSerializer.Internal { + public static class fsReflectionUtility { + /// + /// Searches for a particular implementation of the given interface type inside of the type. + /// This is particularly useful if the interface type is an open type, ie, typeof(IFace{}), + /// because this method will then return IFace{} but with appropriate type parameters + /// inserted. + /// + /// The base type to search for interface + /// The interface type to search for. Can be an open generic + /// type. + /// The actual interface type that the type contains, or null if there is no + /// implementation of the given interfaceType on type. + public static Type GetInterface(Type type, Type interfaceType) { + if (interfaceType.Resolve().IsGenericType && + interfaceType.Resolve().IsGenericTypeDefinition == false) { + + throw new ArgumentException("GetInterface requires that if the interface " + + "type is generic, then it must be the generic type definition, not a " + + "specific generic type instantiation"); + }; + + while (type != null) { + foreach (var iface in type.GetInterfaces()) { + if (iface.Resolve().IsGenericType) { + if (interfaceType == iface.GetGenericTypeDefinition()) { + return iface; + } + } + + else if (interfaceType == iface) { + return iface; + } + } + + type = type.Resolve().BaseType; + } + + return null; + } + } +} \ No newline at end of file diff --git a/Assets/Source/Reflection/fsReflectionUtility.cs.meta b/Assets/Source/Reflection/fsReflectionUtility.cs.meta new file mode 100644 index 0000000..3e5c90d --- /dev/null +++ b/Assets/Source/Reflection/fsReflectionUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0b4280b980c130b42a320f8b5fdfeff5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/Reflection/fsTypeCache.cs b/Assets/Source/Reflection/fsTypeCache.cs new file mode 100644 index 0000000..79ea835 --- /dev/null +++ b/Assets/Source/Reflection/fsTypeCache.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace FullSerializer.Internal { + /// + /// Caches type name to type lookups. Type lookups occur in all loaded assemblies. + /// + public static class fsTypeCache { + /// + /// Cache from fully qualified type name to type instances. + /// + // TODO: verify that type names will be unique + private static Dictionary _cachedTypes = new Dictionary(); + + /// + /// Assemblies indexed by their name. + /// + private static Dictionary _assembliesByName; + + /// + /// A list of assemblies, by index. + /// + private static List _assembliesByIndex; + + static fsTypeCache() { + // Setup assembly references so searching and the like resolves correctly. + _assembliesByName = new Dictionary(); + _assembliesByIndex = new List(); + +#if (!UNITY_EDITOR && UNITY_METRO && !ENABLE_IL2CPP) // no AppDomain on WinRT + var assembly = typeof(object).GetTypeInfo().Assembly; + _assembliesByName[assembly.FullName] = assembly; + _assembliesByIndex.Add(assembly); +#else + foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { + _assembliesByName[assembly.FullName] = assembly; + _assembliesByIndex.Add(assembly); + } +#endif + + _cachedTypes = new Dictionary(); + +#if !(UNITY_WP8 || UNITY_METRO) // AssemblyLoad events are not supported on these platforms + AppDomain.CurrentDomain.AssemblyLoad += OnAssemblyLoaded; +#endif + } + +#if !(UNITY_WP8 || UNITY_METRO) // AssemblyLoad events are not supported on these platforms + private static void OnAssemblyLoaded(object sender, AssemblyLoadEventArgs args) { + _assembliesByName[args.LoadedAssembly.FullName] = args.LoadedAssembly; + _assembliesByIndex.Add(args.LoadedAssembly); + + _cachedTypes = new Dictionary(); + } +#endif + + /// + /// Does a direct lookup for the given type, ie, goes directly to the assembly identified by + /// assembly name and finds it there. + /// + /// The assembly to find the type in. + /// The name of the type. + /// The found type. + /// True if the type was found, false otherwise. + private static bool TryDirectTypeLookup(string assemblyName, string typeName, out Type type) { + if (assemblyName != null) { + Assembly assembly; + if (_assembliesByName.TryGetValue(assemblyName, out assembly)) { + type = assembly.GetType(typeName, /*throwOnError:*/ false); + return type != null; + } + } + + type = null; + return false; + } + + /// + /// Tries to do an indirect type lookup by scanning through every loaded assembly until the + /// type is found in one of them. + /// + /// The name of the type. + /// The found type. + /// True if the type was found, false otherwise. + private static bool TryIndirectTypeLookup(string typeName, out Type type) { + // There used to be a foreach loop through the value keys of the _assembliesByName + // dictionary. However, during that loop assembly loads could occur, causing an + // OutOfSync exception. To resolve that, we just iterate through the assemblies by + // index. + + int i = 0; + while (i < _assembliesByIndex.Count) { + Assembly assembly = _assembliesByIndex[i]; + + // try GetType; should be fast + type = assembly.GetType(typeName); + if (type != null) { + return true; + } + ++i; + } + + i = 0; + // This code here is slow and is just here as a fallback + while (i < _assembliesByIndex.Count) { + Assembly assembly = _assembliesByIndex[i]; + + // private type or similar; go through the slow path and check every type's full + // name + foreach (var foundType in assembly.GetTypes()) { + if (foundType.FullName == typeName) { + type = foundType; + return true; + } + } + ++i; + } + + type = null; + return false; + } + + /// + /// Removes any cached type lookup results. + /// + public static void Reset() { + _cachedTypes = new Dictionary(); + } + + /// + /// Find a type with the given name. An exception is thrown if no type with the given name + /// can be found. This method searches all currently loaded assemblies for the given type. If the type cannot + /// be found, then null will be returned. + /// + /// The fully qualified name of the type. + public static Type GetType(string name) { + return GetType(name, null); + } + + /// + /// Find a type with the given name. An exception is thrown if no type with the given name + /// can be found. This method searches all currently loaded assemblies for the given type. If the type cannot + /// be found, then null will be returned. + /// + /// The fully qualified name of the type. + /// A hint for the assembly to start the search with. Use null if unknown. + public static Type GetType(string name, string assemblyHint) { + if (string.IsNullOrEmpty(name)) { + return null; + } + + Type type; + if (_cachedTypes.TryGetValue(name, out type) == false) { + // if both the direct and indirect type lookups fail, then throw an exception + if (TryDirectTypeLookup(assemblyHint, name, out type) == false && + TryIndirectTypeLookup(name, out type) == false) { + } + + _cachedTypes[name] = type; + } + + return type; + } + } +} + diff --git a/Assets/Source/Reflection/fsTypeCache.cs.meta b/Assets/Source/Reflection/fsTypeCache.cs.meta new file mode 100644 index 0000000..262db74 --- /dev/null +++ b/Assets/Source/Reflection/fsTypeCache.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 233490e64cba5c2408b26b49bd077483 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsAotCompilationManager.cs b/Assets/Source/fsAotCompilationManager.cs new file mode 100644 index 0000000..79c811b --- /dev/null +++ b/Assets/Source/fsAotCompilationManager.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Text; +using FullSerializer.Internal; + +namespace FullSerializer { + /// + /// The AOT compilation manager + /// + public class fsAotCompilationManager { + /// + /// Ahead of time compilations that are available. The type maps to the object type the generated converter + /// will serialize/deserialize, and the string is the text content for a converter that will do the serialization. + /// + /// The generated serializer is completely independent and you don't need to do anything. Simply add the file to + /// your project and it'll get used instead of the reflection based one. + /// + public static Dictionary AvailableAotCompilations { + get { + for (int i = 0; i < _uncomputedAotCompilations.Count; ++i) { + var item = _uncomputedAotCompilations[i]; + _computedAotCompilations[item.Type] = GenerateDirectConverterForTypeInCSharp(item.Type, item.Members, item.IsConstructorPublic); + } + _uncomputedAotCompilations.Clear(); + + return _computedAotCompilations; + } + } + private static Dictionary _computedAotCompilations = new Dictionary(); + + private struct AotCompilation { + public Type Type; + public fsMetaProperty[] Members; + public bool IsConstructorPublic; + } + private static List _uncomputedAotCompilations = new List(); + + /// + /// This is a helper method that makes it simple to run an AOT compilation on the given type. + /// + /// The configuration to use when running AOT compilation. + /// The type to perform the AOT compilation on. + /// The AOT class. Add this C# code to your project. + /// True if AOT compilation was successful. + public static bool TryToPerformAotCompilation(fsConfig config, Type type, out string aotCompiledClassInCSharp) { + if (fsMetaType.Get(config, type).EmitAotData()) { + aotCompiledClassInCSharp = AvailableAotCompilations[type]; + return true; + } + + aotCompiledClassInCSharp = default(string); + return false; + } + + /// + /// Adds a new AOT compilation unit. + /// + /// The type of object we are AOT compiling. + /// The members on the object which will be serialized/deserialized. + public static void AddAotCompilation(Type type, fsMetaProperty[] members, bool isConstructorPublic) { + _uncomputedAotCompilations.Add(new AotCompilation { + Type = type, + Members = members, + IsConstructorPublic = isConstructorPublic + }); + } + + private static string GetConverterString(fsMetaProperty member) { + if (member.OverrideConverterType == null) + return "null"; + + return string.Format("typeof({0})", + member.OverrideConverterType.CSharpName(/*includeNamespace:*/ true)); + } + + /// + /// AOT compiles the object (in C#). + /// + private static string GenerateDirectConverterForTypeInCSharp(Type type, fsMetaProperty[] members, bool isConstructorPublic) { + var sb = new StringBuilder(); + string typeName = type.CSharpName(/*includeNamespace:*/ true); + string typeNameSafeDecl = type.CSharpName(true, true); + + sb.AppendLine("using System;"); + sb.AppendLine("using System.Collections.Generic;"); + sb.AppendLine(); + sb.AppendLine("namespace FullSerializer {"); + sb.AppendLine(" partial class fsConverterRegistrar {"); + sb.AppendLine(" public static Speedup." + typeNameSafeDecl + "_DirectConverter " + "Register_" + typeNameSafeDecl + ";"); + sb.AppendLine(" }"); + sb.AppendLine("}"); + sb.AppendLine(); + sb.AppendLine("namespace FullSerializer.Speedup {"); + sb.AppendLine(" public class " + typeNameSafeDecl + "_DirectConverter : fsDirectConverter<" + typeName + "> {"); + sb.AppendLine(" protected override fsResult DoSerialize(" + typeName + " model, Dictionary serialized) {"); + sb.AppendLine(" var result = fsResult.Success;"); + sb.AppendLine(); + foreach (var member in members) { + sb.AppendLine(" result += SerializeMember(serialized, " + GetConverterString(member) + ", \"" + member.JsonName + "\", model." + member.MemberName + ");"); + } + sb.AppendLine(); + sb.AppendLine(" return result;"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" protected override fsResult DoDeserialize(Dictionary data, ref " + typeName + " model) {"); + sb.AppendLine(" var result = fsResult.Success;"); + sb.AppendLine(); + for (int i = 0; i < members.Length; ++i) { + var member = members[i]; + sb.AppendLine(" var t" + i + " = model." + member.MemberName + ";"); + sb.AppendLine(" result += DeserializeMember(data, " + GetConverterString(member) + ", \"" + member.JsonName + "\", out t" + i + ");"); + sb.AppendLine(" model." + member.MemberName + " = t" + i + ";"); + sb.AppendLine(); + } + sb.AppendLine(" return result;"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" public override object CreateInstance(fsData data, Type storageType) {"); + if (isConstructorPublic) { + sb.AppendLine(" return new " + typeName + "();"); + } + else { + sb.AppendLine(" return Activator.CreateInstance(typeof(" + typeName + "), /*nonPublic:*/true);"); + } + sb.AppendLine(" }"); + sb.AppendLine(" }"); + sb.AppendLine("}"); + + return sb.ToString(); + } + } +} \ No newline at end of file diff --git a/Assets/Source/fsAotCompilationManager.cs.meta b/Assets/Source/fsAotCompilationManager.cs.meta new file mode 100644 index 0000000..5f09ec1 --- /dev/null +++ b/Assets/Source/fsAotCompilationManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38f69a9d341a14246879983c2113fc43 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsBaseConverter.cs b/Assets/Source/fsBaseConverter.cs new file mode 100644 index 0000000..91293a5 --- /dev/null +++ b/Assets/Source/fsBaseConverter.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using FullSerializer.Internal; + +namespace FullSerializer { + /// + /// The serialization converter allows for customization of the serialization process. + /// + /// You do not want to derive from this class - there is no way to actually use it within + /// the serializer.. Instead, derive from either fsConverter or fsDirectConverter + public abstract class fsBaseConverter { + /// + /// The serializer that was owns this converter. + /// + public fsSerializer Serializer; + + /// + /// Construct an object instance that will be passed to TryDeserialize. This should **not** + /// deserialize the object. + /// + /// The data the object was serialized with. + /// The field/property type that is storing the instance. + /// An object instance + public virtual object CreateInstance(fsData data, Type storageType) { + if (RequestCycleSupport(storageType)) { + throw new InvalidOperationException("Please override CreateInstance for " + + GetType().FullName + "; the object graph for " + storageType + + " can contain potentially contain cycles, so separated instance creation " + + "is needed"); + } + + return storageType; + } + + /// + /// If true, then the serializer will support cyclic references with the given converted + /// type. + /// + /// The field/property type that is currently storing the object + /// that is being serialized. + public virtual bool RequestCycleSupport(Type storageType) { + if (storageType == typeof(string)) return false; + + return storageType.Resolve().IsClass || storageType.Resolve().IsInterface; + } + + /// + /// If true, then the serializer will include inheritance data for the given converter. + /// + /// The field/property type that is currently storing the object + /// that is being serialized. + public virtual bool RequestInheritanceSupport(Type storageType) { + return storageType.Resolve().IsSealed == false; + } + + /// + /// Serialize the actual object into the given data storage. + /// + /// The object instance to serialize. This will never be null. + /// The serialized state. + /// The field/property type that is storing this instance. + /// If serialization was successful. + public abstract fsResult TrySerialize(object instance, out fsData serialized, Type storageType); + + /// + /// Deserialize data into the object instance. + /// + /// Serialization data to deserialize from. + /// The object instance to deserialize into. + /// The field/property type that is storing the instance. + /// True if serialization was successful, false otherwise. + public abstract fsResult TryDeserialize(fsData data, ref object instance, Type storageType); + + protected fsResult FailExpectedType(fsData data, params fsDataType[] types) { + return fsResult.Fail(GetType().Name + " expected one of " + + string.Join(", ", types.Select(t => t.ToString()).ToArray()) + + " but got " + data.Type + " in " + data); + } + + protected fsResult CheckType(fsData data, fsDataType type) { + if (data.Type != type) { + return fsResult.Fail(GetType().Name + " expected " + type + " but got " + data.Type + " in " + data); + } + return fsResult.Success; + } + + protected fsResult CheckKey(fsData data, string key, out fsData subitem) { + return CheckKey(data.AsDictionary, key, out subitem); + } + + protected fsResult CheckKey(Dictionary data, string key, out fsData subitem) { + if (data.TryGetValue(key, out subitem) == false) { + return fsResult.Fail(GetType().Name + " requires a <" + key + "> key in the data " + data); + } + return fsResult.Success; + } + + protected fsResult SerializeMember(Dictionary data, Type overrideConverterType, string name, T value) { + fsData memberData; + var result = Serializer.TrySerialize(typeof(T), overrideConverterType, value, out memberData); + if (result.Succeeded) data[name] = memberData; + return result; + } + + protected fsResult DeserializeMember(Dictionary data, Type overrideConverterType, string name, out T value) { + fsData memberData; + if (data.TryGetValue(name, out memberData) == false) { + value = default(T); + return fsResult.Fail("Unable to find member \"" + name + "\""); + } + + object storage = null; + var result = Serializer.TryDeserialize(memberData, typeof(T), overrideConverterType, ref storage); + value = (T)storage; + return result; + } + } +} \ No newline at end of file diff --git a/Assets/Source/fsBaseConverter.cs.meta b/Assets/Source/fsBaseConverter.cs.meta new file mode 100644 index 0000000..429c568 --- /dev/null +++ b/Assets/Source/fsBaseConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8a9a1beed27909d48aa194777a3c7181 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsConfig.cs b/Assets/Source/fsConfig.cs new file mode 100644 index 0000000..d4068d0 --- /dev/null +++ b/Assets/Source/fsConfig.cs @@ -0,0 +1,94 @@ +using System; +using System.Reflection; + +namespace FullSerializer { + // Global configuration options. + public static class fsGlobalConfig { + /// + /// Should deserialization be case sensitive? If this is false and the JSON has multiple members with the + /// same keys only separated by case, then this results in undefined behavior. + /// + public static bool IsCaseSensitive = true; + + /// + /// If exceptions are allowed internally, then additional date formats can be deserialized. + /// Note that the Full Serializer public API will *not* throw exceptions with this enabled; + /// errors will still be returned in a fsResult instance. + /// + public static bool AllowInternalExceptions = true; + + /// + /// This string will be used to prefix fields used internally by FullSerializer. + /// + public static string InternalFieldPrefix = "$"; + } + + /// + /// Enables some top-level customization of Full Serializer. + /// + public class fsConfig { + /// + /// The attributes that will force a field or property to be serialized. + /// + public Type[] SerializeAttributes = { +#if !NO_UNITY + typeof(UnityEngine.SerializeField), +#endif + typeof(fsPropertyAttribute) + }; + + /// + /// The attributes that will force a field or property to *not* be serialized. + /// + public Type[] IgnoreSerializeAttributes = { typeof(NonSerializedAttribute), typeof(fsIgnoreAttribute) }; + + /// + /// The default member serialization. + /// + public fsMemberSerialization DefaultMemberSerialization = fsMemberSerialization.Default; + + /// + /// Convert a C# field/property name into the key used for the JSON object. For example, you could + /// force all JSON names to lowercase with: + /// + /// fsConfig.GetJsonNameFromMemberName = (name, info) => name.ToLower(); + /// + /// This will only be used when the name is not explicitly specified with fsProperty. + /// + public Func GetJsonNameFromMemberName = (name, info) => name; + + /// + /// If false, then *all* property serialization support will be disabled - even properties + /// explicitly annotated with fsProperty or any other opt-in annotation. + /// + /// Setting this to false means that SerializeNonAutoProperties and + /// SerializeNonPublicSetProperties will be completely ignored. + /// + public bool EnablePropertySerialization = true; + + /// + /// Should the default serialization behaviour include non-auto properties? + /// + public bool SerializeNonAutoProperties = false; + + /// + /// Should the default serialization behaviour include properties with non-public setters? + /// + public bool SerializeNonPublicSetProperties = true; + + /// + /// If not null, this string format will be used for DateTime instead of the default one. + /// + public string CustomDateTimeFormatString = null; + + /// + /// Int64 and UInt64 will be serialized and deserialized as string for compatibility + /// + public bool Serialize64BitIntegerAsString = false; + + /// + /// Enums are serialized using their names by default. Setting this to true will serialize them as integers instead. + /// + public bool SerializeEnumsAsInteger = false; + } +} diff --git a/Assets/Source/fsConfig.cs.meta b/Assets/Source/fsConfig.cs.meta new file mode 100644 index 0000000..a5a3d91 --- /dev/null +++ b/Assets/Source/fsConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76108d7346331af428d2c9393d9d8027 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsContext.cs b/Assets/Source/fsContext.cs new file mode 100644 index 0000000..1392d0c --- /dev/null +++ b/Assets/Source/fsContext.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; + +namespace FullSerializer { + /// + /// fsContext stores global metadata that can be used to customize how fsConverters operate + /// during serialization. + /// + public sealed class fsContext { + /// + /// All of the context objects. + /// + private readonly Dictionary _contextObjects = new Dictionary(); + + /// + /// Removes all context objects from the context. + /// + public void Reset() { + _contextObjects.Clear(); + } + + /// + /// Sets the context object for the given type with the given value. + /// + public void Set(T obj) { + _contextObjects[typeof(T)] = obj; + } + + /// + /// Returns true if there is a context object for the given type. + /// + public bool Has() { + return _contextObjects.ContainsKey(typeof(T)); + } + + /// + /// Fetches the context object for the given type. + /// + public T Get() { + object val; + if (_contextObjects.TryGetValue(typeof(T), out val)) { + return (T)val; + } + throw new InvalidOperationException("There is no context object of type " + typeof(T)); + } + } +} \ No newline at end of file diff --git a/Assets/Source/fsContext.cs.meta b/Assets/Source/fsContext.cs.meta new file mode 100644 index 0000000..59ca2a1 --- /dev/null +++ b/Assets/Source/fsContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aa2d584506920bc42a437736d0eac8e9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsConverter.cs b/Assets/Source/fsConverter.cs new file mode 100644 index 0000000..f5ca01e --- /dev/null +++ b/Assets/Source/fsConverter.cs @@ -0,0 +1,15 @@ +using System; + +namespace FullSerializer { + /// + /// The serialization converter allows for customization of the serialization process. + /// + public abstract class fsConverter : fsBaseConverter { + /// + /// Can this converter serialize and deserialize the given object type? + /// + /// The given object type. + /// True if the converter can serialize it, false otherwise. + public abstract bool CanProcess(Type type); + } +} \ No newline at end of file diff --git a/Assets/Source/fsConverter.cs.meta b/Assets/Source/fsConverter.cs.meta new file mode 100644 index 0000000..dc19c7e --- /dev/null +++ b/Assets/Source/fsConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bba5af2bf7ead1c44b8ae89fc6f30783 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsConverterRegistrar.cs b/Assets/Source/fsConverterRegistrar.cs new file mode 100644 index 0000000..d53ef02 --- /dev/null +++ b/Assets/Source/fsConverterRegistrar.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using FullSerializer.Internal; + +namespace FullSerializer { + /// + /// This class allows arbitrary code to easily register global converters. To add a converter, + /// simply declare a new field called "Register_*" that stores the type of converter you would + /// like to add. Alternatively, you can do the same with a method called "Register_*"; just add + /// the converter type to the `Converters` list. + /// + public partial class fsConverterRegistrar { + static fsConverterRegistrar() { + Converters = new List(); + + foreach (var field in typeof(fsConverterRegistrar).GetDeclaredFields()) { + if (field.Name.StartsWith("Register_")) Converters.Add(field.FieldType); + } + + foreach (var method in typeof(fsConverterRegistrar).GetDeclaredMethods()) { + if (method.Name.StartsWith("Register_")) method.Invoke(null, null); + } + + } + + public static List Converters; + + // Example field registration: + //public static AnimationCurve_DirectConverter Register_AnimationCurve_DirectConverter; + + // Example method registration: + //public static void Register_AnimationCurve_DirectConverter() { + // Converters.Add(typeof(AnimationCurve_DirectConverter)); + //} + } +} \ No newline at end of file diff --git a/Assets/Source/fsConverterRegistrar.cs.meta b/Assets/Source/fsConverterRegistrar.cs.meta new file mode 100644 index 0000000..946574d --- /dev/null +++ b/Assets/Source/fsConverterRegistrar.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2ba7cbc3359b9f5439201a47840eba3a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsData.cs b/Assets/Source/fsData.cs new file mode 100644 index 0000000..de76881 --- /dev/null +++ b/Assets/Source/fsData.cs @@ -0,0 +1,394 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace FullSerializer { + /// + /// The actual type that a JsonData instance can store. + /// + public enum fsDataType { + Array, + Object, + Double, + Int64, + Boolean, + String, + Null + } + + /// + /// A union type that stores a serialized value. The stored type can be one of six different + /// types: null, boolean, double, Int64, string, Dictionary, or List. + /// + public sealed class fsData { + /// + /// The raw value that this serialized data stores. It can be one of six different types; a + /// boolean, a double, Int64, a string, a Dictionary, or a List. + /// + private object _value; + + #region Constructors + /// + /// Creates a fsData instance that holds null. + /// + public fsData() { + _value = null; + } + + /// + /// Creates a fsData instance that holds a boolean. + /// + public fsData(bool boolean) { + _value = boolean; + } + + /// + /// Creates a fsData instance that holds a double. + /// + public fsData(double f) { + _value = f; + } + + /// + /// Creates a new fsData instance that holds an integer. + /// + public fsData(Int64 i) { + _value = i; + } + + /// + /// Creates a fsData instance that holds a string. + /// + public fsData(string str) { + _value = str; + } + + /// + /// Creates a fsData instance that holds a dictionary of values. + /// + public fsData(Dictionary dict) { + _value = dict; + } + + /// + /// Creates a fsData instance that holds a list of values. + /// + public fsData(List list) { + _value = list; + } + + /// + /// Helper method to create a fsData instance that holds a dictionary. + /// + public static fsData CreateDictionary() { + return new fsData(new Dictionary( + fsGlobalConfig.IsCaseSensitive ? StringComparer.Ordinal : StringComparer.OrdinalIgnoreCase)); + } + + /// + /// Helper method to create a fsData instance that holds a list. + /// + public static fsData CreateList() { + return new fsData(new List()); + } + + /// + /// Helper method to create a fsData instance that holds a list with the initial capacity. + /// + public static fsData CreateList(int capacity) { + return new fsData(new List(capacity)); + } + + public readonly static fsData True = new fsData(true); + public readonly static fsData False = new fsData(false); + public readonly static fsData Null = new fsData(); + #endregion + + #region Internal Helper Methods + /// + /// Transforms the internal fsData instance into a dictionary. + /// + internal void BecomeDictionary() { + _value = new Dictionary(); + } + + /// + /// Returns a shallow clone of this data instance. + /// + internal fsData Clone() { + var clone = new fsData(); + clone._value = _value; + return clone; + } + #endregion + + #region Casting Predicates + public fsDataType Type { + get { + if (_value == null) return fsDataType.Null; + if (_value is double) return fsDataType.Double; + if (_value is Int64) return fsDataType.Int64; + if (_value is bool) return fsDataType.Boolean; + if (_value is string) return fsDataType.String; + if (_value is Dictionary) return fsDataType.Object; + if (_value is List) return fsDataType.Array; + + throw new InvalidOperationException("unknown JSON data type"); + } + } + + /// + /// Returns true if this fsData instance maps back to null. + /// + public bool IsNull { + get { + return _value == null; + } + } + + /// + /// Returns true if this fsData instance maps back to a double. + /// + public bool IsDouble { + get { + return _value is double; + } + } + + /// + /// Returns true if this fsData instance maps back to an Int64. + /// + public bool IsInt64 { + get { + return _value is Int64; + } + } + + /// + /// Returns true if this fsData instance maps back to a boolean. + /// + public bool IsBool { + get { + return _value is bool; + } + } + + /// + /// Returns true if this fsData instance maps back to a string. + /// + public bool IsString { + get { + return _value is string; + } + } + + /// + /// Returns true if this fsData instance maps back to a Dictionary. + /// + public bool IsDictionary { + get { + return _value is Dictionary; + } + } + + /// + /// Returns true if this fsData instance maps back to a List. + /// + public bool IsList { + get { + return _value is List; + } + } + #endregion + + #region Casts + /// + /// Casts this fsData to a double. Throws an exception if it is not a double. + /// + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + public double AsDouble { + get { + return Cast(); + } + } + + /// + /// Casts this fsData to an Int64. Throws an exception if it is not an Int64. + /// + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + public Int64 AsInt64 { + get { + return Cast(); + } + } + + + /// + /// Casts this fsData to a boolean. Throws an exception if it is not a boolean. + /// + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + public bool AsBool { + get { + return Cast(); + } + } + + /// + /// Casts this fsData to a string. Throws an exception if it is not a string. + /// + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + public string AsString { + get { + return Cast(); + } + } + + /// + /// Casts this fsData to a Dictionary. Throws an exception if it is not a + /// Dictionary. + /// + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + public Dictionary AsDictionary { + get { + return Cast>(); + } + } + + /// + /// Casts this fsData to a List. Throws an exception if it is not a List. + /// + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + public List AsList { + get { + return Cast>(); + } + } + + /// + /// Internal helper method to cast the underlying storage to the given type or throw a + /// pretty printed exception on failure. + /// + private T Cast() { + if (_value is T) { + return (T)_value; + } + + throw new InvalidCastException("Unable to cast <" + this + "> (with type = " + + _value.GetType() + ") to type " + typeof(T)); + } + #endregion + + #region ToString Implementation + public override string ToString() { + return fsJsonPrinter.CompressedJson(this); + } + #endregion + + #region Equality Comparisons + /// + /// Determines whether the specified object is equal to the current object. + /// + public override bool Equals(object obj) { + return Equals(obj as fsData); + } + + /// + /// Determines whether the specified object is equal to the current object. + /// + public bool Equals(fsData other) { + if (other == null || Type != other.Type) { + return false; + } + + switch (Type) { + case fsDataType.Null: + return true; + + case fsDataType.Double: + return AsDouble == other.AsDouble || Math.Abs(AsDouble - other.AsDouble) < double.Epsilon; + + case fsDataType.Int64: + return AsInt64 == other.AsInt64; + + case fsDataType.Boolean: + return AsBool == other.AsBool; + + case fsDataType.String: + return AsString == other.AsString; + + case fsDataType.Array: + var thisList = AsList; + var otherList = other.AsList; + + if (thisList.Count != otherList.Count) return false; + + for (int i = 0; i < thisList.Count; ++i) { + if (thisList[i].Equals(otherList[i]) == false) { + return false; + } + } + + return true; + + case fsDataType.Object: + var thisDict = AsDictionary; + var otherDict = other.AsDictionary; + + if (thisDict.Count != otherDict.Count) return false; + + foreach (string key in thisDict.Keys) { + if (otherDict.ContainsKey(key) == false) { + return false; + } + + if (thisDict[key].Equals(otherDict[key]) == false) { + return false; + } + } + + return true; + } + + throw new Exception("Unknown data type"); + } + + /// + /// Returns true iff a == b. + /// + public static bool operator ==(fsData a, fsData b) { + // If both are null, or both are same instance, return true. + if (ReferenceEquals(a, b)) { + return true; + } + + // If one is null, but not both, return false. + if (((object)a == null) || ((object)b == null)) { + return false; + } + + if (a.IsDouble && b.IsDouble) { + return Math.Abs(a.AsDouble - b.AsDouble) < double.Epsilon; + } + + return a.Equals(b); + } + + /// + /// Returns true iff a != b. + /// + public static bool operator !=(fsData a, fsData b) { + return !(a == b); + } + + /// + /// Returns a hash code for this instance. + /// + /// A hash code for this instance, suitable for use in hashing algorithms and data + /// structures like a hash table. + public override int GetHashCode() { + return _value.GetHashCode(); + } + #endregion + } + +} \ No newline at end of file diff --git a/Assets/Source/fsData.cs.meta b/Assets/Source/fsData.cs.meta new file mode 100644 index 0000000..2a60dde --- /dev/null +++ b/Assets/Source/fsData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f91f03a8b5894984aa6dcd1b7e60534e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsDirectConverter.cs b/Assets/Source/fsDirectConverter.cs new file mode 100644 index 0000000..679611b --- /dev/null +++ b/Assets/Source/fsDirectConverter.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace FullSerializer { + /// + /// The direct converter is similar to a regular converter, except that it targets specifically only one type. + /// This means that it can be used without performance impact when discovering converters. It is strongly + /// recommended that you derive from fsDirectConverter{TModel}. + /// + /// Due to the way that direct converters operate, inheritance is *not* supported. Direct converters + /// will only be used with the exact ModelType object. + public abstract class fsDirectConverter : fsBaseConverter { + public abstract Type ModelType { get; } + } + + public abstract class fsDirectConverter : fsDirectConverter { + public override Type ModelType { get { return typeof(TModel); } } + + public sealed override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) { + var serializedDictionary = new Dictionary(); + var result = DoSerialize((TModel)instance, serializedDictionary); + serialized = new fsData(serializedDictionary); + return result; + } + + public sealed override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) { + var result = fsResult.Success; + if ((result += CheckType(data, fsDataType.Object)).Failed) return result; + + var obj = (TModel)instance; + result += DoDeserialize(data.AsDictionary, ref obj); + instance = obj; + return result; + } + + protected abstract fsResult DoSerialize(TModel model, Dictionary serialized); + protected abstract fsResult DoDeserialize(Dictionary data, ref TModel model); + } +} diff --git a/Assets/Source/fsDirectConverter.cs.meta b/Assets/Source/fsDirectConverter.cs.meta new file mode 100644 index 0000000..113383c --- /dev/null +++ b/Assets/Source/fsDirectConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f7796db4e1a6f0f4b890a0db01cfc258 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsExceptions.cs b/Assets/Source/fsExceptions.cs new file mode 100644 index 0000000..705b834 --- /dev/null +++ b/Assets/Source/fsExceptions.cs @@ -0,0 +1,16 @@ +// note: This file contains exceptions used by FullSerializer. Exceptions are never used at runtime +// in FullSerializer; they are only used when validating annotations and code-based models. + +using System; + +namespace FullSerializer { + public sealed class fsMissingVersionConstructorException : Exception { + public fsMissingVersionConstructorException(Type versionedType, Type constructorType) : + base(versionedType + " is missing a constructor for previous model type " + constructorType) { } + } + + public sealed class fsDuplicateVersionNameException : Exception { + public fsDuplicateVersionNameException(Type typeA, Type typeB, string version) : + base(typeA + " and " + typeB + " have the same version string (" + version + "); please change one of them.") { } + } +} \ No newline at end of file diff --git a/Assets/Source/fsExceptions.cs.meta b/Assets/Source/fsExceptions.cs.meta new file mode 100644 index 0000000..163bfa3 --- /dev/null +++ b/Assets/Source/fsExceptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3425b211a44d09c48a09b46e76c3146a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsISerializationCallbacks.cs b/Assets/Source/fsISerializationCallbacks.cs new file mode 100644 index 0000000..15154be --- /dev/null +++ b/Assets/Source/fsISerializationCallbacks.cs @@ -0,0 +1,97 @@ +using System; +#if !NO_UNITY +using UnityEngine; +#endif + +#if !UNITY_EDITOR && UNITY_WSA +// For System.Reflection.TypeExtensions +using System.Reflection; +#endif + +namespace FullSerializer { + /// + /// Extend this interface on your type to receive notifications about serialization/deserialization events. If you don't + /// have access to the type itself, then you can write an fsObjectProcessor instead. + /// + public interface fsISerializationCallbacks { + /// + /// Called before serialization. + /// + void OnBeforeSerialize(Type storageType); + + /// + /// Called after serialization. + /// + /// The field/property type that is storing the instance. + /// The data that was serialized. + void OnAfterSerialize(Type storageType, ref fsData data); + + /// + /// Called before deserialization. + /// + /// The field/property type that is storing the instance. + /// The data that will be used for deserialization. + void OnBeforeDeserialize(Type storageType, ref fsData data); + + /// + /// Called after deserialization. + /// + /// The field/property type that is storing the instance. + /// The type of the instance. + void OnAfterDeserialize(Type storageType); + } +} + +namespace FullSerializer.Internal { + public class fsSerializationCallbackProcessor : fsObjectProcessor { + public override bool CanProcess(Type type) { + return typeof(fsISerializationCallbacks).IsAssignableFrom(type); + } + + public override void OnBeforeSerialize(Type storageType, object instance) { + // Don't call the callback on null instances. + if(instance == null) return; + ((fsISerializationCallbacks)instance).OnBeforeSerialize(storageType); + } + + public override void OnAfterSerialize(Type storageType, object instance, ref fsData data) { + // Don't call the callback on null instances. + if(instance == null) return; + ((fsISerializationCallbacks)instance).OnAfterSerialize(storageType, ref data); + } + + public override void OnBeforeDeserializeAfterInstanceCreation(Type storageType, object instance, ref fsData data) { + if (instance is fsISerializationCallbacks == false) { + throw new InvalidCastException("Please ensure the converter for " + storageType + " actually returns an instance of it, not an instance of " + instance.GetType()); + } + + ((fsISerializationCallbacks)instance).OnBeforeDeserialize(storageType, ref data); + } + + public override void OnAfterDeserialize(Type storageType, object instance) { + // Don't call the callback on null instances. + if(instance == null) return; + ((fsISerializationCallbacks)instance).OnAfterDeserialize(storageType); + } + } + +#if !NO_UNITY + public class fsSerializationCallbackReceiverProcessor : fsObjectProcessor { + public override bool CanProcess(Type type) { + return typeof(ISerializationCallbackReceiver).IsAssignableFrom(type); + } + + public override void OnBeforeSerialize(Type storageType, object instance) { + // Don't call the callback on null instances. + if(instance == null) return; + ((ISerializationCallbackReceiver)instance).OnBeforeSerialize(); + } + + public override void OnAfterDeserialize(Type storageType, object instance) { + // Don't call the callback on null instances. + if(instance == null) return; + ((ISerializationCallbackReceiver)instance).OnAfterDeserialize(); + } + } +#endif +} diff --git a/Assets/Source/fsISerializationCallbacks.cs.meta b/Assets/Source/fsISerializationCallbacks.cs.meta new file mode 100644 index 0000000..2efab28 --- /dev/null +++ b/Assets/Source/fsISerializationCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d8d502851fa3a1468d7a69bef2536cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsIgnoreAttribute.cs b/Assets/Source/fsIgnoreAttribute.cs new file mode 100644 index 0000000..3eaea48 --- /dev/null +++ b/Assets/Source/fsIgnoreAttribute.cs @@ -0,0 +1,10 @@ +using System; + +namespace FullSerializer { + /// + /// The given property or field annotated with [JsonIgnore] will not be serialized. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] + public sealed class fsIgnoreAttribute : Attribute { + } +} \ No newline at end of file diff --git a/Assets/Source/fsIgnoreAttribute.cs.meta b/Assets/Source/fsIgnoreAttribute.cs.meta new file mode 100644 index 0000000..910de28 --- /dev/null +++ b/Assets/Source/fsIgnoreAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 52525c31751c2a54d8e3fca6e7c0caa6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsJsonParser.cs b/Assets/Source/fsJsonParser.cs new file mode 100644 index 0000000..4ca1af8 --- /dev/null +++ b/Assets/Source/fsJsonParser.cs @@ -0,0 +1,505 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; + +namespace FullSerializer { + // TODO: properly propagate warnings/etc for fsResult states + + /// + /// A simple recursive descent parser for JSON. + /// + public class fsJsonParser { + private int _start; + private string _input; + + private fsResult MakeFailure(string message) { + int start = Math.Max(0, _start - 20); + int length = Math.Min(50, _input.Length - start); + + string error = "Error while parsing: " + message + "; context = <" + + _input.Substring(start, length) + ">"; + return fsResult.Fail(error); + } + + private bool TryMoveNext() { + if (_start < _input.Length) { + ++_start; + return true; + } + + return false; + } + + private bool HasValue() { + return HasValue(0); + } + + private bool HasValue(int offset) { + return (_start + offset) >= 0 && (_start + offset) < _input.Length; + } + + private char Character() { + return Character(0); + } + + private char Character(int offset) { + return _input[_start + offset]; + } + + /// + /// Skips input such that Character() will return a non-whitespace character + /// + private void SkipSpace() { + while (HasValue()) { + char c = Character(); + + // whitespace; fine to skip + if (char.IsWhiteSpace(c)) { + TryMoveNext(); + continue; + } + + // comment? + if (HasValue(1) && Character(0) == '/') { + if (Character(1) == '/') { + // skip the rest of the line + while (HasValue() && Environment.NewLine.Contains("" + Character()) == false) { + TryMoveNext(); + } + continue; + } else if (Character(1) == '*') { + // skip to comment close + TryMoveNext(); + TryMoveNext(); + while (HasValue(1)) { + if (Character(0) == '*' && Character(1) == '/') { + TryMoveNext(); + TryMoveNext(); + TryMoveNext(); + break; + } else { + TryMoveNext(); + } + } + } + // let other checks to check fail + continue; + } + + break; + } + } + + #region Escaping + private bool IsHex(char c) { + return ((c >= '0' && c <= '9') || + (c >= 'a' && c <= 'f') || + (c >= 'A' && c <= 'F')); + } + + private uint ParseSingleChar(char c1, uint multipliyer) { + uint p1 = 0; + if (c1 >= '0' && c1 <= '9') + p1 = (uint)(c1 - '0') * multipliyer; + else if (c1 >= 'A' && c1 <= 'F') + p1 = (uint)((c1 - 'A') + 10) * multipliyer; + else if (c1 >= 'a' && c1 <= 'f') + p1 = (uint)((c1 - 'a') + 10) * multipliyer; + return p1; + } + + private uint ParseUnicode(char c1, char c2, char c3, char c4) { + uint p1 = ParseSingleChar(c1, 0x1000); + uint p2 = ParseSingleChar(c2, 0x100); + uint p3 = ParseSingleChar(c3, 0x10); + uint p4 = ParseSingleChar(c4, 0x1); + + return p1 + p2 + p3 + p4; + } + + private fsResult TryUnescapeChar(out char escaped) { + // skip leading backslash '\' + TryMoveNext(); + if (HasValue() == false) { + escaped = ' '; + return MakeFailure("Unexpected end of input after \\"); + } + + switch (Character()) { + case '\\': TryMoveNext(); escaped = '\\'; return fsResult.Success; + case '/': TryMoveNext(); escaped = '/'; return fsResult.Success; + case '"': TryMoveNext(); escaped = '\"'; return fsResult.Success; + case 'a': TryMoveNext(); escaped = '\a'; return fsResult.Success; + case 'b': TryMoveNext(); escaped = '\b'; return fsResult.Success; + case 'f': TryMoveNext(); escaped = '\f'; return fsResult.Success; + case 'n': TryMoveNext(); escaped = '\n'; return fsResult.Success; + case 'r': TryMoveNext(); escaped = '\r'; return fsResult.Success; + case 't': TryMoveNext(); escaped = '\t'; return fsResult.Success; + case '0': TryMoveNext(); escaped = '\0'; return fsResult.Success; + case 'u': + TryMoveNext(); + if (IsHex(Character(0)) + && IsHex(Character(1)) + && IsHex(Character(2)) + && IsHex(Character(3))) { + + uint codePoint = ParseUnicode(Character(0), Character(1), Character(2), Character(3)); + + TryMoveNext(); + TryMoveNext(); + TryMoveNext(); + TryMoveNext(); + + escaped = (char)codePoint; + return fsResult.Success; + } + + // invalid escape sequence + escaped = (char)0; + return MakeFailure( + string.Format("invalid escape sequence '\\u{0}{1}{2}{3}'\n", + Character(0), + Character(1), + Character(2), + Character(3))); + default: + escaped = (char)0; + return MakeFailure(string.Format("Invalid escape sequence \\{0}", Character())); + } + } + #endregion + + private fsResult TryParseExact(string content) { + for (int i = 0; i < content.Length; ++i) { + if (Character() != content[i]) { + return MakeFailure("Expected " + content[i]); + } + + if (TryMoveNext() == false) { + return MakeFailure("Unexpected end of content when parsing " + content); + } + } + + return fsResult.Success; + } + + private fsResult TryParseTrue(out fsData data) { + var fail = TryParseExact("true"); + + if (fail.Succeeded) { + data = new fsData(true); + return fsResult.Success; + } + + data = null; + return fail; + } + + private fsResult TryParseFalse(out fsData data) { + var fail = TryParseExact("false"); + + if (fail.Succeeded) { + data = new fsData(false); + return fsResult.Success; + } + + data = null; + return fail; + } + + private fsResult TryParseNull(out fsData data) { + var fail = TryParseExact("null"); + + if (fail.Succeeded) { + data = new fsData(); + return fsResult.Success; + } + + data = null; + return fail; + } + + + private bool IsSeparator(char c) { + return char.IsWhiteSpace(c) || c == ',' || c == '}' || c == ']'; + } + + /// + /// Parses numbers that follow the regular expression [-+](\d+|\d*\.\d*) + /// + private fsResult TryParseNumber(out fsData data) { + int start = _start; + + // read until we get to a separator + while ( + TryMoveNext() && + (HasValue() && IsSeparator(Character()) == false)) { + } + + // try to parse the value + string numberString = _input.Substring(start, _start - start); + + // double -- includes a . + if (numberString.Contains(".") || numberString.Contains("e") || numberString.Contains("E") || + numberString == "Infinity" || numberString == "-Infinity" || numberString == "NaN") { + double doubleValue; + if (double.TryParse(numberString, NumberStyles.Any, CultureInfo.InvariantCulture, out doubleValue) == false) { + data = null; + return MakeFailure("Bad double format with " + numberString); + } + + data = new fsData(doubleValue); + return fsResult.Success; + } + else { + Int64 intValue; + if (Int64.TryParse(numberString, NumberStyles.Any, CultureInfo.InvariantCulture, out intValue) == false) { + data = null; + return MakeFailure("Bad Int64 format with " + numberString); + } + + data = new fsData(intValue); + return fsResult.Success; + } + } + + private readonly StringBuilder _cachedStringBuilder = new StringBuilder(256); + /// + /// Parses a string + /// + private fsResult TryParseString(out string str) { + _cachedStringBuilder.Length = 0; + + // skip the first " + if (Character() != '"' || TryMoveNext() == false) { + str = string.Empty; + return MakeFailure("Expected initial \" when parsing a string"); + } + + // read until the next " + while (HasValue() && Character() != '\"') { + char c = Character(); + + // escape if necessary + if (c == '\\') { + char unescaped; + var fail = TryUnescapeChar(out unescaped); + if (fail.Failed) { + str = string.Empty; + return fail; + } + + _cachedStringBuilder.Append(unescaped); + } + + // no escaping necessary + else { + _cachedStringBuilder.Append(c); + + // get the next character + if (TryMoveNext() == false) { + str = string.Empty; + return MakeFailure("Unexpected end of input when reading a string"); + } + } + } + + // skip the first " + if (HasValue() == false || Character() != '"' || TryMoveNext() == false) { + str = string.Empty; + return MakeFailure("No closing \" when parsing a string"); + } + + str = _cachedStringBuilder.ToString(); + return fsResult.Success; + } + + /// + /// Parses an array + /// + private fsResult TryParseArray(out fsData arr) { + if (Character() != '[') { + arr = null; + return MakeFailure("Expected initial [ when parsing an array"); + } + + // skip '[' + if (TryMoveNext() == false) { + arr = null; + return MakeFailure("Unexpected end of input when parsing an array"); + } + SkipSpace(); + + var result = new List(); + + while (HasValue() && Character() != ']') { + // parse the element + fsData element; + var fail = RunParse(out element); + if (fail.Failed) { + arr = null; + return fail; + } + + result.Add(element); + + // parse the comma + SkipSpace(); + if (HasValue() && Character() == ',') { + if (TryMoveNext() == false) break; + SkipSpace(); + } + } + + // skip the final ] + if (HasValue() == false || Character() != ']' || TryMoveNext() == false) { + arr = null; + return MakeFailure("No closing ] for array"); + } + + arr = new fsData(result); + return fsResult.Success; + } + + private fsResult TryParseObject(out fsData obj) { + if (Character() != '{') { + obj = null; + return MakeFailure("Expected initial { when parsing an object"); + } + + // skip '{' + if (TryMoveNext() == false) { + obj = null; + return MakeFailure("Unexpected end of input when parsing an object"); + } + SkipSpace(); + + var result = new Dictionary( + fsGlobalConfig.IsCaseSensitive ? StringComparer.Ordinal : StringComparer.OrdinalIgnoreCase); + + while (HasValue() && Character() != '}') { + fsResult failure; + + // parse the key + SkipSpace(); + string key; + failure = TryParseString(out key); + if (failure.Failed) { + obj = null; + return failure; + } + SkipSpace(); + + // parse the ':' after the key + if (HasValue() == false || Character() != ':' || TryMoveNext() == false) { + obj = null; + return MakeFailure("Expected : after key \"" + key + "\""); + } + SkipSpace(); + + // parse the value + fsData value; + failure = RunParse(out value); + if (failure.Failed) { + obj = null; + return failure; + } + + result.Add(key, value); + + // parse the comma + SkipSpace(); + if (HasValue() && Character() == ',') { + if (TryMoveNext() == false) break; + SkipSpace(); + } + } + + // skip the final } + if (HasValue() == false || Character() != '}' || TryMoveNext() == false) { + obj = null; + return MakeFailure("No closing } for object"); + } + + obj = new fsData(result); + return fsResult.Success; + } + + private fsResult RunParse(out fsData data) { + SkipSpace(); + + if (HasValue() == false) { + data = default(fsData); + return MakeFailure("Unexpected end of input"); + } + + switch (Character()) { + case 'I': // Infinity + case 'N': // NaN + case '.': + case '+': + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': return TryParseNumber(out data); + case '"': { + string str; + fsResult fail = TryParseString(out str); + if (fail.Failed) { + data = null; + return fail; + } + data = new fsData(str); + return fsResult.Success; + } + case '[': return TryParseArray(out data); + case '{': return TryParseObject(out data); + case 't': return TryParseTrue(out data); + case 'f': return TryParseFalse(out data); + case 'n': return TryParseNull(out data); + default: + data = null; + return MakeFailure("unable to parse; invalid token \"" + Character() + "\""); + } + } + + /// + /// Parses the specified input. Returns a failure state if parsing failed. + /// + /// The input to parse. + /// The parsed data. This is undefined if parsing fails. + /// The parsed input. + public static fsResult Parse(string input, out fsData data) { + if (string.IsNullOrEmpty(input)) { + data = default(fsData); + return fsResult.Fail("No input"); + } + + var context = new fsJsonParser(input); + return context.RunParse(out data); + } + + /// + /// Helper method for Parse that does not allow the error information + /// to be recovered. + /// + public static fsData Parse(string input) { + fsData data; + Parse(input, out data).AssertSuccess(); + return data; + } + + private fsJsonParser(string input) { + _input = input; + _start = 0; + } + } +} \ No newline at end of file diff --git a/Assets/Source/fsJsonParser.cs.meta b/Assets/Source/fsJsonParser.cs.meta new file mode 100644 index 0000000..e263708 --- /dev/null +++ b/Assets/Source/fsJsonParser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4c3e5a8da8796c84798679d00813622a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsJsonPrinter.cs b/Assets/Source/fsJsonPrinter.cs new file mode 100644 index 0000000..1239161 --- /dev/null +++ b/Assets/Source/fsJsonPrinter.cs @@ -0,0 +1,287 @@ +using System; +using System.Globalization; +using System.IO; +using System.Text; + +namespace FullSerializer { + public static class fsJsonPrinter { + /// + /// Inserts the given number of indents into the builder. + /// + private static void InsertSpacing(TextWriter stream, int count) { + for (int i = 0; i < count; ++i) { + stream.Write(" "); + } + } + + /// + /// Escapes a string. + /// + private static string EscapeString(string str) { + // Escaping a string is pretty allocation heavy, so we try hard to not do it. + + bool needsEscape = false; + for (int i = 0; i < str.Length; ++i) { + char c = str[i]; + + // unicode code point + int intChar = Convert.ToInt32(c); + if (intChar < 0 || intChar > 127) { + needsEscape = true; + break; + } + + // standard escape character + switch (c) { + case '"': + case '\\': + case '\a': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + case '\0': + needsEscape = true; + break; + } + + if (needsEscape) { + break; + } + } + + if (needsEscape == false) { + return str; + } + + + StringBuilder result = new StringBuilder(); + + for (int i = 0; i < str.Length; ++i) { + char c = str[i]; + + // unicode code point + int intChar = Convert.ToInt32(c); + if (intChar < 0 || intChar > 127) { + result.Append(string.Format("\\u{0:x4} ", intChar).Trim()); + continue; + } + + // standard escape character + switch (c) { + case '"': result.Append("\\\""); continue; + case '\\': result.Append(@"\\"); continue; + case '\a': result.Append(@"\a"); continue; + case '\b': result.Append(@"\b"); continue; + case '\f': result.Append(@"\f"); continue; + case '\n': result.Append(@"\n"); continue; + case '\r': result.Append(@"\r"); continue; + case '\t': result.Append(@"\t"); continue; + case '\0': result.Append(@"\0"); continue; + } + + // no escaping needed + result.Append(c); + } + return result.ToString(); + } + + private static void BuildCompressedString(fsData data, TextWriter stream) { + switch (data.Type) { + case fsDataType.Null: + stream.Write("null"); + break; + + case fsDataType.Boolean: + if (data.AsBool) stream.Write("true"); + else stream.Write("false"); + break; + + case fsDataType.Double: + // doubles must *always* include a decimal + stream.Write(ConvertDoubleToString(data.AsDouble)); + break; + + case fsDataType.Int64: + stream.Write(data.AsInt64); + break; + + case fsDataType.String: + stream.Write('"'); + stream.Write(EscapeString(data.AsString)); + stream.Write('"'); + break; + + case fsDataType.Object: { + stream.Write('{'); + bool comma = false; + foreach (var entry in data.AsDictionary) { + if (comma) stream.Write(','); + comma = true; + stream.Write('"'); + stream.Write(entry.Key); + stream.Write('"'); + stream.Write(":"); + BuildCompressedString(entry.Value, stream); + } + stream.Write('}'); + break; + } + + case fsDataType.Array: { + stream.Write('['); + bool comma = false; + foreach (var entry in data.AsList) { + if (comma) stream.Write(','); + comma = true; + BuildCompressedString(entry, stream); + } + stream.Write(']'); + break; + } + } + } + + /// + /// Formats this data into the given builder. + /// + private static void BuildPrettyString(fsData data, TextWriter stream, int depth) { + switch (data.Type) { + case fsDataType.Null: + stream.Write("null"); + break; + + case fsDataType.Boolean: + if (data.AsBool) stream.Write("true"); + else stream.Write("false"); + break; + + case fsDataType.Double: + stream.Write(ConvertDoubleToString(data.AsDouble)); + break; + + case fsDataType.Int64: + stream.Write(data.AsInt64); + break; + + + case fsDataType.String: + stream.Write('"'); + stream.Write(EscapeString(data.AsString)); + stream.Write('"'); + break; + + case fsDataType.Object: { + stream.Write('{'); + stream.WriteLine(); + bool comma = false; + foreach (var entry in data.AsDictionary) { + if (comma) { + stream.Write(','); + stream.WriteLine(); + } + comma = true; + InsertSpacing(stream, depth + 1); + stream.Write('"'); + stream.Write(entry.Key); + stream.Write('"'); + stream.Write(": "); + BuildPrettyString(entry.Value, stream, depth + 1); + } + stream.WriteLine(); + InsertSpacing(stream, depth); + stream.Write('}'); + break; + } + + case fsDataType.Array: + // special case for empty lists; we don't put an empty line between the brackets + if (data.AsList.Count == 0) { + stream.Write("[]"); + } + + else { + bool comma = false; + + stream.Write('['); + stream.WriteLine(); + foreach (var entry in data.AsList) { + if (comma) { + stream.Write(','); + stream.WriteLine(); + } + comma = true; + InsertSpacing(stream, depth + 1); + BuildPrettyString(entry, stream, depth + 1); + } + stream.WriteLine(); + InsertSpacing(stream, depth); + stream.Write(']'); + } + break; + } + } + + /// + /// Writes the pretty JSON output data to the given stream. + /// + /// The data to print. + /// Where to write the printed data. + public static void PrettyJson(fsData data, TextWriter outputStream) { + BuildPrettyString(data, outputStream, 0); + } + + /// + /// Returns the data in a pretty printed JSON format. + /// + public static string PrettyJson(fsData data) { + var sb = new StringBuilder(); + using (var writer = new StringWriter(sb)) { + BuildPrettyString(data, writer, 0); + return sb.ToString(); + } + } + + /// + /// Writes the compressed JSON output data to the given stream. + /// + /// The data to print. + /// Where to write the printed data. + public static void CompressedJson(fsData data, StreamWriter outputStream) { + BuildCompressedString(data, outputStream); + } + + /// + /// Returns the data in a relatively compressed JSON format. + /// + public static string CompressedJson(fsData data) { + var sb = new StringBuilder(); + using (var writer = new StringWriter(sb)) { + BuildCompressedString(data, writer); + return sb.ToString(); + } + } + + /// + /// Utility method that converts a double to a string. + /// + private static string ConvertDoubleToString(double d) { + if (Double.IsInfinity(d) || Double.IsNaN(d)) + return d.ToString(CultureInfo.InvariantCulture); + + string doubledString = d.ToString(CultureInfo.InvariantCulture); + + // NOTE/HACK: If we don't serialize with a period or an exponent, + // then the number will be deserialized as an Int64, not a double. + if (doubledString.Contains(".") == false && + doubledString.Contains("e") == false && + doubledString.Contains("E") == false) { + doubledString += ".0"; + } + + return doubledString; + } + + } +} \ No newline at end of file diff --git a/Assets/Source/fsJsonPrinter.cs.meta b/Assets/Source/fsJsonPrinter.cs.meta new file mode 100644 index 0000000..2cc1c2a --- /dev/null +++ b/Assets/Source/fsJsonPrinter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4e795bc949226ef4d8a63c2f4bd3bdf9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsMemberSerialization.cs b/Assets/Source/fsMemberSerialization.cs new file mode 100644 index 0000000..de7767b --- /dev/null +++ b/Assets/Source/fsMemberSerialization.cs @@ -0,0 +1,21 @@ +namespace FullSerializer { + /// + /// Controls how the reflected converter handles member serialization. + /// + public enum fsMemberSerialization { + /// + /// Only members with [SerializeField] or [fsProperty] attributes are serialized. + /// + OptIn, + + /// + /// Only members with [NotSerialized] or [fsIgnore] will not be serialized. + /// + OptOut, + + /// + /// The default member serialization behavior is applied. + /// + Default + } +} \ No newline at end of file diff --git a/Assets/Source/fsMemberSerialization.cs.meta b/Assets/Source/fsMemberSerialization.cs.meta new file mode 100644 index 0000000..0b48230 --- /dev/null +++ b/Assets/Source/fsMemberSerialization.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3191f05f033e23947b48c7694d12e76c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsObjectAttribute.cs b/Assets/Source/fsObjectAttribute.cs new file mode 100644 index 0000000..bda5579 --- /dev/null +++ b/Assets/Source/fsObjectAttribute.cs @@ -0,0 +1,52 @@ +using System; + +namespace FullSerializer { + /// + /// This attribute controls some serialization behavior for a type. See the comments + /// on each of the fields for more information. + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] + public sealed class fsObjectAttribute : Attribute { + /// + /// The previous model that should be used if an old version of this + /// object is encountered. Using this attribute also requires that the + /// type have a public constructor that takes only one parameter, an object + /// instance of the given type. Use of this parameter *requires* that + /// the VersionString parameter is also set. + /// + public Type[] PreviousModels; + + /// + /// The version string to use for this model. This should be unique among all + /// prior versions of this model that is supported for importation. If PreviousModel + /// is set, then this attribute must also be set. A good valid example for this + /// is "v1", "v2", "v3", ... + /// + public string VersionString; + + /// + /// This controls the behavior for member serialization. + /// The default behavior is fsMemberSerialization.Default. + /// + public fsMemberSerialization MemberSerialization = fsMemberSerialization.Default; + + /// + /// Specify a custom converter to use for serialization. The converter type needs + /// to derive from fsBaseConverter. This defaults to null. + /// + public Type Converter; + + /// + /// Specify a custom processor to use during serialization. The processor type needs + /// to derive from fsObjectProcessor and the call to CanProcess is not invoked. This + /// defaults to null. + /// + public Type Processor; + + public fsObjectAttribute() { } + public fsObjectAttribute(string versionString, params Type[] previousModels) { + VersionString = versionString; + PreviousModels = previousModels; + } + } +} \ No newline at end of file diff --git a/Assets/Source/fsObjectAttribute.cs.meta b/Assets/Source/fsObjectAttribute.cs.meta new file mode 100644 index 0000000..cc3e574 --- /dev/null +++ b/Assets/Source/fsObjectAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ccb6d168f2ca6b34da57030c4d6edfcd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsObjectProcessor.cs b/Assets/Source/fsObjectProcessor.cs new file mode 100644 index 0000000..1fc7f7a --- /dev/null +++ b/Assets/Source/fsObjectProcessor.cs @@ -0,0 +1,68 @@ +using System; + +namespace FullSerializer { + /// + /// + /// Enables injecting code before/after an object has been serialized. This is most + /// useful if you want to run the default serialization process but apply a pre/post + /// processing step. + /// + /// + /// Multiple object processors can be active at the same time. When running they are + /// called in a "nested" fashion - if we have processor1 and process2 added to the + /// serializer in that order (p1 then p2), then the execution order will be + /// p1#Before p2#Before /serialization/ p2#After p1#After. + /// + /// + public abstract class fsObjectProcessor { + /// + /// Is the processor interested in objects of the given type? + /// + /// The given type. + /// True if the processor should be applied, false otherwise. + public virtual bool CanProcess(Type type) { throw new NotImplementedException(); } + + /// + /// Called before serialization. + /// + /// The field/property type that is storing the instance. + /// The type of the instance. + public virtual void OnBeforeSerialize(Type storageType, object instance) { } + + /// + /// Called after serialization. + /// + /// The field/property type that is storing the instance. + /// The type of the instance. + /// The data that was serialized. + public virtual void OnAfterSerialize(Type storageType, object instance, ref fsData data) { } + + /// + /// Called before deserialization. + /// + /// The field/property type that is storing the instance. + /// The data that will be used for deserialization. + public virtual void OnBeforeDeserialize(Type storageType, ref fsData data) { } + + /// + /// Called before deserialization has begun but *after* the object instance has been created. This will get + /// invoked even if the user passed in an existing instance. + /// + /// + /// **IMPORTANT**: The actual instance that gets passed here is *not* guaranteed to be an a subtype of storageType, since + /// the value for instance is whatever the active converter returned for CreateInstance() - ie, some converters will return + /// dummy types in CreateInstance() if instance creation cannot be separated from deserialization (ie, KeyValuePair). + /// + /// The field/property type that is storing the instance. + /// The created object instance. No deserialization has been applied to it. + /// The data that will be used for deserialization. + public virtual void OnBeforeDeserializeAfterInstanceCreation(Type storageType, object instance, ref fsData data) { } + + /// + /// Called after deserialization. + /// + /// The field/property type that is storing the instance. + /// The type of the instance. + public virtual void OnAfterDeserialize(Type storageType, object instance) { } + } +} diff --git a/Assets/Source/fsObjectProcessor.cs.meta b/Assets/Source/fsObjectProcessor.cs.meta new file mode 100644 index 0000000..cfb8133 --- /dev/null +++ b/Assets/Source/fsObjectProcessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b4f80a540fed3e14884d52cbbb7527e7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsPropertyAttribute.cs b/Assets/Source/fsPropertyAttribute.cs new file mode 100644 index 0000000..3772c43 --- /dev/null +++ b/Assets/Source/fsPropertyAttribute.cs @@ -0,0 +1,28 @@ +using System; + +namespace FullSerializer { + /// + /// Explicitly mark a property to be serialized. This can also be used to give the name that the + /// property should use during serialization. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] + public sealed class fsPropertyAttribute : Attribute { + /// + /// The name of that the property will use in JSON serialization. + /// + public string Name; + + /// + /// Use a custom converter for the given type. Specify the converter to use using typeof. + /// + public Type Converter; + + public fsPropertyAttribute() + : this(string.Empty) { + } + + public fsPropertyAttribute(string name) { + Name = name; + } + } +} \ No newline at end of file diff --git a/Assets/Source/fsPropertyAttribute.cs.meta b/Assets/Source/fsPropertyAttribute.cs.meta new file mode 100644 index 0000000..7c56fd4 --- /dev/null +++ b/Assets/Source/fsPropertyAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1cc3d11ad86bde44d99e301b15937685 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsResult.cs b/Assets/Source/fsResult.cs new file mode 100644 index 0000000..86320b9 --- /dev/null +++ b/Assets/Source/fsResult.cs @@ -0,0 +1,187 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace FullSerializer { + /// + /// The result of some sort of operation. A result is either successful or not, but if it + /// is successful then there may be a set of warnings/messages associated with it. These + /// warnings describe the performed error recovery operations. + /// + public struct fsResult { + // We cache the empty string array so we can unify some collections processing code. + private static readonly string[] EmptyStringArray = { }; + + /// + /// Is this result successful? + /// + /// This is intentionally a `success` state so that when the object + /// is default constructed it defaults to a failure state. + private bool _success; + + /// + /// The warning or error messages associated with the result. This may be null if + /// there are no messages. + /// + private List _messages; + + /// + /// Adds a new message to this result. + /// + /// + public void AddMessage(string message) { + if (_messages == null) { + _messages = new List(); + } + + _messages.Add(message); + } + + /// + /// Adds only the messages from the other result into this result, ignoring + /// the success/failure status of the other result. + /// + public void AddMessages(fsResult result) { + if (result._messages == null) { + return; + } + + if (_messages == null) { + _messages = new List(); + } + + _messages.AddRange(result._messages); + } + + /// + /// Merges the other result into this one. If the other result failed, then + /// this one too will have failed. + /// + /// + /// Note that you can use += instead of this method so that you don't bury + /// the actual method call that is generating the other fsResult. + /// + public fsResult Merge(fsResult other) { + // Copy success over + _success = _success && other._success; + + // Copy messages over + if (other._messages != null) { + if (_messages == null) _messages = new List(other._messages); + else _messages.AddRange(other._messages); + } + + return this; + } + + /// + /// A successful result. + /// + public static fsResult Success = new fsResult { + _success = true + }; + + /// + /// Create a result that is successful but contains the given warning message. + /// + public static fsResult Warn(string warning) { + return new fsResult { + _success = true, + _messages = new List { warning } + }; + } + + /// + /// Create a result that failed. + /// + public static fsResult Fail(string warning) { + return new fsResult { + _success = false, + _messages = new List { warning } + }; + } + + // TODO: how to make sure this is only used as +=? + + /// + /// Only use this as +=! + /// + public static fsResult operator +(fsResult a, fsResult b) { + return a.Merge(b); + } + + /// + /// Did this result fail? If so, you can see the reasons why in `RawMessages`. + /// + public bool Failed { + get { + return _success == false; + } + } + + /// + /// Was the result a success? Note that even successful operations may have + /// warning messages (`RawMessages`) associated with them. + /// + public bool Succeeded { + get { + return _success; + } + } + + /// + /// Does this result have any warnings? This says nothing about if it failed + /// or succeeded, just if it has warning messages associated with it. + /// + public bool HasWarnings { + get { + return _messages != null && _messages.Any(); + } + } + + /// + /// A simply utility method that will assert that this result is successful. If it + /// is not, then an exception is thrown. + /// + public fsResult AssertSuccess() { + if (Failed) throw AsException; + return this; + } + + /// + /// A simple utility method that will assert that this result is successful and that + /// there are no warning messages. This throws an exception if either of those + /// asserts are false. + /// + public fsResult AssertSuccessWithoutWarnings() { + if (Failed || RawMessages.Any()) throw AsException; + return this; + } + + /// + /// Utility method to convert the result to an exception. This method is only defined + /// is `Failed` returns true. + /// + public Exception AsException { + get { + if (!Failed && !RawMessages.Any()) throw new Exception("Only a failed result can be converted to an exception"); + return new Exception(FormattedMessages); + } + } + + public IEnumerable RawMessages { + get { + if (_messages != null) { + return _messages; + } + return EmptyStringArray; + } + } + + public string FormattedMessages { + get { + return string.Join(",\n", RawMessages.ToArray()); + } + } + } +} \ No newline at end of file diff --git a/Assets/Source/fsResult.cs.meta b/Assets/Source/fsResult.cs.meta new file mode 100644 index 0000000..d3f3f1b --- /dev/null +++ b/Assets/Source/fsResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 87a1962de4655664eb55d9570c0a3b2d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Source/fsSerializer.cs b/Assets/Source/fsSerializer.cs new file mode 100644 index 0000000..c4a7d93 --- /dev/null +++ b/Assets/Source/fsSerializer.cs @@ -0,0 +1,843 @@ +using System; +using System.Collections.Generic; +using FullSerializer.Internal; + +#if !UNITY_EDITOR && UNITY_WSA +// For System.Reflection.TypeExtensions +using System.Reflection; +#endif + +namespace FullSerializer { + public class fsSerializer { + #region Keys + private static HashSet _reservedKeywords; + static fsSerializer() { + _reservedKeywords = new HashSet { + Key_ObjectReference, + Key_ObjectDefinition, + Key_InstanceType, + Key_Version, + Key_Content + }; + } + /// + /// Returns true if the given key is a special keyword that full serializer uses to + /// add additional metadata on top of the emitted JSON. + /// + public static bool IsReservedKeyword(string key) { + return _reservedKeywords.Contains(key); + } + + /// + /// This is an object reference in part of a cyclic graph. + /// + private static readonly string Key_ObjectReference = string.Format("{0}ref", fsGlobalConfig.InternalFieldPrefix); + + /// + /// This is an object definition, as part of a cyclic graph. + /// + private static readonly string Key_ObjectDefinition = string.Format("{0}id", fsGlobalConfig.InternalFieldPrefix); + + /// + /// This specifies the actual type of an object (the instance type was different from + /// the field type). + /// + private static readonly string Key_InstanceType = string.Format("{0}type", fsGlobalConfig.InternalFieldPrefix); + + /// + /// The version string for the serialized data. + /// + private static readonly string Key_Version = string.Format("{0}version", fsGlobalConfig.InternalFieldPrefix); + + /// + /// If we have to add metadata but the original serialized state was not a dictionary, + /// then this will contain the original data. + /// + private static readonly string Key_Content = string.Format("{0}content", fsGlobalConfig.InternalFieldPrefix); + + private static bool IsObjectReference(fsData data) { + if (data.IsDictionary == false) return false; + return data.AsDictionary.ContainsKey(Key_ObjectReference); + } + private static bool IsObjectDefinition(fsData data) { + if (data.IsDictionary == false) return false; + return data.AsDictionary.ContainsKey(Key_ObjectDefinition); + } + private static bool IsVersioned(fsData data) { + if (data.IsDictionary == false) return false; + return data.AsDictionary.ContainsKey(Key_Version); + } + private static bool IsTypeSpecified(fsData data) { + if (data.IsDictionary == false) return false; + return data.AsDictionary.ContainsKey(Key_InstanceType); + } + private static bool IsWrappedData(fsData data) { + if (data.IsDictionary == false) return false; + return data.AsDictionary.ContainsKey(Key_Content); + } + + /// + /// Strips all deserialization metadata from the object, like $type and $content fields. + /// + /// After making this call, you will *not* be able to deserialize the same object instance. The metadata is + /// strictly necessary for deserialization! + public static void StripDeserializationMetadata(ref fsData data) { + if (data.IsDictionary && data.AsDictionary.ContainsKey(Key_Content)) { + data = data.AsDictionary[Key_Content]; + } + + if (data.IsDictionary) { + var dict = data.AsDictionary; + dict.Remove(Key_ObjectReference); + dict.Remove(Key_ObjectDefinition); + dict.Remove(Key_InstanceType); + dict.Remove(Key_Version); + } + } + + /// + /// This function converts legacy serialization data into the new format, so that + /// the import process can be unified and ignore the old format. + /// + private static void ConvertLegacyData(ref fsData data) { + if (data.IsDictionary == false) return; + + var dict = data.AsDictionary; + + // fast-exit: metadata never had more than two items + if (dict.Count > 2) return; + + // Key strings used in the legacy system + string referenceIdString = "ReferenceId"; + string sourceIdString = "SourceId"; + string sourceDataString = "Data"; + string typeString = "Type"; + string typeDataString = "Data"; + + // type specifier + if (dict.Count == 2 && dict.ContainsKey(typeString) && dict.ContainsKey(typeDataString)) { + data = dict[typeDataString]; + EnsureDictionary(data); + ConvertLegacyData(ref data); + + data.AsDictionary[Key_InstanceType] = dict[typeString]; + } + + // object definition + else if (dict.Count == 2 && dict.ContainsKey(sourceIdString) && dict.ContainsKey(sourceDataString)) { + data = dict[sourceDataString]; + EnsureDictionary(data); + ConvertLegacyData(ref data); + + data.AsDictionary[Key_ObjectDefinition] = dict[sourceIdString]; + } + + // object reference + else if (dict.Count == 1 && dict.ContainsKey(referenceIdString)) { + data = fsData.CreateDictionary(); + data.AsDictionary[Key_ObjectReference] = dict[referenceIdString]; + } + } + #endregion + + #region Utility Methods + private static void Invoke_OnBeforeSerialize(List processors, Type storageType, object instance) { + for (int i = 0; i < processors.Count; ++i) { + processors[i].OnBeforeSerialize(storageType, instance); + } + } + private static void Invoke_OnAfterSerialize(List processors, Type storageType, object instance, ref fsData data) { + // We run the after calls in reverse order; this significantly reduces the interaction burden between + // multiple processors - it makes each one much more independent and ignorant of the other ones. + + for (int i = processors.Count - 1; i >= 0; --i) { + processors[i].OnAfterSerialize(storageType, instance, ref data); + } + } + private static void Invoke_OnBeforeDeserialize(List processors, Type storageType, ref fsData data) { + for (int i = 0; i < processors.Count; ++i) { + processors[i].OnBeforeDeserialize(storageType, ref data); + } + } + private static void Invoke_OnBeforeDeserializeAfterInstanceCreation(List processors, Type storageType, object instance, ref fsData data) { + for (int i = 0; i < processors.Count; ++i) { + processors[i].OnBeforeDeserializeAfterInstanceCreation(storageType, instance, ref data); + } + } + private static void Invoke_OnAfterDeserialize(List processors, Type storageType, object instance) { + for (int i = processors.Count - 1; i >= 0; --i) { + processors[i].OnAfterDeserialize(storageType, instance); + } + } + #endregion + + /// + /// Ensures that the data is a dictionary. If it is not, then it is wrapped inside of one. + /// + private static void EnsureDictionary(fsData data) { + if (data.IsDictionary == false) { + var existingData = data.Clone(); + data.BecomeDictionary(); + data.AsDictionary[Key_Content] = existingData; + } + } + + /// + /// This manages instance writing so that we do not write unnecessary $id fields. We + /// only need to write out an $id field when there is a corresponding $ref field. This is able + /// to write $id references lazily because the fsData instance is not actually written out to text + /// until we have entirely finished serializing it. + /// + internal class fsLazyCycleDefinitionWriter { + private Dictionary _pendingDefinitions = new Dictionary(); + private HashSet _references = new HashSet(); + + public void WriteDefinition(int id, fsData data) { + if (_references.Contains(id)) { + EnsureDictionary(data); + data.AsDictionary[Key_ObjectDefinition] = new fsData(id.ToString()); + } + + else { + _pendingDefinitions[id] = data; + } + } + + public void WriteReference(int id, Dictionary dict) { + // Write the actual definition if necessary + if (_pendingDefinitions.ContainsKey(id)) { + var data = _pendingDefinitions[id]; + EnsureDictionary(data); + data.AsDictionary[Key_ObjectDefinition] = new fsData(id.ToString()); + _pendingDefinitions.Remove(id); + } + else { + _references.Add(id); + } + + // Write the reference + dict[Key_ObjectReference] = new fsData(id.ToString()); + } + + public void Clear() { + _pendingDefinitions.Clear(); + _references.Clear(); + } + } + + /// + /// Converter type to converter instance lookup table. This could likely be stored inside + // of _cachedConverters, but there is a semantic difference because _cachedConverters goes + /// from serialized type to converter. + /// + private Dictionary _cachedConverterTypeInstances; + + /// + /// A cache from type to it's converter. + /// + private Dictionary _cachedConverters; + + /// + /// A cache from type to the set of processors that are interested in it. + /// + private Dictionary> _cachedProcessors; + + /// + /// Converters that can be used for type registration. + /// + private readonly List _availableConverters; + + /// + /// Direct converters (optimized _converters). We use these so we don't have to + /// perform a scan through every item in _converters and can instead just do an O(1) + /// lookup. This is potentially important to perf when there are a ton of direct + /// converters. + /// + private readonly Dictionary _availableDirectConverters; + + /// + /// Processors that are available. + /// + private readonly List _processors; + + /// + /// Reference manager for cycle detection. + /// + private readonly fsCyclicReferenceManager _references; + private readonly fsLazyCycleDefinitionWriter _lazyReferenceWriter; + + public fsSerializer() { + _cachedConverterTypeInstances = new Dictionary(); + _cachedConverters = new Dictionary(); + _cachedProcessors = new Dictionary>(); + + _references = new fsCyclicReferenceManager(); + _lazyReferenceWriter = new fsLazyCycleDefinitionWriter(); + + // note: The order here is important. Items at the beginning of this + // list will be used before converters at the end. Converters + // added via AddConverter() are added to the front of the list. + _availableConverters = new List { + new fsNullableConverter { Serializer = this }, + new fsGuidConverter { Serializer = this }, + new fsTypeConverter { Serializer = this }, + new fsDateConverter { Serializer = this }, + new fsEnumConverter { Serializer = this }, + new fsPrimitiveConverter { Serializer = this }, + new fsArrayConverter { Serializer = this }, + new fsDictionaryConverter { Serializer = this }, + new fsIEnumerableConverter { Serializer = this }, + new fsKeyValuePairConverter { Serializer = this }, + new fsWeakReferenceConverter { Serializer = this }, + new fsReflectedConverter { Serializer = this } + }; + _availableDirectConverters = new Dictionary(); + + _processors = new List() { + new fsSerializationCallbackProcessor() + }; + +#if !NO_UNITY + _processors.Add(new fsSerializationCallbackReceiverProcessor()); +#endif + + Context = new fsContext(); + Config = new fsConfig(); + + // Register the converters from the registrar + foreach (var converterType in fsConverterRegistrar.Converters) { + AddConverter((fsBaseConverter)Activator.CreateInstance(converterType)); + } + } + + /// + /// A context object that fsConverters can use to customize how they operate. + /// + public fsContext Context; + + /// + /// Configuration options. Also see fsGlobalConfig. + /// + public fsConfig Config; + + /// + /// Add a new processor to the serializer. Multiple processors can run at the same time in the + /// same order they were added in. + /// + /// The processor to add. + public void AddProcessor(fsObjectProcessor processor) { + _processors.Add(processor); + + // We need to reset our cached processor set, as it could be invalid with the new + // processor. Ideally, _cachedProcessors should be empty (as the user should fully setup + // the serializer before actually using it), but there is no guarantee. + _cachedProcessors = new Dictionary>(); + } + + /// + /// Remove all processors which derive from TProcessor. + /// + public void RemoveProcessor() { + int i = 0; + while (i < _processors.Count) { + if (_processors[i] is TProcessor) { + _processors.RemoveAt(i); + } + else { + ++i; + } + } + + // We need to reset our cached processor set, as it could be invalid with the new + // processor. Ideally, _cachedProcessors should be empty (as the user should fully setup + // the serializer before actually using it), but there is no guarantee. + _cachedProcessors = new Dictionary>(); + } + + /// + /// Fetches all of the processors for the given type. + /// + private List GetProcessors(Type type) { + List processors; + + // Check to see if the user has defined a custom processor for the type. If they + // have, then we don't need to scan through all of the processor to check which + // one can process the type; instead, we directly use the specified processor. + var attr = fsPortableReflection.GetAttribute(type); + if (attr != null && attr.Processor != null) { + var processor = (fsObjectProcessor)Activator.CreateInstance(attr.Processor); + processors = new List(); + processors.Add(processor); + _cachedProcessors[type] = processors; + } + + else if (_cachedProcessors.TryGetValue(type, out processors) == false) { + processors = new List(); + + for (int i = 0; i < _processors.Count; ++i) { + var processor = _processors[i]; + if (processor.CanProcess(type)) { + processors.Add(processor); + } + } + + _cachedProcessors[type] = processors; + } + + return processors; + } + + + /// + /// Adds a new converter that can be used to customize how an object is serialized and + /// deserialized. + /// + public void AddConverter(fsBaseConverter converter) { + if (converter.Serializer != null) { + throw new InvalidOperationException("Cannot add a single converter instance to " + + "multiple fsConverters -- please construct a new instance for " + converter); + } + + // TODO: wrap inside of a ConverterManager so we can control _converters and _cachedConverters lifetime + if (converter is fsDirectConverter) { + var directConverter = (fsDirectConverter)converter; + _availableDirectConverters[directConverter.ModelType] = directConverter; + } + else if (converter is fsConverter) { + _availableConverters.Insert(0, (fsConverter)converter); + } + else { + throw new InvalidOperationException("Unable to add converter " + converter + + "; the type association strategy is unknown. Please use either " + + "fsDirectConverter or fsConverter as your base type."); + } + + converter.Serializer = this; + + // We need to reset our cached converter set, as it could be invalid with the new + // converter. Ideally, _cachedConverters should be empty (as the user should fully setup + // the serializer before actually using it), but there is no guarantee. + _cachedConverters = new Dictionary(); + } + + /// + /// Fetches a converter that can serialize/deserialize the given type. + /// + private fsBaseConverter GetConverter(Type type, Type overrideConverterType) { + // Use an override converter type instead if that's what the user has requested. + if (overrideConverterType != null) { + fsBaseConverter overrideConverter; + if (_cachedConverterTypeInstances.TryGetValue(overrideConverterType, out overrideConverter) == false) { + overrideConverter = (fsBaseConverter)Activator.CreateInstance(overrideConverterType); + overrideConverter.Serializer = this; + _cachedConverterTypeInstances[overrideConverterType] = overrideConverter; + } + + return overrideConverter; + } + + // Try to lookup an existing converter. + fsBaseConverter converter; + if (_cachedConverters.TryGetValue(type, out converter)) { + return converter; + } + + // Check to see if the user has defined a custom converter for the type. If they + // have, then we don't need to scan through all of the converters to check which + // one can process the type; instead, we directly use the specified converter. + { + var attr = fsPortableReflection.GetAttribute(type); + if (attr != null && attr.Converter != null) { + converter = (fsBaseConverter)Activator.CreateInstance(attr.Converter); + converter.Serializer = this; + return _cachedConverters[type] = converter; + } + } + + // Check for a [fsForward] attribute. + { + var attr = fsPortableReflection.GetAttribute(type); + if (attr != null) { + converter = new fsForwardConverter(attr); + converter.Serializer = this; + return _cachedConverters[type] = converter; + } + } + + + // There is no specific converter specified; try all of the general ones to see + // which ones matches. + if (_cachedConverters.TryGetValue(type, out converter) == false) { + if (_availableDirectConverters.ContainsKey(type)) { + converter = _availableDirectConverters[type]; + return _cachedConverters[type] = converter; + } + else { + for (int i = 0; i < _availableConverters.Count; ++i) { + if (_availableConverters[i].CanProcess(type)) { + converter = _availableConverters[i]; + return _cachedConverters[type] = converter; + } + } + } + } + + throw new InvalidOperationException("Internal error -- could not find a converter for " + type); + } + + /// + /// Helper method that simply forwards the call to TrySerialize(typeof(T), instance, out data); + /// + public fsResult TrySerialize(T instance, out fsData data) { + return TrySerialize(typeof(T), instance, out data); + } + + /// + /// Generic wrapper around TryDeserialize that simply forwards the call. + /// + public fsResult TryDeserialize(fsData data, ref T instance) { + object boxed = instance; + var fail = TryDeserialize(data, typeof(T), ref boxed); + if (fail.Succeeded) { + instance = (T)boxed; + } + return fail; + } + + /// + /// Serialize the given value. + /// + /// The type of field/property that stores the object instance. This is + /// important particularly for inheritance, as a field storing an IInterface instance + /// should have type information included. + /// The actual object instance to serialize. + /// The serialized state of the object. + /// If serialization was successful. + public fsResult TrySerialize(Type storageType, object instance, out fsData data) { + return TrySerialize(storageType, null, instance, out data); + } + + /// + /// Serialize the given value. + /// + /// The type of field/property that stores the object instance. This is + /// important particularly for inheritance, as a field storing an IInterface instance + /// should have type information included. + /// An fsBaseConverter derived type that will be used to serialize + /// the object instead of the converter found via the normal discovery mechanisms. + /// The actual object instance to serialize. + /// The serialized state of the object. + /// If serialization was successful. + public fsResult TrySerialize(Type storageType, Type overrideConverterType, object instance, out fsData data) { + var processors = GetProcessors(instance == null ? storageType : instance.GetType()); + + Invoke_OnBeforeSerialize(processors, storageType, instance); + + // We always serialize null directly as null + if (ReferenceEquals(instance, null)) { + data = new fsData(); + Invoke_OnAfterSerialize(processors, storageType, instance, ref data); + return fsResult.Success; + } + + var result = InternalSerialize_1_ProcessCycles(storageType, overrideConverterType, instance, out data); + Invoke_OnAfterSerialize(processors, storageType, instance, ref data); + return result; + } + + private fsResult InternalSerialize_1_ProcessCycles(Type storageType, Type overrideConverterType, object instance, out fsData data) { + // We have an object definition to serialize. + try { + // Note that we enter the reference group at the beginning of serialization so that we support + // references that are at equal serialization levels, not just nested serialization levels, within + // the given subobject. A prime example is serialization a list of references. + _references.Enter(); + + // This type does not need cycle support. + var converter = GetConverter(instance.GetType(), overrideConverterType); + if (converter.RequestCycleSupport(instance.GetType()) == false) { + return InternalSerialize_2_Inheritance(storageType, overrideConverterType, instance, out data); + } + + // We've already serialized this object instance (or it is pending higher up on the call stack). + // Just serialize a reference to it to escape the cycle. + // + // note: We serialize the int as a string to so that we don't lose any information + // in a conversion to/from double. + if (_references.IsReference(instance)) { + data = fsData.CreateDictionary(); + _lazyReferenceWriter.WriteReference(_references.GetReferenceId(instance), data.AsDictionary); + return fsResult.Success; + } + + // Mark inside the object graph that we've serialized the instance. We do this *before* + // serialization so that if we get back into this function recursively, it'll already + // be marked and we can handle the cycle properly without going into an infinite loop. + _references.MarkSerialized(instance); + + // We've created the cycle metadata, so we can now serialize the actual object. + // InternalSerialize will handle inheritance correctly for us. + var result = InternalSerialize_2_Inheritance(storageType, overrideConverterType, instance, out data); + if (result.Failed) return result; + + _lazyReferenceWriter.WriteDefinition(_references.GetReferenceId(instance), data); + + return result; + } + finally { + if (_references.Exit()) { + _lazyReferenceWriter.Clear(); + } + } + } + private fsResult InternalSerialize_2_Inheritance(Type storageType, Type overrideConverterType, object instance, out fsData data) { + // Serialize the actual object with the field type being the same as the object + // type so that we won't go into an infinite loop. + var serializeResult = InternalSerialize_3_ProcessVersioning(overrideConverterType, instance, out data); + if (serializeResult.Failed) return serializeResult; + + // Do we need to add type information? If the field type and the instance type are different + // then we will not be able to recover the correct instance type from the field type when + // we deserialize the object. + // + // Note: We allow converters to request that we do *not* add type information. + if (storageType != instance.GetType() && + GetConverter(storageType, overrideConverterType).RequestInheritanceSupport(storageType)) { + + // Add the inheritance metadata + EnsureDictionary(data); + data.AsDictionary[Key_InstanceType] = new fsData(instance.GetType().FullName); + } + + return serializeResult; + } + + private fsResult InternalSerialize_3_ProcessVersioning(Type overrideConverterType, object instance, out fsData data) { + // note: We do not have to take a Type parameter here, since at this point in the serialization + // algorithm inheritance has *always* been handled. If we took a type parameter, it will + // *always* be equal to instance.GetType(), so why bother taking the parameter? + + // Check to see if there is versioning information for this type. If so, then we need to serialize it. + fsOption optionalVersionedType = fsVersionManager.GetVersionedType(instance.GetType()); + if (optionalVersionedType.HasValue) { + fsVersionedType versionedType = optionalVersionedType.Value; + + // Serialize the actual object content; we'll just wrap it with versioning metadata here. + var result = InternalSerialize_4_Converter(overrideConverterType, instance, out data); + if (result.Failed) return result; + + // Add the versioning information + EnsureDictionary(data); + data.AsDictionary[Key_Version] = new fsData(versionedType.VersionString); + + return result; + } + + // This type has no versioning information -- directly serialize it using the selected converter. + return InternalSerialize_4_Converter(overrideConverterType, instance, out data); + } + private fsResult InternalSerialize_4_Converter(Type overrideConverterType, object instance, out fsData data) { + var instanceType = instance.GetType(); + return GetConverter(instanceType, overrideConverterType).TrySerialize(instance, out data, instanceType); + } + + /// + /// Attempts to deserialize a value from a serialized state. + /// + public fsResult TryDeserialize(fsData data, Type storageType, ref object result) { + return TryDeserialize(data, storageType, null, ref result); + } + + /// + /// Attempts to deserialize a value from a serialized state. + /// + public fsResult TryDeserialize(fsData data, Type storageType, Type overrideConverterType, ref object result) { + if (data.IsNull) { + result = null; + var processors = GetProcessors(storageType); + Invoke_OnBeforeDeserialize(processors, storageType, ref data); + Invoke_OnAfterDeserialize(processors, storageType, null); + return fsResult.Success; + } + + // Convert legacy data into modern style data + ConvertLegacyData(ref data); + + try { + // We wrap the entire deserialize call in a reference group so that we can properly + // deserialize a "parallel" set of references, ie, a list of objects that are cyclic + // w.r.t. the list + _references.Enter(); + + List processors; + var r = InternalDeserialize_1_CycleReference(overrideConverterType, data, storageType, ref result, out processors); + if (r.Succeeded) { + Invoke_OnAfterDeserialize(processors, storageType, result); + } + return r; + } + finally { + _references.Exit(); + } + } + + private fsResult InternalDeserialize_1_CycleReference(Type overrideConverterType, fsData data, Type storageType, ref object result, out List processors) { + // We handle object references first because we could be deserializing a cyclic type that is + // inherited. If that is the case, then if we handle references after inheritances we will try + // to create an object instance for an abstract/interface type. + + // While object construction should technically be two-pass, we can do it in + // one pass because of how serialization happens. We traverse the serialization + // graph in the same order during serialization and deserialization, so the first + // time we encounter an object it'll always be the definition. Any times after that + // it will be a reference. Because of this, if we encounter a reference then we + // will have *always* already encountered the definition for it. + if (IsObjectReference(data)) { + int refId = int.Parse(data.AsDictionary[Key_ObjectReference].AsString); + result = _references.GetReferenceObject(refId); + processors = GetProcessors(result.GetType()); + return fsResult.Success; + } + + return InternalDeserialize_2_Version(overrideConverterType, data, storageType, ref result, out processors); + } + + private fsResult InternalDeserialize_2_Version(Type overrideConverterType, fsData data, Type storageType, ref object result, out List processors) { + if (IsVersioned(data)) { + // data is versioned, but we might not need to do a migration + string version = data.AsDictionary[Key_Version].AsString; + + fsOption versionedType = fsVersionManager.GetVersionedType(storageType); + if (versionedType.HasValue && + versionedType.Value.VersionString != version) { + + // we have to do a migration + var deserializeResult = fsResult.Success; + + List path; + deserializeResult += fsVersionManager.GetVersionImportPath(version, versionedType.Value, out path); + if (deserializeResult.Failed) { + processors = GetProcessors(storageType); + return deserializeResult; + } + + // deserialize as the original type + deserializeResult += InternalDeserialize_3_Inheritance(overrideConverterType, data, path[0].ModelType, ref result, out processors); + if (deserializeResult.Failed) return deserializeResult; + + // TODO: we probably should be invoking object processors all along this pipeline + for (int i = 1; i < path.Count; ++i) { + result = path[i].Migrate(result); + } + + // Our data contained an object definition ($id) that was added to _references in step 4. + // However, in case we are doing versioning, it will contain the old version. + // To make sure future references to this object end up referencing the migrated version, + // we must update the reference. + if (IsObjectDefinition(data)) { + int sourceId = int.Parse(data.AsDictionary[Key_ObjectDefinition].AsString); + _references.AddReferenceWithId(sourceId, result); + } + + processors = GetProcessors(deserializeResult.GetType()); + return deserializeResult; + } + } + + return InternalDeserialize_3_Inheritance(overrideConverterType, data, storageType, ref result, out processors); + } + + private fsResult InternalDeserialize_3_Inheritance(Type overrideConverterType, fsData data, Type storageType, ref object result, out List processors) { + var deserializeResult = fsResult.Success; + + Type objectType = storageType; + + // If the serialized state contains type information, then we need to make sure to update our + // objectType and data to the proper values so that when we construct an object instance later + // and run deserialization we run it on the proper type. + if (IsTypeSpecified(data)) { + fsData typeNameData = data.AsDictionary[Key_InstanceType]; + + // we wrap everything in a do while false loop so we can break out it + do { + if (typeNameData.IsString == false) { + deserializeResult.AddMessage(Key_InstanceType + " value must be a string (in " + data + ")"); + break; + } + + string typeName = typeNameData.AsString; + Type type = fsTypeCache.GetType(typeName); + if (type == null) { + deserializeResult += fsResult.Fail("Unable to locate specified type \"" + typeName + "\""); + break; + } + + if (storageType.IsAssignableFrom(type) == false) { + deserializeResult.AddMessage("Ignoring type specifier; a field/property of type " + storageType + " cannot hold an instance of " + type); + break; + } + + objectType = type; + } while (false); + } + + // We wait until here to actually Invoke_OnBeforeDeserialize because we do not + // have the correct set of processors to invoke until *after* we have resolved + // the proper type to use for deserialization. + processors = GetProcessors(objectType); + + if (deserializeResult.Failed) + return deserializeResult; + + Invoke_OnBeforeDeserialize(processors, storageType, ref data); + + // Construct an object instance if we don't have one already. We also need to construct + // an instance if the result type is of the wrong type, which may be the case when we + // have a versioned import graph. + if (ReferenceEquals(result, null) || result.GetType() != objectType) { + result = GetConverter(objectType, overrideConverterType).CreateInstance(data, objectType); + } + + // We call OnBeforeDeserializeAfterInstanceCreation here because we still want to invoke the + // method even if the user passed in an existing instance. + Invoke_OnBeforeDeserializeAfterInstanceCreation(processors, storageType, result, ref data); + + // NOTE: It is critically important that we pass the actual objectType down instead of + // using result.GetType() because it is not guaranteed that result.GetType() + // will equal objectType, especially because some converters are known to + // return dummy values for CreateInstance() (for example, the default behavior + // for structs is to just return the type of the struct). + + return deserializeResult += InternalDeserialize_4_Cycles(overrideConverterType, data, objectType, ref result); + } + + private fsResult InternalDeserialize_4_Cycles(Type overrideConverterType, fsData data, Type resultType, ref object result) { + if (IsObjectDefinition(data)) { + // NOTE: object references are handled at stage 1 + + // If this is a definition, then we have a serialization invariant that this is the + // first time we have encountered the object (TODO: verify in the deserialization logic) + + // Since at this stage in the deserialization process we already have access to the + // object instance, so we just need to sync the object id to the references database + // so that when we encounter the instance we lookup this same object. We want to do + // this before actually deserializing the object because when deserializing the object + // there may be references to itself. + + int sourceId = int.Parse(data.AsDictionary[Key_ObjectDefinition].AsString); + _references.AddReferenceWithId(sourceId, result); + } + + // Nothing special, go through the standard deserialization logic. + return InternalDeserialize_5_Converter(overrideConverterType, data, resultType, ref result); + } + + private fsResult InternalDeserialize_5_Converter(Type overrideConverterType, fsData data, Type resultType, ref object result) { + if (IsWrappedData(data)) { + data = data.AsDictionary[Key_Content]; + } + + return GetConverter(resultType, overrideConverterType).TryDeserialize(data, ref result, resultType); + } + } +} diff --git a/Assets/Source/fsSerializer.cs.meta b/Assets/Source/fsSerializer.cs.meta new file mode 100644 index 0000000..fc91881 --- /dev/null +++ b/Assets/Source/fsSerializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 81d68ae97272ffe4da1f76ed884c2257 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/pixelgon.blend b/Assets/pixelgon.blend new file mode 100644 index 0000000..f603cf5 Binary files /dev/null and b/Assets/pixelgon.blend differ diff --git a/Assets/pixelgon.blend.meta b/Assets/pixelgon.blend.meta new file mode 100644 index 0000000..f9457e8 --- /dev/null +++ b/Assets/pixelgon.blend.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: dc6240c783ee7974e8811c10e071e0cc +ModelImporter: + serializedVersion: 19300 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/pixelgon.blend1 b/Assets/pixelgon.blend1 new file mode 100644 index 0000000..387e5d9 Binary files /dev/null and b/Assets/pixelgon.blend1 differ diff --git a/Assets/pixelgon.blend1.meta b/Assets/pixelgon.blend1.meta new file mode 100644 index 0000000..3047f96 --- /dev/null +++ b/Assets/pixelgon.blend1.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3b66ac45c9b936c46a371553fd177dc5 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/APIUpdater/project-dependencies.graph b/Library/APIUpdater/project-dependencies.graph new file mode 100644 index 0000000..52fabe4 Binary files /dev/null and b/Library/APIUpdater/project-dependencies.graph differ diff --git a/Library/AnnotationManager b/Library/AnnotationManager new file mode 100644 index 0000000..529161e Binary files /dev/null and b/Library/AnnotationManager differ diff --git a/Library/ArtifactDB b/Library/ArtifactDB new file mode 100644 index 0000000..15e5a6c Binary files /dev/null and b/Library/ArtifactDB differ diff --git a/Library/ArtifactDB-lock b/Library/ArtifactDB-lock new file mode 100644 index 0000000..f0ffaf6 Binary files /dev/null and b/Library/ArtifactDB-lock differ diff --git a/Library/Artifacts/00/001067bf2bd4e382e1bdf319a17a4a7a b/Library/Artifacts/00/001067bf2bd4e382e1bdf319a17a4a7a new file mode 100644 index 0000000..9f78f58 Binary files /dev/null and b/Library/Artifacts/00/001067bf2bd4e382e1bdf319a17a4a7a differ diff --git a/Library/Artifacts/00/00282c7715361d2c5ae117341b59c3e5 b/Library/Artifacts/00/00282c7715361d2c5ae117341b59c3e5 new file mode 100644 index 0000000..a3f9792 Binary files /dev/null and b/Library/Artifacts/00/00282c7715361d2c5ae117341b59c3e5 differ diff --git a/Library/Artifacts/00/0035b28e5a88ed7ded047a6b1b222361 b/Library/Artifacts/00/0035b28e5a88ed7ded047a6b1b222361 new file mode 100644 index 0000000..2678210 Binary files /dev/null and b/Library/Artifacts/00/0035b28e5a88ed7ded047a6b1b222361 differ diff --git a/Library/Artifacts/00/0036600e7057ec359574bb4902c5b795 b/Library/Artifacts/00/0036600e7057ec359574bb4902c5b795 new file mode 100644 index 0000000..753f462 Binary files /dev/null and b/Library/Artifacts/00/0036600e7057ec359574bb4902c5b795 differ diff --git a/Library/Artifacts/00/005f8c744689c2d5677404abf2588e23 b/Library/Artifacts/00/005f8c744689c2d5677404abf2588e23 new file mode 100644 index 0000000..7c4883e Binary files /dev/null and b/Library/Artifacts/00/005f8c744689c2d5677404abf2588e23 differ diff --git a/Library/Artifacts/00/006fa53d8cd8ff7deeb155618004091a b/Library/Artifacts/00/006fa53d8cd8ff7deeb155618004091a new file mode 100644 index 0000000..12220a2 Binary files /dev/null and b/Library/Artifacts/00/006fa53d8cd8ff7deeb155618004091a differ diff --git a/Library/Artifacts/00/0075ec64c5f3e3adc6b695804ce6d292 b/Library/Artifacts/00/0075ec64c5f3e3adc6b695804ce6d292 new file mode 100644 index 0000000..2e95c66 Binary files /dev/null and b/Library/Artifacts/00/0075ec64c5f3e3adc6b695804ce6d292 differ diff --git a/Library/Artifacts/00/00e12ba755b4f6287936f1a8c77d2c03 b/Library/Artifacts/00/00e12ba755b4f6287936f1a8c77d2c03 new file mode 100644 index 0000000..0319cc0 Binary files /dev/null and b/Library/Artifacts/00/00e12ba755b4f6287936f1a8c77d2c03 differ diff --git a/Library/Artifacts/01/011c952e4227985c9ab097a9e3b06273 b/Library/Artifacts/01/011c952e4227985c9ab097a9e3b06273 new file mode 100644 index 0000000..5f4b008 Binary files /dev/null and b/Library/Artifacts/01/011c952e4227985c9ab097a9e3b06273 differ diff --git a/Library/Artifacts/01/011d5544ca7ecf30ccd737f27ba0d065 b/Library/Artifacts/01/011d5544ca7ecf30ccd737f27ba0d065 new file mode 100644 index 0000000..d3ca05a Binary files /dev/null and b/Library/Artifacts/01/011d5544ca7ecf30ccd737f27ba0d065 differ diff --git a/Library/Artifacts/01/012c4e7ed80308b09d389444902dff1f b/Library/Artifacts/01/012c4e7ed80308b09d389444902dff1f new file mode 100644 index 0000000..b659762 Binary files /dev/null and b/Library/Artifacts/01/012c4e7ed80308b09d389444902dff1f differ diff --git a/Library/Artifacts/01/012d0b8f3319667c2982930df5daf96a b/Library/Artifacts/01/012d0b8f3319667c2982930df5daf96a new file mode 100644 index 0000000..94537ab Binary files /dev/null and b/Library/Artifacts/01/012d0b8f3319667c2982930df5daf96a differ diff --git a/Library/Artifacts/01/0137ab94a89ac136bc615d4cc0be7420 b/Library/Artifacts/01/0137ab94a89ac136bc615d4cc0be7420 new file mode 100644 index 0000000..fe862f9 Binary files /dev/null and b/Library/Artifacts/01/0137ab94a89ac136bc615d4cc0be7420 differ diff --git a/Library/Artifacts/01/0159762bc950c7eba9ff2400470ace7b b/Library/Artifacts/01/0159762bc950c7eba9ff2400470ace7b new file mode 100644 index 0000000..4468df8 Binary files /dev/null and b/Library/Artifacts/01/0159762bc950c7eba9ff2400470ace7b differ diff --git a/Library/Artifacts/01/017d673b440f959d77ecaa318f2aecc3 b/Library/Artifacts/01/017d673b440f959d77ecaa318f2aecc3 new file mode 100644 index 0000000..37c7975 Binary files /dev/null and b/Library/Artifacts/01/017d673b440f959d77ecaa318f2aecc3 differ diff --git a/Library/Artifacts/01/0186302bb0faec19889a59a527f82a02 b/Library/Artifacts/01/0186302bb0faec19889a59a527f82a02 new file mode 100644 index 0000000..28f594c Binary files /dev/null and b/Library/Artifacts/01/0186302bb0faec19889a59a527f82a02 differ diff --git a/Library/Artifacts/01/01aa780c5df84b27beba9b88f08cf972 b/Library/Artifacts/01/01aa780c5df84b27beba9b88f08cf972 new file mode 100644 index 0000000..7ae647c Binary files /dev/null and b/Library/Artifacts/01/01aa780c5df84b27beba9b88f08cf972 differ diff --git a/Library/Artifacts/01/01d052b8f80a2cafbde178e1eb4e8c44 b/Library/Artifacts/01/01d052b8f80a2cafbde178e1eb4e8c44 new file mode 100644 index 0000000..ea81b06 Binary files /dev/null and b/Library/Artifacts/01/01d052b8f80a2cafbde178e1eb4e8c44 differ diff --git a/Library/Artifacts/01/01f4265caa176760545d6f0b767c8f4c b/Library/Artifacts/01/01f4265caa176760545d6f0b767c8f4c new file mode 100644 index 0000000..898b1e3 Binary files /dev/null and b/Library/Artifacts/01/01f4265caa176760545d6f0b767c8f4c differ diff --git a/Library/Artifacts/01/01f690bcafd3a44d10f7624c201308a3 b/Library/Artifacts/01/01f690bcafd3a44d10f7624c201308a3 new file mode 100644 index 0000000..90e3eb2 Binary files /dev/null and b/Library/Artifacts/01/01f690bcafd3a44d10f7624c201308a3 differ diff --git a/Library/Artifacts/02/020158690d69637cc17e62380089157f b/Library/Artifacts/02/020158690d69637cc17e62380089157f new file mode 100644 index 0000000..866116e Binary files /dev/null and b/Library/Artifacts/02/020158690d69637cc17e62380089157f differ diff --git a/Library/Artifacts/02/0212edc501abb0d0e06bebb50346d7c6 b/Library/Artifacts/02/0212edc501abb0d0e06bebb50346d7c6 new file mode 100644 index 0000000..dd66e07 Binary files /dev/null and b/Library/Artifacts/02/0212edc501abb0d0e06bebb50346d7c6 differ diff --git a/Library/Artifacts/02/021836ad62456c3a07ec15924526eb26 b/Library/Artifacts/02/021836ad62456c3a07ec15924526eb26 new file mode 100644 index 0000000..b7d20b1 Binary files /dev/null and b/Library/Artifacts/02/021836ad62456c3a07ec15924526eb26 differ diff --git a/Library/Artifacts/02/02389a08cf4342a2df4825147b5c08c3 b/Library/Artifacts/02/02389a08cf4342a2df4825147b5c08c3 new file mode 100644 index 0000000..379166e Binary files /dev/null and b/Library/Artifacts/02/02389a08cf4342a2df4825147b5c08c3 differ diff --git a/Library/Artifacts/02/0261ed4a622ee4cd4f8eb4ceba49de34 b/Library/Artifacts/02/0261ed4a622ee4cd4f8eb4ceba49de34 new file mode 100644 index 0000000..38bf2fc Binary files /dev/null and b/Library/Artifacts/02/0261ed4a622ee4cd4f8eb4ceba49de34 differ diff --git a/Library/Artifacts/02/0261efad9e1e0f80b00c2be52946359c b/Library/Artifacts/02/0261efad9e1e0f80b00c2be52946359c new file mode 100644 index 0000000..38d4f61 Binary files /dev/null and b/Library/Artifacts/02/0261efad9e1e0f80b00c2be52946359c differ diff --git a/Library/Artifacts/02/028a1885c7446c882bd8502e3ebd3266 b/Library/Artifacts/02/028a1885c7446c882bd8502e3ebd3266 new file mode 100644 index 0000000..7c4f07b Binary files /dev/null and b/Library/Artifacts/02/028a1885c7446c882bd8502e3ebd3266 differ diff --git a/Library/Artifacts/02/02a5ebab30e2760197dedd9f260e0573 b/Library/Artifacts/02/02a5ebab30e2760197dedd9f260e0573 new file mode 100644 index 0000000..4e53978 Binary files /dev/null and b/Library/Artifacts/02/02a5ebab30e2760197dedd9f260e0573 differ diff --git a/Library/Artifacts/03/0331b540d212569a771c72eb44f34de1 b/Library/Artifacts/03/0331b540d212569a771c72eb44f34de1 new file mode 100644 index 0000000..d73f68d Binary files /dev/null and b/Library/Artifacts/03/0331b540d212569a771c72eb44f34de1 differ diff --git a/Library/Artifacts/03/033fffa0afb25ca8cdec0a022767af34 b/Library/Artifacts/03/033fffa0afb25ca8cdec0a022767af34 new file mode 100644 index 0000000..ef600ae Binary files /dev/null and b/Library/Artifacts/03/033fffa0afb25ca8cdec0a022767af34 differ diff --git a/Library/Artifacts/03/0352fef15b5e7c1e13580643fa6655ff b/Library/Artifacts/03/0352fef15b5e7c1e13580643fa6655ff new file mode 100644 index 0000000..5d84d10 Binary files /dev/null and b/Library/Artifacts/03/0352fef15b5e7c1e13580643fa6655ff differ diff --git a/Library/Artifacts/03/036cc2319380b3405ec85ae876aae37e b/Library/Artifacts/03/036cc2319380b3405ec85ae876aae37e new file mode 100644 index 0000000..b708c4e Binary files /dev/null and b/Library/Artifacts/03/036cc2319380b3405ec85ae876aae37e differ diff --git a/Library/Artifacts/03/036ff1515c5d8ce0eaf411e65ece183c b/Library/Artifacts/03/036ff1515c5d8ce0eaf411e65ece183c new file mode 100644 index 0000000..711e972 Binary files /dev/null and b/Library/Artifacts/03/036ff1515c5d8ce0eaf411e65ece183c differ diff --git a/Library/Artifacts/03/03a19fa9cf07c0bcd75c71e6e422c6e4 b/Library/Artifacts/03/03a19fa9cf07c0bcd75c71e6e422c6e4 new file mode 100644 index 0000000..c3a7293 Binary files /dev/null and b/Library/Artifacts/03/03a19fa9cf07c0bcd75c71e6e422c6e4 differ diff --git a/Library/Artifacts/03/03d661e89c4eb5cb1a66f7172dd94730 b/Library/Artifacts/03/03d661e89c4eb5cb1a66f7172dd94730 new file mode 100644 index 0000000..680c957 Binary files /dev/null and b/Library/Artifacts/03/03d661e89c4eb5cb1a66f7172dd94730 differ diff --git a/Library/Artifacts/03/03e3f405f6a8acce269b5121901bd8db b/Library/Artifacts/03/03e3f405f6a8acce269b5121901bd8db new file mode 100644 index 0000000..bae6a2f Binary files /dev/null and b/Library/Artifacts/03/03e3f405f6a8acce269b5121901bd8db differ diff --git a/Library/Artifacts/03/03eca33c10d45935310bbe4fac9bf5b2 b/Library/Artifacts/03/03eca33c10d45935310bbe4fac9bf5b2 new file mode 100644 index 0000000..ad8d069 Binary files /dev/null and b/Library/Artifacts/03/03eca33c10d45935310bbe4fac9bf5b2 differ diff --git a/Library/Artifacts/03/03ee8265d47e45894314b43d14a9e6a0 b/Library/Artifacts/03/03ee8265d47e45894314b43d14a9e6a0 new file mode 100644 index 0000000..57d52b0 Binary files /dev/null and b/Library/Artifacts/03/03ee8265d47e45894314b43d14a9e6a0 differ diff --git a/Library/Artifacts/04/0408c0a439f61566342de2433be131c2 b/Library/Artifacts/04/0408c0a439f61566342de2433be131c2 new file mode 100644 index 0000000..f6e23c1 Binary files /dev/null and b/Library/Artifacts/04/0408c0a439f61566342de2433be131c2 differ diff --git a/Library/Artifacts/04/0412d4433319395005b23a0db8b5074f b/Library/Artifacts/04/0412d4433319395005b23a0db8b5074f new file mode 100644 index 0000000..b7479cd Binary files /dev/null and b/Library/Artifacts/04/0412d4433319395005b23a0db8b5074f differ diff --git a/Library/Artifacts/04/0442e98cab2c4553190a244b6cf1ab8c b/Library/Artifacts/04/0442e98cab2c4553190a244b6cf1ab8c new file mode 100644 index 0000000..c5541fc Binary files /dev/null and b/Library/Artifacts/04/0442e98cab2c4553190a244b6cf1ab8c differ diff --git a/Library/Artifacts/04/047af08fa8930896e2ab0f499a767e47 b/Library/Artifacts/04/047af08fa8930896e2ab0f499a767e47 new file mode 100644 index 0000000..dabd610 Binary files /dev/null and b/Library/Artifacts/04/047af08fa8930896e2ab0f499a767e47 differ diff --git a/Library/Artifacts/04/049315c72d4d0db0fde5fa5bb370e44f b/Library/Artifacts/04/049315c72d4d0db0fde5fa5bb370e44f new file mode 100644 index 0000000..4c351b4 Binary files /dev/null and b/Library/Artifacts/04/049315c72d4d0db0fde5fa5bb370e44f differ diff --git a/Library/Artifacts/04/04e6806e718a3219c7cee909199e61ff b/Library/Artifacts/04/04e6806e718a3219c7cee909199e61ff new file mode 100644 index 0000000..3443139 Binary files /dev/null and b/Library/Artifacts/04/04e6806e718a3219c7cee909199e61ff differ diff --git a/Library/Artifacts/04/04ef1e8e993f3a9622982f1e0c448ffc b/Library/Artifacts/04/04ef1e8e993f3a9622982f1e0c448ffc new file mode 100644 index 0000000..64118b2 Binary files /dev/null and b/Library/Artifacts/04/04ef1e8e993f3a9622982f1e0c448ffc differ diff --git a/Library/Artifacts/05/05258396b3d29d25f03b664b4216b469 b/Library/Artifacts/05/05258396b3d29d25f03b664b4216b469 new file mode 100644 index 0000000..95b5546 Binary files /dev/null and b/Library/Artifacts/05/05258396b3d29d25f03b664b4216b469 differ diff --git a/Library/Artifacts/05/0530a2a20e958863c977c5d97d9e5212 b/Library/Artifacts/05/0530a2a20e958863c977c5d97d9e5212 new file mode 100644 index 0000000..13365b7 Binary files /dev/null and b/Library/Artifacts/05/0530a2a20e958863c977c5d97d9e5212 differ diff --git a/Library/Artifacts/05/0535e3eeba26edac252bcd88a33ac370 b/Library/Artifacts/05/0535e3eeba26edac252bcd88a33ac370 new file mode 100644 index 0000000..5c0a812 Binary files /dev/null and b/Library/Artifacts/05/0535e3eeba26edac252bcd88a33ac370 differ diff --git a/Library/Artifacts/05/0547e968f538e8701f1a3478f8527b25 b/Library/Artifacts/05/0547e968f538e8701f1a3478f8527b25 new file mode 100644 index 0000000..ba38057 Binary files /dev/null and b/Library/Artifacts/05/0547e968f538e8701f1a3478f8527b25 differ diff --git a/Library/Artifacts/05/055e70c6f791a12e38bfbd078f426a32 b/Library/Artifacts/05/055e70c6f791a12e38bfbd078f426a32 new file mode 100644 index 0000000..d1d4170 Binary files /dev/null and b/Library/Artifacts/05/055e70c6f791a12e38bfbd078f426a32 differ diff --git a/Library/Artifacts/05/05789e437d6a386d831e5c1aa953e9d3 b/Library/Artifacts/05/05789e437d6a386d831e5c1aa953e9d3 new file mode 100644 index 0000000..16d9736 Binary files /dev/null and b/Library/Artifacts/05/05789e437d6a386d831e5c1aa953e9d3 differ diff --git a/Library/Artifacts/05/057bdfe7da04aaf9bcccdd9ec803fd00 b/Library/Artifacts/05/057bdfe7da04aaf9bcccdd9ec803fd00 new file mode 100644 index 0000000..88237ea Binary files /dev/null and b/Library/Artifacts/05/057bdfe7da04aaf9bcccdd9ec803fd00 differ diff --git a/Library/Artifacts/05/05a0b5ba334d7ff253fb02e00a771094 b/Library/Artifacts/05/05a0b5ba334d7ff253fb02e00a771094 new file mode 100644 index 0000000..0b1a124 Binary files /dev/null and b/Library/Artifacts/05/05a0b5ba334d7ff253fb02e00a771094 differ diff --git a/Library/Artifacts/05/05a84a69ff994947547fec15ffa3e12b b/Library/Artifacts/05/05a84a69ff994947547fec15ffa3e12b new file mode 100644 index 0000000..de00d0d Binary files /dev/null and b/Library/Artifacts/05/05a84a69ff994947547fec15ffa3e12b differ diff --git a/Library/Artifacts/06/0645772e0105824c51ce900066c1f115 b/Library/Artifacts/06/0645772e0105824c51ce900066c1f115 new file mode 100644 index 0000000..bf6734f Binary files /dev/null and b/Library/Artifacts/06/0645772e0105824c51ce900066c1f115 differ diff --git a/Library/Artifacts/06/0693167daa18d18bd0c21622d8b4cc0b b/Library/Artifacts/06/0693167daa18d18bd0c21622d8b4cc0b new file mode 100644 index 0000000..c5d3f34 Binary files /dev/null and b/Library/Artifacts/06/0693167daa18d18bd0c21622d8b4cc0b differ diff --git a/Library/Artifacts/06/06add85d82e1141d1704b660e2bc8b70 b/Library/Artifacts/06/06add85d82e1141d1704b660e2bc8b70 new file mode 100644 index 0000000..cdaa69d Binary files /dev/null and b/Library/Artifacts/06/06add85d82e1141d1704b660e2bc8b70 differ diff --git a/Library/Artifacts/06/06f797d6b100bdaa394cb88c12bf6df2 b/Library/Artifacts/06/06f797d6b100bdaa394cb88c12bf6df2 new file mode 100644 index 0000000..c862de0 Binary files /dev/null and b/Library/Artifacts/06/06f797d6b100bdaa394cb88c12bf6df2 differ diff --git a/Library/Artifacts/07/07088e39d358583e222c9f27a5908d0b b/Library/Artifacts/07/07088e39d358583e222c9f27a5908d0b new file mode 100644 index 0000000..7d37ecc Binary files /dev/null and b/Library/Artifacts/07/07088e39d358583e222c9f27a5908d0b differ diff --git a/Library/Artifacts/07/0719c6c4d855570ca10ca7ddebac7256 b/Library/Artifacts/07/0719c6c4d855570ca10ca7ddebac7256 new file mode 100644 index 0000000..0b2f482 Binary files /dev/null and b/Library/Artifacts/07/0719c6c4d855570ca10ca7ddebac7256 differ diff --git a/Library/Artifacts/07/073bb68d6cfd8b75bc5797f96906828c b/Library/Artifacts/07/073bb68d6cfd8b75bc5797f96906828c new file mode 100644 index 0000000..7dff51b Binary files /dev/null and b/Library/Artifacts/07/073bb68d6cfd8b75bc5797f96906828c differ diff --git a/Library/Artifacts/07/0780d2b7a664a7a4282f3685810b3ed9 b/Library/Artifacts/07/0780d2b7a664a7a4282f3685810b3ed9 new file mode 100644 index 0000000..7d55c34 Binary files /dev/null and b/Library/Artifacts/07/0780d2b7a664a7a4282f3685810b3ed9 differ diff --git a/Library/Artifacts/07/07a3187558ca29444546c1e5bd08c70f b/Library/Artifacts/07/07a3187558ca29444546c1e5bd08c70f new file mode 100644 index 0000000..b3366d9 Binary files /dev/null and b/Library/Artifacts/07/07a3187558ca29444546c1e5bd08c70f differ diff --git a/Library/Artifacts/07/07a3c317b5376a409c75059e5d302f36 b/Library/Artifacts/07/07a3c317b5376a409c75059e5d302f36 new file mode 100644 index 0000000..d870281 Binary files /dev/null and b/Library/Artifacts/07/07a3c317b5376a409c75059e5d302f36 differ diff --git a/Library/Artifacts/07/07b1e582f3f620e40ca95d1e40afcf12 b/Library/Artifacts/07/07b1e582f3f620e40ca95d1e40afcf12 new file mode 100644 index 0000000..49459ed Binary files /dev/null and b/Library/Artifacts/07/07b1e582f3f620e40ca95d1e40afcf12 differ diff --git a/Library/Artifacts/07/07e438fcdf092642512e53e5ff2a5458 b/Library/Artifacts/07/07e438fcdf092642512e53e5ff2a5458 new file mode 100644 index 0000000..d708c7e Binary files /dev/null and b/Library/Artifacts/07/07e438fcdf092642512e53e5ff2a5458 differ diff --git a/Library/Artifacts/07/07eee7427ee5dcd029b87bc41714cf42 b/Library/Artifacts/07/07eee7427ee5dcd029b87bc41714cf42 new file mode 100644 index 0000000..d6a6183 Binary files /dev/null and b/Library/Artifacts/07/07eee7427ee5dcd029b87bc41714cf42 differ diff --git a/Library/Artifacts/07/07f7bd1426516da7e70957d4dff18754 b/Library/Artifacts/07/07f7bd1426516da7e70957d4dff18754 new file mode 100644 index 0000000..8a6a280 Binary files /dev/null and b/Library/Artifacts/07/07f7bd1426516da7e70957d4dff18754 differ diff --git a/Library/Artifacts/08/08127ebbc4f7dca0f9afc0c54aa6f7d6 b/Library/Artifacts/08/08127ebbc4f7dca0f9afc0c54aa6f7d6 new file mode 100644 index 0000000..e075ea0 Binary files /dev/null and b/Library/Artifacts/08/08127ebbc4f7dca0f9afc0c54aa6f7d6 differ diff --git a/Library/Artifacts/08/082309225c96e536a31fc10ee27895ed b/Library/Artifacts/08/082309225c96e536a31fc10ee27895ed new file mode 100644 index 0000000..a39bcf5 Binary files /dev/null and b/Library/Artifacts/08/082309225c96e536a31fc10ee27895ed differ diff --git a/Library/Artifacts/08/08388a7d2499c5afc58b61eb2784228e b/Library/Artifacts/08/08388a7d2499c5afc58b61eb2784228e new file mode 100644 index 0000000..94c2cc0 Binary files /dev/null and b/Library/Artifacts/08/08388a7d2499c5afc58b61eb2784228e differ diff --git a/Library/Artifacts/08/08404d83a2fd8f104669a9fe9fcb4df9 b/Library/Artifacts/08/08404d83a2fd8f104669a9fe9fcb4df9 new file mode 100644 index 0000000..5d8ca3a Binary files /dev/null and b/Library/Artifacts/08/08404d83a2fd8f104669a9fe9fcb4df9 differ diff --git a/Library/Artifacts/08/08837399ef22f4e109ee6d9f84abfc7d b/Library/Artifacts/08/08837399ef22f4e109ee6d9f84abfc7d new file mode 100644 index 0000000..52d654c Binary files /dev/null and b/Library/Artifacts/08/08837399ef22f4e109ee6d9f84abfc7d differ diff --git a/Library/Artifacts/08/08e46c7363eea4e0436871540f7a7d70 b/Library/Artifacts/08/08e46c7363eea4e0436871540f7a7d70 new file mode 100644 index 0000000..20871bc Binary files /dev/null and b/Library/Artifacts/08/08e46c7363eea4e0436871540f7a7d70 differ diff --git a/Library/Artifacts/09/094f3faa9c1251fd446f58ba8974f318 b/Library/Artifacts/09/094f3faa9c1251fd446f58ba8974f318 new file mode 100644 index 0000000..17ad9cc Binary files /dev/null and b/Library/Artifacts/09/094f3faa9c1251fd446f58ba8974f318 differ diff --git a/Library/Artifacts/09/096feffbd0916e43fddb3d0f2464bf37 b/Library/Artifacts/09/096feffbd0916e43fddb3d0f2464bf37 new file mode 100644 index 0000000..6bb2055 Binary files /dev/null and b/Library/Artifacts/09/096feffbd0916e43fddb3d0f2464bf37 differ diff --git a/Library/Artifacts/09/099a1ffa12d4a8cc806f4a89a2708f76 b/Library/Artifacts/09/099a1ffa12d4a8cc806f4a89a2708f76 new file mode 100644 index 0000000..98a55a5 Binary files /dev/null and b/Library/Artifacts/09/099a1ffa12d4a8cc806f4a89a2708f76 differ diff --git a/Library/Artifacts/09/09dda3632b751c1de851f0f6509d4b26 b/Library/Artifacts/09/09dda3632b751c1de851f0f6509d4b26 new file mode 100644 index 0000000..f986d34 Binary files /dev/null and b/Library/Artifacts/09/09dda3632b751c1de851f0f6509d4b26 differ diff --git a/Library/Artifacts/09/09eccc9cda73304ad8ca5c86b46bb33c b/Library/Artifacts/09/09eccc9cda73304ad8ca5c86b46bb33c new file mode 100644 index 0000000..036b998 Binary files /dev/null and b/Library/Artifacts/09/09eccc9cda73304ad8ca5c86b46bb33c differ diff --git a/Library/Artifacts/0a/0a053f2db19085b28dffa62a2293504e b/Library/Artifacts/0a/0a053f2db19085b28dffa62a2293504e new file mode 100644 index 0000000..d42ca77 Binary files /dev/null and b/Library/Artifacts/0a/0a053f2db19085b28dffa62a2293504e differ diff --git a/Library/Artifacts/0a/0a1858b5ec5c1c80343cdebaed434df7 b/Library/Artifacts/0a/0a1858b5ec5c1c80343cdebaed434df7 new file mode 100644 index 0000000..1d5777c Binary files /dev/null and b/Library/Artifacts/0a/0a1858b5ec5c1c80343cdebaed434df7 differ diff --git a/Library/Artifacts/0a/0a22dafc0fdb7724d7c385e2674365d7 b/Library/Artifacts/0a/0a22dafc0fdb7724d7c385e2674365d7 new file mode 100644 index 0000000..2fcaa2b Binary files /dev/null and b/Library/Artifacts/0a/0a22dafc0fdb7724d7c385e2674365d7 differ diff --git a/Library/Artifacts/0a/0a2ce07b8428e53584f3d0a3bd5af2d8 b/Library/Artifacts/0a/0a2ce07b8428e53584f3d0a3bd5af2d8 new file mode 100644 index 0000000..c017eec Binary files /dev/null and b/Library/Artifacts/0a/0a2ce07b8428e53584f3d0a3bd5af2d8 differ diff --git a/Library/Artifacts/0a/0a44c5fd950f36a3b830aa43c4dc5cc4 b/Library/Artifacts/0a/0a44c5fd950f36a3b830aa43c4dc5cc4 new file mode 100644 index 0000000..d8af0e9 Binary files /dev/null and b/Library/Artifacts/0a/0a44c5fd950f36a3b830aa43c4dc5cc4 differ diff --git a/Library/Artifacts/0a/0a823a15b54d15483e21452419552cea b/Library/Artifacts/0a/0a823a15b54d15483e21452419552cea new file mode 100644 index 0000000..2323fa8 Binary files /dev/null and b/Library/Artifacts/0a/0a823a15b54d15483e21452419552cea differ diff --git a/Library/Artifacts/0a/0a8fc9fd3223bb6863b92adb96e1fccd b/Library/Artifacts/0a/0a8fc9fd3223bb6863b92adb96e1fccd new file mode 100644 index 0000000..760967a Binary files /dev/null and b/Library/Artifacts/0a/0a8fc9fd3223bb6863b92adb96e1fccd differ diff --git a/Library/Artifacts/0a/0aa6fc04e913555d8bd4c33313166f63 b/Library/Artifacts/0a/0aa6fc04e913555d8bd4c33313166f63 new file mode 100644 index 0000000..cdbc1b1 Binary files /dev/null and b/Library/Artifacts/0a/0aa6fc04e913555d8bd4c33313166f63 differ diff --git a/Library/Artifacts/0a/0ab340e860f1f3da2af722a915ad6057 b/Library/Artifacts/0a/0ab340e860f1f3da2af722a915ad6057 new file mode 100644 index 0000000..0a3b931 Binary files /dev/null and b/Library/Artifacts/0a/0ab340e860f1f3da2af722a915ad6057 differ diff --git a/Library/Artifacts/0a/0ad9204dbfc244166b35700349f5ac55 b/Library/Artifacts/0a/0ad9204dbfc244166b35700349f5ac55 new file mode 100644 index 0000000..9040241 Binary files /dev/null and b/Library/Artifacts/0a/0ad9204dbfc244166b35700349f5ac55 differ diff --git a/Library/Artifacts/0b/0b0173f99dbd3b8313a77753a030ded7 b/Library/Artifacts/0b/0b0173f99dbd3b8313a77753a030ded7 new file mode 100644 index 0000000..050eb5f Binary files /dev/null and b/Library/Artifacts/0b/0b0173f99dbd3b8313a77753a030ded7 differ diff --git a/Library/Artifacts/0b/0b5bdf435c60560bacfb69d242ff6f63 b/Library/Artifacts/0b/0b5bdf435c60560bacfb69d242ff6f63 new file mode 100644 index 0000000..48c1e85 Binary files /dev/null and b/Library/Artifacts/0b/0b5bdf435c60560bacfb69d242ff6f63 differ diff --git a/Library/Artifacts/0b/0b62b7d2c07de42ed6d1aed42ba55d8e b/Library/Artifacts/0b/0b62b7d2c07de42ed6d1aed42ba55d8e new file mode 100644 index 0000000..276d18e Binary files /dev/null and b/Library/Artifacts/0b/0b62b7d2c07de42ed6d1aed42ba55d8e differ diff --git a/Library/Artifacts/0b/0b68c2e4d16d0824b975004705e2f2f6 b/Library/Artifacts/0b/0b68c2e4d16d0824b975004705e2f2f6 new file mode 100644 index 0000000..9b04a0d Binary files /dev/null and b/Library/Artifacts/0b/0b68c2e4d16d0824b975004705e2f2f6 differ diff --git a/Library/Artifacts/0b/0b8ff7d08d1c877088963cdbbcaeb67d b/Library/Artifacts/0b/0b8ff7d08d1c877088963cdbbcaeb67d new file mode 100644 index 0000000..4b69cfd Binary files /dev/null and b/Library/Artifacts/0b/0b8ff7d08d1c877088963cdbbcaeb67d differ diff --git a/Library/Artifacts/0b/0b9878e279f2a5a7b4618c363454b831 b/Library/Artifacts/0b/0b9878e279f2a5a7b4618c363454b831 new file mode 100644 index 0000000..de21195 Binary files /dev/null and b/Library/Artifacts/0b/0b9878e279f2a5a7b4618c363454b831 differ diff --git a/Library/Artifacts/0b/0bb01e6e81bb37bdc13b62c1ae6e8260 b/Library/Artifacts/0b/0bb01e6e81bb37bdc13b62c1ae6e8260 new file mode 100644 index 0000000..5d4472c Binary files /dev/null and b/Library/Artifacts/0b/0bb01e6e81bb37bdc13b62c1ae6e8260 differ diff --git a/Library/Artifacts/0b/0bcd4633785f86869ddb9dc6007f56c7 b/Library/Artifacts/0b/0bcd4633785f86869ddb9dc6007f56c7 new file mode 100644 index 0000000..fde9c00 Binary files /dev/null and b/Library/Artifacts/0b/0bcd4633785f86869ddb9dc6007f56c7 differ diff --git a/Library/Artifacts/0b/0bd3544c8b15e0cee29db9ed79df3f27 b/Library/Artifacts/0b/0bd3544c8b15e0cee29db9ed79df3f27 new file mode 100644 index 0000000..e6fe439 Binary files /dev/null and b/Library/Artifacts/0b/0bd3544c8b15e0cee29db9ed79df3f27 differ diff --git a/Library/Artifacts/0b/0bee53d0b7d6ffdc5b2600709fc4bf5a b/Library/Artifacts/0b/0bee53d0b7d6ffdc5b2600709fc4bf5a new file mode 100644 index 0000000..52c472b Binary files /dev/null and b/Library/Artifacts/0b/0bee53d0b7d6ffdc5b2600709fc4bf5a differ diff --git a/Library/Artifacts/0c/0c4368566cae861c125a7f7fd85adf5a b/Library/Artifacts/0c/0c4368566cae861c125a7f7fd85adf5a new file mode 100644 index 0000000..daae5aa Binary files /dev/null and b/Library/Artifacts/0c/0c4368566cae861c125a7f7fd85adf5a differ diff --git a/Library/Artifacts/0c/0c75560e5e0e71d83e2ecb19f88e5ea7 b/Library/Artifacts/0c/0c75560e5e0e71d83e2ecb19f88e5ea7 new file mode 100644 index 0000000..ab64b0b Binary files /dev/null and b/Library/Artifacts/0c/0c75560e5e0e71d83e2ecb19f88e5ea7 differ diff --git a/Library/Artifacts/0c/0c8ecf38f51065fe8cd0181c77d24c2e b/Library/Artifacts/0c/0c8ecf38f51065fe8cd0181c77d24c2e new file mode 100644 index 0000000..2141891 Binary files /dev/null and b/Library/Artifacts/0c/0c8ecf38f51065fe8cd0181c77d24c2e differ diff --git a/Library/Artifacts/0c/0c93f18b8e5f9005f21ceae19588d158 b/Library/Artifacts/0c/0c93f18b8e5f9005f21ceae19588d158 new file mode 100644 index 0000000..019e876 Binary files /dev/null and b/Library/Artifacts/0c/0c93f18b8e5f9005f21ceae19588d158 differ diff --git a/Library/Artifacts/0c/0c9f9b15ba5f12c88a321be16ab42d57 b/Library/Artifacts/0c/0c9f9b15ba5f12c88a321be16ab42d57 new file mode 100644 index 0000000..bcc730f Binary files /dev/null and b/Library/Artifacts/0c/0c9f9b15ba5f12c88a321be16ab42d57 differ diff --git a/Library/Artifacts/0c/0cb80b72823831f38ee22dd75a6023b4 b/Library/Artifacts/0c/0cb80b72823831f38ee22dd75a6023b4 new file mode 100644 index 0000000..5195bf6 Binary files /dev/null and b/Library/Artifacts/0c/0cb80b72823831f38ee22dd75a6023b4 differ diff --git a/Library/Artifacts/0c/0cbbef2455c113b708c92c06e10ddb7b b/Library/Artifacts/0c/0cbbef2455c113b708c92c06e10ddb7b new file mode 100644 index 0000000..26e8382 Binary files /dev/null and b/Library/Artifacts/0c/0cbbef2455c113b708c92c06e10ddb7b differ diff --git a/Library/Artifacts/0c/0cc2650b83f151ad7a9b4d7a36d68c73 b/Library/Artifacts/0c/0cc2650b83f151ad7a9b4d7a36d68c73 new file mode 100644 index 0000000..3705d97 Binary files /dev/null and b/Library/Artifacts/0c/0cc2650b83f151ad7a9b4d7a36d68c73 differ diff --git a/Library/Artifacts/0c/0cd402f3b201456cc4427e393ec09671 b/Library/Artifacts/0c/0cd402f3b201456cc4427e393ec09671 new file mode 100644 index 0000000..148fe63 Binary files /dev/null and b/Library/Artifacts/0c/0cd402f3b201456cc4427e393ec09671 differ diff --git a/Library/Artifacts/0d/0d445ac52cfa96276f0740ec24430a9c b/Library/Artifacts/0d/0d445ac52cfa96276f0740ec24430a9c new file mode 100644 index 0000000..0efa6ec Binary files /dev/null and b/Library/Artifacts/0d/0d445ac52cfa96276f0740ec24430a9c differ diff --git a/Library/Artifacts/0d/0d6cf8de2ac6c248b158ec282036485b b/Library/Artifacts/0d/0d6cf8de2ac6c248b158ec282036485b new file mode 100644 index 0000000..a03e2fb Binary files /dev/null and b/Library/Artifacts/0d/0d6cf8de2ac6c248b158ec282036485b differ diff --git a/Library/Artifacts/0d/0d7b7d099d82456f43844ae9eaa78e62 b/Library/Artifacts/0d/0d7b7d099d82456f43844ae9eaa78e62 new file mode 100644 index 0000000..3f93384 Binary files /dev/null and b/Library/Artifacts/0d/0d7b7d099d82456f43844ae9eaa78e62 differ diff --git a/Library/Artifacts/0d/0d9127a37b316e8ba56d39dbf4763850 b/Library/Artifacts/0d/0d9127a37b316e8ba56d39dbf4763850 new file mode 100644 index 0000000..8bb8c62 Binary files /dev/null and b/Library/Artifacts/0d/0d9127a37b316e8ba56d39dbf4763850 differ diff --git a/Library/Artifacts/0d/0d9710788bbae950938937fb2afb9278 b/Library/Artifacts/0d/0d9710788bbae950938937fb2afb9278 new file mode 100644 index 0000000..4a6ae2a Binary files /dev/null and b/Library/Artifacts/0d/0d9710788bbae950938937fb2afb9278 differ diff --git a/Library/Artifacts/0d/0dde9d83ec2ad303201b5a2812e07edc b/Library/Artifacts/0d/0dde9d83ec2ad303201b5a2812e07edc new file mode 100644 index 0000000..c1fd02c Binary files /dev/null and b/Library/Artifacts/0d/0dde9d83ec2ad303201b5a2812e07edc differ diff --git a/Library/Artifacts/0d/0de61355159f594a8f3ab14ad65c4146 b/Library/Artifacts/0d/0de61355159f594a8f3ab14ad65c4146 new file mode 100644 index 0000000..5d5f867 Binary files /dev/null and b/Library/Artifacts/0d/0de61355159f594a8f3ab14ad65c4146 differ diff --git a/Library/Artifacts/0d/0de8de3a077da0497cdab7e4dae68f4a b/Library/Artifacts/0d/0de8de3a077da0497cdab7e4dae68f4a new file mode 100644 index 0000000..812c678 Binary files /dev/null and b/Library/Artifacts/0d/0de8de3a077da0497cdab7e4dae68f4a differ diff --git a/Library/Artifacts/0e/0e25c356f2b9018107eb95f75c9b85a0 b/Library/Artifacts/0e/0e25c356f2b9018107eb95f75c9b85a0 new file mode 100644 index 0000000..6b1160e Binary files /dev/null and b/Library/Artifacts/0e/0e25c356f2b9018107eb95f75c9b85a0 differ diff --git a/Library/Artifacts/0e/0e55648e1c43b4c7cfe19a047b46dabe b/Library/Artifacts/0e/0e55648e1c43b4c7cfe19a047b46dabe new file mode 100644 index 0000000..421794c Binary files /dev/null and b/Library/Artifacts/0e/0e55648e1c43b4c7cfe19a047b46dabe differ diff --git a/Library/Artifacts/0e/0e5951c03510f8615e34e8766f8ef466 b/Library/Artifacts/0e/0e5951c03510f8615e34e8766f8ef466 new file mode 100644 index 0000000..2db4a07 Binary files /dev/null and b/Library/Artifacts/0e/0e5951c03510f8615e34e8766f8ef466 differ diff --git a/Library/Artifacts/0e/0e7b711e6141bf1ae73d527011cd7624 b/Library/Artifacts/0e/0e7b711e6141bf1ae73d527011cd7624 new file mode 100644 index 0000000..18a8b1d Binary files /dev/null and b/Library/Artifacts/0e/0e7b711e6141bf1ae73d527011cd7624 differ diff --git a/Library/Artifacts/0e/0e84c25c0d2ea4aea185fbf56cff6a48 b/Library/Artifacts/0e/0e84c25c0d2ea4aea185fbf56cff6a48 new file mode 100644 index 0000000..94f5a5f Binary files /dev/null and b/Library/Artifacts/0e/0e84c25c0d2ea4aea185fbf56cff6a48 differ diff --git a/Library/Artifacts/0e/0e88a8c2bed962a40798c40623b4942c b/Library/Artifacts/0e/0e88a8c2bed962a40798c40623b4942c new file mode 100644 index 0000000..0bfa699 Binary files /dev/null and b/Library/Artifacts/0e/0e88a8c2bed962a40798c40623b4942c differ diff --git a/Library/Artifacts/0e/0eabda3c51b38d65e69b35ea60f09d82 b/Library/Artifacts/0e/0eabda3c51b38d65e69b35ea60f09d82 new file mode 100644 index 0000000..2bc8bd8 Binary files /dev/null and b/Library/Artifacts/0e/0eabda3c51b38d65e69b35ea60f09d82 differ diff --git a/Library/Artifacts/0e/0ec3d8941bbc6ff10c89c3bad4f61e73 b/Library/Artifacts/0e/0ec3d8941bbc6ff10c89c3bad4f61e73 new file mode 100644 index 0000000..5b8f5dc Binary files /dev/null and b/Library/Artifacts/0e/0ec3d8941bbc6ff10c89c3bad4f61e73 differ diff --git a/Library/Artifacts/0f/0f674787b14a8e788a6c4952da825084 b/Library/Artifacts/0f/0f674787b14a8e788a6c4952da825084 new file mode 100644 index 0000000..910e0b4 Binary files /dev/null and b/Library/Artifacts/0f/0f674787b14a8e788a6c4952da825084 differ diff --git a/Library/Artifacts/0f/0f6750bc2ace24d47f6d03842a58f0ce b/Library/Artifacts/0f/0f6750bc2ace24d47f6d03842a58f0ce new file mode 100644 index 0000000..91bcda4 Binary files /dev/null and b/Library/Artifacts/0f/0f6750bc2ace24d47f6d03842a58f0ce differ diff --git a/Library/Artifacts/0f/0f91783f6a0131c0527a892bf77f672e b/Library/Artifacts/0f/0f91783f6a0131c0527a892bf77f672e new file mode 100644 index 0000000..0a07fb7 Binary files /dev/null and b/Library/Artifacts/0f/0f91783f6a0131c0527a892bf77f672e differ diff --git a/Library/Artifacts/0f/0fa92fb75109bc60678c41601ef41fbf b/Library/Artifacts/0f/0fa92fb75109bc60678c41601ef41fbf new file mode 100644 index 0000000..a2cd3e2 Binary files /dev/null and b/Library/Artifacts/0f/0fa92fb75109bc60678c41601ef41fbf differ diff --git a/Library/Artifacts/0f/0fc04d433015a2cf911c8810cbc4128f b/Library/Artifacts/0f/0fc04d433015a2cf911c8810cbc4128f new file mode 100644 index 0000000..b09d8aa Binary files /dev/null and b/Library/Artifacts/0f/0fc04d433015a2cf911c8810cbc4128f differ diff --git a/Library/Artifacts/0f/0fd785ee61b68ebdc2c5d3486f22a67e b/Library/Artifacts/0f/0fd785ee61b68ebdc2c5d3486f22a67e new file mode 100644 index 0000000..efdc996 Binary files /dev/null and b/Library/Artifacts/0f/0fd785ee61b68ebdc2c5d3486f22a67e differ diff --git a/Library/Artifacts/10/1004eba4838a7ff4f0e02d706cb7474f b/Library/Artifacts/10/1004eba4838a7ff4f0e02d706cb7474f new file mode 100644 index 0000000..db319f0 Binary files /dev/null and b/Library/Artifacts/10/1004eba4838a7ff4f0e02d706cb7474f differ diff --git a/Library/Artifacts/10/100e5527f8e40c1ad4587961492d504f b/Library/Artifacts/10/100e5527f8e40c1ad4587961492d504f new file mode 100644 index 0000000..37b3922 Binary files /dev/null and b/Library/Artifacts/10/100e5527f8e40c1ad4587961492d504f differ diff --git a/Library/Artifacts/10/1030621d2c77fd765a050572b0c54ed8 b/Library/Artifacts/10/1030621d2c77fd765a050572b0c54ed8 new file mode 100644 index 0000000..24780a1 Binary files /dev/null and b/Library/Artifacts/10/1030621d2c77fd765a050572b0c54ed8 differ diff --git a/Library/Artifacts/10/1051142465923ad4db6eef825dac2382 b/Library/Artifacts/10/1051142465923ad4db6eef825dac2382 new file mode 100644 index 0000000..739f826 Binary files /dev/null and b/Library/Artifacts/10/1051142465923ad4db6eef825dac2382 differ diff --git a/Library/Artifacts/10/105d4078463a38cbc397b6521928d605 b/Library/Artifacts/10/105d4078463a38cbc397b6521928d605 new file mode 100644 index 0000000..603e743 Binary files /dev/null and b/Library/Artifacts/10/105d4078463a38cbc397b6521928d605 differ diff --git a/Library/Artifacts/10/1061db1d0a6260e451c5e533340c0f9f b/Library/Artifacts/10/1061db1d0a6260e451c5e533340c0f9f new file mode 100644 index 0000000..07bf902 Binary files /dev/null and b/Library/Artifacts/10/1061db1d0a6260e451c5e533340c0f9f differ diff --git a/Library/Artifacts/10/10c5cba3fa58985dc0c0e8577572eb98 b/Library/Artifacts/10/10c5cba3fa58985dc0c0e8577572eb98 new file mode 100644 index 0000000..739b0a2 Binary files /dev/null and b/Library/Artifacts/10/10c5cba3fa58985dc0c0e8577572eb98 differ diff --git a/Library/Artifacts/10/10f74e8bfa56db265507a9dda425831b b/Library/Artifacts/10/10f74e8bfa56db265507a9dda425831b new file mode 100644 index 0000000..712f555 Binary files /dev/null and b/Library/Artifacts/10/10f74e8bfa56db265507a9dda425831b differ diff --git a/Library/Artifacts/11/1124825407569c0436114962b1933754 b/Library/Artifacts/11/1124825407569c0436114962b1933754 new file mode 100644 index 0000000..d08f2c7 Binary files /dev/null and b/Library/Artifacts/11/1124825407569c0436114962b1933754 differ diff --git a/Library/Artifacts/11/11893022c46645582cd6743e65cbae72 b/Library/Artifacts/11/11893022c46645582cd6743e65cbae72 new file mode 100644 index 0000000..6d9b313 Binary files /dev/null and b/Library/Artifacts/11/11893022c46645582cd6743e65cbae72 differ diff --git a/Library/Artifacts/11/118c5f2be4fd3d6130d79ffa2e3ef406 b/Library/Artifacts/11/118c5f2be4fd3d6130d79ffa2e3ef406 new file mode 100644 index 0000000..cb2f9e9 Binary files /dev/null and b/Library/Artifacts/11/118c5f2be4fd3d6130d79ffa2e3ef406 differ diff --git a/Library/Artifacts/11/11b0a5e4ddad0f6e5c5424fd188e1fe0 b/Library/Artifacts/11/11b0a5e4ddad0f6e5c5424fd188e1fe0 new file mode 100644 index 0000000..871be18 Binary files /dev/null and b/Library/Artifacts/11/11b0a5e4ddad0f6e5c5424fd188e1fe0 differ diff --git a/Library/Artifacts/11/11bcca85b5eecd7447beebf0ca9200eb b/Library/Artifacts/11/11bcca85b5eecd7447beebf0ca9200eb new file mode 100644 index 0000000..99bab63 Binary files /dev/null and b/Library/Artifacts/11/11bcca85b5eecd7447beebf0ca9200eb differ diff --git a/Library/Artifacts/11/11d9248838b078be3c63a52ea24d1d9f b/Library/Artifacts/11/11d9248838b078be3c63a52ea24d1d9f new file mode 100644 index 0000000..2b0489d Binary files /dev/null and b/Library/Artifacts/11/11d9248838b078be3c63a52ea24d1d9f differ diff --git a/Library/Artifacts/12/1299871c11f32a7beb7b0463f5bcb14b b/Library/Artifacts/12/1299871c11f32a7beb7b0463f5bcb14b new file mode 100644 index 0000000..61477cf Binary files /dev/null and b/Library/Artifacts/12/1299871c11f32a7beb7b0463f5bcb14b differ diff --git a/Library/Artifacts/12/12a0af55301f5b588b301b688616bdf5 b/Library/Artifacts/12/12a0af55301f5b588b301b688616bdf5 new file mode 100644 index 0000000..2bf0e7d Binary files /dev/null and b/Library/Artifacts/12/12a0af55301f5b588b301b688616bdf5 differ diff --git a/Library/Artifacts/12/12d47997cf12670df578648c7f8588f8 b/Library/Artifacts/12/12d47997cf12670df578648c7f8588f8 new file mode 100644 index 0000000..3516123 Binary files /dev/null and b/Library/Artifacts/12/12d47997cf12670df578648c7f8588f8 differ diff --git a/Library/Artifacts/12/12f3807459ecf15ddd6a01160cf17770 b/Library/Artifacts/12/12f3807459ecf15ddd6a01160cf17770 new file mode 100644 index 0000000..596e6f0 Binary files /dev/null and b/Library/Artifacts/12/12f3807459ecf15ddd6a01160cf17770 differ diff --git a/Library/Artifacts/13/130c6361b8a84697726bb975cce61446 b/Library/Artifacts/13/130c6361b8a84697726bb975cce61446 new file mode 100644 index 0000000..208ae5c Binary files /dev/null and b/Library/Artifacts/13/130c6361b8a84697726bb975cce61446 differ diff --git a/Library/Artifacts/13/13248967cc6a399a70e821c2162fc425 b/Library/Artifacts/13/13248967cc6a399a70e821c2162fc425 new file mode 100644 index 0000000..e346e5b Binary files /dev/null and b/Library/Artifacts/13/13248967cc6a399a70e821c2162fc425 differ diff --git a/Library/Artifacts/13/133d838c821d6a3c4c66f8f2147e2108 b/Library/Artifacts/13/133d838c821d6a3c4c66f8f2147e2108 new file mode 100644 index 0000000..20fee9b Binary files /dev/null and b/Library/Artifacts/13/133d838c821d6a3c4c66f8f2147e2108 differ diff --git a/Library/Artifacts/13/1348ccf43a371dde62b0370675a1a6cd b/Library/Artifacts/13/1348ccf43a371dde62b0370675a1a6cd new file mode 100644 index 0000000..b9adbed Binary files /dev/null and b/Library/Artifacts/13/1348ccf43a371dde62b0370675a1a6cd differ diff --git a/Library/Artifacts/13/134ee420275034a2f91a131c6b4491c3 b/Library/Artifacts/13/134ee420275034a2f91a131c6b4491c3 new file mode 100644 index 0000000..7e25602 Binary files /dev/null and b/Library/Artifacts/13/134ee420275034a2f91a131c6b4491c3 differ diff --git a/Library/Artifacts/13/137e53745e1980f5877d8bea2e2d397d b/Library/Artifacts/13/137e53745e1980f5877d8bea2e2d397d new file mode 100644 index 0000000..696e133 Binary files /dev/null and b/Library/Artifacts/13/137e53745e1980f5877d8bea2e2d397d differ diff --git a/Library/Artifacts/13/13bd4887864cf371241ec8a924402e73 b/Library/Artifacts/13/13bd4887864cf371241ec8a924402e73 new file mode 100644 index 0000000..e150bd7 Binary files /dev/null and b/Library/Artifacts/13/13bd4887864cf371241ec8a924402e73 differ diff --git a/Library/Artifacts/13/13d91e6d51eba368de5ee8c362abbdf8 b/Library/Artifacts/13/13d91e6d51eba368de5ee8c362abbdf8 new file mode 100644 index 0000000..5b6f771 Binary files /dev/null and b/Library/Artifacts/13/13d91e6d51eba368de5ee8c362abbdf8 differ diff --git a/Library/Artifacts/14/1434cff9e4de9efdcaf282a70a1b0b4e b/Library/Artifacts/14/1434cff9e4de9efdcaf282a70a1b0b4e new file mode 100644 index 0000000..35493d7 Binary files /dev/null and b/Library/Artifacts/14/1434cff9e4de9efdcaf282a70a1b0b4e differ diff --git a/Library/Artifacts/14/14486d83d6902ca3c18caa57ca01718d b/Library/Artifacts/14/14486d83d6902ca3c18caa57ca01718d new file mode 100644 index 0000000..aef0620 Binary files /dev/null and b/Library/Artifacts/14/14486d83d6902ca3c18caa57ca01718d differ diff --git a/Library/Artifacts/14/1496c8260fd7a30bdabb73cb75441fd7 b/Library/Artifacts/14/1496c8260fd7a30bdabb73cb75441fd7 new file mode 100644 index 0000000..e3b44a6 Binary files /dev/null and b/Library/Artifacts/14/1496c8260fd7a30bdabb73cb75441fd7 differ diff --git a/Library/Artifacts/14/149bbba47d32acf8834fbb1abfa12c74 b/Library/Artifacts/14/149bbba47d32acf8834fbb1abfa12c74 new file mode 100644 index 0000000..1f61d8a Binary files /dev/null and b/Library/Artifacts/14/149bbba47d32acf8834fbb1abfa12c74 differ diff --git a/Library/Artifacts/14/14add48e81823f9d8e53faf7a90878ce b/Library/Artifacts/14/14add48e81823f9d8e53faf7a90878ce new file mode 100644 index 0000000..f148e5b Binary files /dev/null and b/Library/Artifacts/14/14add48e81823f9d8e53faf7a90878ce differ diff --git a/Library/Artifacts/14/14c3ab8c980a1673ae5a73984f7ff7c0 b/Library/Artifacts/14/14c3ab8c980a1673ae5a73984f7ff7c0 new file mode 100644 index 0000000..da35bff Binary files /dev/null and b/Library/Artifacts/14/14c3ab8c980a1673ae5a73984f7ff7c0 differ diff --git a/Library/Artifacts/14/14d5aff13a57560eeafdeb5cfb1ca61c b/Library/Artifacts/14/14d5aff13a57560eeafdeb5cfb1ca61c new file mode 100644 index 0000000..ad003ad Binary files /dev/null and b/Library/Artifacts/14/14d5aff13a57560eeafdeb5cfb1ca61c differ diff --git a/Library/Artifacts/14/14f3d6e1ff593d3fbb2c44d8eb0c0d8d b/Library/Artifacts/14/14f3d6e1ff593d3fbb2c44d8eb0c0d8d new file mode 100644 index 0000000..8544cfd Binary files /dev/null and b/Library/Artifacts/14/14f3d6e1ff593d3fbb2c44d8eb0c0d8d differ diff --git a/Library/Artifacts/15/1521aaa272932a54e93123d143a80665 b/Library/Artifacts/15/1521aaa272932a54e93123d143a80665 new file mode 100644 index 0000000..e0e254a Binary files /dev/null and b/Library/Artifacts/15/1521aaa272932a54e93123d143a80665 differ diff --git a/Library/Artifacts/15/1532cc61658d77add48cdc82c50d06ad b/Library/Artifacts/15/1532cc61658d77add48cdc82c50d06ad new file mode 100644 index 0000000..55747d2 Binary files /dev/null and b/Library/Artifacts/15/1532cc61658d77add48cdc82c50d06ad differ diff --git a/Library/Artifacts/15/158a3c199fa49738f8710493f3a971e6 b/Library/Artifacts/15/158a3c199fa49738f8710493f3a971e6 new file mode 100644 index 0000000..62b3a8c Binary files /dev/null and b/Library/Artifacts/15/158a3c199fa49738f8710493f3a971e6 differ diff --git a/Library/Artifacts/15/1594e4b01915a990d40fccc366d1d1cf b/Library/Artifacts/15/1594e4b01915a990d40fccc366d1d1cf new file mode 100644 index 0000000..7556fc1 Binary files /dev/null and b/Library/Artifacts/15/1594e4b01915a990d40fccc366d1d1cf differ diff --git a/Library/Artifacts/15/159ba189f1c5f8160526cc49bc9631fc b/Library/Artifacts/15/159ba189f1c5f8160526cc49bc9631fc new file mode 100644 index 0000000..71fafc8 Binary files /dev/null and b/Library/Artifacts/15/159ba189f1c5f8160526cc49bc9631fc differ diff --git a/Library/Artifacts/15/15f5b7c2996d3215addd7c9d776df8b4 b/Library/Artifacts/15/15f5b7c2996d3215addd7c9d776df8b4 new file mode 100644 index 0000000..c02dcbc Binary files /dev/null and b/Library/Artifacts/15/15f5b7c2996d3215addd7c9d776df8b4 differ diff --git a/Library/Artifacts/15/15fd552641bfd3fc3e519fe5b44c5e8e b/Library/Artifacts/15/15fd552641bfd3fc3e519fe5b44c5e8e new file mode 100644 index 0000000..8431749 Binary files /dev/null and b/Library/Artifacts/15/15fd552641bfd3fc3e519fe5b44c5e8e differ diff --git a/Library/Artifacts/16/161d7f7b90bce980a04e615e81339d14 b/Library/Artifacts/16/161d7f7b90bce980a04e615e81339d14 new file mode 100644 index 0000000..b7fd2ad Binary files /dev/null and b/Library/Artifacts/16/161d7f7b90bce980a04e615e81339d14 differ diff --git a/Library/Artifacts/16/16383911f4a623daf8cb1c874de9b7f3 b/Library/Artifacts/16/16383911f4a623daf8cb1c874de9b7f3 new file mode 100644 index 0000000..0e2d486 Binary files /dev/null and b/Library/Artifacts/16/16383911f4a623daf8cb1c874de9b7f3 differ diff --git a/Library/Artifacts/16/163a3fcd269123bb8b2312a9330622b0 b/Library/Artifacts/16/163a3fcd269123bb8b2312a9330622b0 new file mode 100644 index 0000000..cb7dd19 Binary files /dev/null and b/Library/Artifacts/16/163a3fcd269123bb8b2312a9330622b0 differ diff --git a/Library/Artifacts/16/16450106216f3f2e7060877bcc19ca7d b/Library/Artifacts/16/16450106216f3f2e7060877bcc19ca7d new file mode 100644 index 0000000..2e818df Binary files /dev/null and b/Library/Artifacts/16/16450106216f3f2e7060877bcc19ca7d differ diff --git a/Library/Artifacts/16/165843f477b4aebd063a7d98a75c6d78 b/Library/Artifacts/16/165843f477b4aebd063a7d98a75c6d78 new file mode 100644 index 0000000..f5a5709 Binary files /dev/null and b/Library/Artifacts/16/165843f477b4aebd063a7d98a75c6d78 differ diff --git a/Library/Artifacts/16/16b2084f07414a9602e7d94cc6598941 b/Library/Artifacts/16/16b2084f07414a9602e7d94cc6598941 new file mode 100644 index 0000000..88ca5cd Binary files /dev/null and b/Library/Artifacts/16/16b2084f07414a9602e7d94cc6598941 differ diff --git a/Library/Artifacts/16/16b59371c1d0a2ca8f5c5f3bf5a1114f b/Library/Artifacts/16/16b59371c1d0a2ca8f5c5f3bf5a1114f new file mode 100644 index 0000000..513e819 Binary files /dev/null and b/Library/Artifacts/16/16b59371c1d0a2ca8f5c5f3bf5a1114f differ diff --git a/Library/Artifacts/16/16d363088ef3cbde05ad1c23dbc9120d b/Library/Artifacts/16/16d363088ef3cbde05ad1c23dbc9120d new file mode 100644 index 0000000..7a44914 Binary files /dev/null and b/Library/Artifacts/16/16d363088ef3cbde05ad1c23dbc9120d differ diff --git a/Library/Artifacts/16/16f1b0526fbd51b953311b157b5515d8 b/Library/Artifacts/16/16f1b0526fbd51b953311b157b5515d8 new file mode 100644 index 0000000..20fed83 Binary files /dev/null and b/Library/Artifacts/16/16f1b0526fbd51b953311b157b5515d8 differ diff --git a/Library/Artifacts/17/1711da0c7d8a3979e877945be3edfc83 b/Library/Artifacts/17/1711da0c7d8a3979e877945be3edfc83 new file mode 100644 index 0000000..47c49c2 Binary files /dev/null and b/Library/Artifacts/17/1711da0c7d8a3979e877945be3edfc83 differ diff --git a/Library/Artifacts/17/1719874b3a0197ba7e05c828a6343b5b b/Library/Artifacts/17/1719874b3a0197ba7e05c828a6343b5b new file mode 100644 index 0000000..6ec27eb Binary files /dev/null and b/Library/Artifacts/17/1719874b3a0197ba7e05c828a6343b5b differ diff --git a/Library/Artifacts/17/1733e30a2a4e7689b9cac3f6ff268367 b/Library/Artifacts/17/1733e30a2a4e7689b9cac3f6ff268367 new file mode 100644 index 0000000..aaf1f59 Binary files /dev/null and b/Library/Artifacts/17/1733e30a2a4e7689b9cac3f6ff268367 differ diff --git a/Library/Artifacts/17/1735759485e4f1ee2aa56269ffcba793 b/Library/Artifacts/17/1735759485e4f1ee2aa56269ffcba793 new file mode 100644 index 0000000..26ed746 Binary files /dev/null and b/Library/Artifacts/17/1735759485e4f1ee2aa56269ffcba793 differ diff --git a/Library/Artifacts/17/177165c66d013c89373223467dea423d b/Library/Artifacts/17/177165c66d013c89373223467dea423d new file mode 100644 index 0000000..e0b5700 Binary files /dev/null and b/Library/Artifacts/17/177165c66d013c89373223467dea423d differ diff --git a/Library/Artifacts/17/177a8e7affd9b5d257632252518c3625 b/Library/Artifacts/17/177a8e7affd9b5d257632252518c3625 new file mode 100644 index 0000000..1c8d551 Binary files /dev/null and b/Library/Artifacts/17/177a8e7affd9b5d257632252518c3625 differ diff --git a/Library/Artifacts/17/17f04188f220bab8e3262e4f3bcb2d08 b/Library/Artifacts/17/17f04188f220bab8e3262e4f3bcb2d08 new file mode 100644 index 0000000..b7abb39 Binary files /dev/null and b/Library/Artifacts/17/17f04188f220bab8e3262e4f3bcb2d08 differ diff --git a/Library/Artifacts/17/17fd6a883f5a1841dcc124cee2ba689b b/Library/Artifacts/17/17fd6a883f5a1841dcc124cee2ba689b new file mode 100644 index 0000000..62b2237 Binary files /dev/null and b/Library/Artifacts/17/17fd6a883f5a1841dcc124cee2ba689b differ diff --git a/Library/Artifacts/18/18321f34f414d67e627ce7ef6f5d1d1f b/Library/Artifacts/18/18321f34f414d67e627ce7ef6f5d1d1f new file mode 100644 index 0000000..e772a39 Binary files /dev/null and b/Library/Artifacts/18/18321f34f414d67e627ce7ef6f5d1d1f differ diff --git a/Library/Artifacts/18/183a6e99acaec4f07f6fad965be9d8d2 b/Library/Artifacts/18/183a6e99acaec4f07f6fad965be9d8d2 new file mode 100644 index 0000000..255a529 Binary files /dev/null and b/Library/Artifacts/18/183a6e99acaec4f07f6fad965be9d8d2 differ diff --git a/Library/Artifacts/18/183f752f0e2d0d544a6cd01ebba57179 b/Library/Artifacts/18/183f752f0e2d0d544a6cd01ebba57179 new file mode 100644 index 0000000..4245c49 Binary files /dev/null and b/Library/Artifacts/18/183f752f0e2d0d544a6cd01ebba57179 differ diff --git a/Library/Artifacts/18/1896100f54084e10ac9dc6d043d34d98 b/Library/Artifacts/18/1896100f54084e10ac9dc6d043d34d98 new file mode 100644 index 0000000..0209bfd Binary files /dev/null and b/Library/Artifacts/18/1896100f54084e10ac9dc6d043d34d98 differ diff --git a/Library/Artifacts/18/18e710d7327dfb1ee4b7e23aa833cec5 b/Library/Artifacts/18/18e710d7327dfb1ee4b7e23aa833cec5 new file mode 100644 index 0000000..eec1b32 Binary files /dev/null and b/Library/Artifacts/18/18e710d7327dfb1ee4b7e23aa833cec5 differ diff --git a/Library/Artifacts/18/18ed34887d1222e8ea6aa2de1278cca5 b/Library/Artifacts/18/18ed34887d1222e8ea6aa2de1278cca5 new file mode 100644 index 0000000..fd478de Binary files /dev/null and b/Library/Artifacts/18/18ed34887d1222e8ea6aa2de1278cca5 differ diff --git a/Library/Artifacts/19/194fc25432bbb81260aac056beea73f0 b/Library/Artifacts/19/194fc25432bbb81260aac056beea73f0 new file mode 100644 index 0000000..031d2cf Binary files /dev/null and b/Library/Artifacts/19/194fc25432bbb81260aac056beea73f0 differ diff --git a/Library/Artifacts/19/1986674a467d2eeeef72f8727b686699 b/Library/Artifacts/19/1986674a467d2eeeef72f8727b686699 new file mode 100644 index 0000000..f624f2b Binary files /dev/null and b/Library/Artifacts/19/1986674a467d2eeeef72f8727b686699 differ diff --git a/Library/Artifacts/19/19a83a896ca4e31324132dee4143cce1 b/Library/Artifacts/19/19a83a896ca4e31324132dee4143cce1 new file mode 100644 index 0000000..83a512b Binary files /dev/null and b/Library/Artifacts/19/19a83a896ca4e31324132dee4143cce1 differ diff --git a/Library/Artifacts/19/19a89119005c96e8b18c1b88b20d0530 b/Library/Artifacts/19/19a89119005c96e8b18c1b88b20d0530 new file mode 100644 index 0000000..0e2d5ac Binary files /dev/null and b/Library/Artifacts/19/19a89119005c96e8b18c1b88b20d0530 differ diff --git a/Library/Artifacts/1a/1a725b431c39de66214291629efa71a9 b/Library/Artifacts/1a/1a725b431c39de66214291629efa71a9 new file mode 100644 index 0000000..af8d1ba Binary files /dev/null and b/Library/Artifacts/1a/1a725b431c39de66214291629efa71a9 differ diff --git a/Library/Artifacts/1a/1a7826ff849882ffa09bfc1e02e8e480 b/Library/Artifacts/1a/1a7826ff849882ffa09bfc1e02e8e480 new file mode 100644 index 0000000..bae7405 Binary files /dev/null and b/Library/Artifacts/1a/1a7826ff849882ffa09bfc1e02e8e480 differ diff --git a/Library/Artifacts/1a/1a8e714194ee4cc2faf47d22b362176f b/Library/Artifacts/1a/1a8e714194ee4cc2faf47d22b362176f new file mode 100644 index 0000000..50e7e6e Binary files /dev/null and b/Library/Artifacts/1a/1a8e714194ee4cc2faf47d22b362176f differ diff --git a/Library/Artifacts/1a/1ab1871a8ba0e631e161fcf8f82de991 b/Library/Artifacts/1a/1ab1871a8ba0e631e161fcf8f82de991 new file mode 100644 index 0000000..15dd84b Binary files /dev/null and b/Library/Artifacts/1a/1ab1871a8ba0e631e161fcf8f82de991 differ diff --git a/Library/Artifacts/1a/1ab3fe11b939a93c406b813bd62a8a5c b/Library/Artifacts/1a/1ab3fe11b939a93c406b813bd62a8a5c new file mode 100644 index 0000000..6480156 Binary files /dev/null and b/Library/Artifacts/1a/1ab3fe11b939a93c406b813bd62a8a5c differ diff --git a/Library/Artifacts/1a/1ae3b6848903cc7798f73db99c3f891c b/Library/Artifacts/1a/1ae3b6848903cc7798f73db99c3f891c new file mode 100644 index 0000000..7ba67b1 Binary files /dev/null and b/Library/Artifacts/1a/1ae3b6848903cc7798f73db99c3f891c differ diff --git a/Library/Artifacts/1a/1aebad4d371304e74f64264e52f1e1f5 b/Library/Artifacts/1a/1aebad4d371304e74f64264e52f1e1f5 new file mode 100644 index 0000000..8c0dd1b Binary files /dev/null and b/Library/Artifacts/1a/1aebad4d371304e74f64264e52f1e1f5 differ diff --git a/Library/Artifacts/1a/1af8715c90f09a3012d56ff9c210631d b/Library/Artifacts/1a/1af8715c90f09a3012d56ff9c210631d new file mode 100644 index 0000000..a1582c3 Binary files /dev/null and b/Library/Artifacts/1a/1af8715c90f09a3012d56ff9c210631d differ diff --git a/Library/Artifacts/1b/1b1d7820bbbde9bfa69a8e5b3d7e39b6 b/Library/Artifacts/1b/1b1d7820bbbde9bfa69a8e5b3d7e39b6 new file mode 100644 index 0000000..0f879c4 Binary files /dev/null and b/Library/Artifacts/1b/1b1d7820bbbde9bfa69a8e5b3d7e39b6 differ diff --git a/Library/Artifacts/1b/1b30c296b6dbd699003f3e7c56e22fc2 b/Library/Artifacts/1b/1b30c296b6dbd699003f3e7c56e22fc2 new file mode 100644 index 0000000..c7d0c86 Binary files /dev/null and b/Library/Artifacts/1b/1b30c296b6dbd699003f3e7c56e22fc2 differ diff --git a/Library/Artifacts/1b/1b598a14c2df53f19522dc088e07859c b/Library/Artifacts/1b/1b598a14c2df53f19522dc088e07859c new file mode 100644 index 0000000..97492e3 Binary files /dev/null and b/Library/Artifacts/1b/1b598a14c2df53f19522dc088e07859c differ diff --git a/Library/Artifacts/1b/1b6bc403de9b8c1f5fef98bbbc04ac5d b/Library/Artifacts/1b/1b6bc403de9b8c1f5fef98bbbc04ac5d new file mode 100644 index 0000000..5a7a01f Binary files /dev/null and b/Library/Artifacts/1b/1b6bc403de9b8c1f5fef98bbbc04ac5d differ diff --git a/Library/Artifacts/1b/1b881e90131ae316dc6ea42c9239a792 b/Library/Artifacts/1b/1b881e90131ae316dc6ea42c9239a792 new file mode 100644 index 0000000..ccab6fe Binary files /dev/null and b/Library/Artifacts/1b/1b881e90131ae316dc6ea42c9239a792 differ diff --git a/Library/Artifacts/1b/1b9f6f4abc93150f7ff07755262f4366 b/Library/Artifacts/1b/1b9f6f4abc93150f7ff07755262f4366 new file mode 100644 index 0000000..b1bbc14 Binary files /dev/null and b/Library/Artifacts/1b/1b9f6f4abc93150f7ff07755262f4366 differ diff --git a/Library/Artifacts/1b/1ba64c131d41b615d05a2792dedaddb4 b/Library/Artifacts/1b/1ba64c131d41b615d05a2792dedaddb4 new file mode 100644 index 0000000..b296b13 Binary files /dev/null and b/Library/Artifacts/1b/1ba64c131d41b615d05a2792dedaddb4 differ diff --git a/Library/Artifacts/1b/1bf1c202e4eb833ea0c1f2427c7631ac b/Library/Artifacts/1b/1bf1c202e4eb833ea0c1f2427c7631ac new file mode 100644 index 0000000..02e25b1 Binary files /dev/null and b/Library/Artifacts/1b/1bf1c202e4eb833ea0c1f2427c7631ac differ diff --git a/Library/Artifacts/1c/1c4bc8948f1f8a52c32c754e8b4c1c97 b/Library/Artifacts/1c/1c4bc8948f1f8a52c32c754e8b4c1c97 new file mode 100644 index 0000000..a3017c7 Binary files /dev/null and b/Library/Artifacts/1c/1c4bc8948f1f8a52c32c754e8b4c1c97 differ diff --git a/Library/Artifacts/1c/1c7ad60937587c404005b9ca86c9fe56 b/Library/Artifacts/1c/1c7ad60937587c404005b9ca86c9fe56 new file mode 100644 index 0000000..8ca8459 Binary files /dev/null and b/Library/Artifacts/1c/1c7ad60937587c404005b9ca86c9fe56 differ diff --git a/Library/Artifacts/1c/1cb88d09bcb6a1bf0c9db3c8f91bbba8 b/Library/Artifacts/1c/1cb88d09bcb6a1bf0c9db3c8f91bbba8 new file mode 100644 index 0000000..37582cd Binary files /dev/null and b/Library/Artifacts/1c/1cb88d09bcb6a1bf0c9db3c8f91bbba8 differ diff --git a/Library/Artifacts/1c/1cd0d1ced306ca2b047cdb3f0a4dc352 b/Library/Artifacts/1c/1cd0d1ced306ca2b047cdb3f0a4dc352 new file mode 100644 index 0000000..a1590d6 Binary files /dev/null and b/Library/Artifacts/1c/1cd0d1ced306ca2b047cdb3f0a4dc352 differ diff --git a/Library/Artifacts/1c/1cd1833ac0e256d3bdbb56dc70a39f9e b/Library/Artifacts/1c/1cd1833ac0e256d3bdbb56dc70a39f9e new file mode 100644 index 0000000..7ee4461 Binary files /dev/null and b/Library/Artifacts/1c/1cd1833ac0e256d3bdbb56dc70a39f9e differ diff --git a/Library/Artifacts/1c/1cf21607a62b3d9dcbca82e90a694d38 b/Library/Artifacts/1c/1cf21607a62b3d9dcbca82e90a694d38 new file mode 100644 index 0000000..cc7464b Binary files /dev/null and b/Library/Artifacts/1c/1cf21607a62b3d9dcbca82e90a694d38 differ diff --git a/Library/Artifacts/1d/1d0e25b3a97e5c449bf752894c1fb9a8 b/Library/Artifacts/1d/1d0e25b3a97e5c449bf752894c1fb9a8 new file mode 100644 index 0000000..7f55bb1 Binary files /dev/null and b/Library/Artifacts/1d/1d0e25b3a97e5c449bf752894c1fb9a8 differ diff --git a/Library/Artifacts/1d/1d2e2bdc7c609efcdaf6a8bf5b361a80 b/Library/Artifacts/1d/1d2e2bdc7c609efcdaf6a8bf5b361a80 new file mode 100644 index 0000000..4f202c0 Binary files /dev/null and b/Library/Artifacts/1d/1d2e2bdc7c609efcdaf6a8bf5b361a80 differ diff --git a/Library/Artifacts/1d/1d5849fce07d4fd563335aca835aecd9 b/Library/Artifacts/1d/1d5849fce07d4fd563335aca835aecd9 new file mode 100644 index 0000000..689590f Binary files /dev/null and b/Library/Artifacts/1d/1d5849fce07d4fd563335aca835aecd9 differ diff --git a/Library/Artifacts/1d/1d83c7a742812a181f5667a1f3ab15ad b/Library/Artifacts/1d/1d83c7a742812a181f5667a1f3ab15ad new file mode 100644 index 0000000..5f6b998 Binary files /dev/null and b/Library/Artifacts/1d/1d83c7a742812a181f5667a1f3ab15ad differ diff --git a/Library/Artifacts/1d/1dd9f33c9328d0881c4528354f301233 b/Library/Artifacts/1d/1dd9f33c9328d0881c4528354f301233 new file mode 100644 index 0000000..496da51 Binary files /dev/null and b/Library/Artifacts/1d/1dd9f33c9328d0881c4528354f301233 differ diff --git a/Library/Artifacts/1d/1de643b3cff993daae626fea8bf21812 b/Library/Artifacts/1d/1de643b3cff993daae626fea8bf21812 new file mode 100644 index 0000000..b1ff76c Binary files /dev/null and b/Library/Artifacts/1d/1de643b3cff993daae626fea8bf21812 differ diff --git a/Library/Artifacts/1d/1dff72b3f96e490b7e53fef63ee68f5e b/Library/Artifacts/1d/1dff72b3f96e490b7e53fef63ee68f5e new file mode 100644 index 0000000..80f3134 Binary files /dev/null and b/Library/Artifacts/1d/1dff72b3f96e490b7e53fef63ee68f5e differ diff --git a/Library/Artifacts/1e/1e135a305614b6d08af68cd0cb2f601e b/Library/Artifacts/1e/1e135a305614b6d08af68cd0cb2f601e new file mode 100644 index 0000000..be2b8b7 Binary files /dev/null and b/Library/Artifacts/1e/1e135a305614b6d08af68cd0cb2f601e differ diff --git a/Library/Artifacts/1e/1e314a8e14b09644c88fa2d5bfcc19a6 b/Library/Artifacts/1e/1e314a8e14b09644c88fa2d5bfcc19a6 new file mode 100644 index 0000000..c96d671 Binary files /dev/null and b/Library/Artifacts/1e/1e314a8e14b09644c88fa2d5bfcc19a6 differ diff --git a/Library/Artifacts/1e/1e8d739f6db827a8b596f8728dc06b3e b/Library/Artifacts/1e/1e8d739f6db827a8b596f8728dc06b3e new file mode 100644 index 0000000..29fb598 Binary files /dev/null and b/Library/Artifacts/1e/1e8d739f6db827a8b596f8728dc06b3e differ diff --git a/Library/Artifacts/1e/1e9668f42f3fff077769db19bd95a058 b/Library/Artifacts/1e/1e9668f42f3fff077769db19bd95a058 new file mode 100644 index 0000000..10ceb33 Binary files /dev/null and b/Library/Artifacts/1e/1e9668f42f3fff077769db19bd95a058 differ diff --git a/Library/Artifacts/1e/1eae78a865384b2861ab21eb94191f27 b/Library/Artifacts/1e/1eae78a865384b2861ab21eb94191f27 new file mode 100644 index 0000000..66fef68 Binary files /dev/null and b/Library/Artifacts/1e/1eae78a865384b2861ab21eb94191f27 differ diff --git a/Library/Artifacts/1e/1eb3528a40c93e2de2e158a0988b152f b/Library/Artifacts/1e/1eb3528a40c93e2de2e158a0988b152f new file mode 100644 index 0000000..089842a Binary files /dev/null and b/Library/Artifacts/1e/1eb3528a40c93e2de2e158a0988b152f differ diff --git a/Library/Artifacts/1e/1ef4a53c59b210c03d70b4069aa70dc9 b/Library/Artifacts/1e/1ef4a53c59b210c03d70b4069aa70dc9 new file mode 100644 index 0000000..92ca1b9 Binary files /dev/null and b/Library/Artifacts/1e/1ef4a53c59b210c03d70b4069aa70dc9 differ diff --git a/Library/Artifacts/1f/1f0f48dc7029cfefcb0c7e0a67ba4c42 b/Library/Artifacts/1f/1f0f48dc7029cfefcb0c7e0a67ba4c42 new file mode 100644 index 0000000..058d5e0 Binary files /dev/null and b/Library/Artifacts/1f/1f0f48dc7029cfefcb0c7e0a67ba4c42 differ diff --git a/Library/Artifacts/1f/1f49db412268523f4f3be825aace26fc b/Library/Artifacts/1f/1f49db412268523f4f3be825aace26fc new file mode 100644 index 0000000..869cc45 Binary files /dev/null and b/Library/Artifacts/1f/1f49db412268523f4f3be825aace26fc differ diff --git a/Library/Artifacts/1f/1f5ce131a40e61a78a63155a4991467a b/Library/Artifacts/1f/1f5ce131a40e61a78a63155a4991467a new file mode 100644 index 0000000..c9152ac Binary files /dev/null and b/Library/Artifacts/1f/1f5ce131a40e61a78a63155a4991467a differ diff --git a/Library/Artifacts/1f/1f8afc99ac8a9a73a9fdab450884a39e b/Library/Artifacts/1f/1f8afc99ac8a9a73a9fdab450884a39e new file mode 100644 index 0000000..f2c0298 Binary files /dev/null and b/Library/Artifacts/1f/1f8afc99ac8a9a73a9fdab450884a39e differ diff --git a/Library/Artifacts/1f/1fd6c6213f0b8caf885e9f365333bda8 b/Library/Artifacts/1f/1fd6c6213f0b8caf885e9f365333bda8 new file mode 100644 index 0000000..979cef7 Binary files /dev/null and b/Library/Artifacts/1f/1fd6c6213f0b8caf885e9f365333bda8 differ diff --git a/Library/Artifacts/1f/1fec442c704ddf090ea5398d42d9df79 b/Library/Artifacts/1f/1fec442c704ddf090ea5398d42d9df79 new file mode 100644 index 0000000..67ce8dd Binary files /dev/null and b/Library/Artifacts/1f/1fec442c704ddf090ea5398d42d9df79 differ diff --git a/Library/Artifacts/1f/1ff3fc056886d2678adac8fb81f3179b b/Library/Artifacts/1f/1ff3fc056886d2678adac8fb81f3179b new file mode 100644 index 0000000..7179a84 Binary files /dev/null and b/Library/Artifacts/1f/1ff3fc056886d2678adac8fb81f3179b differ diff --git a/Library/Artifacts/1f/1ff8890ba3ae7074c3bde7cc6750cb80 b/Library/Artifacts/1f/1ff8890ba3ae7074c3bde7cc6750cb80 new file mode 100644 index 0000000..9ebf0ac Binary files /dev/null and b/Library/Artifacts/1f/1ff8890ba3ae7074c3bde7cc6750cb80 differ diff --git a/Library/Artifacts/1f/1ff934afa2b4f1aa1cacc676596c9af2 b/Library/Artifacts/1f/1ff934afa2b4f1aa1cacc676596c9af2 new file mode 100644 index 0000000..4a034ec Binary files /dev/null and b/Library/Artifacts/1f/1ff934afa2b4f1aa1cacc676596c9af2 differ diff --git a/Library/Artifacts/20/2014e815d3109520d44f1e7e46b08ecd b/Library/Artifacts/20/2014e815d3109520d44f1e7e46b08ecd new file mode 100644 index 0000000..50c2615 Binary files /dev/null and b/Library/Artifacts/20/2014e815d3109520d44f1e7e46b08ecd differ diff --git a/Library/Artifacts/20/20248e1fcff77df753eabacbf082ac9f b/Library/Artifacts/20/20248e1fcff77df753eabacbf082ac9f new file mode 100644 index 0000000..a6bd227 Binary files /dev/null and b/Library/Artifacts/20/20248e1fcff77df753eabacbf082ac9f differ diff --git a/Library/Artifacts/20/2029b19cbb3b0f0a2da9fcc93b1b904a b/Library/Artifacts/20/2029b19cbb3b0f0a2da9fcc93b1b904a new file mode 100644 index 0000000..263e3a1 Binary files /dev/null and b/Library/Artifacts/20/2029b19cbb3b0f0a2da9fcc93b1b904a differ diff --git a/Library/Artifacts/20/203783c66821fa26181dc547ac5edeb4 b/Library/Artifacts/20/203783c66821fa26181dc547ac5edeb4 new file mode 100644 index 0000000..298bdd4 Binary files /dev/null and b/Library/Artifacts/20/203783c66821fa26181dc547ac5edeb4 differ diff --git a/Library/Artifacts/20/20522552b398962befcd7e6b14d037dd b/Library/Artifacts/20/20522552b398962befcd7e6b14d037dd new file mode 100644 index 0000000..ed6d39e Binary files /dev/null and b/Library/Artifacts/20/20522552b398962befcd7e6b14d037dd differ diff --git a/Library/Artifacts/20/205e1831ab62e1e35dc5179a2cf21286 b/Library/Artifacts/20/205e1831ab62e1e35dc5179a2cf21286 new file mode 100644 index 0000000..f3df6c2 Binary files /dev/null and b/Library/Artifacts/20/205e1831ab62e1e35dc5179a2cf21286 differ diff --git a/Library/Artifacts/20/206262910bee02752565d04af73d8d62 b/Library/Artifacts/20/206262910bee02752565d04af73d8d62 new file mode 100644 index 0000000..1ee652d Binary files /dev/null and b/Library/Artifacts/20/206262910bee02752565d04af73d8d62 differ diff --git a/Library/Artifacts/20/20776044dc9f0d405aed25af60d96264 b/Library/Artifacts/20/20776044dc9f0d405aed25af60d96264 new file mode 100644 index 0000000..f52f68a Binary files /dev/null and b/Library/Artifacts/20/20776044dc9f0d405aed25af60d96264 differ diff --git a/Library/Artifacts/20/20ef4d666b2e683e032988ba6f3d22b1 b/Library/Artifacts/20/20ef4d666b2e683e032988ba6f3d22b1 new file mode 100644 index 0000000..1b32f8a Binary files /dev/null and b/Library/Artifacts/20/20ef4d666b2e683e032988ba6f3d22b1 differ diff --git a/Library/Artifacts/20/20f43cf9f30eb23d6836fda5e861b16a b/Library/Artifacts/20/20f43cf9f30eb23d6836fda5e861b16a new file mode 100644 index 0000000..b1f5db9 Binary files /dev/null and b/Library/Artifacts/20/20f43cf9f30eb23d6836fda5e861b16a differ diff --git a/Library/Artifacts/21/212beee701501b18060672b9107d8554 b/Library/Artifacts/21/212beee701501b18060672b9107d8554 new file mode 100644 index 0000000..db8f84a Binary files /dev/null and b/Library/Artifacts/21/212beee701501b18060672b9107d8554 differ diff --git a/Library/Artifacts/21/214579b9566fb632e0ec6479a26c3492 b/Library/Artifacts/21/214579b9566fb632e0ec6479a26c3492 new file mode 100644 index 0000000..4c83394 Binary files /dev/null and b/Library/Artifacts/21/214579b9566fb632e0ec6479a26c3492 differ diff --git a/Library/Artifacts/21/218b4ab5ad84f6287d370def3e2ded8e b/Library/Artifacts/21/218b4ab5ad84f6287d370def3e2ded8e new file mode 100644 index 0000000..131dd5e Binary files /dev/null and b/Library/Artifacts/21/218b4ab5ad84f6287d370def3e2ded8e differ diff --git a/Library/Artifacts/21/218f0d419d5d57322394777c2ed2d60b b/Library/Artifacts/21/218f0d419d5d57322394777c2ed2d60b new file mode 100644 index 0000000..c403116 Binary files /dev/null and b/Library/Artifacts/21/218f0d419d5d57322394777c2ed2d60b differ diff --git a/Library/Artifacts/21/21dbbcd447789043edf3789f1b034e9d b/Library/Artifacts/21/21dbbcd447789043edf3789f1b034e9d new file mode 100644 index 0000000..9fffdc7 Binary files /dev/null and b/Library/Artifacts/21/21dbbcd447789043edf3789f1b034e9d differ diff --git a/Library/Artifacts/21/21e12f23c34a33c39d038dede5fc1d80 b/Library/Artifacts/21/21e12f23c34a33c39d038dede5fc1d80 new file mode 100644 index 0000000..b01d4b2 Binary files /dev/null and b/Library/Artifacts/21/21e12f23c34a33c39d038dede5fc1d80 differ diff --git a/Library/Artifacts/22/225b829c7fc6736e3adfda76bf141910 b/Library/Artifacts/22/225b829c7fc6736e3adfda76bf141910 new file mode 100644 index 0000000..953a32b Binary files /dev/null and b/Library/Artifacts/22/225b829c7fc6736e3adfda76bf141910 differ diff --git a/Library/Artifacts/22/2282503684f04652bd005a3eadb631dc b/Library/Artifacts/22/2282503684f04652bd005a3eadb631dc new file mode 100644 index 0000000..738c61d Binary files /dev/null and b/Library/Artifacts/22/2282503684f04652bd005a3eadb631dc differ diff --git a/Library/Artifacts/22/22ba1bd088cd7ed588d2e3737983afb5 b/Library/Artifacts/22/22ba1bd088cd7ed588d2e3737983afb5 new file mode 100644 index 0000000..d1f1547 Binary files /dev/null and b/Library/Artifacts/22/22ba1bd088cd7ed588d2e3737983afb5 differ diff --git a/Library/Artifacts/22/22d102f8c3ea22c3e017924985759647 b/Library/Artifacts/22/22d102f8c3ea22c3e017924985759647 new file mode 100644 index 0000000..a6381ae Binary files /dev/null and b/Library/Artifacts/22/22d102f8c3ea22c3e017924985759647 differ diff --git a/Library/Artifacts/22/22f433090e41e7a9f3d338ba0daad3b4 b/Library/Artifacts/22/22f433090e41e7a9f3d338ba0daad3b4 new file mode 100644 index 0000000..7259616 Binary files /dev/null and b/Library/Artifacts/22/22f433090e41e7a9f3d338ba0daad3b4 differ diff --git a/Library/Artifacts/23/230cb71d0a4eb54f66fdc5f902523e2d b/Library/Artifacts/23/230cb71d0a4eb54f66fdc5f902523e2d new file mode 100644 index 0000000..b248044 Binary files /dev/null and b/Library/Artifacts/23/230cb71d0a4eb54f66fdc5f902523e2d differ diff --git a/Library/Artifacts/23/231b78285ff4897ab4b2c17f898b71fe b/Library/Artifacts/23/231b78285ff4897ab4b2c17f898b71fe new file mode 100644 index 0000000..1f151eb Binary files /dev/null and b/Library/Artifacts/23/231b78285ff4897ab4b2c17f898b71fe differ diff --git a/Library/Artifacts/23/235522ee61c2a18963935f61d088723c b/Library/Artifacts/23/235522ee61c2a18963935f61d088723c new file mode 100644 index 0000000..190a4da Binary files /dev/null and b/Library/Artifacts/23/235522ee61c2a18963935f61d088723c differ diff --git a/Library/Artifacts/23/23886dc15b2c6618f0414390357d1108 b/Library/Artifacts/23/23886dc15b2c6618f0414390357d1108 new file mode 100644 index 0000000..6c7a10c Binary files /dev/null and b/Library/Artifacts/23/23886dc15b2c6618f0414390357d1108 differ diff --git a/Library/Artifacts/23/23e2ac84fef379e04a573637e27a3442 b/Library/Artifacts/23/23e2ac84fef379e04a573637e27a3442 new file mode 100644 index 0000000..c829fb4 Binary files /dev/null and b/Library/Artifacts/23/23e2ac84fef379e04a573637e27a3442 differ diff --git a/Library/Artifacts/24/24002926945309a37ae7f6ebb182c074 b/Library/Artifacts/24/24002926945309a37ae7f6ebb182c074 new file mode 100644 index 0000000..ae72cce Binary files /dev/null and b/Library/Artifacts/24/24002926945309a37ae7f6ebb182c074 differ diff --git a/Library/Artifacts/24/2425e5fdca85857501230e42e96c79b7 b/Library/Artifacts/24/2425e5fdca85857501230e42e96c79b7 new file mode 100644 index 0000000..12c9200 Binary files /dev/null and b/Library/Artifacts/24/2425e5fdca85857501230e42e96c79b7 differ diff --git a/Library/Artifacts/24/242a01da2eaefb863b977d8709f0a588 b/Library/Artifacts/24/242a01da2eaefb863b977d8709f0a588 new file mode 100644 index 0000000..e4207bf Binary files /dev/null and b/Library/Artifacts/24/242a01da2eaefb863b977d8709f0a588 differ diff --git a/Library/Artifacts/24/243d08c49f480dcc8e9cb9feb17d9c6d b/Library/Artifacts/24/243d08c49f480dcc8e9cb9feb17d9c6d new file mode 100644 index 0000000..7dfd709 Binary files /dev/null and b/Library/Artifacts/24/243d08c49f480dcc8e9cb9feb17d9c6d differ diff --git a/Library/Artifacts/24/248f28e2ebac20ce9491e15a7b139b5d b/Library/Artifacts/24/248f28e2ebac20ce9491e15a7b139b5d new file mode 100644 index 0000000..8e08cd0 Binary files /dev/null and b/Library/Artifacts/24/248f28e2ebac20ce9491e15a7b139b5d differ diff --git a/Library/Artifacts/24/24a710c67097268d2b49a75256a8d228 b/Library/Artifacts/24/24a710c67097268d2b49a75256a8d228 new file mode 100644 index 0000000..09e51df Binary files /dev/null and b/Library/Artifacts/24/24a710c67097268d2b49a75256a8d228 differ diff --git a/Library/Artifacts/24/24c960c074c365f566a69a752d6b1585 b/Library/Artifacts/24/24c960c074c365f566a69a752d6b1585 new file mode 100644 index 0000000..42cd7be Binary files /dev/null and b/Library/Artifacts/24/24c960c074c365f566a69a752d6b1585 differ diff --git a/Library/Artifacts/25/2533671f59608bc6d5f5f8162fa92eac b/Library/Artifacts/25/2533671f59608bc6d5f5f8162fa92eac new file mode 100644 index 0000000..4cca61e Binary files /dev/null and b/Library/Artifacts/25/2533671f59608bc6d5f5f8162fa92eac differ diff --git a/Library/Artifacts/25/2565c980496edeb9a7f1413f264d0b68 b/Library/Artifacts/25/2565c980496edeb9a7f1413f264d0b68 new file mode 100644 index 0000000..234fbd6 Binary files /dev/null and b/Library/Artifacts/25/2565c980496edeb9a7f1413f264d0b68 differ diff --git a/Library/Artifacts/25/25850fd39392d030a533bf2a2975c9fa b/Library/Artifacts/25/25850fd39392d030a533bf2a2975c9fa new file mode 100644 index 0000000..d4b26dd Binary files /dev/null and b/Library/Artifacts/25/25850fd39392d030a533bf2a2975c9fa differ diff --git a/Library/Artifacts/25/258b3fc94678532e15161318defaa8e9 b/Library/Artifacts/25/258b3fc94678532e15161318defaa8e9 new file mode 100644 index 0000000..55c0705 Binary files /dev/null and b/Library/Artifacts/25/258b3fc94678532e15161318defaa8e9 differ diff --git a/Library/Artifacts/25/259fab770611219d6f99d9cb65e0b167 b/Library/Artifacts/25/259fab770611219d6f99d9cb65e0b167 new file mode 100644 index 0000000..479416c Binary files /dev/null and b/Library/Artifacts/25/259fab770611219d6f99d9cb65e0b167 differ diff --git a/Library/Artifacts/25/25cc09c0795315c08c75467f28c2833e b/Library/Artifacts/25/25cc09c0795315c08c75467f28c2833e new file mode 100644 index 0000000..3e22130 Binary files /dev/null and b/Library/Artifacts/25/25cc09c0795315c08c75467f28c2833e differ diff --git a/Library/Artifacts/25/25d991bf022fd32a9da81489debf575f b/Library/Artifacts/25/25d991bf022fd32a9da81489debf575f new file mode 100644 index 0000000..62f459a Binary files /dev/null and b/Library/Artifacts/25/25d991bf022fd32a9da81489debf575f differ diff --git a/Library/Artifacts/25/25e6dd3409b40da2bc36a0841d661acb b/Library/Artifacts/25/25e6dd3409b40da2bc36a0841d661acb new file mode 100644 index 0000000..7707941 Binary files /dev/null and b/Library/Artifacts/25/25e6dd3409b40da2bc36a0841d661acb differ diff --git a/Library/Artifacts/25/25ee6247d7be0fc3d1519bdcb34c660e b/Library/Artifacts/25/25ee6247d7be0fc3d1519bdcb34c660e new file mode 100644 index 0000000..0e2bdf6 Binary files /dev/null and b/Library/Artifacts/25/25ee6247d7be0fc3d1519bdcb34c660e differ diff --git a/Library/Artifacts/25/25f3b7e8a8ee5186cca8ccea3e7e9869 b/Library/Artifacts/25/25f3b7e8a8ee5186cca8ccea3e7e9869 new file mode 100644 index 0000000..dbf453c Binary files /dev/null and b/Library/Artifacts/25/25f3b7e8a8ee5186cca8ccea3e7e9869 differ diff --git a/Library/Artifacts/26/261751d5010f75dbddb49982e1a9cfa2 b/Library/Artifacts/26/261751d5010f75dbddb49982e1a9cfa2 new file mode 100644 index 0000000..50ba7ec Binary files /dev/null and b/Library/Artifacts/26/261751d5010f75dbddb49982e1a9cfa2 differ diff --git a/Library/Artifacts/26/2628688eb85ef2058da67257a75b4981 b/Library/Artifacts/26/2628688eb85ef2058da67257a75b4981 new file mode 100644 index 0000000..5c2fb6c Binary files /dev/null and b/Library/Artifacts/26/2628688eb85ef2058da67257a75b4981 differ diff --git a/Library/Artifacts/26/267cf5f4e10d01d19087c00dac991740 b/Library/Artifacts/26/267cf5f4e10d01d19087c00dac991740 new file mode 100644 index 0000000..4a4af24 Binary files /dev/null and b/Library/Artifacts/26/267cf5f4e10d01d19087c00dac991740 differ diff --git a/Library/Artifacts/26/26a25e464dc7f4b62353e9a7b45dfee4 b/Library/Artifacts/26/26a25e464dc7f4b62353e9a7b45dfee4 new file mode 100644 index 0000000..2a5ce3d Binary files /dev/null and b/Library/Artifacts/26/26a25e464dc7f4b62353e9a7b45dfee4 differ diff --git a/Library/Artifacts/27/270af2b6adfcb367e588daea04e336c0 b/Library/Artifacts/27/270af2b6adfcb367e588daea04e336c0 new file mode 100644 index 0000000..6c4f93d Binary files /dev/null and b/Library/Artifacts/27/270af2b6adfcb367e588daea04e336c0 differ diff --git a/Library/Artifacts/27/270cc40e6d3476e8a9b7c1cb0edd2616 b/Library/Artifacts/27/270cc40e6d3476e8a9b7c1cb0edd2616 new file mode 100644 index 0000000..c4a2f2b Binary files /dev/null and b/Library/Artifacts/27/270cc40e6d3476e8a9b7c1cb0edd2616 differ diff --git a/Library/Artifacts/27/272542bed1e68b8659f65913ebbfe068 b/Library/Artifacts/27/272542bed1e68b8659f65913ebbfe068 new file mode 100644 index 0000000..211e7d7 Binary files /dev/null and b/Library/Artifacts/27/272542bed1e68b8659f65913ebbfe068 differ diff --git a/Library/Artifacts/27/274dd1db0d189b3dd96c73ec6ff7a8b9 b/Library/Artifacts/27/274dd1db0d189b3dd96c73ec6ff7a8b9 new file mode 100644 index 0000000..e071589 Binary files /dev/null and b/Library/Artifacts/27/274dd1db0d189b3dd96c73ec6ff7a8b9 differ diff --git a/Library/Artifacts/27/27620ec05d584f02da7854e3f740b212 b/Library/Artifacts/27/27620ec05d584f02da7854e3f740b212 new file mode 100644 index 0000000..0f3df13 Binary files /dev/null and b/Library/Artifacts/27/27620ec05d584f02da7854e3f740b212 differ diff --git a/Library/Artifacts/27/2768d160308083231ef50a48f87b4daa b/Library/Artifacts/27/2768d160308083231ef50a48f87b4daa new file mode 100644 index 0000000..e518f6f Binary files /dev/null and b/Library/Artifacts/27/2768d160308083231ef50a48f87b4daa differ diff --git a/Library/Artifacts/27/2782f5c3f529f4ad154d0c700bb77cfb b/Library/Artifacts/27/2782f5c3f529f4ad154d0c700bb77cfb new file mode 100644 index 0000000..6657b74 Binary files /dev/null and b/Library/Artifacts/27/2782f5c3f529f4ad154d0c700bb77cfb differ diff --git a/Library/Artifacts/27/27914280ee1a7957d97707b8327599f8 b/Library/Artifacts/27/27914280ee1a7957d97707b8327599f8 new file mode 100644 index 0000000..eb0bbc0 Binary files /dev/null and b/Library/Artifacts/27/27914280ee1a7957d97707b8327599f8 differ diff --git a/Library/Artifacts/27/279437dcdb1ca4a76134dcb4392e7c77 b/Library/Artifacts/27/279437dcdb1ca4a76134dcb4392e7c77 new file mode 100644 index 0000000..04a84a7 Binary files /dev/null and b/Library/Artifacts/27/279437dcdb1ca4a76134dcb4392e7c77 differ diff --git a/Library/Artifacts/28/28138fdcb00bb53dd18fb40ed05750ef b/Library/Artifacts/28/28138fdcb00bb53dd18fb40ed05750ef new file mode 100644 index 0000000..69b967f Binary files /dev/null and b/Library/Artifacts/28/28138fdcb00bb53dd18fb40ed05750ef differ diff --git a/Library/Artifacts/28/281de90916b2effdc4bdf66f91909019 b/Library/Artifacts/28/281de90916b2effdc4bdf66f91909019 new file mode 100644 index 0000000..df9adcf Binary files /dev/null and b/Library/Artifacts/28/281de90916b2effdc4bdf66f91909019 differ diff --git a/Library/Artifacts/28/284948ebee117b9050331bcc704390b3 b/Library/Artifacts/28/284948ebee117b9050331bcc704390b3 new file mode 100644 index 0000000..0aa5467 Binary files /dev/null and b/Library/Artifacts/28/284948ebee117b9050331bcc704390b3 differ diff --git a/Library/Artifacts/28/28dd09b40b4273d3111e01d74e2f9f28 b/Library/Artifacts/28/28dd09b40b4273d3111e01d74e2f9f28 new file mode 100644 index 0000000..99df41b Binary files /dev/null and b/Library/Artifacts/28/28dd09b40b4273d3111e01d74e2f9f28 differ diff --git a/Library/Artifacts/28/28e124aa54a479cdbd76ce03883674f7 b/Library/Artifacts/28/28e124aa54a479cdbd76ce03883674f7 new file mode 100644 index 0000000..cf394ba Binary files /dev/null and b/Library/Artifacts/28/28e124aa54a479cdbd76ce03883674f7 differ diff --git a/Library/Artifacts/29/294c4948776c3f834418994f19307059 b/Library/Artifacts/29/294c4948776c3f834418994f19307059 new file mode 100644 index 0000000..fc42217 Binary files /dev/null and b/Library/Artifacts/29/294c4948776c3f834418994f19307059 differ diff --git a/Library/Artifacts/29/29598f670c6b098a5cea03e49f493b5b b/Library/Artifacts/29/29598f670c6b098a5cea03e49f493b5b new file mode 100644 index 0000000..e6d601f Binary files /dev/null and b/Library/Artifacts/29/29598f670c6b098a5cea03e49f493b5b differ diff --git a/Library/Artifacts/29/29b4eaff1607226c818420be17d2b32d b/Library/Artifacts/29/29b4eaff1607226c818420be17d2b32d new file mode 100644 index 0000000..85148d1 Binary files /dev/null and b/Library/Artifacts/29/29b4eaff1607226c818420be17d2b32d differ diff --git a/Library/Artifacts/29/29f6819655d024f7f8b9df6c9a0fa1c9 b/Library/Artifacts/29/29f6819655d024f7f8b9df6c9a0fa1c9 new file mode 100644 index 0000000..bd426e2 Binary files /dev/null and b/Library/Artifacts/29/29f6819655d024f7f8b9df6c9a0fa1c9 differ diff --git a/Library/Artifacts/29/29fb4ad698cd499a295ec75a1606605d b/Library/Artifacts/29/29fb4ad698cd499a295ec75a1606605d new file mode 100644 index 0000000..566bac0 Binary files /dev/null and b/Library/Artifacts/29/29fb4ad698cd499a295ec75a1606605d differ diff --git a/Library/Artifacts/2a/2a02806daad250e38aa7a8d67403cf88 b/Library/Artifacts/2a/2a02806daad250e38aa7a8d67403cf88 new file mode 100644 index 0000000..ba19226 Binary files /dev/null and b/Library/Artifacts/2a/2a02806daad250e38aa7a8d67403cf88 differ diff --git a/Library/Artifacts/2a/2a4914c184b784b409b153d9c69b8907 b/Library/Artifacts/2a/2a4914c184b784b409b153d9c69b8907 new file mode 100644 index 0000000..93ac8bc Binary files /dev/null and b/Library/Artifacts/2a/2a4914c184b784b409b153d9c69b8907 differ diff --git a/Library/Artifacts/2a/2a4fc6e71962a80af60e19ab02c21e05 b/Library/Artifacts/2a/2a4fc6e71962a80af60e19ab02c21e05 new file mode 100644 index 0000000..b70fff4 Binary files /dev/null and b/Library/Artifacts/2a/2a4fc6e71962a80af60e19ab02c21e05 differ diff --git a/Library/Artifacts/2a/2a56f096ff542c106a4368b6ee92a8cd b/Library/Artifacts/2a/2a56f096ff542c106a4368b6ee92a8cd new file mode 100644 index 0000000..854b520 Binary files /dev/null and b/Library/Artifacts/2a/2a56f096ff542c106a4368b6ee92a8cd differ diff --git a/Library/Artifacts/2a/2a6bdc6a77c6461b6ef09dd785954edb b/Library/Artifacts/2a/2a6bdc6a77c6461b6ef09dd785954edb new file mode 100644 index 0000000..b25282a Binary files /dev/null and b/Library/Artifacts/2a/2a6bdc6a77c6461b6ef09dd785954edb differ diff --git a/Library/Artifacts/2a/2aaa1181a73cfeaaa14e1c0ffcc45814 b/Library/Artifacts/2a/2aaa1181a73cfeaaa14e1c0ffcc45814 new file mode 100644 index 0000000..bba7c0e Binary files /dev/null and b/Library/Artifacts/2a/2aaa1181a73cfeaaa14e1c0ffcc45814 differ diff --git a/Library/Artifacts/2a/2abab6e2aff39255a505250cc7713363 b/Library/Artifacts/2a/2abab6e2aff39255a505250cc7713363 new file mode 100644 index 0000000..b217462 Binary files /dev/null and b/Library/Artifacts/2a/2abab6e2aff39255a505250cc7713363 differ diff --git a/Library/Artifacts/2a/2ad0cb7cb27565102b5bbf6716b47945 b/Library/Artifacts/2a/2ad0cb7cb27565102b5bbf6716b47945 new file mode 100644 index 0000000..0b0b632 Binary files /dev/null and b/Library/Artifacts/2a/2ad0cb7cb27565102b5bbf6716b47945 differ diff --git a/Library/Artifacts/2a/2aeb9f44252ab14633b1b388898938b7 b/Library/Artifacts/2a/2aeb9f44252ab14633b1b388898938b7 new file mode 100644 index 0000000..086948c Binary files /dev/null and b/Library/Artifacts/2a/2aeb9f44252ab14633b1b388898938b7 differ diff --git a/Library/Artifacts/2a/2aed8ff2a885da5bcb9710b01a5f7eeb b/Library/Artifacts/2a/2aed8ff2a885da5bcb9710b01a5f7eeb new file mode 100644 index 0000000..9c592e0 Binary files /dev/null and b/Library/Artifacts/2a/2aed8ff2a885da5bcb9710b01a5f7eeb differ diff --git a/Library/Artifacts/2b/2b10a5c430e9c0b6ddac74ac416aab5f b/Library/Artifacts/2b/2b10a5c430e9c0b6ddac74ac416aab5f new file mode 100644 index 0000000..1ee4dee Binary files /dev/null and b/Library/Artifacts/2b/2b10a5c430e9c0b6ddac74ac416aab5f differ diff --git a/Library/Artifacts/2b/2ba2b038595cfa2ce31eac654f8e9163 b/Library/Artifacts/2b/2ba2b038595cfa2ce31eac654f8e9163 new file mode 100644 index 0000000..d8c159b Binary files /dev/null and b/Library/Artifacts/2b/2ba2b038595cfa2ce31eac654f8e9163 differ diff --git a/Library/Artifacts/2b/2bd7e8bc5fddfec893fb922bd562f979 b/Library/Artifacts/2b/2bd7e8bc5fddfec893fb922bd562f979 new file mode 100644 index 0000000..aa836ce Binary files /dev/null and b/Library/Artifacts/2b/2bd7e8bc5fddfec893fb922bd562f979 differ diff --git a/Library/Artifacts/2b/2bfe2fb49e95b01e4b3d42387e80d37a b/Library/Artifacts/2b/2bfe2fb49e95b01e4b3d42387e80d37a new file mode 100644 index 0000000..715cf8e Binary files /dev/null and b/Library/Artifacts/2b/2bfe2fb49e95b01e4b3d42387e80d37a differ diff --git a/Library/Artifacts/2c/2c0a2d4c46ce1f4aa4f6640746fea9dd b/Library/Artifacts/2c/2c0a2d4c46ce1f4aa4f6640746fea9dd new file mode 100644 index 0000000..7062b0a Binary files /dev/null and b/Library/Artifacts/2c/2c0a2d4c46ce1f4aa4f6640746fea9dd differ diff --git a/Library/Artifacts/2c/2c0fea2fa78268836dfb9cf7267014ec b/Library/Artifacts/2c/2c0fea2fa78268836dfb9cf7267014ec new file mode 100644 index 0000000..b8ec198 Binary files /dev/null and b/Library/Artifacts/2c/2c0fea2fa78268836dfb9cf7267014ec differ diff --git a/Library/Artifacts/2c/2c11135059e63fad256814db674e0188 b/Library/Artifacts/2c/2c11135059e63fad256814db674e0188 new file mode 100644 index 0000000..02006ea Binary files /dev/null and b/Library/Artifacts/2c/2c11135059e63fad256814db674e0188 differ diff --git a/Library/Artifacts/2c/2c20977c7651a46a1203dbd2ae87adaf b/Library/Artifacts/2c/2c20977c7651a46a1203dbd2ae87adaf new file mode 100644 index 0000000..988db5e Binary files /dev/null and b/Library/Artifacts/2c/2c20977c7651a46a1203dbd2ae87adaf differ diff --git a/Library/Artifacts/2c/2c3395ccd9246ab9749f1d2a9d446fcc b/Library/Artifacts/2c/2c3395ccd9246ab9749f1d2a9d446fcc new file mode 100644 index 0000000..4137177 Binary files /dev/null and b/Library/Artifacts/2c/2c3395ccd9246ab9749f1d2a9d446fcc differ diff --git a/Library/Artifacts/2c/2c7637f3de35a6a0c11184e4904cae5c b/Library/Artifacts/2c/2c7637f3de35a6a0c11184e4904cae5c new file mode 100644 index 0000000..a1627e1 Binary files /dev/null and b/Library/Artifacts/2c/2c7637f3de35a6a0c11184e4904cae5c differ diff --git a/Library/Artifacts/2c/2c7fbfc21e695ac8bce6fec3d9911099 b/Library/Artifacts/2c/2c7fbfc21e695ac8bce6fec3d9911099 new file mode 100644 index 0000000..8e3b289 Binary files /dev/null and b/Library/Artifacts/2c/2c7fbfc21e695ac8bce6fec3d9911099 differ diff --git a/Library/Artifacts/2c/2c90755f3e377e1a30a7587ab84037ba b/Library/Artifacts/2c/2c90755f3e377e1a30a7587ab84037ba new file mode 100644 index 0000000..6aaa619 Binary files /dev/null and b/Library/Artifacts/2c/2c90755f3e377e1a30a7587ab84037ba differ diff --git a/Library/Artifacts/2c/2cbf4d91a3d683343e7b47565eba9db4 b/Library/Artifacts/2c/2cbf4d91a3d683343e7b47565eba9db4 new file mode 100644 index 0000000..7e72a8a Binary files /dev/null and b/Library/Artifacts/2c/2cbf4d91a3d683343e7b47565eba9db4 differ diff --git a/Library/Artifacts/2c/2cbf8b5bfccb1d225b33bd26909ff834 b/Library/Artifacts/2c/2cbf8b5bfccb1d225b33bd26909ff834 new file mode 100644 index 0000000..c74452d Binary files /dev/null and b/Library/Artifacts/2c/2cbf8b5bfccb1d225b33bd26909ff834 differ diff --git a/Library/Artifacts/2c/2cdde032ecfab5bca1e419a619d32f65 b/Library/Artifacts/2c/2cdde032ecfab5bca1e419a619d32f65 new file mode 100644 index 0000000..ff91529 Binary files /dev/null and b/Library/Artifacts/2c/2cdde032ecfab5bca1e419a619d32f65 differ diff --git a/Library/Artifacts/2c/2ce02c46ee6547d056743f397c2d8c89 b/Library/Artifacts/2c/2ce02c46ee6547d056743f397c2d8c89 new file mode 100644 index 0000000..67463f1 Binary files /dev/null and b/Library/Artifacts/2c/2ce02c46ee6547d056743f397c2d8c89 differ diff --git a/Library/Artifacts/2c/2ce803e68ed0dbba333cde13433e496b b/Library/Artifacts/2c/2ce803e68ed0dbba333cde13433e496b new file mode 100644 index 0000000..53979df Binary files /dev/null and b/Library/Artifacts/2c/2ce803e68ed0dbba333cde13433e496b differ diff --git a/Library/Artifacts/2d/2d08cbf2a06e4f34e2f5028c218a6abd b/Library/Artifacts/2d/2d08cbf2a06e4f34e2f5028c218a6abd new file mode 100644 index 0000000..684e32b Binary files /dev/null and b/Library/Artifacts/2d/2d08cbf2a06e4f34e2f5028c218a6abd differ diff --git a/Library/Artifacts/2d/2da0e87a8da79ed9d3e12b9247fae575 b/Library/Artifacts/2d/2da0e87a8da79ed9d3e12b9247fae575 new file mode 100644 index 0000000..3a04dae Binary files /dev/null and b/Library/Artifacts/2d/2da0e87a8da79ed9d3e12b9247fae575 differ diff --git a/Library/Artifacts/2d/2da29cb8bca69a6d6d2da30afd2e4004 b/Library/Artifacts/2d/2da29cb8bca69a6d6d2da30afd2e4004 new file mode 100644 index 0000000..0bd71e4 Binary files /dev/null and b/Library/Artifacts/2d/2da29cb8bca69a6d6d2da30afd2e4004 differ diff --git a/Library/Artifacts/2d/2da8b1b6a10fed05482a3a18e6320feb b/Library/Artifacts/2d/2da8b1b6a10fed05482a3a18e6320feb new file mode 100644 index 0000000..b9e7e46 Binary files /dev/null and b/Library/Artifacts/2d/2da8b1b6a10fed05482a3a18e6320feb differ diff --git a/Library/Artifacts/2d/2db3d44d660af15c71d08f9b5dfa51c7 b/Library/Artifacts/2d/2db3d44d660af15c71d08f9b5dfa51c7 new file mode 100644 index 0000000..3acc050 Binary files /dev/null and b/Library/Artifacts/2d/2db3d44d660af15c71d08f9b5dfa51c7 differ diff --git a/Library/Artifacts/2e/2e1502f1aa5c07570a79a2384795c694 b/Library/Artifacts/2e/2e1502f1aa5c07570a79a2384795c694 new file mode 100644 index 0000000..d790777 Binary files /dev/null and b/Library/Artifacts/2e/2e1502f1aa5c07570a79a2384795c694 differ diff --git a/Library/Artifacts/2e/2e2160d621da952a374709188e358c55 b/Library/Artifacts/2e/2e2160d621da952a374709188e358c55 new file mode 100644 index 0000000..825400e Binary files /dev/null and b/Library/Artifacts/2e/2e2160d621da952a374709188e358c55 differ diff --git a/Library/Artifacts/2e/2e263dc827b4914da906700db37abaab b/Library/Artifacts/2e/2e263dc827b4914da906700db37abaab new file mode 100644 index 0000000..62637bc Binary files /dev/null and b/Library/Artifacts/2e/2e263dc827b4914da906700db37abaab differ diff --git a/Library/Artifacts/2e/2e4709376daf584dbbcefe6b7b2b7c22 b/Library/Artifacts/2e/2e4709376daf584dbbcefe6b7b2b7c22 new file mode 100644 index 0000000..ce9314a Binary files /dev/null and b/Library/Artifacts/2e/2e4709376daf584dbbcefe6b7b2b7c22 differ diff --git a/Library/Artifacts/2e/2e4aca3fb03eceaf1d3cb12f1e2aded5 b/Library/Artifacts/2e/2e4aca3fb03eceaf1d3cb12f1e2aded5 new file mode 100644 index 0000000..4ec0ad1 Binary files /dev/null and b/Library/Artifacts/2e/2e4aca3fb03eceaf1d3cb12f1e2aded5 differ diff --git a/Library/Artifacts/2e/2e5faf0fbd5adf5309fe94f65bb9c250 b/Library/Artifacts/2e/2e5faf0fbd5adf5309fe94f65bb9c250 new file mode 100644 index 0000000..605ad49 Binary files /dev/null and b/Library/Artifacts/2e/2e5faf0fbd5adf5309fe94f65bb9c250 differ diff --git a/Library/Artifacts/2e/2e679b17b0b8efc7d0d4c1fc1cdae31f b/Library/Artifacts/2e/2e679b17b0b8efc7d0d4c1fc1cdae31f new file mode 100644 index 0000000..45ed57e Binary files /dev/null and b/Library/Artifacts/2e/2e679b17b0b8efc7d0d4c1fc1cdae31f differ diff --git a/Library/Artifacts/2e/2e7e4738c5a9eba4752cef69ce62a1cd b/Library/Artifacts/2e/2e7e4738c5a9eba4752cef69ce62a1cd new file mode 100644 index 0000000..811d49e Binary files /dev/null and b/Library/Artifacts/2e/2e7e4738c5a9eba4752cef69ce62a1cd differ diff --git a/Library/Artifacts/2e/2eb449654cee7d33662c3e7730f3f94c b/Library/Artifacts/2e/2eb449654cee7d33662c3e7730f3f94c new file mode 100644 index 0000000..0122a9e Binary files /dev/null and b/Library/Artifacts/2e/2eb449654cee7d33662c3e7730f3f94c differ diff --git a/Library/Artifacts/2e/2ede6af250f365011b922fd5686ac12f b/Library/Artifacts/2e/2ede6af250f365011b922fd5686ac12f new file mode 100644 index 0000000..09dae98 Binary files /dev/null and b/Library/Artifacts/2e/2ede6af250f365011b922fd5686ac12f differ diff --git a/Library/Artifacts/2f/2f0e07adf97d2ebb4b04c37f95b0c44d b/Library/Artifacts/2f/2f0e07adf97d2ebb4b04c37f95b0c44d new file mode 100644 index 0000000..8dd2456 Binary files /dev/null and b/Library/Artifacts/2f/2f0e07adf97d2ebb4b04c37f95b0c44d differ diff --git a/Library/Artifacts/2f/2f25fc3ab6cccb3ee20ce9f602dd93f9 b/Library/Artifacts/2f/2f25fc3ab6cccb3ee20ce9f602dd93f9 new file mode 100644 index 0000000..bd829a0 Binary files /dev/null and b/Library/Artifacts/2f/2f25fc3ab6cccb3ee20ce9f602dd93f9 differ diff --git a/Library/Artifacts/2f/2f62364e3a05dadc0f7ec1ab33f8497f b/Library/Artifacts/2f/2f62364e3a05dadc0f7ec1ab33f8497f new file mode 100644 index 0000000..3e803e7 Binary files /dev/null and b/Library/Artifacts/2f/2f62364e3a05dadc0f7ec1ab33f8497f differ diff --git a/Library/Artifacts/2f/2f7be9330efaa6e000285600b01eaa47 b/Library/Artifacts/2f/2f7be9330efaa6e000285600b01eaa47 new file mode 100644 index 0000000..190087c Binary files /dev/null and b/Library/Artifacts/2f/2f7be9330efaa6e000285600b01eaa47 differ diff --git a/Library/Artifacts/2f/2ff609f3f05f8bc13ec6953b5701b2cc b/Library/Artifacts/2f/2ff609f3f05f8bc13ec6953b5701b2cc new file mode 100644 index 0000000..7efcab6 Binary files /dev/null and b/Library/Artifacts/2f/2ff609f3f05f8bc13ec6953b5701b2cc differ diff --git a/Library/Artifacts/30/301d2a805b957408c729ce1b6d9d3f47 b/Library/Artifacts/30/301d2a805b957408c729ce1b6d9d3f47 new file mode 100644 index 0000000..162bf34 Binary files /dev/null and b/Library/Artifacts/30/301d2a805b957408c729ce1b6d9d3f47 differ diff --git a/Library/Artifacts/30/3028d3957c555c3c34b5db0233d9b4b9 b/Library/Artifacts/30/3028d3957c555c3c34b5db0233d9b4b9 new file mode 100644 index 0000000..edbd77e Binary files /dev/null and b/Library/Artifacts/30/3028d3957c555c3c34b5db0233d9b4b9 differ diff --git a/Library/Artifacts/30/302a144d1bbf3558e7f81688c106824b b/Library/Artifacts/30/302a144d1bbf3558e7f81688c106824b new file mode 100644 index 0000000..84d6241 Binary files /dev/null and b/Library/Artifacts/30/302a144d1bbf3558e7f81688c106824b differ diff --git a/Library/Artifacts/30/302bc822cf53dfc77d144c1468711bb5 b/Library/Artifacts/30/302bc822cf53dfc77d144c1468711bb5 new file mode 100644 index 0000000..7cb7a13 Binary files /dev/null and b/Library/Artifacts/30/302bc822cf53dfc77d144c1468711bb5 differ diff --git a/Library/Artifacts/30/306524b21660c3daf3fd0010adc0c1b4 b/Library/Artifacts/30/306524b21660c3daf3fd0010adc0c1b4 new file mode 100644 index 0000000..671ca8a Binary files /dev/null and b/Library/Artifacts/30/306524b21660c3daf3fd0010adc0c1b4 differ diff --git a/Library/Artifacts/30/306564ea4134f20cc67cf30c4b7684df b/Library/Artifacts/30/306564ea4134f20cc67cf30c4b7684df new file mode 100644 index 0000000..4c43aa0 Binary files /dev/null and b/Library/Artifacts/30/306564ea4134f20cc67cf30c4b7684df differ diff --git a/Library/Artifacts/30/3085e26411e6fae08884f158ac08f777 b/Library/Artifacts/30/3085e26411e6fae08884f158ac08f777 new file mode 100644 index 0000000..d077b75 Binary files /dev/null and b/Library/Artifacts/30/3085e26411e6fae08884f158ac08f777 differ diff --git a/Library/Artifacts/30/309d1ba5504f29e1b8e25aaf727540a7 b/Library/Artifacts/30/309d1ba5504f29e1b8e25aaf727540a7 new file mode 100644 index 0000000..65f2c85 Binary files /dev/null and b/Library/Artifacts/30/309d1ba5504f29e1b8e25aaf727540a7 differ diff --git a/Library/Artifacts/30/309e93185df35a72f9e55b1c2e7958ea b/Library/Artifacts/30/309e93185df35a72f9e55b1c2e7958ea new file mode 100644 index 0000000..0021f19 Binary files /dev/null and b/Library/Artifacts/30/309e93185df35a72f9e55b1c2e7958ea differ diff --git a/Library/Artifacts/30/30c5e90b8aa808db644928610df69107 b/Library/Artifacts/30/30c5e90b8aa808db644928610df69107 new file mode 100644 index 0000000..b08329a Binary files /dev/null and b/Library/Artifacts/30/30c5e90b8aa808db644928610df69107 differ diff --git a/Library/Artifacts/30/30cbf5de7efbac0c75b9e844b44ef7e9 b/Library/Artifacts/30/30cbf5de7efbac0c75b9e844b44ef7e9 new file mode 100644 index 0000000..1fde578 Binary files /dev/null and b/Library/Artifacts/30/30cbf5de7efbac0c75b9e844b44ef7e9 differ diff --git a/Library/Artifacts/30/30d94ef916bdb850605257d234b44abe b/Library/Artifacts/30/30d94ef916bdb850605257d234b44abe new file mode 100644 index 0000000..9091b0f Binary files /dev/null and b/Library/Artifacts/30/30d94ef916bdb850605257d234b44abe differ diff --git a/Library/Artifacts/30/30eee26ea43e5992da4054965c5ef918 b/Library/Artifacts/30/30eee26ea43e5992da4054965c5ef918 new file mode 100644 index 0000000..2788989 Binary files /dev/null and b/Library/Artifacts/30/30eee26ea43e5992da4054965c5ef918 differ diff --git a/Library/Artifacts/31/3109a380f03f93300158385a3cd9a1f2 b/Library/Artifacts/31/3109a380f03f93300158385a3cd9a1f2 new file mode 100644 index 0000000..9efa68e Binary files /dev/null and b/Library/Artifacts/31/3109a380f03f93300158385a3cd9a1f2 differ diff --git a/Library/Artifacts/31/310cc12a18e54dd38180d2ddd3f13e3f b/Library/Artifacts/31/310cc12a18e54dd38180d2ddd3f13e3f new file mode 100644 index 0000000..ff905a7 Binary files /dev/null and b/Library/Artifacts/31/310cc12a18e54dd38180d2ddd3f13e3f differ diff --git a/Library/Artifacts/31/314640a610aa210088b4a5e1166d40bf b/Library/Artifacts/31/314640a610aa210088b4a5e1166d40bf new file mode 100644 index 0000000..65a7b8d Binary files /dev/null and b/Library/Artifacts/31/314640a610aa210088b4a5e1166d40bf differ diff --git a/Library/Artifacts/31/3158656e403ada76276defa4f38b6683 b/Library/Artifacts/31/3158656e403ada76276defa4f38b6683 new file mode 100644 index 0000000..3a130f1 Binary files /dev/null and b/Library/Artifacts/31/3158656e403ada76276defa4f38b6683 differ diff --git a/Library/Artifacts/31/318384c8f08fc3fd5dd03295e3253942 b/Library/Artifacts/31/318384c8f08fc3fd5dd03295e3253942 new file mode 100644 index 0000000..01e7f6d Binary files /dev/null and b/Library/Artifacts/31/318384c8f08fc3fd5dd03295e3253942 differ diff --git a/Library/Artifacts/31/3199ce810d5359edda9ffbb1155d2b3d b/Library/Artifacts/31/3199ce810d5359edda9ffbb1155d2b3d new file mode 100644 index 0000000..6e32dca Binary files /dev/null and b/Library/Artifacts/31/3199ce810d5359edda9ffbb1155d2b3d differ diff --git a/Library/Artifacts/31/319d4a84f877d069e023c76755e6d52f b/Library/Artifacts/31/319d4a84f877d069e023c76755e6d52f new file mode 100644 index 0000000..009cfda Binary files /dev/null and b/Library/Artifacts/31/319d4a84f877d069e023c76755e6d52f differ diff --git a/Library/Artifacts/31/31cf14ae10a53db997b57937dbdd1f53 b/Library/Artifacts/31/31cf14ae10a53db997b57937dbdd1f53 new file mode 100644 index 0000000..11b4310 Binary files /dev/null and b/Library/Artifacts/31/31cf14ae10a53db997b57937dbdd1f53 differ diff --git a/Library/Artifacts/32/321bdb0fcd5492bfed628b3efbd65363 b/Library/Artifacts/32/321bdb0fcd5492bfed628b3efbd65363 new file mode 100644 index 0000000..6429dfd Binary files /dev/null and b/Library/Artifacts/32/321bdb0fcd5492bfed628b3efbd65363 differ diff --git a/Library/Artifacts/32/3249b1b09aa7ef79da9e3bfb36620caf b/Library/Artifacts/32/3249b1b09aa7ef79da9e3bfb36620caf new file mode 100644 index 0000000..3ca5270 Binary files /dev/null and b/Library/Artifacts/32/3249b1b09aa7ef79da9e3bfb36620caf differ diff --git a/Library/Artifacts/32/32d85ed03a7f4539843d3ae510df1c03 b/Library/Artifacts/32/32d85ed03a7f4539843d3ae510df1c03 new file mode 100644 index 0000000..b6019cb Binary files /dev/null and b/Library/Artifacts/32/32d85ed03a7f4539843d3ae510df1c03 differ diff --git a/Library/Artifacts/32/32f714a1b075dee80ea07ad768ca1cb1 b/Library/Artifacts/32/32f714a1b075dee80ea07ad768ca1cb1 new file mode 100644 index 0000000..d4e2e87 Binary files /dev/null and b/Library/Artifacts/32/32f714a1b075dee80ea07ad768ca1cb1 differ diff --git a/Library/Artifacts/32/32fe4106d2c61606fdeee8dc8cef0ffc b/Library/Artifacts/32/32fe4106d2c61606fdeee8dc8cef0ffc new file mode 100644 index 0000000..7af1f61 Binary files /dev/null and b/Library/Artifacts/32/32fe4106d2c61606fdeee8dc8cef0ffc differ diff --git a/Library/Artifacts/33/33080f9481ee274a2c376d449cfb55a5 b/Library/Artifacts/33/33080f9481ee274a2c376d449cfb55a5 new file mode 100644 index 0000000..f0ff71b Binary files /dev/null and b/Library/Artifacts/33/33080f9481ee274a2c376d449cfb55a5 differ diff --git a/Library/Artifacts/33/330f7682cb9a192d2c642b865d7250d0 b/Library/Artifacts/33/330f7682cb9a192d2c642b865d7250d0 new file mode 100644 index 0000000..f3426a1 Binary files /dev/null and b/Library/Artifacts/33/330f7682cb9a192d2c642b865d7250d0 differ diff --git a/Library/Artifacts/33/332855dfd4b72e3be2f7c9137c6ce63c b/Library/Artifacts/33/332855dfd4b72e3be2f7c9137c6ce63c new file mode 100644 index 0000000..441df19 Binary files /dev/null and b/Library/Artifacts/33/332855dfd4b72e3be2f7c9137c6ce63c differ diff --git a/Library/Artifacts/33/33555cb87004c2a9f59e80897ee51aab b/Library/Artifacts/33/33555cb87004c2a9f59e80897ee51aab new file mode 100644 index 0000000..152523d Binary files /dev/null and b/Library/Artifacts/33/33555cb87004c2a9f59e80897ee51aab differ diff --git a/Library/Artifacts/33/33772d85f72822b866ebbd2a441b6df2 b/Library/Artifacts/33/33772d85f72822b866ebbd2a441b6df2 new file mode 100644 index 0000000..bdf6436 Binary files /dev/null and b/Library/Artifacts/33/33772d85f72822b866ebbd2a441b6df2 differ diff --git a/Library/Artifacts/33/3391dca25ce4ddd748bd30afaef18f32 b/Library/Artifacts/33/3391dca25ce4ddd748bd30afaef18f32 new file mode 100644 index 0000000..8cacff6 Binary files /dev/null and b/Library/Artifacts/33/3391dca25ce4ddd748bd30afaef18f32 differ diff --git a/Library/Artifacts/33/33c956929f110dbdc06f8fbd7dc958f1 b/Library/Artifacts/33/33c956929f110dbdc06f8fbd7dc958f1 new file mode 100644 index 0000000..14bec22 Binary files /dev/null and b/Library/Artifacts/33/33c956929f110dbdc06f8fbd7dc958f1 differ diff --git a/Library/Artifacts/34/34139fa894d1edd105d9d900d7490085 b/Library/Artifacts/34/34139fa894d1edd105d9d900d7490085 new file mode 100644 index 0000000..c3e40d7 Binary files /dev/null and b/Library/Artifacts/34/34139fa894d1edd105d9d900d7490085 differ diff --git a/Library/Artifacts/34/3419a668fa7642000cab1f300973dfea b/Library/Artifacts/34/3419a668fa7642000cab1f300973dfea new file mode 100644 index 0000000..f371208 Binary files /dev/null and b/Library/Artifacts/34/3419a668fa7642000cab1f300973dfea differ diff --git a/Library/Artifacts/34/343fc16da28e66bc6925bb8772516712 b/Library/Artifacts/34/343fc16da28e66bc6925bb8772516712 new file mode 100644 index 0000000..1d2bcfa Binary files /dev/null and b/Library/Artifacts/34/343fc16da28e66bc6925bb8772516712 differ diff --git a/Library/Artifacts/34/344bc7efca335ed3b07de1b33d962963 b/Library/Artifacts/34/344bc7efca335ed3b07de1b33d962963 new file mode 100644 index 0000000..547e05f Binary files /dev/null and b/Library/Artifacts/34/344bc7efca335ed3b07de1b33d962963 differ diff --git a/Library/Artifacts/34/345d6485a60c4bfcc4d6c775aea18836 b/Library/Artifacts/34/345d6485a60c4bfcc4d6c775aea18836 new file mode 100644 index 0000000..c003299 Binary files /dev/null and b/Library/Artifacts/34/345d6485a60c4bfcc4d6c775aea18836 differ diff --git a/Library/Artifacts/34/34786cb82548c4c699ecaa19ab814662 b/Library/Artifacts/34/34786cb82548c4c699ecaa19ab814662 new file mode 100644 index 0000000..3da06e4 Binary files /dev/null and b/Library/Artifacts/34/34786cb82548c4c699ecaa19ab814662 differ diff --git a/Library/Artifacts/34/3494177e2ec54a757c6164f00e271515 b/Library/Artifacts/34/3494177e2ec54a757c6164f00e271515 new file mode 100644 index 0000000..f99bb23 Binary files /dev/null and b/Library/Artifacts/34/3494177e2ec54a757c6164f00e271515 differ diff --git a/Library/Artifacts/34/34965dd2227b482cf5fb1af2f529873f b/Library/Artifacts/34/34965dd2227b482cf5fb1af2f529873f new file mode 100644 index 0000000..4872b85 Binary files /dev/null and b/Library/Artifacts/34/34965dd2227b482cf5fb1af2f529873f differ diff --git a/Library/Artifacts/34/34b0c69ca8a13d13e9d95725c35160f6 b/Library/Artifacts/34/34b0c69ca8a13d13e9d95725c35160f6 new file mode 100644 index 0000000..d80bd09 Binary files /dev/null and b/Library/Artifacts/34/34b0c69ca8a13d13e9d95725c35160f6 differ diff --git a/Library/Artifacts/34/34d7778e59683544dc89342b5e5b897b b/Library/Artifacts/34/34d7778e59683544dc89342b5e5b897b new file mode 100644 index 0000000..12d369a Binary files /dev/null and b/Library/Artifacts/34/34d7778e59683544dc89342b5e5b897b differ diff --git a/Library/Artifacts/35/3529e2783e7dfef3d33371ef44b781b8 b/Library/Artifacts/35/3529e2783e7dfef3d33371ef44b781b8 new file mode 100644 index 0000000..b5f0e22 Binary files /dev/null and b/Library/Artifacts/35/3529e2783e7dfef3d33371ef44b781b8 differ diff --git a/Library/Artifacts/35/35736368c2e2d7d7bacacb4b93091809 b/Library/Artifacts/35/35736368c2e2d7d7bacacb4b93091809 new file mode 100644 index 0000000..8d436b5 Binary files /dev/null and b/Library/Artifacts/35/35736368c2e2d7d7bacacb4b93091809 differ diff --git a/Library/Artifacts/35/35aa59f8a78c412c76debc048a5389b1 b/Library/Artifacts/35/35aa59f8a78c412c76debc048a5389b1 new file mode 100644 index 0000000..b966db4 Binary files /dev/null and b/Library/Artifacts/35/35aa59f8a78c412c76debc048a5389b1 differ diff --git a/Library/Artifacts/35/35d7c9d7fa6306dcfa927e05f54e962b b/Library/Artifacts/35/35d7c9d7fa6306dcfa927e05f54e962b new file mode 100644 index 0000000..88d78e5 Binary files /dev/null and b/Library/Artifacts/35/35d7c9d7fa6306dcfa927e05f54e962b differ diff --git a/Library/Artifacts/35/35dfa198ad82b1d6317a92ecdddaf70d b/Library/Artifacts/35/35dfa198ad82b1d6317a92ecdddaf70d new file mode 100644 index 0000000..395a2a5 Binary files /dev/null and b/Library/Artifacts/35/35dfa198ad82b1d6317a92ecdddaf70d differ diff --git a/Library/Artifacts/35/35ec35222c68d8eef2d0925bfb19ea05 b/Library/Artifacts/35/35ec35222c68d8eef2d0925bfb19ea05 new file mode 100644 index 0000000..a6d7de5 Binary files /dev/null and b/Library/Artifacts/35/35ec35222c68d8eef2d0925bfb19ea05 differ diff --git a/Library/Artifacts/35/35f12597bd9f99d15b030f81b98006e5 b/Library/Artifacts/35/35f12597bd9f99d15b030f81b98006e5 new file mode 100644 index 0000000..042df13 Binary files /dev/null and b/Library/Artifacts/35/35f12597bd9f99d15b030f81b98006e5 differ diff --git a/Library/Artifacts/36/3609ce33a04d22e19049893ffa311b2f b/Library/Artifacts/36/3609ce33a04d22e19049893ffa311b2f new file mode 100644 index 0000000..a9440c0 Binary files /dev/null and b/Library/Artifacts/36/3609ce33a04d22e19049893ffa311b2f differ diff --git a/Library/Artifacts/36/362a78e976125d724639025f2787143c b/Library/Artifacts/36/362a78e976125d724639025f2787143c new file mode 100644 index 0000000..e3bdc47 Binary files /dev/null and b/Library/Artifacts/36/362a78e976125d724639025f2787143c differ diff --git a/Library/Artifacts/36/3679e3d38eed273942bfb1af7d3b519c b/Library/Artifacts/36/3679e3d38eed273942bfb1af7d3b519c new file mode 100644 index 0000000..277f5ac Binary files /dev/null and b/Library/Artifacts/36/3679e3d38eed273942bfb1af7d3b519c differ diff --git a/Library/Artifacts/36/36858026ddee40cd70e83aa8d8f13611 b/Library/Artifacts/36/36858026ddee40cd70e83aa8d8f13611 new file mode 100644 index 0000000..3cef555 Binary files /dev/null and b/Library/Artifacts/36/36858026ddee40cd70e83aa8d8f13611 differ diff --git a/Library/Artifacts/37/370eccbfbf5ebcf1c2832afcc57e60ec b/Library/Artifacts/37/370eccbfbf5ebcf1c2832afcc57e60ec new file mode 100644 index 0000000..238117f Binary files /dev/null and b/Library/Artifacts/37/370eccbfbf5ebcf1c2832afcc57e60ec differ diff --git a/Library/Artifacts/37/3710b444dcf118e9d5bc65a627ccc1f5 b/Library/Artifacts/37/3710b444dcf118e9d5bc65a627ccc1f5 new file mode 100644 index 0000000..2048b2d Binary files /dev/null and b/Library/Artifacts/37/3710b444dcf118e9d5bc65a627ccc1f5 differ diff --git a/Library/Artifacts/37/3711aef820ef6a9298fcdbb1b0e9a80d b/Library/Artifacts/37/3711aef820ef6a9298fcdbb1b0e9a80d new file mode 100644 index 0000000..46bc67b Binary files /dev/null and b/Library/Artifacts/37/3711aef820ef6a9298fcdbb1b0e9a80d differ diff --git a/Library/Artifacts/37/371742db58906533fd4aaffe781376d4 b/Library/Artifacts/37/371742db58906533fd4aaffe781376d4 new file mode 100644 index 0000000..3930013 Binary files /dev/null and b/Library/Artifacts/37/371742db58906533fd4aaffe781376d4 differ diff --git a/Library/Artifacts/37/3761f90aad6226c7bb7143a5aec0d9f7 b/Library/Artifacts/37/3761f90aad6226c7bb7143a5aec0d9f7 new file mode 100644 index 0000000..cd3eb6a Binary files /dev/null and b/Library/Artifacts/37/3761f90aad6226c7bb7143a5aec0d9f7 differ diff --git a/Library/Artifacts/37/376ca21e5ae331e0f92696dfef2892c1 b/Library/Artifacts/37/376ca21e5ae331e0f92696dfef2892c1 new file mode 100644 index 0000000..bdd287e Binary files /dev/null and b/Library/Artifacts/37/376ca21e5ae331e0f92696dfef2892c1 differ diff --git a/Library/Artifacts/37/37773b8ac05c4ee65f5661cbbb079981 b/Library/Artifacts/37/37773b8ac05c4ee65f5661cbbb079981 new file mode 100644 index 0000000..41cbfc2 Binary files /dev/null and b/Library/Artifacts/37/37773b8ac05c4ee65f5661cbbb079981 differ diff --git a/Library/Artifacts/37/379eebcc39a7a0575095254aa1770831 b/Library/Artifacts/37/379eebcc39a7a0575095254aa1770831 new file mode 100644 index 0000000..b3b49e1 Binary files /dev/null and b/Library/Artifacts/37/379eebcc39a7a0575095254aa1770831 differ diff --git a/Library/Artifacts/37/37ae807ba4fd8ea5e597119afce777dd b/Library/Artifacts/37/37ae807ba4fd8ea5e597119afce777dd new file mode 100644 index 0000000..6e640ae Binary files /dev/null and b/Library/Artifacts/37/37ae807ba4fd8ea5e597119afce777dd differ diff --git a/Library/Artifacts/37/37f009f4efc4dc7eac25edb7a1deacc1 b/Library/Artifacts/37/37f009f4efc4dc7eac25edb7a1deacc1 new file mode 100644 index 0000000..fd04be7 Binary files /dev/null and b/Library/Artifacts/37/37f009f4efc4dc7eac25edb7a1deacc1 differ diff --git a/Library/Artifacts/38/3805f63ecce3186f75bcd8c255b50f78 b/Library/Artifacts/38/3805f63ecce3186f75bcd8c255b50f78 new file mode 100644 index 0000000..1e019e6 Binary files /dev/null and b/Library/Artifacts/38/3805f63ecce3186f75bcd8c255b50f78 differ diff --git a/Library/Artifacts/38/38073d8f33bb623925de9f42d148d7a5 b/Library/Artifacts/38/38073d8f33bb623925de9f42d148d7a5 new file mode 100644 index 0000000..8dfb2df Binary files /dev/null and b/Library/Artifacts/38/38073d8f33bb623925de9f42d148d7a5 differ diff --git a/Library/Artifacts/38/38320a7a32a5a6b8f89d88b8d90c9f77 b/Library/Artifacts/38/38320a7a32a5a6b8f89d88b8d90c9f77 new file mode 100644 index 0000000..c9e94e0 Binary files /dev/null and b/Library/Artifacts/38/38320a7a32a5a6b8f89d88b8d90c9f77 differ diff --git a/Library/Artifacts/38/3835d7e1e3ac6b556394910b7a7d8f7b b/Library/Artifacts/38/3835d7e1e3ac6b556394910b7a7d8f7b new file mode 100644 index 0000000..15fc40d Binary files /dev/null and b/Library/Artifacts/38/3835d7e1e3ac6b556394910b7a7d8f7b differ diff --git a/Library/Artifacts/38/389a12ee828c1a24cd85b307aff5529a b/Library/Artifacts/38/389a12ee828c1a24cd85b307aff5529a new file mode 100644 index 0000000..4344d50 Binary files /dev/null and b/Library/Artifacts/38/389a12ee828c1a24cd85b307aff5529a differ diff --git a/Library/Artifacts/38/38b1247fb1b78f9960df9d78b16b41ae b/Library/Artifacts/38/38b1247fb1b78f9960df9d78b16b41ae new file mode 100644 index 0000000..cf20ba3 Binary files /dev/null and b/Library/Artifacts/38/38b1247fb1b78f9960df9d78b16b41ae differ diff --git a/Library/Artifacts/38/38e56d7def921bb16814165b65c2fd65 b/Library/Artifacts/38/38e56d7def921bb16814165b65c2fd65 new file mode 100644 index 0000000..77fc7fe Binary files /dev/null and b/Library/Artifacts/38/38e56d7def921bb16814165b65c2fd65 differ diff --git a/Library/Artifacts/39/390a0bb67a9a9a5e537c1d0e89a9457b b/Library/Artifacts/39/390a0bb67a9a9a5e537c1d0e89a9457b new file mode 100644 index 0000000..6f2f371 Binary files /dev/null and b/Library/Artifacts/39/390a0bb67a9a9a5e537c1d0e89a9457b differ diff --git a/Library/Artifacts/39/3915cb9a98c168e023cd43d5efa64cff b/Library/Artifacts/39/3915cb9a98c168e023cd43d5efa64cff new file mode 100644 index 0000000..2a37a8a Binary files /dev/null and b/Library/Artifacts/39/3915cb9a98c168e023cd43d5efa64cff differ diff --git a/Library/Artifacts/39/3917dbb8c6de21b6527e78692394b280 b/Library/Artifacts/39/3917dbb8c6de21b6527e78692394b280 new file mode 100644 index 0000000..94c3339 Binary files /dev/null and b/Library/Artifacts/39/3917dbb8c6de21b6527e78692394b280 differ diff --git a/Library/Artifacts/39/3937fc2c737b6db1f9e6e44ad076a25b b/Library/Artifacts/39/3937fc2c737b6db1f9e6e44ad076a25b new file mode 100644 index 0000000..ac1bcb4 Binary files /dev/null and b/Library/Artifacts/39/3937fc2c737b6db1f9e6e44ad076a25b differ diff --git a/Library/Artifacts/39/394a2e489e038f30802c9d4ea670f390 b/Library/Artifacts/39/394a2e489e038f30802c9d4ea670f390 new file mode 100644 index 0000000..b65d1a7 Binary files /dev/null and b/Library/Artifacts/39/394a2e489e038f30802c9d4ea670f390 differ diff --git a/Library/Artifacts/39/39781d2524cf795e9f7d37b7ebfc8b08 b/Library/Artifacts/39/39781d2524cf795e9f7d37b7ebfc8b08 new file mode 100644 index 0000000..12cebf3 Binary files /dev/null and b/Library/Artifacts/39/39781d2524cf795e9f7d37b7ebfc8b08 differ diff --git a/Library/Artifacts/39/3983d2524c41e8875e52cb65df5bc933 b/Library/Artifacts/39/3983d2524c41e8875e52cb65df5bc933 new file mode 100644 index 0000000..af5b3d4 Binary files /dev/null and b/Library/Artifacts/39/3983d2524c41e8875e52cb65df5bc933 differ diff --git a/Library/Artifacts/39/39d15b1e409260b2205ede5f464ff657 b/Library/Artifacts/39/39d15b1e409260b2205ede5f464ff657 new file mode 100644 index 0000000..9408a0b Binary files /dev/null and b/Library/Artifacts/39/39d15b1e409260b2205ede5f464ff657 differ diff --git a/Library/Artifacts/39/39f2b65f5fdd13a20136fc6b96833dbf b/Library/Artifacts/39/39f2b65f5fdd13a20136fc6b96833dbf new file mode 100644 index 0000000..061f167 Binary files /dev/null and b/Library/Artifacts/39/39f2b65f5fdd13a20136fc6b96833dbf differ diff --git a/Library/Artifacts/3a/3a02562a33e867e99b5f02113b81e915 b/Library/Artifacts/3a/3a02562a33e867e99b5f02113b81e915 new file mode 100644 index 0000000..56369cb Binary files /dev/null and b/Library/Artifacts/3a/3a02562a33e867e99b5f02113b81e915 differ diff --git a/Library/Artifacts/3a/3a212d26da06ce961ade8d4eecedf0f9 b/Library/Artifacts/3a/3a212d26da06ce961ade8d4eecedf0f9 new file mode 100644 index 0000000..c5c1639 Binary files /dev/null and b/Library/Artifacts/3a/3a212d26da06ce961ade8d4eecedf0f9 differ diff --git a/Library/Artifacts/3a/3a37d41d07a904d34445921424659cae b/Library/Artifacts/3a/3a37d41d07a904d34445921424659cae new file mode 100644 index 0000000..9aa21c4 Binary files /dev/null and b/Library/Artifacts/3a/3a37d41d07a904d34445921424659cae differ diff --git a/Library/Artifacts/3a/3a463d2c203c995c5ea59cf909a7bed0 b/Library/Artifacts/3a/3a463d2c203c995c5ea59cf909a7bed0 new file mode 100644 index 0000000..9e006c1 Binary files /dev/null and b/Library/Artifacts/3a/3a463d2c203c995c5ea59cf909a7bed0 differ diff --git a/Library/Artifacts/3a/3a9dd292c9464d34a9ee1f54e820dc88 b/Library/Artifacts/3a/3a9dd292c9464d34a9ee1f54e820dc88 new file mode 100644 index 0000000..67c5689 Binary files /dev/null and b/Library/Artifacts/3a/3a9dd292c9464d34a9ee1f54e820dc88 differ diff --git a/Library/Artifacts/3a/3ab05c283060535fd9697d3af9067b56 b/Library/Artifacts/3a/3ab05c283060535fd9697d3af9067b56 new file mode 100644 index 0000000..938277c Binary files /dev/null and b/Library/Artifacts/3a/3ab05c283060535fd9697d3af9067b56 differ diff --git a/Library/Artifacts/3a/3acca75d2c7982d71f8e67121c2c4e92 b/Library/Artifacts/3a/3acca75d2c7982d71f8e67121c2c4e92 new file mode 100644 index 0000000..1f304fb Binary files /dev/null and b/Library/Artifacts/3a/3acca75d2c7982d71f8e67121c2c4e92 differ diff --git a/Library/Artifacts/3a/3adb82cef303c689470b5b47a42d8d5f b/Library/Artifacts/3a/3adb82cef303c689470b5b47a42d8d5f new file mode 100644 index 0000000..0ddd6a6 Binary files /dev/null and b/Library/Artifacts/3a/3adb82cef303c689470b5b47a42d8d5f differ diff --git a/Library/Artifacts/3b/3b09895b36fa9dd7ad817bad02ff0a5d b/Library/Artifacts/3b/3b09895b36fa9dd7ad817bad02ff0a5d new file mode 100644 index 0000000..7d9e43c Binary files /dev/null and b/Library/Artifacts/3b/3b09895b36fa9dd7ad817bad02ff0a5d differ diff --git a/Library/Artifacts/3b/3b117cf6799c906e31417e35a2a854c4 b/Library/Artifacts/3b/3b117cf6799c906e31417e35a2a854c4 new file mode 100644 index 0000000..2c3fdeb Binary files /dev/null and b/Library/Artifacts/3b/3b117cf6799c906e31417e35a2a854c4 differ diff --git a/Library/Artifacts/3b/3b35ac1fe7f859b30278338e8dcd86fc b/Library/Artifacts/3b/3b35ac1fe7f859b30278338e8dcd86fc new file mode 100644 index 0000000..df03710 Binary files /dev/null and b/Library/Artifacts/3b/3b35ac1fe7f859b30278338e8dcd86fc differ diff --git a/Library/Artifacts/3b/3b5c456639f49bae104dcec398520e05 b/Library/Artifacts/3b/3b5c456639f49bae104dcec398520e05 new file mode 100644 index 0000000..062601f Binary files /dev/null and b/Library/Artifacts/3b/3b5c456639f49bae104dcec398520e05 differ diff --git a/Library/Artifacts/3b/3b6de124ee2a4008592b924910e5a9d1 b/Library/Artifacts/3b/3b6de124ee2a4008592b924910e5a9d1 new file mode 100644 index 0000000..14a3130 Binary files /dev/null and b/Library/Artifacts/3b/3b6de124ee2a4008592b924910e5a9d1 differ diff --git a/Library/Artifacts/3b/3b76e03cc6134422d4670a14dab598d2 b/Library/Artifacts/3b/3b76e03cc6134422d4670a14dab598d2 new file mode 100644 index 0000000..fb2def4 Binary files /dev/null and b/Library/Artifacts/3b/3b76e03cc6134422d4670a14dab598d2 differ diff --git a/Library/Artifacts/3b/3bd69abfa5c72cc3e1bb880875c348f4 b/Library/Artifacts/3b/3bd69abfa5c72cc3e1bb880875c348f4 new file mode 100644 index 0000000..0a08136 Binary files /dev/null and b/Library/Artifacts/3b/3bd69abfa5c72cc3e1bb880875c348f4 differ diff --git a/Library/Artifacts/3b/3bfa21664bcdfbe63c8893d18131bdf0 b/Library/Artifacts/3b/3bfa21664bcdfbe63c8893d18131bdf0 new file mode 100644 index 0000000..302392d Binary files /dev/null and b/Library/Artifacts/3b/3bfa21664bcdfbe63c8893d18131bdf0 differ diff --git a/Library/Artifacts/3c/3c32dd6dfdedd04109f7445d10e24b1f b/Library/Artifacts/3c/3c32dd6dfdedd04109f7445d10e24b1f new file mode 100644 index 0000000..4e588fc Binary files /dev/null and b/Library/Artifacts/3c/3c32dd6dfdedd04109f7445d10e24b1f differ diff --git a/Library/Artifacts/3c/3c6a2654cfffc493d61a6d976060093b b/Library/Artifacts/3c/3c6a2654cfffc493d61a6d976060093b new file mode 100644 index 0000000..202e880 Binary files /dev/null and b/Library/Artifacts/3c/3c6a2654cfffc493d61a6d976060093b differ diff --git a/Library/Artifacts/3c/3c96c4604cc1a0c7d31cd3a40c13b627 b/Library/Artifacts/3c/3c96c4604cc1a0c7d31cd3a40c13b627 new file mode 100644 index 0000000..f129f25 Binary files /dev/null and b/Library/Artifacts/3c/3c96c4604cc1a0c7d31cd3a40c13b627 differ diff --git a/Library/Artifacts/3c/3caaf41b60137bea0f3d3b56d2dcd941 b/Library/Artifacts/3c/3caaf41b60137bea0f3d3b56d2dcd941 new file mode 100644 index 0000000..3596d85 Binary files /dev/null and b/Library/Artifacts/3c/3caaf41b60137bea0f3d3b56d2dcd941 differ diff --git a/Library/Artifacts/3c/3cb771adc727ed4e1d2c9ec92aa17c88 b/Library/Artifacts/3c/3cb771adc727ed4e1d2c9ec92aa17c88 new file mode 100644 index 0000000..4a7af5f Binary files /dev/null and b/Library/Artifacts/3c/3cb771adc727ed4e1d2c9ec92aa17c88 differ diff --git a/Library/Artifacts/3c/3ccf9007523111492c8d627d665fbe27 b/Library/Artifacts/3c/3ccf9007523111492c8d627d665fbe27 new file mode 100644 index 0000000..355f18e Binary files /dev/null and b/Library/Artifacts/3c/3ccf9007523111492c8d627d665fbe27 differ diff --git a/Library/Artifacts/3d/3d04ee1250fa5af336aa68ce4eb8e3b8 b/Library/Artifacts/3d/3d04ee1250fa5af336aa68ce4eb8e3b8 new file mode 100644 index 0000000..e303bc9 Binary files /dev/null and b/Library/Artifacts/3d/3d04ee1250fa5af336aa68ce4eb8e3b8 differ diff --git a/Library/Artifacts/3d/3d0d833f8871faf3dd6a4cff3f0940c9 b/Library/Artifacts/3d/3d0d833f8871faf3dd6a4cff3f0940c9 new file mode 100644 index 0000000..87c1a2a Binary files /dev/null and b/Library/Artifacts/3d/3d0d833f8871faf3dd6a4cff3f0940c9 differ diff --git a/Library/Artifacts/3d/3d1e11f5bd8a51e5793fee0d9e887c61 b/Library/Artifacts/3d/3d1e11f5bd8a51e5793fee0d9e887c61 new file mode 100644 index 0000000..689e5f3 Binary files /dev/null and b/Library/Artifacts/3d/3d1e11f5bd8a51e5793fee0d9e887c61 differ diff --git a/Library/Artifacts/3d/3d56eb8d89c3377ba11cc45282d7cfc1 b/Library/Artifacts/3d/3d56eb8d89c3377ba11cc45282d7cfc1 new file mode 100644 index 0000000..88cf07a Binary files /dev/null and b/Library/Artifacts/3d/3d56eb8d89c3377ba11cc45282d7cfc1 differ diff --git a/Library/Artifacts/3d/3d57ff5352cae60b32377f1f5d7842f5 b/Library/Artifacts/3d/3d57ff5352cae60b32377f1f5d7842f5 new file mode 100644 index 0000000..06f874b Binary files /dev/null and b/Library/Artifacts/3d/3d57ff5352cae60b32377f1f5d7842f5 differ diff --git a/Library/Artifacts/3d/3d60c6b2303e429d7ce17fb3d6bd2907 b/Library/Artifacts/3d/3d60c6b2303e429d7ce17fb3d6bd2907 new file mode 100644 index 0000000..c2e540b Binary files /dev/null and b/Library/Artifacts/3d/3d60c6b2303e429d7ce17fb3d6bd2907 differ diff --git a/Library/Artifacts/3d/3d730902bbb4d63629be5b0610d3c73d b/Library/Artifacts/3d/3d730902bbb4d63629be5b0610d3c73d new file mode 100644 index 0000000..726d1fa Binary files /dev/null and b/Library/Artifacts/3d/3d730902bbb4d63629be5b0610d3c73d differ diff --git a/Library/Artifacts/3d/3da99ead1930a2b34d53967dda4f1ef5 b/Library/Artifacts/3d/3da99ead1930a2b34d53967dda4f1ef5 new file mode 100644 index 0000000..1120ec0 Binary files /dev/null and b/Library/Artifacts/3d/3da99ead1930a2b34d53967dda4f1ef5 differ diff --git a/Library/Artifacts/3d/3dd3ea9cea596e4cb128c09b434e0a66 b/Library/Artifacts/3d/3dd3ea9cea596e4cb128c09b434e0a66 new file mode 100644 index 0000000..d47ea50 Binary files /dev/null and b/Library/Artifacts/3d/3dd3ea9cea596e4cb128c09b434e0a66 differ diff --git a/Library/Artifacts/3e/3e4852449343f6b98b2608427c711eb0 b/Library/Artifacts/3e/3e4852449343f6b98b2608427c711eb0 new file mode 100644 index 0000000..f0032be Binary files /dev/null and b/Library/Artifacts/3e/3e4852449343f6b98b2608427c711eb0 differ diff --git a/Library/Artifacts/3e/3e51d01940f07df0f95816a86f03673e b/Library/Artifacts/3e/3e51d01940f07df0f95816a86f03673e new file mode 100644 index 0000000..6d2a68d Binary files /dev/null and b/Library/Artifacts/3e/3e51d01940f07df0f95816a86f03673e differ diff --git a/Library/Artifacts/3e/3e66a338c392c6b0f5729cb3114c5e30 b/Library/Artifacts/3e/3e66a338c392c6b0f5729cb3114c5e30 new file mode 100644 index 0000000..f42a999 Binary files /dev/null and b/Library/Artifacts/3e/3e66a338c392c6b0f5729cb3114c5e30 differ diff --git a/Library/Artifacts/3e/3e7a8ebecba688ee24402f2dacd893c8 b/Library/Artifacts/3e/3e7a8ebecba688ee24402f2dacd893c8 new file mode 100644 index 0000000..5ef08d7 Binary files /dev/null and b/Library/Artifacts/3e/3e7a8ebecba688ee24402f2dacd893c8 differ diff --git a/Library/Artifacts/3e/3e88e392a0623ab066109bd35639fff6 b/Library/Artifacts/3e/3e88e392a0623ab066109bd35639fff6 new file mode 100644 index 0000000..e17f9bd Binary files /dev/null and b/Library/Artifacts/3e/3e88e392a0623ab066109bd35639fff6 differ diff --git a/Library/Artifacts/3e/3e8b13aae2cc67221facb380e0090909 b/Library/Artifacts/3e/3e8b13aae2cc67221facb380e0090909 new file mode 100644 index 0000000..d25c8c1 Binary files /dev/null and b/Library/Artifacts/3e/3e8b13aae2cc67221facb380e0090909 differ diff --git a/Library/Artifacts/3e/3ecc52b9ea9682dc8a381a2b65f07654 b/Library/Artifacts/3e/3ecc52b9ea9682dc8a381a2b65f07654 new file mode 100644 index 0000000..93bbd19 Binary files /dev/null and b/Library/Artifacts/3e/3ecc52b9ea9682dc8a381a2b65f07654 differ diff --git a/Library/Artifacts/3e/3ed4b065ebe4e01f8b2eeab2a38f5877 b/Library/Artifacts/3e/3ed4b065ebe4e01f8b2eeab2a38f5877 new file mode 100644 index 0000000..e4d6b4b Binary files /dev/null and b/Library/Artifacts/3e/3ed4b065ebe4e01f8b2eeab2a38f5877 differ diff --git a/Library/Artifacts/3f/3f64dc7af0d006c432e475548cab11da b/Library/Artifacts/3f/3f64dc7af0d006c432e475548cab11da new file mode 100644 index 0000000..b3f541d Binary files /dev/null and b/Library/Artifacts/3f/3f64dc7af0d006c432e475548cab11da differ diff --git a/Library/Artifacts/3f/3f7be1269b102e186775ca0f9b40936f b/Library/Artifacts/3f/3f7be1269b102e186775ca0f9b40936f new file mode 100644 index 0000000..6583a05 Binary files /dev/null and b/Library/Artifacts/3f/3f7be1269b102e186775ca0f9b40936f differ diff --git a/Library/Artifacts/3f/3f878ef34779674a3880a4f567a87ff5 b/Library/Artifacts/3f/3f878ef34779674a3880a4f567a87ff5 new file mode 100644 index 0000000..6747ee5 Binary files /dev/null and b/Library/Artifacts/3f/3f878ef34779674a3880a4f567a87ff5 differ diff --git a/Library/Artifacts/3f/3f95b0c11a277df2bd5de29158a162ac b/Library/Artifacts/3f/3f95b0c11a277df2bd5de29158a162ac new file mode 100644 index 0000000..9500410 Binary files /dev/null and b/Library/Artifacts/3f/3f95b0c11a277df2bd5de29158a162ac differ diff --git a/Library/Artifacts/3f/3fe8c0f290272312f5d1da99e068f97a b/Library/Artifacts/3f/3fe8c0f290272312f5d1da99e068f97a new file mode 100644 index 0000000..43ea66d Binary files /dev/null and b/Library/Artifacts/3f/3fe8c0f290272312f5d1da99e068f97a differ diff --git a/Library/Artifacts/40/40098bba83f0231ccd68bda356b84978 b/Library/Artifacts/40/40098bba83f0231ccd68bda356b84978 new file mode 100644 index 0000000..d5ecc04 Binary files /dev/null and b/Library/Artifacts/40/40098bba83f0231ccd68bda356b84978 differ diff --git a/Library/Artifacts/40/401da16eb7dae858fdbf5e3bbc71946e b/Library/Artifacts/40/401da16eb7dae858fdbf5e3bbc71946e new file mode 100644 index 0000000..79b24b9 Binary files /dev/null and b/Library/Artifacts/40/401da16eb7dae858fdbf5e3bbc71946e differ diff --git a/Library/Artifacts/40/4042266a4b9e74d5a88fa719ba9bb80f b/Library/Artifacts/40/4042266a4b9e74d5a88fa719ba9bb80f new file mode 100644 index 0000000..856ae6b Binary files /dev/null and b/Library/Artifacts/40/4042266a4b9e74d5a88fa719ba9bb80f differ diff --git a/Library/Artifacts/40/40566722eb2c9f8739ebd7bade9a3bcf b/Library/Artifacts/40/40566722eb2c9f8739ebd7bade9a3bcf new file mode 100644 index 0000000..d79195d Binary files /dev/null and b/Library/Artifacts/40/40566722eb2c9f8739ebd7bade9a3bcf differ diff --git a/Library/Artifacts/40/40cea9e631e39f77d834865b5ee6dc9b b/Library/Artifacts/40/40cea9e631e39f77d834865b5ee6dc9b new file mode 100644 index 0000000..bdadd5c Binary files /dev/null and b/Library/Artifacts/40/40cea9e631e39f77d834865b5ee6dc9b differ diff --git a/Library/Artifacts/40/40dea64a9e732b3599cd271773c62d11 b/Library/Artifacts/40/40dea64a9e732b3599cd271773c62d11 new file mode 100644 index 0000000..2d0af3d Binary files /dev/null and b/Library/Artifacts/40/40dea64a9e732b3599cd271773c62d11 differ diff --git a/Library/Artifacts/41/4104dc8fa3afa7e22eee43771c2299b1 b/Library/Artifacts/41/4104dc8fa3afa7e22eee43771c2299b1 new file mode 100644 index 0000000..2f64eb9 Binary files /dev/null and b/Library/Artifacts/41/4104dc8fa3afa7e22eee43771c2299b1 differ diff --git a/Library/Artifacts/41/4106546e26237744f70bf47ce56a0112 b/Library/Artifacts/41/4106546e26237744f70bf47ce56a0112 new file mode 100644 index 0000000..da0b816 Binary files /dev/null and b/Library/Artifacts/41/4106546e26237744f70bf47ce56a0112 differ diff --git a/Library/Artifacts/41/410bb95246684a103b65947d04a56a9f b/Library/Artifacts/41/410bb95246684a103b65947d04a56a9f new file mode 100644 index 0000000..6871678 Binary files /dev/null and b/Library/Artifacts/41/410bb95246684a103b65947d04a56a9f differ diff --git a/Library/Artifacts/41/41160486a2fdedc8f4edd4fe045e2405 b/Library/Artifacts/41/41160486a2fdedc8f4edd4fe045e2405 new file mode 100644 index 0000000..c9fd45b Binary files /dev/null and b/Library/Artifacts/41/41160486a2fdedc8f4edd4fe045e2405 differ diff --git a/Library/Artifacts/41/411a14de3f1b19ad2f222e92ac3ae475 b/Library/Artifacts/41/411a14de3f1b19ad2f222e92ac3ae475 new file mode 100644 index 0000000..4a41c33 Binary files /dev/null and b/Library/Artifacts/41/411a14de3f1b19ad2f222e92ac3ae475 differ diff --git a/Library/Artifacts/41/412b4c44c020ffce367d4e434ad8b649 b/Library/Artifacts/41/412b4c44c020ffce367d4e434ad8b649 new file mode 100644 index 0000000..1bb2e13 Binary files /dev/null and b/Library/Artifacts/41/412b4c44c020ffce367d4e434ad8b649 differ diff --git a/Library/Artifacts/41/412de59d0837303a99cf1424d1a6dfe8 b/Library/Artifacts/41/412de59d0837303a99cf1424d1a6dfe8 new file mode 100644 index 0000000..c038425 Binary files /dev/null and b/Library/Artifacts/41/412de59d0837303a99cf1424d1a6dfe8 differ diff --git a/Library/Artifacts/41/4173870dc20fe08ef12867c8d982afc7 b/Library/Artifacts/41/4173870dc20fe08ef12867c8d982afc7 new file mode 100644 index 0000000..8a8f2f0 Binary files /dev/null and b/Library/Artifacts/41/4173870dc20fe08ef12867c8d982afc7 differ diff --git a/Library/Artifacts/41/417e39ce6a74ee0947f2111211ac610b b/Library/Artifacts/41/417e39ce6a74ee0947f2111211ac610b new file mode 100644 index 0000000..cf12b29 Binary files /dev/null and b/Library/Artifacts/41/417e39ce6a74ee0947f2111211ac610b differ diff --git a/Library/Artifacts/41/41a5b082677e26977810cc3496b775d0 b/Library/Artifacts/41/41a5b082677e26977810cc3496b775d0 new file mode 100644 index 0000000..2009b5a Binary files /dev/null and b/Library/Artifacts/41/41a5b082677e26977810cc3496b775d0 differ diff --git a/Library/Artifacts/41/41c6c5869236961c25aec4229d604fdb b/Library/Artifacts/41/41c6c5869236961c25aec4229d604fdb new file mode 100644 index 0000000..ca295a2 Binary files /dev/null and b/Library/Artifacts/41/41c6c5869236961c25aec4229d604fdb differ diff --git a/Library/Artifacts/41/41d452f2a76cdcca20d177cf004cc4ed b/Library/Artifacts/41/41d452f2a76cdcca20d177cf004cc4ed new file mode 100644 index 0000000..8e69fe3 Binary files /dev/null and b/Library/Artifacts/41/41d452f2a76cdcca20d177cf004cc4ed differ diff --git a/Library/Artifacts/41/41fd84bc9b41b9e268c446a6a5c3ee52 b/Library/Artifacts/41/41fd84bc9b41b9e268c446a6a5c3ee52 new file mode 100644 index 0000000..f27f288 Binary files /dev/null and b/Library/Artifacts/41/41fd84bc9b41b9e268c446a6a5c3ee52 differ diff --git a/Library/Artifacts/42/42125be72dc57867d84a27e0547d7f62 b/Library/Artifacts/42/42125be72dc57867d84a27e0547d7f62 new file mode 100644 index 0000000..ee3d07b Binary files /dev/null and b/Library/Artifacts/42/42125be72dc57867d84a27e0547d7f62 differ diff --git a/Library/Artifacts/42/423f7cd90ed24bdaba019d0abc478950 b/Library/Artifacts/42/423f7cd90ed24bdaba019d0abc478950 new file mode 100644 index 0000000..bb7bc98 Binary files /dev/null and b/Library/Artifacts/42/423f7cd90ed24bdaba019d0abc478950 differ diff --git a/Library/Artifacts/42/4244c6b19cc8cfdee4a89990113df839 b/Library/Artifacts/42/4244c6b19cc8cfdee4a89990113df839 new file mode 100644 index 0000000..7aeddf2 Binary files /dev/null and b/Library/Artifacts/42/4244c6b19cc8cfdee4a89990113df839 differ diff --git a/Library/Artifacts/42/4256e3c66cb786c9e9b8d2fdb0ff15ab b/Library/Artifacts/42/4256e3c66cb786c9e9b8d2fdb0ff15ab new file mode 100644 index 0000000..c5bbdd2 Binary files /dev/null and b/Library/Artifacts/42/4256e3c66cb786c9e9b8d2fdb0ff15ab differ diff --git a/Library/Artifacts/42/4260c436fa324091707763515ca73107 b/Library/Artifacts/42/4260c436fa324091707763515ca73107 new file mode 100644 index 0000000..893d135 Binary files /dev/null and b/Library/Artifacts/42/4260c436fa324091707763515ca73107 differ diff --git a/Library/Artifacts/42/427a74b700a5b4b43756d0289b88c17f b/Library/Artifacts/42/427a74b700a5b4b43756d0289b88c17f new file mode 100644 index 0000000..dfd2993 Binary files /dev/null and b/Library/Artifacts/42/427a74b700a5b4b43756d0289b88c17f differ diff --git a/Library/Artifacts/42/4298247ab074ae066ec056f73f621c94 b/Library/Artifacts/42/4298247ab074ae066ec056f73f621c94 new file mode 100644 index 0000000..86fd27f Binary files /dev/null and b/Library/Artifacts/42/4298247ab074ae066ec056f73f621c94 differ diff --git a/Library/Artifacts/42/42bdccfdbd69b7694b115453df0f13bf b/Library/Artifacts/42/42bdccfdbd69b7694b115453df0f13bf new file mode 100644 index 0000000..0f90f3a Binary files /dev/null and b/Library/Artifacts/42/42bdccfdbd69b7694b115453df0f13bf differ diff --git a/Library/Artifacts/42/42d16a6b4d89f312888e9d382f5e90c4 b/Library/Artifacts/42/42d16a6b4d89f312888e9d382f5e90c4 new file mode 100644 index 0000000..35acd9a Binary files /dev/null and b/Library/Artifacts/42/42d16a6b4d89f312888e9d382f5e90c4 differ diff --git a/Library/Artifacts/43/4305c32afaabeec87a012062cb26e6db b/Library/Artifacts/43/4305c32afaabeec87a012062cb26e6db new file mode 100644 index 0000000..b0d53fd Binary files /dev/null and b/Library/Artifacts/43/4305c32afaabeec87a012062cb26e6db differ diff --git a/Library/Artifacts/43/431194f535c698e710ac0bb14405c0e1 b/Library/Artifacts/43/431194f535c698e710ac0bb14405c0e1 new file mode 100644 index 0000000..43cc1d4 Binary files /dev/null and b/Library/Artifacts/43/431194f535c698e710ac0bb14405c0e1 differ diff --git a/Library/Artifacts/43/435512dc82034556e4fc42650bd2517c b/Library/Artifacts/43/435512dc82034556e4fc42650bd2517c new file mode 100644 index 0000000..60fe8b4 Binary files /dev/null and b/Library/Artifacts/43/435512dc82034556e4fc42650bd2517c differ diff --git a/Library/Artifacts/43/4396e030d3dc232ec79fc433acd0b7fc b/Library/Artifacts/43/4396e030d3dc232ec79fc433acd0b7fc new file mode 100644 index 0000000..10f1c1c Binary files /dev/null and b/Library/Artifacts/43/4396e030d3dc232ec79fc433acd0b7fc differ diff --git a/Library/Artifacts/43/43fc4bd89e8262828db22bc0a3d54485 b/Library/Artifacts/43/43fc4bd89e8262828db22bc0a3d54485 new file mode 100644 index 0000000..25bc4c6 Binary files /dev/null and b/Library/Artifacts/43/43fc4bd89e8262828db22bc0a3d54485 differ diff --git a/Library/Artifacts/44/442883e37e9a7dbd5ef9c78db0f03658 b/Library/Artifacts/44/442883e37e9a7dbd5ef9c78db0f03658 new file mode 100644 index 0000000..17df632 Binary files /dev/null and b/Library/Artifacts/44/442883e37e9a7dbd5ef9c78db0f03658 differ diff --git a/Library/Artifacts/44/4458cc719b51796e61d401caaf76fd5c b/Library/Artifacts/44/4458cc719b51796e61d401caaf76fd5c new file mode 100644 index 0000000..0654bb4 Binary files /dev/null and b/Library/Artifacts/44/4458cc719b51796e61d401caaf76fd5c differ diff --git a/Library/Artifacts/44/44679485587e81b2e49724f6b48f006d b/Library/Artifacts/44/44679485587e81b2e49724f6b48f006d new file mode 100644 index 0000000..ebe0a9b Binary files /dev/null and b/Library/Artifacts/44/44679485587e81b2e49724f6b48f006d differ diff --git a/Library/Artifacts/44/4490986a7bceb582cac5a42ba618be27 b/Library/Artifacts/44/4490986a7bceb582cac5a42ba618be27 new file mode 100644 index 0000000..b3d5552 Binary files /dev/null and b/Library/Artifacts/44/4490986a7bceb582cac5a42ba618be27 differ diff --git a/Library/Artifacts/44/449e3c3309e142b0c9fca67411d5e783 b/Library/Artifacts/44/449e3c3309e142b0c9fca67411d5e783 new file mode 100644 index 0000000..91614bc Binary files /dev/null and b/Library/Artifacts/44/449e3c3309e142b0c9fca67411d5e783 differ diff --git a/Library/Artifacts/44/44b81c35f37ca76729d0587e28239785 b/Library/Artifacts/44/44b81c35f37ca76729d0587e28239785 new file mode 100644 index 0000000..48272ea Binary files /dev/null and b/Library/Artifacts/44/44b81c35f37ca76729d0587e28239785 differ diff --git a/Library/Artifacts/44/44c106afd2439f0a719b6c03b556ad3f b/Library/Artifacts/44/44c106afd2439f0a719b6c03b556ad3f new file mode 100644 index 0000000..5975b77 Binary files /dev/null and b/Library/Artifacts/44/44c106afd2439f0a719b6c03b556ad3f differ diff --git a/Library/Artifacts/44/44cdef3bb042d2d97cb71c6773f615c6 b/Library/Artifacts/44/44cdef3bb042d2d97cb71c6773f615c6 new file mode 100644 index 0000000..a80d0ae Binary files /dev/null and b/Library/Artifacts/44/44cdef3bb042d2d97cb71c6773f615c6 differ diff --git a/Library/Artifacts/44/44d1b1df7f129a987a4ea13f86737294 b/Library/Artifacts/44/44d1b1df7f129a987a4ea13f86737294 new file mode 100644 index 0000000..f930ecf Binary files /dev/null and b/Library/Artifacts/44/44d1b1df7f129a987a4ea13f86737294 differ diff --git a/Library/Artifacts/44/44e53897d301614d680283f5f081f8d7 b/Library/Artifacts/44/44e53897d301614d680283f5f081f8d7 new file mode 100644 index 0000000..7dac35b Binary files /dev/null and b/Library/Artifacts/44/44e53897d301614d680283f5f081f8d7 differ diff --git a/Library/Artifacts/44/44e66b1327390e29f0820da22d5bc4f7 b/Library/Artifacts/44/44e66b1327390e29f0820da22d5bc4f7 new file mode 100644 index 0000000..1ee5d7c Binary files /dev/null and b/Library/Artifacts/44/44e66b1327390e29f0820da22d5bc4f7 differ diff --git a/Library/Artifacts/45/4508ef5c629aa2275f18c0e2488f9a52 b/Library/Artifacts/45/4508ef5c629aa2275f18c0e2488f9a52 new file mode 100644 index 0000000..4546950 Binary files /dev/null and b/Library/Artifacts/45/4508ef5c629aa2275f18c0e2488f9a52 differ diff --git a/Library/Artifacts/45/450be0f5107855470d60620cc57d8529 b/Library/Artifacts/45/450be0f5107855470d60620cc57d8529 new file mode 100644 index 0000000..f348177 Binary files /dev/null and b/Library/Artifacts/45/450be0f5107855470d60620cc57d8529 differ diff --git a/Library/Artifacts/45/45625399a8e9d489443743bc1496014f b/Library/Artifacts/45/45625399a8e9d489443743bc1496014f new file mode 100644 index 0000000..0289a98 Binary files /dev/null and b/Library/Artifacts/45/45625399a8e9d489443743bc1496014f differ diff --git a/Library/Artifacts/45/4565120fca0a5a2ba794bcdcf158d7ab b/Library/Artifacts/45/4565120fca0a5a2ba794bcdcf158d7ab new file mode 100644 index 0000000..4c63643 Binary files /dev/null and b/Library/Artifacts/45/4565120fca0a5a2ba794bcdcf158d7ab differ diff --git a/Library/Artifacts/45/457e4990e54720b4c77698a5a429baee b/Library/Artifacts/45/457e4990e54720b4c77698a5a429baee new file mode 100644 index 0000000..dcb9d93 Binary files /dev/null and b/Library/Artifacts/45/457e4990e54720b4c77698a5a429baee differ diff --git a/Library/Artifacts/45/4583ade7372daad62de8b544bd56900a b/Library/Artifacts/45/4583ade7372daad62de8b544bd56900a new file mode 100644 index 0000000..71a3333 Binary files /dev/null and b/Library/Artifacts/45/4583ade7372daad62de8b544bd56900a differ diff --git a/Library/Artifacts/45/458424a9d811a7a92a8699bc579b60d2 b/Library/Artifacts/45/458424a9d811a7a92a8699bc579b60d2 new file mode 100644 index 0000000..83c4911 Binary files /dev/null and b/Library/Artifacts/45/458424a9d811a7a92a8699bc579b60d2 differ diff --git a/Library/Artifacts/45/459d61af032a3795aaf4122dceff2b5e b/Library/Artifacts/45/459d61af032a3795aaf4122dceff2b5e new file mode 100644 index 0000000..bd6fa4b Binary files /dev/null and b/Library/Artifacts/45/459d61af032a3795aaf4122dceff2b5e differ diff --git a/Library/Artifacts/45/45d6c59ce0fb998344a1d9ae69ce0c2c b/Library/Artifacts/45/45d6c59ce0fb998344a1d9ae69ce0c2c new file mode 100644 index 0000000..6fc8442 Binary files /dev/null and b/Library/Artifacts/45/45d6c59ce0fb998344a1d9ae69ce0c2c differ diff --git a/Library/Artifacts/45/45f499828ae81ab0cf19b34a1ba7a568 b/Library/Artifacts/45/45f499828ae81ab0cf19b34a1ba7a568 new file mode 100644 index 0000000..f3c6804 Binary files /dev/null and b/Library/Artifacts/45/45f499828ae81ab0cf19b34a1ba7a568 differ diff --git a/Library/Artifacts/46/4622d0051127f13272cb6c35d7e92d3e b/Library/Artifacts/46/4622d0051127f13272cb6c35d7e92d3e new file mode 100644 index 0000000..6f15ec0 Binary files /dev/null and b/Library/Artifacts/46/4622d0051127f13272cb6c35d7e92d3e differ diff --git a/Library/Artifacts/46/4630126a20ddfba71910d31e0ce9c683 b/Library/Artifacts/46/4630126a20ddfba71910d31e0ce9c683 new file mode 100644 index 0000000..180c0c3 Binary files /dev/null and b/Library/Artifacts/46/4630126a20ddfba71910d31e0ce9c683 differ diff --git a/Library/Artifacts/46/46756d548225a02081a6a28dc41edef8 b/Library/Artifacts/46/46756d548225a02081a6a28dc41edef8 new file mode 100644 index 0000000..1c869ec Binary files /dev/null and b/Library/Artifacts/46/46756d548225a02081a6a28dc41edef8 differ diff --git a/Library/Artifacts/47/470bdf45c3d58239189220e5e66c6515 b/Library/Artifacts/47/470bdf45c3d58239189220e5e66c6515 new file mode 100644 index 0000000..a07df41 Binary files /dev/null and b/Library/Artifacts/47/470bdf45c3d58239189220e5e66c6515 differ diff --git a/Library/Artifacts/47/472dd484c8c1066369b03735748e9d8e b/Library/Artifacts/47/472dd484c8c1066369b03735748e9d8e new file mode 100644 index 0000000..24f0dc4 Binary files /dev/null and b/Library/Artifacts/47/472dd484c8c1066369b03735748e9d8e differ diff --git a/Library/Artifacts/47/473410be573bf62b6b800f1d0a39a09b b/Library/Artifacts/47/473410be573bf62b6b800f1d0a39a09b new file mode 100644 index 0000000..b345ecd Binary files /dev/null and b/Library/Artifacts/47/473410be573bf62b6b800f1d0a39a09b differ diff --git a/Library/Artifacts/47/475f8eca38c59c8afa99735c0580bbcd b/Library/Artifacts/47/475f8eca38c59c8afa99735c0580bbcd new file mode 100644 index 0000000..cf8c6ca Binary files /dev/null and b/Library/Artifacts/47/475f8eca38c59c8afa99735c0580bbcd differ diff --git a/Library/Artifacts/47/4775e4a018932639704c718b097c2432 b/Library/Artifacts/47/4775e4a018932639704c718b097c2432 new file mode 100644 index 0000000..a62efa4 Binary files /dev/null and b/Library/Artifacts/47/4775e4a018932639704c718b097c2432 differ diff --git a/Library/Artifacts/47/477d4d62a68be60df19b43925b3138a5 b/Library/Artifacts/47/477d4d62a68be60df19b43925b3138a5 new file mode 100644 index 0000000..29b2315 Binary files /dev/null and b/Library/Artifacts/47/477d4d62a68be60df19b43925b3138a5 differ diff --git a/Library/Artifacts/47/478d60d5bc1636d91e183a3be25c5597 b/Library/Artifacts/47/478d60d5bc1636d91e183a3be25c5597 new file mode 100644 index 0000000..77d9e52 Binary files /dev/null and b/Library/Artifacts/47/478d60d5bc1636d91e183a3be25c5597 differ diff --git a/Library/Artifacts/47/4794cf6313bde2a6165a37b1a1c05482 b/Library/Artifacts/47/4794cf6313bde2a6165a37b1a1c05482 new file mode 100644 index 0000000..e44bae5 Binary files /dev/null and b/Library/Artifacts/47/4794cf6313bde2a6165a37b1a1c05482 differ diff --git a/Library/Artifacts/47/47a202ecdf87b91313561cf5928c40af b/Library/Artifacts/47/47a202ecdf87b91313561cf5928c40af new file mode 100644 index 0000000..21865fa Binary files /dev/null and b/Library/Artifacts/47/47a202ecdf87b91313561cf5928c40af differ diff --git a/Library/Artifacts/47/47b6db49b8ff4caf91662cc9d85cdb3f b/Library/Artifacts/47/47b6db49b8ff4caf91662cc9d85cdb3f new file mode 100644 index 0000000..da22ad1 Binary files /dev/null and b/Library/Artifacts/47/47b6db49b8ff4caf91662cc9d85cdb3f differ diff --git a/Library/Artifacts/47/47cda245f6baf4fc02272acb72fa83d6 b/Library/Artifacts/47/47cda245f6baf4fc02272acb72fa83d6 new file mode 100644 index 0000000..f517571 Binary files /dev/null and b/Library/Artifacts/47/47cda245f6baf4fc02272acb72fa83d6 differ diff --git a/Library/Artifacts/47/47f6837e5fe158579197680bf03fdcb9 b/Library/Artifacts/47/47f6837e5fe158579197680bf03fdcb9 new file mode 100644 index 0000000..07782b4 Binary files /dev/null and b/Library/Artifacts/47/47f6837e5fe158579197680bf03fdcb9 differ diff --git a/Library/Artifacts/48/4823c004eb6f5c846fab174099398dd7 b/Library/Artifacts/48/4823c004eb6f5c846fab174099398dd7 new file mode 100644 index 0000000..042c00c Binary files /dev/null and b/Library/Artifacts/48/4823c004eb6f5c846fab174099398dd7 differ diff --git a/Library/Artifacts/48/48350f716d4c3ebd3aa60688299e87f6 b/Library/Artifacts/48/48350f716d4c3ebd3aa60688299e87f6 new file mode 100644 index 0000000..583aa52 Binary files /dev/null and b/Library/Artifacts/48/48350f716d4c3ebd3aa60688299e87f6 differ diff --git a/Library/Artifacts/48/483d3cc466179a913fc6a6d59ba4c6fd b/Library/Artifacts/48/483d3cc466179a913fc6a6d59ba4c6fd new file mode 100644 index 0000000..aaab7df Binary files /dev/null and b/Library/Artifacts/48/483d3cc466179a913fc6a6d59ba4c6fd differ diff --git a/Library/Artifacts/48/48403fb583a8c339acf352aa9a056e07 b/Library/Artifacts/48/48403fb583a8c339acf352aa9a056e07 new file mode 100644 index 0000000..852803d Binary files /dev/null and b/Library/Artifacts/48/48403fb583a8c339acf352aa9a056e07 differ diff --git a/Library/Artifacts/49/490ecdec600baa440a894a7b554b33d8 b/Library/Artifacts/49/490ecdec600baa440a894a7b554b33d8 new file mode 100644 index 0000000..07d1b60 Binary files /dev/null and b/Library/Artifacts/49/490ecdec600baa440a894a7b554b33d8 differ diff --git a/Library/Artifacts/49/49487d98d385d411d328daab0ab4aba8 b/Library/Artifacts/49/49487d98d385d411d328daab0ab4aba8 new file mode 100644 index 0000000..9068dc6 Binary files /dev/null and b/Library/Artifacts/49/49487d98d385d411d328daab0ab4aba8 differ diff --git a/Library/Artifacts/49/4948e128127b95d8bc463dbe6614152b b/Library/Artifacts/49/4948e128127b95d8bc463dbe6614152b new file mode 100644 index 0000000..83c2de7 Binary files /dev/null and b/Library/Artifacts/49/4948e128127b95d8bc463dbe6614152b differ diff --git a/Library/Artifacts/49/494f3e17610ee29256eb5300a81eb6dc b/Library/Artifacts/49/494f3e17610ee29256eb5300a81eb6dc new file mode 100644 index 0000000..a8708f5 Binary files /dev/null and b/Library/Artifacts/49/494f3e17610ee29256eb5300a81eb6dc differ diff --git a/Library/Artifacts/49/494fab169c6f2f3f6bae56a3ae42018e b/Library/Artifacts/49/494fab169c6f2f3f6bae56a3ae42018e new file mode 100644 index 0000000..888eef7 Binary files /dev/null and b/Library/Artifacts/49/494fab169c6f2f3f6bae56a3ae42018e differ diff --git a/Library/Artifacts/49/496c2979b427577d951ab2d0b61f5f31 b/Library/Artifacts/49/496c2979b427577d951ab2d0b61f5f31 new file mode 100644 index 0000000..3f0b9c3 Binary files /dev/null and b/Library/Artifacts/49/496c2979b427577d951ab2d0b61f5f31 differ diff --git a/Library/Artifacts/49/4973ad47b0e553b6e2d237f9c1833a82 b/Library/Artifacts/49/4973ad47b0e553b6e2d237f9c1833a82 new file mode 100644 index 0000000..e8a7926 Binary files /dev/null and b/Library/Artifacts/49/4973ad47b0e553b6e2d237f9c1833a82 differ diff --git a/Library/Artifacts/49/49ba1e5078685d196e775ebdb32e9767 b/Library/Artifacts/49/49ba1e5078685d196e775ebdb32e9767 new file mode 100644 index 0000000..30f9187 Binary files /dev/null and b/Library/Artifacts/49/49ba1e5078685d196e775ebdb32e9767 differ diff --git a/Library/Artifacts/49/49c89673f87398a45a32a99daaf5aa51 b/Library/Artifacts/49/49c89673f87398a45a32a99daaf5aa51 new file mode 100644 index 0000000..79d6cb2 Binary files /dev/null and b/Library/Artifacts/49/49c89673f87398a45a32a99daaf5aa51 differ diff --git a/Library/Artifacts/49/49ea2f4eb17a1bf07d7c52eaa29e8685 b/Library/Artifacts/49/49ea2f4eb17a1bf07d7c52eaa29e8685 new file mode 100644 index 0000000..48fdd5f Binary files /dev/null and b/Library/Artifacts/49/49ea2f4eb17a1bf07d7c52eaa29e8685 differ diff --git a/Library/Artifacts/4a/4a09acf1b6a775cad46f574c0229b6ca b/Library/Artifacts/4a/4a09acf1b6a775cad46f574c0229b6ca new file mode 100644 index 0000000..63aae90 Binary files /dev/null and b/Library/Artifacts/4a/4a09acf1b6a775cad46f574c0229b6ca differ diff --git a/Library/Artifacts/4a/4a0e34a1fbae3a33451adf32d0d480f5 b/Library/Artifacts/4a/4a0e34a1fbae3a33451adf32d0d480f5 new file mode 100644 index 0000000..522d672 Binary files /dev/null and b/Library/Artifacts/4a/4a0e34a1fbae3a33451adf32d0d480f5 differ diff --git a/Library/Artifacts/4a/4a3e2992043638f89489d169edf50c91 b/Library/Artifacts/4a/4a3e2992043638f89489d169edf50c91 new file mode 100644 index 0000000..6480497 Binary files /dev/null and b/Library/Artifacts/4a/4a3e2992043638f89489d169edf50c91 differ diff --git a/Library/Artifacts/4a/4a56c529c383f1b3e6f8e10e7dea4b93 b/Library/Artifacts/4a/4a56c529c383f1b3e6f8e10e7dea4b93 new file mode 100644 index 0000000..1a32801 Binary files /dev/null and b/Library/Artifacts/4a/4a56c529c383f1b3e6f8e10e7dea4b93 differ diff --git a/Library/Artifacts/4a/4a60e9ba56e41987ab460c667473bc5a b/Library/Artifacts/4a/4a60e9ba56e41987ab460c667473bc5a new file mode 100644 index 0000000..9e4b212 Binary files /dev/null and b/Library/Artifacts/4a/4a60e9ba56e41987ab460c667473bc5a differ diff --git a/Library/Artifacts/4a/4a6eb6fa0093e2869920740eb0240ec1 b/Library/Artifacts/4a/4a6eb6fa0093e2869920740eb0240ec1 new file mode 100644 index 0000000..41f5510 Binary files /dev/null and b/Library/Artifacts/4a/4a6eb6fa0093e2869920740eb0240ec1 differ diff --git a/Library/Artifacts/4a/4a82fb86e85822531a303a8c3f6978d8 b/Library/Artifacts/4a/4a82fb86e85822531a303a8c3f6978d8 new file mode 100644 index 0000000..7763172 Binary files /dev/null and b/Library/Artifacts/4a/4a82fb86e85822531a303a8c3f6978d8 differ diff --git a/Library/Artifacts/4a/4a9f52113a23b119d2539e4c26f3ffdb b/Library/Artifacts/4a/4a9f52113a23b119d2539e4c26f3ffdb new file mode 100644 index 0000000..b05e909 Binary files /dev/null and b/Library/Artifacts/4a/4a9f52113a23b119d2539e4c26f3ffdb differ diff --git a/Library/Artifacts/4a/4aaca2460b9a45f2eeb0532252f28d3c b/Library/Artifacts/4a/4aaca2460b9a45f2eeb0532252f28d3c new file mode 100644 index 0000000..87c66dc Binary files /dev/null and b/Library/Artifacts/4a/4aaca2460b9a45f2eeb0532252f28d3c differ diff --git a/Library/Artifacts/4a/4ab149888eac793f6776e2221f07f269 b/Library/Artifacts/4a/4ab149888eac793f6776e2221f07f269 new file mode 100644 index 0000000..27d1f72 Binary files /dev/null and b/Library/Artifacts/4a/4ab149888eac793f6776e2221f07f269 differ diff --git a/Library/Artifacts/4a/4abf9e0c26e00d90dc472ce8be50050b b/Library/Artifacts/4a/4abf9e0c26e00d90dc472ce8be50050b new file mode 100644 index 0000000..f3a5169 Binary files /dev/null and b/Library/Artifacts/4a/4abf9e0c26e00d90dc472ce8be50050b differ diff --git a/Library/Artifacts/4a/4ac2bd02ab9743c4ff498ed257d9ce74 b/Library/Artifacts/4a/4ac2bd02ab9743c4ff498ed257d9ce74 new file mode 100644 index 0000000..8ceacbe Binary files /dev/null and b/Library/Artifacts/4a/4ac2bd02ab9743c4ff498ed257d9ce74 differ diff --git a/Library/Artifacts/4a/4acceb8f95881f105cb4b9e36ffbd95e b/Library/Artifacts/4a/4acceb8f95881f105cb4b9e36ffbd95e new file mode 100644 index 0000000..80d24c0 Binary files /dev/null and b/Library/Artifacts/4a/4acceb8f95881f105cb4b9e36ffbd95e differ diff --git a/Library/Artifacts/4a/4ace8432bd2248f5502925f6df245d3b b/Library/Artifacts/4a/4ace8432bd2248f5502925f6df245d3b new file mode 100644 index 0000000..f19e8c6 Binary files /dev/null and b/Library/Artifacts/4a/4ace8432bd2248f5502925f6df245d3b differ diff --git a/Library/Artifacts/4a/4ad5bda2f470acdc14f1b32722d3daf8 b/Library/Artifacts/4a/4ad5bda2f470acdc14f1b32722d3daf8 new file mode 100644 index 0000000..2127335 Binary files /dev/null and b/Library/Artifacts/4a/4ad5bda2f470acdc14f1b32722d3daf8 differ diff --git a/Library/Artifacts/4b/4b4eb7bc10366999129a00b25658c659 b/Library/Artifacts/4b/4b4eb7bc10366999129a00b25658c659 new file mode 100644 index 0000000..d0adff4 Binary files /dev/null and b/Library/Artifacts/4b/4b4eb7bc10366999129a00b25658c659 differ diff --git a/Library/Artifacts/4b/4b6a4946cc52a59b54cceac2b1a90b22 b/Library/Artifacts/4b/4b6a4946cc52a59b54cceac2b1a90b22 new file mode 100644 index 0000000..e46aeff Binary files /dev/null and b/Library/Artifacts/4b/4b6a4946cc52a59b54cceac2b1a90b22 differ diff --git a/Library/Artifacts/4b/4b89de86d21c7f192baf63463f6fe5fd b/Library/Artifacts/4b/4b89de86d21c7f192baf63463f6fe5fd new file mode 100644 index 0000000..3ed46ff Binary files /dev/null and b/Library/Artifacts/4b/4b89de86d21c7f192baf63463f6fe5fd differ diff --git a/Library/Artifacts/4b/4bffaf67dc47700f49299cb50c30f03f b/Library/Artifacts/4b/4bffaf67dc47700f49299cb50c30f03f new file mode 100644 index 0000000..baae892 Binary files /dev/null and b/Library/Artifacts/4b/4bffaf67dc47700f49299cb50c30f03f differ diff --git a/Library/Artifacts/4c/4c2571e185d659e48fb0fbb3581ada42 b/Library/Artifacts/4c/4c2571e185d659e48fb0fbb3581ada42 new file mode 100644 index 0000000..a3b75a5 Binary files /dev/null and b/Library/Artifacts/4c/4c2571e185d659e48fb0fbb3581ada42 differ diff --git a/Library/Artifacts/4c/4c34ccb8c39c7d1f579b75eab14ef47d b/Library/Artifacts/4c/4c34ccb8c39c7d1f579b75eab14ef47d new file mode 100644 index 0000000..023fb06 Binary files /dev/null and b/Library/Artifacts/4c/4c34ccb8c39c7d1f579b75eab14ef47d differ diff --git a/Library/Artifacts/4c/4c3cbf745fa01fe0113337531113ab8e b/Library/Artifacts/4c/4c3cbf745fa01fe0113337531113ab8e new file mode 100644 index 0000000..a690ad1 Binary files /dev/null and b/Library/Artifacts/4c/4c3cbf745fa01fe0113337531113ab8e differ diff --git a/Library/Artifacts/4c/4c693d776dc3f122616e7999c51c7bca b/Library/Artifacts/4c/4c693d776dc3f122616e7999c51c7bca new file mode 100644 index 0000000..8f5d398 Binary files /dev/null and b/Library/Artifacts/4c/4c693d776dc3f122616e7999c51c7bca differ diff --git a/Library/Artifacts/4c/4c7cfc6a5b43de39cecc21491afa1700 b/Library/Artifacts/4c/4c7cfc6a5b43de39cecc21491afa1700 new file mode 100644 index 0000000..9516ebb Binary files /dev/null and b/Library/Artifacts/4c/4c7cfc6a5b43de39cecc21491afa1700 differ diff --git a/Library/Artifacts/4c/4ca81fee675567ad1aa4e7449ec457fe b/Library/Artifacts/4c/4ca81fee675567ad1aa4e7449ec457fe new file mode 100644 index 0000000..00a3122 Binary files /dev/null and b/Library/Artifacts/4c/4ca81fee675567ad1aa4e7449ec457fe differ diff --git a/Library/Artifacts/4c/4cd6cf6c9876668930125f6b78147157 b/Library/Artifacts/4c/4cd6cf6c9876668930125f6b78147157 new file mode 100644 index 0000000..4c95b11 Binary files /dev/null and b/Library/Artifacts/4c/4cd6cf6c9876668930125f6b78147157 differ diff --git a/Library/Artifacts/4c/4cde00062b12eee46dbfa71de7330f31 b/Library/Artifacts/4c/4cde00062b12eee46dbfa71de7330f31 new file mode 100644 index 0000000..d6b6b4a Binary files /dev/null and b/Library/Artifacts/4c/4cde00062b12eee46dbfa71de7330f31 differ diff --git a/Library/Artifacts/4d/4d3b6896db5fa83d2cddb7f42886033b b/Library/Artifacts/4d/4d3b6896db5fa83d2cddb7f42886033b new file mode 100644 index 0000000..1c55fae Binary files /dev/null and b/Library/Artifacts/4d/4d3b6896db5fa83d2cddb7f42886033b differ diff --git a/Library/Artifacts/4d/4d635953233a71820dfb9b9e55d10de1 b/Library/Artifacts/4d/4d635953233a71820dfb9b9e55d10de1 new file mode 100644 index 0000000..009dc94 Binary files /dev/null and b/Library/Artifacts/4d/4d635953233a71820dfb9b9e55d10de1 differ diff --git a/Library/Artifacts/4d/4da8504ede179f766a59024b033bec42 b/Library/Artifacts/4d/4da8504ede179f766a59024b033bec42 new file mode 100644 index 0000000..be79cc8 Binary files /dev/null and b/Library/Artifacts/4d/4da8504ede179f766a59024b033bec42 differ diff --git a/Library/Artifacts/4d/4dafc908918ee98f47b3225bf034f1ff b/Library/Artifacts/4d/4dafc908918ee98f47b3225bf034f1ff new file mode 100644 index 0000000..398d15b Binary files /dev/null and b/Library/Artifacts/4d/4dafc908918ee98f47b3225bf034f1ff differ diff --git a/Library/Artifacts/4d/4dbbf7ce2e3021a6a9a97f73256c7f08 b/Library/Artifacts/4d/4dbbf7ce2e3021a6a9a97f73256c7f08 new file mode 100644 index 0000000..a892a12 Binary files /dev/null and b/Library/Artifacts/4d/4dbbf7ce2e3021a6a9a97f73256c7f08 differ diff --git a/Library/Artifacts/4d/4dbf79aa44019ce50eb63f964fb65658 b/Library/Artifacts/4d/4dbf79aa44019ce50eb63f964fb65658 new file mode 100644 index 0000000..985c393 Binary files /dev/null and b/Library/Artifacts/4d/4dbf79aa44019ce50eb63f964fb65658 differ diff --git a/Library/Artifacts/4d/4dc236272a4ea6f976ec8c0a11aedc61 b/Library/Artifacts/4d/4dc236272a4ea6f976ec8c0a11aedc61 new file mode 100644 index 0000000..67af343 Binary files /dev/null and b/Library/Artifacts/4d/4dc236272a4ea6f976ec8c0a11aedc61 differ diff --git a/Library/Artifacts/4d/4de9008a8771852c65b0e4418c5104e3 b/Library/Artifacts/4d/4de9008a8771852c65b0e4418c5104e3 new file mode 100644 index 0000000..626f98e Binary files /dev/null and b/Library/Artifacts/4d/4de9008a8771852c65b0e4418c5104e3 differ diff --git a/Library/Artifacts/4d/4dffc7860e7b46f0663347b7d5a714fb b/Library/Artifacts/4d/4dffc7860e7b46f0663347b7d5a714fb new file mode 100644 index 0000000..1d6602a Binary files /dev/null and b/Library/Artifacts/4d/4dffc7860e7b46f0663347b7d5a714fb differ diff --git a/Library/Artifacts/4e/4e1af996c7da0b679627e53de167848b b/Library/Artifacts/4e/4e1af996c7da0b679627e53de167848b new file mode 100644 index 0000000..ceef0fe Binary files /dev/null and b/Library/Artifacts/4e/4e1af996c7da0b679627e53de167848b differ diff --git a/Library/Artifacts/4e/4e79f4739e5094cf3b17bb3eb5644043 b/Library/Artifacts/4e/4e79f4739e5094cf3b17bb3eb5644043 new file mode 100644 index 0000000..adc73a5 Binary files /dev/null and b/Library/Artifacts/4e/4e79f4739e5094cf3b17bb3eb5644043 differ diff --git a/Library/Artifacts/4e/4ea2a86866a2b86ad34d1d2db1ce916a b/Library/Artifacts/4e/4ea2a86866a2b86ad34d1d2db1ce916a new file mode 100644 index 0000000..c77b9e8 Binary files /dev/null and b/Library/Artifacts/4e/4ea2a86866a2b86ad34d1d2db1ce916a differ diff --git a/Library/Artifacts/4e/4eac69a30e94366a4b3f3fa669e88158 b/Library/Artifacts/4e/4eac69a30e94366a4b3f3fa669e88158 new file mode 100644 index 0000000..2bee28b Binary files /dev/null and b/Library/Artifacts/4e/4eac69a30e94366a4b3f3fa669e88158 differ diff --git a/Library/Artifacts/4e/4eb06434862d0fe245f497f61037730b b/Library/Artifacts/4e/4eb06434862d0fe245f497f61037730b new file mode 100644 index 0000000..e173cea Binary files /dev/null and b/Library/Artifacts/4e/4eb06434862d0fe245f497f61037730b differ diff --git a/Library/Artifacts/4e/4ed5daac6befca21f895284c6e4c2a6f b/Library/Artifacts/4e/4ed5daac6befca21f895284c6e4c2a6f new file mode 100644 index 0000000..3de1f6e Binary files /dev/null and b/Library/Artifacts/4e/4ed5daac6befca21f895284c6e4c2a6f differ diff --git a/Library/Artifacts/4e/4edb9d9cd9a7ac10612285895d5eaf12 b/Library/Artifacts/4e/4edb9d9cd9a7ac10612285895d5eaf12 new file mode 100644 index 0000000..9b24dbd Binary files /dev/null and b/Library/Artifacts/4e/4edb9d9cd9a7ac10612285895d5eaf12 differ diff --git a/Library/Artifacts/4f/4f21d7ba9ef526d68aaf0f405260d311 b/Library/Artifacts/4f/4f21d7ba9ef526d68aaf0f405260d311 new file mode 100644 index 0000000..f4588d6 Binary files /dev/null and b/Library/Artifacts/4f/4f21d7ba9ef526d68aaf0f405260d311 differ diff --git a/Library/Artifacts/4f/4f41e86b92959d653753cd5c77471f14 b/Library/Artifacts/4f/4f41e86b92959d653753cd5c77471f14 new file mode 100644 index 0000000..cfc6230 Binary files /dev/null and b/Library/Artifacts/4f/4f41e86b92959d653753cd5c77471f14 differ diff --git a/Library/Artifacts/4f/4f4405d7a625374285073637e7fc42fb b/Library/Artifacts/4f/4f4405d7a625374285073637e7fc42fb new file mode 100644 index 0000000..f801401 Binary files /dev/null and b/Library/Artifacts/4f/4f4405d7a625374285073637e7fc42fb differ diff --git a/Library/Artifacts/4f/4f5efd348bddeca3f380ac82545dbc13 b/Library/Artifacts/4f/4f5efd348bddeca3f380ac82545dbc13 new file mode 100644 index 0000000..e532bb8 Binary files /dev/null and b/Library/Artifacts/4f/4f5efd348bddeca3f380ac82545dbc13 differ diff --git a/Library/Artifacts/4f/4f84829302fb459ca6b09699c655f3a0 b/Library/Artifacts/4f/4f84829302fb459ca6b09699c655f3a0 new file mode 100644 index 0000000..c274b0b Binary files /dev/null and b/Library/Artifacts/4f/4f84829302fb459ca6b09699c655f3a0 differ diff --git a/Library/Artifacts/4f/4fc39e9d472f6b2f0c4658a446e5f3a4 b/Library/Artifacts/4f/4fc39e9d472f6b2f0c4658a446e5f3a4 new file mode 100644 index 0000000..3588b7b Binary files /dev/null and b/Library/Artifacts/4f/4fc39e9d472f6b2f0c4658a446e5f3a4 differ diff --git a/Library/Artifacts/4f/4fd0ef87e47bae0b1d45937c7bb27c91 b/Library/Artifacts/4f/4fd0ef87e47bae0b1d45937c7bb27c91 new file mode 100644 index 0000000..53edb44 Binary files /dev/null and b/Library/Artifacts/4f/4fd0ef87e47bae0b1d45937c7bb27c91 differ diff --git a/Library/Artifacts/50/5008a5510528d4543c374405d365b03b b/Library/Artifacts/50/5008a5510528d4543c374405d365b03b new file mode 100644 index 0000000..d527d2d Binary files /dev/null and b/Library/Artifacts/50/5008a5510528d4543c374405d365b03b differ diff --git a/Library/Artifacts/50/503cc7cf465619d1554f3b188c16e22f b/Library/Artifacts/50/503cc7cf465619d1554f3b188c16e22f new file mode 100644 index 0000000..b064d76 Binary files /dev/null and b/Library/Artifacts/50/503cc7cf465619d1554f3b188c16e22f differ diff --git a/Library/Artifacts/50/50b61f8dd9b46738e6b37b79db6a7126 b/Library/Artifacts/50/50b61f8dd9b46738e6b37b79db6a7126 new file mode 100644 index 0000000..b481244 Binary files /dev/null and b/Library/Artifacts/50/50b61f8dd9b46738e6b37b79db6a7126 differ diff --git a/Library/Artifacts/51/5116fbb39874b6b6845227523d7da5bb b/Library/Artifacts/51/5116fbb39874b6b6845227523d7da5bb new file mode 100644 index 0000000..9dffd9e Binary files /dev/null and b/Library/Artifacts/51/5116fbb39874b6b6845227523d7da5bb differ diff --git a/Library/Artifacts/51/51594ce3fe4cb601b56378fb46d81ca5 b/Library/Artifacts/51/51594ce3fe4cb601b56378fb46d81ca5 new file mode 100644 index 0000000..30bffab Binary files /dev/null and b/Library/Artifacts/51/51594ce3fe4cb601b56378fb46d81ca5 differ diff --git a/Library/Artifacts/51/5165fa49bc2342fb0c328f8e0f9889af b/Library/Artifacts/51/5165fa49bc2342fb0c328f8e0f9889af new file mode 100644 index 0000000..3a9871d Binary files /dev/null and b/Library/Artifacts/51/5165fa49bc2342fb0c328f8e0f9889af differ diff --git a/Library/Artifacts/51/516f026454a1d35dc67308d7d0874649 b/Library/Artifacts/51/516f026454a1d35dc67308d7d0874649 new file mode 100644 index 0000000..4d3385d Binary files /dev/null and b/Library/Artifacts/51/516f026454a1d35dc67308d7d0874649 differ diff --git a/Library/Artifacts/51/519821617d1cdb42dae6fd6982d2a03f b/Library/Artifacts/51/519821617d1cdb42dae6fd6982d2a03f new file mode 100644 index 0000000..446d4ca Binary files /dev/null and b/Library/Artifacts/51/519821617d1cdb42dae6fd6982d2a03f differ diff --git a/Library/Artifacts/51/51a06f38648fda453bcdd24c26339b67 b/Library/Artifacts/51/51a06f38648fda453bcdd24c26339b67 new file mode 100644 index 0000000..c17a7a9 Binary files /dev/null and b/Library/Artifacts/51/51a06f38648fda453bcdd24c26339b67 differ diff --git a/Library/Artifacts/51/51d1f84483bdc15b696c7d666cd5a3e1 b/Library/Artifacts/51/51d1f84483bdc15b696c7d666cd5a3e1 new file mode 100644 index 0000000..203aecc Binary files /dev/null and b/Library/Artifacts/51/51d1f84483bdc15b696c7d666cd5a3e1 differ diff --git a/Library/Artifacts/51/51f42e1c73dc14320bc5bedfa53f6df8 b/Library/Artifacts/51/51f42e1c73dc14320bc5bedfa53f6df8 new file mode 100644 index 0000000..b921db8 Binary files /dev/null and b/Library/Artifacts/51/51f42e1c73dc14320bc5bedfa53f6df8 differ diff --git a/Library/Artifacts/52/5214c93edbb4df81989a04d8d918222a b/Library/Artifacts/52/5214c93edbb4df81989a04d8d918222a new file mode 100644 index 0000000..778f8ad Binary files /dev/null and b/Library/Artifacts/52/5214c93edbb4df81989a04d8d918222a differ diff --git a/Library/Artifacts/52/5237572b9bdd764fabd2662575fd589a b/Library/Artifacts/52/5237572b9bdd764fabd2662575fd589a new file mode 100644 index 0000000..55fe41e Binary files /dev/null and b/Library/Artifacts/52/5237572b9bdd764fabd2662575fd589a differ diff --git a/Library/Artifacts/52/5258bf78649159e4d29f114852ec004c b/Library/Artifacts/52/5258bf78649159e4d29f114852ec004c new file mode 100644 index 0000000..77f8ce0 Binary files /dev/null and b/Library/Artifacts/52/5258bf78649159e4d29f114852ec004c differ diff --git a/Library/Artifacts/52/52a3336694141a15a3795113073086b1 b/Library/Artifacts/52/52a3336694141a15a3795113073086b1 new file mode 100644 index 0000000..791de9a Binary files /dev/null and b/Library/Artifacts/52/52a3336694141a15a3795113073086b1 differ diff --git a/Library/Artifacts/52/52bd9dbf6e0c5a6ccf6afbdc487fad5e b/Library/Artifacts/52/52bd9dbf6e0c5a6ccf6afbdc487fad5e new file mode 100644 index 0000000..ffba66e Binary files /dev/null and b/Library/Artifacts/52/52bd9dbf6e0c5a6ccf6afbdc487fad5e differ diff --git a/Library/Artifacts/52/52e106087fa66a10e98d147e0e39138f b/Library/Artifacts/52/52e106087fa66a10e98d147e0e39138f new file mode 100644 index 0000000..15298b4 Binary files /dev/null and b/Library/Artifacts/52/52e106087fa66a10e98d147e0e39138f differ diff --git a/Library/Artifacts/52/52e23132cbdfd60effe2d9b4d36900e7 b/Library/Artifacts/52/52e23132cbdfd60effe2d9b4d36900e7 new file mode 100644 index 0000000..f8de04e Binary files /dev/null and b/Library/Artifacts/52/52e23132cbdfd60effe2d9b4d36900e7 differ diff --git a/Library/Artifacts/52/52e8336efa1e3b1d551392f96fbe1a67 b/Library/Artifacts/52/52e8336efa1e3b1d551392f96fbe1a67 new file mode 100644 index 0000000..e76f3b2 Binary files /dev/null and b/Library/Artifacts/52/52e8336efa1e3b1d551392f96fbe1a67 differ diff --git a/Library/Artifacts/53/5364f70e60fa5b98e6648a71c62ceb92 b/Library/Artifacts/53/5364f70e60fa5b98e6648a71c62ceb92 new file mode 100644 index 0000000..de30e4e Binary files /dev/null and b/Library/Artifacts/53/5364f70e60fa5b98e6648a71c62ceb92 differ diff --git a/Library/Artifacts/53/537579fc110481fac7dffc22d32b0183 b/Library/Artifacts/53/537579fc110481fac7dffc22d32b0183 new file mode 100644 index 0000000..8599d47 Binary files /dev/null and b/Library/Artifacts/53/537579fc110481fac7dffc22d32b0183 differ diff --git a/Library/Artifacts/53/53b5ad6afb9ceed957c993da9ccb6b5d b/Library/Artifacts/53/53b5ad6afb9ceed957c993da9ccb6b5d new file mode 100644 index 0000000..c39558a Binary files /dev/null and b/Library/Artifacts/53/53b5ad6afb9ceed957c993da9ccb6b5d differ diff --git a/Library/Artifacts/53/53bf28334bec4a349fb0a82fa4c357a4 b/Library/Artifacts/53/53bf28334bec4a349fb0a82fa4c357a4 new file mode 100644 index 0000000..5a2e5db Binary files /dev/null and b/Library/Artifacts/53/53bf28334bec4a349fb0a82fa4c357a4 differ diff --git a/Library/Artifacts/53/53c85e67f72f414d8ccbc610f67e588b b/Library/Artifacts/53/53c85e67f72f414d8ccbc610f67e588b new file mode 100644 index 0000000..a184e92 Binary files /dev/null and b/Library/Artifacts/53/53c85e67f72f414d8ccbc610f67e588b differ diff --git a/Library/Artifacts/53/53fb8dde7ef2047740bfcf0b1e2c4f2c b/Library/Artifacts/53/53fb8dde7ef2047740bfcf0b1e2c4f2c new file mode 100644 index 0000000..298afb2 Binary files /dev/null and b/Library/Artifacts/53/53fb8dde7ef2047740bfcf0b1e2c4f2c differ diff --git a/Library/Artifacts/54/5409a7ec95ca5b53cf61ae4fb5234647 b/Library/Artifacts/54/5409a7ec95ca5b53cf61ae4fb5234647 new file mode 100644 index 0000000..eb421ad Binary files /dev/null and b/Library/Artifacts/54/5409a7ec95ca5b53cf61ae4fb5234647 differ diff --git a/Library/Artifacts/54/5434adcab9bb508c8dc0961c249fec3e b/Library/Artifacts/54/5434adcab9bb508c8dc0961c249fec3e new file mode 100644 index 0000000..fe98e91 Binary files /dev/null and b/Library/Artifacts/54/5434adcab9bb508c8dc0961c249fec3e differ diff --git a/Library/Artifacts/54/54433c027d0db3c2c98131ac88d19ab9 b/Library/Artifacts/54/54433c027d0db3c2c98131ac88d19ab9 new file mode 100644 index 0000000..d8f0aba Binary files /dev/null and b/Library/Artifacts/54/54433c027d0db3c2c98131ac88d19ab9 differ diff --git a/Library/Artifacts/54/5470ed3ea80a6b5498143d90581a6ce2 b/Library/Artifacts/54/5470ed3ea80a6b5498143d90581a6ce2 new file mode 100644 index 0000000..936227e Binary files /dev/null and b/Library/Artifacts/54/5470ed3ea80a6b5498143d90581a6ce2 differ diff --git a/Library/Artifacts/54/547daa2dd7eaf37067275589b82153d8 b/Library/Artifacts/54/547daa2dd7eaf37067275589b82153d8 new file mode 100644 index 0000000..dab5c16 Binary files /dev/null and b/Library/Artifacts/54/547daa2dd7eaf37067275589b82153d8 differ diff --git a/Library/Artifacts/54/547f302659439b48854c353eea330b44 b/Library/Artifacts/54/547f302659439b48854c353eea330b44 new file mode 100644 index 0000000..4e2d096 Binary files /dev/null and b/Library/Artifacts/54/547f302659439b48854c353eea330b44 differ diff --git a/Library/Artifacts/54/5496433913aabecb3246b453cdc5af93 b/Library/Artifacts/54/5496433913aabecb3246b453cdc5af93 new file mode 100644 index 0000000..0c4b463 Binary files /dev/null and b/Library/Artifacts/54/5496433913aabecb3246b453cdc5af93 differ diff --git a/Library/Artifacts/54/54bb6a0ca1571306b7f73825f06b0248 b/Library/Artifacts/54/54bb6a0ca1571306b7f73825f06b0248 new file mode 100644 index 0000000..a09ea0a Binary files /dev/null and b/Library/Artifacts/54/54bb6a0ca1571306b7f73825f06b0248 differ diff --git a/Library/Artifacts/55/550dab7f8dc2dba0d4059c10f509757a b/Library/Artifacts/55/550dab7f8dc2dba0d4059c10f509757a new file mode 100644 index 0000000..9f7ca7c Binary files /dev/null and b/Library/Artifacts/55/550dab7f8dc2dba0d4059c10f509757a differ diff --git a/Library/Artifacts/55/55117f25294db9bd1dbccefb1802f827 b/Library/Artifacts/55/55117f25294db9bd1dbccefb1802f827 new file mode 100644 index 0000000..9526b03 Binary files /dev/null and b/Library/Artifacts/55/55117f25294db9bd1dbccefb1802f827 differ diff --git a/Library/Artifacts/55/5517e39afd4dfd78d8e897b11bea32b6 b/Library/Artifacts/55/5517e39afd4dfd78d8e897b11bea32b6 new file mode 100644 index 0000000..8d618b1 Binary files /dev/null and b/Library/Artifacts/55/5517e39afd4dfd78d8e897b11bea32b6 differ diff --git a/Library/Artifacts/55/551c005c5ec4010b5f44215d163417f7 b/Library/Artifacts/55/551c005c5ec4010b5f44215d163417f7 new file mode 100644 index 0000000..de2f2c4 Binary files /dev/null and b/Library/Artifacts/55/551c005c5ec4010b5f44215d163417f7 differ diff --git a/Library/Artifacts/55/5584d01306eb6c939fa25961b04b7248 b/Library/Artifacts/55/5584d01306eb6c939fa25961b04b7248 new file mode 100644 index 0000000..170a081 Binary files /dev/null and b/Library/Artifacts/55/5584d01306eb6c939fa25961b04b7248 differ diff --git a/Library/Artifacts/55/558c8ee14fd29c2d16ef7e9b76929bda b/Library/Artifacts/55/558c8ee14fd29c2d16ef7e9b76929bda new file mode 100644 index 0000000..c2f729c Binary files /dev/null and b/Library/Artifacts/55/558c8ee14fd29c2d16ef7e9b76929bda differ diff --git a/Library/Artifacts/55/55995b5c64b5017e89d8039fe0e98d23 b/Library/Artifacts/55/55995b5c64b5017e89d8039fe0e98d23 new file mode 100644 index 0000000..707d5c8 Binary files /dev/null and b/Library/Artifacts/55/55995b5c64b5017e89d8039fe0e98d23 differ diff --git a/Library/Artifacts/55/55ae7e1b7d12d9d9c5f1effcd1c9c304 b/Library/Artifacts/55/55ae7e1b7d12d9d9c5f1effcd1c9c304 new file mode 100644 index 0000000..cf21141 Binary files /dev/null and b/Library/Artifacts/55/55ae7e1b7d12d9d9c5f1effcd1c9c304 differ diff --git a/Library/Artifacts/55/55d46fec5a11a10f37eb6722cc5a3605 b/Library/Artifacts/55/55d46fec5a11a10f37eb6722cc5a3605 new file mode 100644 index 0000000..74acc88 Binary files /dev/null and b/Library/Artifacts/55/55d46fec5a11a10f37eb6722cc5a3605 differ diff --git a/Library/Artifacts/56/56596ab0eb371777de482d26b5191d62 b/Library/Artifacts/56/56596ab0eb371777de482d26b5191d62 new file mode 100644 index 0000000..94ddb16 Binary files /dev/null and b/Library/Artifacts/56/56596ab0eb371777de482d26b5191d62 differ diff --git a/Library/Artifacts/56/568792038545f0ac8507711669ddc248 b/Library/Artifacts/56/568792038545f0ac8507711669ddc248 new file mode 100644 index 0000000..0b49610 Binary files /dev/null and b/Library/Artifacts/56/568792038545f0ac8507711669ddc248 differ diff --git a/Library/Artifacts/56/568f02adad6b8f9da6e41c9b93199679 b/Library/Artifacts/56/568f02adad6b8f9da6e41c9b93199679 new file mode 100644 index 0000000..48156dd Binary files /dev/null and b/Library/Artifacts/56/568f02adad6b8f9da6e41c9b93199679 differ diff --git a/Library/Artifacts/56/56942d18f97a1268fefea37f1cf73f9f b/Library/Artifacts/56/56942d18f97a1268fefea37f1cf73f9f new file mode 100644 index 0000000..a86e852 Binary files /dev/null and b/Library/Artifacts/56/56942d18f97a1268fefea37f1cf73f9f differ diff --git a/Library/Artifacts/56/56d9c8bcbb4ddec28453de3850fdc64d b/Library/Artifacts/56/56d9c8bcbb4ddec28453de3850fdc64d new file mode 100644 index 0000000..f33da7e Binary files /dev/null and b/Library/Artifacts/56/56d9c8bcbb4ddec28453de3850fdc64d differ diff --git a/Library/Artifacts/56/56e690bfe2300c79b842009c9c1069c4 b/Library/Artifacts/56/56e690bfe2300c79b842009c9c1069c4 new file mode 100644 index 0000000..7e4c506 Binary files /dev/null and b/Library/Artifacts/56/56e690bfe2300c79b842009c9c1069c4 differ diff --git a/Library/Artifacts/57/576796e4e4f3954bc81724f28214d29b b/Library/Artifacts/57/576796e4e4f3954bc81724f28214d29b new file mode 100644 index 0000000..df0af20 Binary files /dev/null and b/Library/Artifacts/57/576796e4e4f3954bc81724f28214d29b differ diff --git a/Library/Artifacts/57/5768a34e9532f918c0f565ade4d31758 b/Library/Artifacts/57/5768a34e9532f918c0f565ade4d31758 new file mode 100644 index 0000000..7c61447 Binary files /dev/null and b/Library/Artifacts/57/5768a34e9532f918c0f565ade4d31758 differ diff --git a/Library/Artifacts/57/576ee7bf1b4b6202cd8daa2cce383dbf b/Library/Artifacts/57/576ee7bf1b4b6202cd8daa2cce383dbf new file mode 100644 index 0000000..2f4622d Binary files /dev/null and b/Library/Artifacts/57/576ee7bf1b4b6202cd8daa2cce383dbf differ diff --git a/Library/Artifacts/57/5771a5923feb27e1e74c6f0131fc6196 b/Library/Artifacts/57/5771a5923feb27e1e74c6f0131fc6196 new file mode 100644 index 0000000..f18d4ab Binary files /dev/null and b/Library/Artifacts/57/5771a5923feb27e1e74c6f0131fc6196 differ diff --git a/Library/Artifacts/57/5779daef3ab13504cd6849ec88530b68 b/Library/Artifacts/57/5779daef3ab13504cd6849ec88530b68 new file mode 100644 index 0000000..6694905 Binary files /dev/null and b/Library/Artifacts/57/5779daef3ab13504cd6849ec88530b68 differ diff --git a/Library/Artifacts/57/57883047a954afbdf7b606e169a49b3d b/Library/Artifacts/57/57883047a954afbdf7b606e169a49b3d new file mode 100644 index 0000000..46cbbdb Binary files /dev/null and b/Library/Artifacts/57/57883047a954afbdf7b606e169a49b3d differ diff --git a/Library/Artifacts/57/579964ad2d8e68d446859d7d7d3e6d59 b/Library/Artifacts/57/579964ad2d8e68d446859d7d7d3e6d59 new file mode 100644 index 0000000..e8c4242 Binary files /dev/null and b/Library/Artifacts/57/579964ad2d8e68d446859d7d7d3e6d59 differ diff --git a/Library/Artifacts/57/57d39994dea62020b35a02abb4c72909 b/Library/Artifacts/57/57d39994dea62020b35a02abb4c72909 new file mode 100644 index 0000000..598c2b1 Binary files /dev/null and b/Library/Artifacts/57/57d39994dea62020b35a02abb4c72909 differ diff --git a/Library/Artifacts/57/57d5f35864447e23528faa9df78b0c0a b/Library/Artifacts/57/57d5f35864447e23528faa9df78b0c0a new file mode 100644 index 0000000..a699441 Binary files /dev/null and b/Library/Artifacts/57/57d5f35864447e23528faa9df78b0c0a differ diff --git a/Library/Artifacts/57/57fa16917be33609253fe7ff4d2be84c b/Library/Artifacts/57/57fa16917be33609253fe7ff4d2be84c new file mode 100644 index 0000000..3aa5993 Binary files /dev/null and b/Library/Artifacts/57/57fa16917be33609253fe7ff4d2be84c differ diff --git a/Library/Artifacts/58/582bc7521541a8d0f942a1f4b0e5e19b b/Library/Artifacts/58/582bc7521541a8d0f942a1f4b0e5e19b new file mode 100644 index 0000000..964c2a8 Binary files /dev/null and b/Library/Artifacts/58/582bc7521541a8d0f942a1f4b0e5e19b differ diff --git a/Library/Artifacts/58/58512864a0ce6989d58ab272f1586f3b b/Library/Artifacts/58/58512864a0ce6989d58ab272f1586f3b new file mode 100644 index 0000000..b6dedb6 Binary files /dev/null and b/Library/Artifacts/58/58512864a0ce6989d58ab272f1586f3b differ diff --git a/Library/Artifacts/58/58530ee39fcc644829567b649a1e6a44 b/Library/Artifacts/58/58530ee39fcc644829567b649a1e6a44 new file mode 100644 index 0000000..444d91f Binary files /dev/null and b/Library/Artifacts/58/58530ee39fcc644829567b649a1e6a44 differ diff --git a/Library/Artifacts/58/58687231fed57e12b2608459514aea60 b/Library/Artifacts/58/58687231fed57e12b2608459514aea60 new file mode 100644 index 0000000..a9a5ec3 Binary files /dev/null and b/Library/Artifacts/58/58687231fed57e12b2608459514aea60 differ diff --git a/Library/Artifacts/58/587098fc6be26d0a16c930659b612b21 b/Library/Artifacts/58/587098fc6be26d0a16c930659b612b21 new file mode 100644 index 0000000..4609c60 Binary files /dev/null and b/Library/Artifacts/58/587098fc6be26d0a16c930659b612b21 differ diff --git a/Library/Artifacts/58/58794c762190574cbe6afd8020ec73c1 b/Library/Artifacts/58/58794c762190574cbe6afd8020ec73c1 new file mode 100644 index 0000000..b88f915 Binary files /dev/null and b/Library/Artifacts/58/58794c762190574cbe6afd8020ec73c1 differ diff --git a/Library/Artifacts/58/589dff1bd974d80741e2b2389c9f1d1b b/Library/Artifacts/58/589dff1bd974d80741e2b2389c9f1d1b new file mode 100644 index 0000000..33f0c47 Binary files /dev/null and b/Library/Artifacts/58/589dff1bd974d80741e2b2389c9f1d1b differ diff --git a/Library/Artifacts/58/58ca184cf1be70a178c03977f34c80df b/Library/Artifacts/58/58ca184cf1be70a178c03977f34c80df new file mode 100644 index 0000000..38d9440 Binary files /dev/null and b/Library/Artifacts/58/58ca184cf1be70a178c03977f34c80df differ diff --git a/Library/Artifacts/58/58cc2add20759a6d235413a3297d1d23 b/Library/Artifacts/58/58cc2add20759a6d235413a3297d1d23 new file mode 100644 index 0000000..1f8d37c Binary files /dev/null and b/Library/Artifacts/58/58cc2add20759a6d235413a3297d1d23 differ diff --git a/Library/Artifacts/58/58da4c21d4dc07794b4773f7d3ac61bb b/Library/Artifacts/58/58da4c21d4dc07794b4773f7d3ac61bb new file mode 100644 index 0000000..45afd68 Binary files /dev/null and b/Library/Artifacts/58/58da4c21d4dc07794b4773f7d3ac61bb differ diff --git a/Library/Artifacts/58/58ef0baf65b6f697be94916456087607 b/Library/Artifacts/58/58ef0baf65b6f697be94916456087607 new file mode 100644 index 0000000..962b9b6 Binary files /dev/null and b/Library/Artifacts/58/58ef0baf65b6f697be94916456087607 differ diff --git a/Library/Artifacts/59/593eb51990949e86a4b5371e0662cdf9 b/Library/Artifacts/59/593eb51990949e86a4b5371e0662cdf9 new file mode 100644 index 0000000..1b6bb11 Binary files /dev/null and b/Library/Artifacts/59/593eb51990949e86a4b5371e0662cdf9 differ diff --git a/Library/Artifacts/59/596ddf60090c07eeb0365d787bb3bbb6 b/Library/Artifacts/59/596ddf60090c07eeb0365d787bb3bbb6 new file mode 100644 index 0000000..fae6565 Binary files /dev/null and b/Library/Artifacts/59/596ddf60090c07eeb0365d787bb3bbb6 differ diff --git a/Library/Artifacts/59/5984b1a24ddf62333121cf5835a78f06 b/Library/Artifacts/59/5984b1a24ddf62333121cf5835a78f06 new file mode 100644 index 0000000..d18cd26 Binary files /dev/null and b/Library/Artifacts/59/5984b1a24ddf62333121cf5835a78f06 differ diff --git a/Library/Artifacts/59/59b42aa64289435433034ee93692864c b/Library/Artifacts/59/59b42aa64289435433034ee93692864c new file mode 100644 index 0000000..67b6622 Binary files /dev/null and b/Library/Artifacts/59/59b42aa64289435433034ee93692864c differ diff --git a/Library/Artifacts/59/59e5a64fd86ece6b4e07613830269fb4 b/Library/Artifacts/59/59e5a64fd86ece6b4e07613830269fb4 new file mode 100644 index 0000000..c03cdd1 Binary files /dev/null and b/Library/Artifacts/59/59e5a64fd86ece6b4e07613830269fb4 differ diff --git a/Library/Artifacts/59/59fd3cea8a93edc366d018b5ffdb0fbe b/Library/Artifacts/59/59fd3cea8a93edc366d018b5ffdb0fbe new file mode 100644 index 0000000..06ba41a Binary files /dev/null and b/Library/Artifacts/59/59fd3cea8a93edc366d018b5ffdb0fbe differ diff --git a/Library/Artifacts/59/59fd69907bdd91d618bf8716fcc9111e b/Library/Artifacts/59/59fd69907bdd91d618bf8716fcc9111e new file mode 100644 index 0000000..2d8b3fb Binary files /dev/null and b/Library/Artifacts/59/59fd69907bdd91d618bf8716fcc9111e differ diff --git a/Library/Artifacts/59/59fe412e4677eeb7cdcac1d0ec6d1082 b/Library/Artifacts/59/59fe412e4677eeb7cdcac1d0ec6d1082 new file mode 100644 index 0000000..e297af5 Binary files /dev/null and b/Library/Artifacts/59/59fe412e4677eeb7cdcac1d0ec6d1082 differ diff --git a/Library/Artifacts/5a/5a8e9d41a638196100bb67afbdc8e6f5 b/Library/Artifacts/5a/5a8e9d41a638196100bb67afbdc8e6f5 new file mode 100644 index 0000000..d441188 Binary files /dev/null and b/Library/Artifacts/5a/5a8e9d41a638196100bb67afbdc8e6f5 differ diff --git a/Library/Artifacts/5a/5aacbacc831de886a02634d69e958fc1 b/Library/Artifacts/5a/5aacbacc831de886a02634d69e958fc1 new file mode 100644 index 0000000..2af205e Binary files /dev/null and b/Library/Artifacts/5a/5aacbacc831de886a02634d69e958fc1 differ diff --git a/Library/Artifacts/5a/5aba4411540eacea022a037205ea25cd b/Library/Artifacts/5a/5aba4411540eacea022a037205ea25cd new file mode 100644 index 0000000..212e205 Binary files /dev/null and b/Library/Artifacts/5a/5aba4411540eacea022a037205ea25cd differ diff --git a/Library/Artifacts/5a/5abfab6164b9f644527ce1a3c8c3258d b/Library/Artifacts/5a/5abfab6164b9f644527ce1a3c8c3258d new file mode 100644 index 0000000..289e48c Binary files /dev/null and b/Library/Artifacts/5a/5abfab6164b9f644527ce1a3c8c3258d differ diff --git a/Library/Artifacts/5a/5ac3429d24b5b6fbb17a173785d13117 b/Library/Artifacts/5a/5ac3429d24b5b6fbb17a173785d13117 new file mode 100644 index 0000000..7ff8933 Binary files /dev/null and b/Library/Artifacts/5a/5ac3429d24b5b6fbb17a173785d13117 differ diff --git a/Library/Artifacts/5a/5adce4a86111867ff1e2cd0906d92793 b/Library/Artifacts/5a/5adce4a86111867ff1e2cd0906d92793 new file mode 100644 index 0000000..9d1f3a2 Binary files /dev/null and b/Library/Artifacts/5a/5adce4a86111867ff1e2cd0906d92793 differ diff --git a/Library/Artifacts/5b/5b0eb981bac5613e4f3e646929a73b94 b/Library/Artifacts/5b/5b0eb981bac5613e4f3e646929a73b94 new file mode 100644 index 0000000..7e9f861 Binary files /dev/null and b/Library/Artifacts/5b/5b0eb981bac5613e4f3e646929a73b94 differ diff --git a/Library/Artifacts/5b/5b6b01d667f70044af58cefccc735a30 b/Library/Artifacts/5b/5b6b01d667f70044af58cefccc735a30 new file mode 100644 index 0000000..6f080c0 Binary files /dev/null and b/Library/Artifacts/5b/5b6b01d667f70044af58cefccc735a30 differ diff --git a/Library/Artifacts/5b/5ba05ae27d8e8a44c41226988625e8f1 b/Library/Artifacts/5b/5ba05ae27d8e8a44c41226988625e8f1 new file mode 100644 index 0000000..537afe8 Binary files /dev/null and b/Library/Artifacts/5b/5ba05ae27d8e8a44c41226988625e8f1 differ diff --git a/Library/Artifacts/5b/5bbb5dba444f7dd66667403decf7e0cc b/Library/Artifacts/5b/5bbb5dba444f7dd66667403decf7e0cc new file mode 100644 index 0000000..ffab932 Binary files /dev/null and b/Library/Artifacts/5b/5bbb5dba444f7dd66667403decf7e0cc differ diff --git a/Library/Artifacts/5b/5bf6317d83d603b2b804851b703056ee b/Library/Artifacts/5b/5bf6317d83d603b2b804851b703056ee new file mode 100644 index 0000000..10dafc2 Binary files /dev/null and b/Library/Artifacts/5b/5bf6317d83d603b2b804851b703056ee differ diff --git a/Library/Artifacts/5c/5c15110a348634d8b3573b27ad777b0d b/Library/Artifacts/5c/5c15110a348634d8b3573b27ad777b0d new file mode 100644 index 0000000..dc8eef9 Binary files /dev/null and b/Library/Artifacts/5c/5c15110a348634d8b3573b27ad777b0d differ diff --git a/Library/Artifacts/5c/5c275331248cdc0ba2ddc52a0a06ad16 b/Library/Artifacts/5c/5c275331248cdc0ba2ddc52a0a06ad16 new file mode 100644 index 0000000..20d7677 Binary files /dev/null and b/Library/Artifacts/5c/5c275331248cdc0ba2ddc52a0a06ad16 differ diff --git a/Library/Artifacts/5c/5c5655b5e9820eca55371c72472b8b66 b/Library/Artifacts/5c/5c5655b5e9820eca55371c72472b8b66 new file mode 100644 index 0000000..0a62ae5 Binary files /dev/null and b/Library/Artifacts/5c/5c5655b5e9820eca55371c72472b8b66 differ diff --git a/Library/Artifacts/5c/5c7bc2f51bbde420e5ffcde943285902 b/Library/Artifacts/5c/5c7bc2f51bbde420e5ffcde943285902 new file mode 100644 index 0000000..fd1fd34 Binary files /dev/null and b/Library/Artifacts/5c/5c7bc2f51bbde420e5ffcde943285902 differ diff --git a/Library/Artifacts/5c/5c97adeffcdadf07945c0933c3a9e030 b/Library/Artifacts/5c/5c97adeffcdadf07945c0933c3a9e030 new file mode 100644 index 0000000..f978572 Binary files /dev/null and b/Library/Artifacts/5c/5c97adeffcdadf07945c0933c3a9e030 differ diff --git a/Library/Artifacts/5c/5cb28d4b2fed8902fd6580bcff474389 b/Library/Artifacts/5c/5cb28d4b2fed8902fd6580bcff474389 new file mode 100644 index 0000000..6812c21 Binary files /dev/null and b/Library/Artifacts/5c/5cb28d4b2fed8902fd6580bcff474389 differ diff --git a/Library/Artifacts/5c/5cf0a5cd69685dc42b9b878fc3f9790b b/Library/Artifacts/5c/5cf0a5cd69685dc42b9b878fc3f9790b new file mode 100644 index 0000000..1744c90 Binary files /dev/null and b/Library/Artifacts/5c/5cf0a5cd69685dc42b9b878fc3f9790b differ diff --git a/Library/Artifacts/5c/5cf9a284cf6831c2af65c34796ac57ab b/Library/Artifacts/5c/5cf9a284cf6831c2af65c34796ac57ab new file mode 100644 index 0000000..d22c6a8 Binary files /dev/null and b/Library/Artifacts/5c/5cf9a284cf6831c2af65c34796ac57ab differ diff --git a/Library/Artifacts/5c/5cfa3da79aa4dab36f602655801edf3d b/Library/Artifacts/5c/5cfa3da79aa4dab36f602655801edf3d new file mode 100644 index 0000000..288c085 Binary files /dev/null and b/Library/Artifacts/5c/5cfa3da79aa4dab36f602655801edf3d differ diff --git a/Library/Artifacts/5d/5d06e3c010f5ced81f33b48d3e81f663 b/Library/Artifacts/5d/5d06e3c010f5ced81f33b48d3e81f663 new file mode 100644 index 0000000..cae6d4c Binary files /dev/null and b/Library/Artifacts/5d/5d06e3c010f5ced81f33b48d3e81f663 differ diff --git a/Library/Artifacts/5d/5d0ad780a9723669b794b38ce90d5863 b/Library/Artifacts/5d/5d0ad780a9723669b794b38ce90d5863 new file mode 100644 index 0000000..3fecca5 Binary files /dev/null and b/Library/Artifacts/5d/5d0ad780a9723669b794b38ce90d5863 differ diff --git a/Library/Artifacts/5d/5d1a740a61340f8d35ef32274a3bbfdc b/Library/Artifacts/5d/5d1a740a61340f8d35ef32274a3bbfdc new file mode 100644 index 0000000..70d7984 Binary files /dev/null and b/Library/Artifacts/5d/5d1a740a61340f8d35ef32274a3bbfdc differ diff --git a/Library/Artifacts/5d/5d3c154914d05c106ab0022103c8be00 b/Library/Artifacts/5d/5d3c154914d05c106ab0022103c8be00 new file mode 100644 index 0000000..f036ef7 Binary files /dev/null and b/Library/Artifacts/5d/5d3c154914d05c106ab0022103c8be00 differ diff --git a/Library/Artifacts/5d/5d3eae759ecf2846b895a18a91701280 b/Library/Artifacts/5d/5d3eae759ecf2846b895a18a91701280 new file mode 100644 index 0000000..7f6f5ab Binary files /dev/null and b/Library/Artifacts/5d/5d3eae759ecf2846b895a18a91701280 differ diff --git a/Library/Artifacts/5d/5d47269c29efa1ba87476e81d111cbde b/Library/Artifacts/5d/5d47269c29efa1ba87476e81d111cbde new file mode 100644 index 0000000..b4b89e0 Binary files /dev/null and b/Library/Artifacts/5d/5d47269c29efa1ba87476e81d111cbde differ diff --git a/Library/Artifacts/5d/5db08a42849cdc7a6658a18bbd99b502 b/Library/Artifacts/5d/5db08a42849cdc7a6658a18bbd99b502 new file mode 100644 index 0000000..b65d95e Binary files /dev/null and b/Library/Artifacts/5d/5db08a42849cdc7a6658a18bbd99b502 differ diff --git a/Library/Artifacts/5d/5dc9c92a94f096cf85ab86f370f7cd7f b/Library/Artifacts/5d/5dc9c92a94f096cf85ab86f370f7cd7f new file mode 100644 index 0000000..4427fe0 Binary files /dev/null and b/Library/Artifacts/5d/5dc9c92a94f096cf85ab86f370f7cd7f differ diff --git a/Library/Artifacts/5d/5de348ab4305a297f68d81302ebe7bca b/Library/Artifacts/5d/5de348ab4305a297f68d81302ebe7bca new file mode 100644 index 0000000..d5c7be0 Binary files /dev/null and b/Library/Artifacts/5d/5de348ab4305a297f68d81302ebe7bca differ diff --git a/Library/Artifacts/5e/5e5eb493c2377549c5ad954e36714165 b/Library/Artifacts/5e/5e5eb493c2377549c5ad954e36714165 new file mode 100644 index 0000000..825dc08 Binary files /dev/null and b/Library/Artifacts/5e/5e5eb493c2377549c5ad954e36714165 differ diff --git a/Library/Artifacts/5e/5e619061bd5464630f56f1ae70a8c0dc b/Library/Artifacts/5e/5e619061bd5464630f56f1ae70a8c0dc new file mode 100644 index 0000000..d8b2767 Binary files /dev/null and b/Library/Artifacts/5e/5e619061bd5464630f56f1ae70a8c0dc differ diff --git a/Library/Artifacts/5e/5e733468cb8ef3af92c11b9820a74c69 b/Library/Artifacts/5e/5e733468cb8ef3af92c11b9820a74c69 new file mode 100644 index 0000000..2973c42 Binary files /dev/null and b/Library/Artifacts/5e/5e733468cb8ef3af92c11b9820a74c69 differ diff --git a/Library/Artifacts/5e/5ea12daef6eb4094182939e2ccc9f0b5 b/Library/Artifacts/5e/5ea12daef6eb4094182939e2ccc9f0b5 new file mode 100644 index 0000000..f80d98d Binary files /dev/null and b/Library/Artifacts/5e/5ea12daef6eb4094182939e2ccc9f0b5 differ diff --git a/Library/Artifacts/5e/5ea42598d20a3141ed4a51998fe32bbc b/Library/Artifacts/5e/5ea42598d20a3141ed4a51998fe32bbc new file mode 100644 index 0000000..c8f2c14 Binary files /dev/null and b/Library/Artifacts/5e/5ea42598d20a3141ed4a51998fe32bbc differ diff --git a/Library/Artifacts/5e/5ebdb3957f4b7f970a2b5fd34a07d8ea b/Library/Artifacts/5e/5ebdb3957f4b7f970a2b5fd34a07d8ea new file mode 100644 index 0000000..9396afb Binary files /dev/null and b/Library/Artifacts/5e/5ebdb3957f4b7f970a2b5fd34a07d8ea differ diff --git a/Library/Artifacts/5e/5ecff736b3d3e2dcfd31fa3814456ca0 b/Library/Artifacts/5e/5ecff736b3d3e2dcfd31fa3814456ca0 new file mode 100644 index 0000000..6dd7091 Binary files /dev/null and b/Library/Artifacts/5e/5ecff736b3d3e2dcfd31fa3814456ca0 differ diff --git a/Library/Artifacts/5e/5ee3c82c4b817edb66926b7503cf59e0 b/Library/Artifacts/5e/5ee3c82c4b817edb66926b7503cf59e0 new file mode 100644 index 0000000..8748d83 Binary files /dev/null and b/Library/Artifacts/5e/5ee3c82c4b817edb66926b7503cf59e0 differ diff --git a/Library/Artifacts/5e/5ee4974fd5239e923bbcfe2257ab5e60 b/Library/Artifacts/5e/5ee4974fd5239e923bbcfe2257ab5e60 new file mode 100644 index 0000000..678f91f Binary files /dev/null and b/Library/Artifacts/5e/5ee4974fd5239e923bbcfe2257ab5e60 differ diff --git a/Library/Artifacts/5e/5eef27214da36b7cdb7e454767bc5fd7 b/Library/Artifacts/5e/5eef27214da36b7cdb7e454767bc5fd7 new file mode 100644 index 0000000..196a05b Binary files /dev/null and b/Library/Artifacts/5e/5eef27214da36b7cdb7e454767bc5fd7 differ diff --git a/Library/Artifacts/5f/5f19e44e892dd5615c47ca847260371f b/Library/Artifacts/5f/5f19e44e892dd5615c47ca847260371f new file mode 100644 index 0000000..4ab04fe Binary files /dev/null and b/Library/Artifacts/5f/5f19e44e892dd5615c47ca847260371f differ diff --git a/Library/Artifacts/5f/5f33873cb59b8d348e21fe3f7eed39ed b/Library/Artifacts/5f/5f33873cb59b8d348e21fe3f7eed39ed new file mode 100644 index 0000000..8ad2614 Binary files /dev/null and b/Library/Artifacts/5f/5f33873cb59b8d348e21fe3f7eed39ed differ diff --git a/Library/Artifacts/5f/5f7e3821596c87120fc01c5f0a219d6e b/Library/Artifacts/5f/5f7e3821596c87120fc01c5f0a219d6e new file mode 100644 index 0000000..49381c0 Binary files /dev/null and b/Library/Artifacts/5f/5f7e3821596c87120fc01c5f0a219d6e differ diff --git a/Library/Artifacts/5f/5f7fc4145507664af779bc0c254521f7 b/Library/Artifacts/5f/5f7fc4145507664af779bc0c254521f7 new file mode 100644 index 0000000..6778a7f Binary files /dev/null and b/Library/Artifacts/5f/5f7fc4145507664af779bc0c254521f7 differ diff --git a/Library/Artifacts/5f/5f8a0a7396eaeafd33c412203152f257 b/Library/Artifacts/5f/5f8a0a7396eaeafd33c412203152f257 new file mode 100644 index 0000000..63ee7fa Binary files /dev/null and b/Library/Artifacts/5f/5f8a0a7396eaeafd33c412203152f257 differ diff --git a/Library/Artifacts/5f/5fa82888db92289f801326588dc74a59 b/Library/Artifacts/5f/5fa82888db92289f801326588dc74a59 new file mode 100644 index 0000000..79e0092 Binary files /dev/null and b/Library/Artifacts/5f/5fa82888db92289f801326588dc74a59 differ diff --git a/Library/Artifacts/60/600270d14da731e95c993e2de01767c7 b/Library/Artifacts/60/600270d14da731e95c993e2de01767c7 new file mode 100644 index 0000000..8271878 Binary files /dev/null and b/Library/Artifacts/60/600270d14da731e95c993e2de01767c7 differ diff --git a/Library/Artifacts/60/6017028525c331af250477594eacab3c b/Library/Artifacts/60/6017028525c331af250477594eacab3c new file mode 100644 index 0000000..645931e Binary files /dev/null and b/Library/Artifacts/60/6017028525c331af250477594eacab3c differ diff --git a/Library/Artifacts/60/604da78f06d1138dd1605b454bf45439 b/Library/Artifacts/60/604da78f06d1138dd1605b454bf45439 new file mode 100644 index 0000000..6be2bce Binary files /dev/null and b/Library/Artifacts/60/604da78f06d1138dd1605b454bf45439 differ diff --git a/Library/Artifacts/60/6051140fb3f9e30e687585c6b010d373 b/Library/Artifacts/60/6051140fb3f9e30e687585c6b010d373 new file mode 100644 index 0000000..f99c3fb Binary files /dev/null and b/Library/Artifacts/60/6051140fb3f9e30e687585c6b010d373 differ diff --git a/Library/Artifacts/60/606f15776460f728f4078275889b4cbf b/Library/Artifacts/60/606f15776460f728f4078275889b4cbf new file mode 100644 index 0000000..d7874f0 Binary files /dev/null and b/Library/Artifacts/60/606f15776460f728f4078275889b4cbf differ diff --git a/Library/Artifacts/60/60a6077cb284d30827bf713a4659b0da b/Library/Artifacts/60/60a6077cb284d30827bf713a4659b0da new file mode 100644 index 0000000..d78eb5e Binary files /dev/null and b/Library/Artifacts/60/60a6077cb284d30827bf713a4659b0da differ diff --git a/Library/Artifacts/60/60cdee83f39cf2c3fbe72bcdb9c63ffd b/Library/Artifacts/60/60cdee83f39cf2c3fbe72bcdb9c63ffd new file mode 100644 index 0000000..36a5496 Binary files /dev/null and b/Library/Artifacts/60/60cdee83f39cf2c3fbe72bcdb9c63ffd differ diff --git a/Library/Artifacts/60/60d889ce4e38c8e5eaeba31ecc2b92dd b/Library/Artifacts/60/60d889ce4e38c8e5eaeba31ecc2b92dd new file mode 100644 index 0000000..e0a5a0f Binary files /dev/null and b/Library/Artifacts/60/60d889ce4e38c8e5eaeba31ecc2b92dd differ diff --git a/Library/Artifacts/61/61223eb922af3102779a6d60492fbbab b/Library/Artifacts/61/61223eb922af3102779a6d60492fbbab new file mode 100644 index 0000000..1e87316 Binary files /dev/null and b/Library/Artifacts/61/61223eb922af3102779a6d60492fbbab differ diff --git a/Library/Artifacts/61/61232b5fc99fc33f32733aa8f75d692e b/Library/Artifacts/61/61232b5fc99fc33f32733aa8f75d692e new file mode 100644 index 0000000..042d75a Binary files /dev/null and b/Library/Artifacts/61/61232b5fc99fc33f32733aa8f75d692e differ diff --git a/Library/Artifacts/61/6153418350f68d5f194271079c7400f6 b/Library/Artifacts/61/6153418350f68d5f194271079c7400f6 new file mode 100644 index 0000000..888eea5 Binary files /dev/null and b/Library/Artifacts/61/6153418350f68d5f194271079c7400f6 differ diff --git a/Library/Artifacts/61/615d96fad09fcd3f0062c9b754a5f935 b/Library/Artifacts/61/615d96fad09fcd3f0062c9b754a5f935 new file mode 100644 index 0000000..d204434 Binary files /dev/null and b/Library/Artifacts/61/615d96fad09fcd3f0062c9b754a5f935 differ diff --git a/Library/Artifacts/61/618e8464709fcb4b645e840906cba45b b/Library/Artifacts/61/618e8464709fcb4b645e840906cba45b new file mode 100644 index 0000000..0763a3a Binary files /dev/null and b/Library/Artifacts/61/618e8464709fcb4b645e840906cba45b differ diff --git a/Library/Artifacts/61/61985443f7954e637a337ff6bee5ea24 b/Library/Artifacts/61/61985443f7954e637a337ff6bee5ea24 new file mode 100644 index 0000000..270be94 Binary files /dev/null and b/Library/Artifacts/61/61985443f7954e637a337ff6bee5ea24 differ diff --git a/Library/Artifacts/61/61b57dc13b7986fb82fd9892dd10e3f1 b/Library/Artifacts/61/61b57dc13b7986fb82fd9892dd10e3f1 new file mode 100644 index 0000000..e828450 Binary files /dev/null and b/Library/Artifacts/61/61b57dc13b7986fb82fd9892dd10e3f1 differ diff --git a/Library/Artifacts/61/61d128195a9812504e4d98df5e1aded9 b/Library/Artifacts/61/61d128195a9812504e4d98df5e1aded9 new file mode 100644 index 0000000..fd6759b Binary files /dev/null and b/Library/Artifacts/61/61d128195a9812504e4d98df5e1aded9 differ diff --git a/Library/Artifacts/61/61d3a0414c358a65c9eb12e3b36a3ae1 b/Library/Artifacts/61/61d3a0414c358a65c9eb12e3b36a3ae1 new file mode 100644 index 0000000..cb88ba2 Binary files /dev/null and b/Library/Artifacts/61/61d3a0414c358a65c9eb12e3b36a3ae1 differ diff --git a/Library/Artifacts/61/61fb7c6e3f200d01c45cb7422a815822 b/Library/Artifacts/61/61fb7c6e3f200d01c45cb7422a815822 new file mode 100644 index 0000000..f44f372 Binary files /dev/null and b/Library/Artifacts/61/61fb7c6e3f200d01c45cb7422a815822 differ diff --git a/Library/Artifacts/61/61fde0f30ce8eaa673fa11e07c9fbc53 b/Library/Artifacts/61/61fde0f30ce8eaa673fa11e07c9fbc53 new file mode 100644 index 0000000..45cff18 Binary files /dev/null and b/Library/Artifacts/61/61fde0f30ce8eaa673fa11e07c9fbc53 differ diff --git a/Library/Artifacts/62/6242d7e36d5c215e4676c63af346de8e b/Library/Artifacts/62/6242d7e36d5c215e4676c63af346de8e new file mode 100644 index 0000000..9ad7705 Binary files /dev/null and b/Library/Artifacts/62/6242d7e36d5c215e4676c63af346de8e differ diff --git a/Library/Artifacts/62/626d4c9f99f0d8113a25d78f41bfbd4d b/Library/Artifacts/62/626d4c9f99f0d8113a25d78f41bfbd4d new file mode 100644 index 0000000..8f79fdc Binary files /dev/null and b/Library/Artifacts/62/626d4c9f99f0d8113a25d78f41bfbd4d differ diff --git a/Library/Artifacts/62/627bcb995be78e1fbb433aa4ef651728 b/Library/Artifacts/62/627bcb995be78e1fbb433aa4ef651728 new file mode 100644 index 0000000..8cff230 Binary files /dev/null and b/Library/Artifacts/62/627bcb995be78e1fbb433aa4ef651728 differ diff --git a/Library/Artifacts/62/627cafe21af2bec3552f8ab327f1c770 b/Library/Artifacts/62/627cafe21af2bec3552f8ab327f1c770 new file mode 100644 index 0000000..997a5dd Binary files /dev/null and b/Library/Artifacts/62/627cafe21af2bec3552f8ab327f1c770 differ diff --git a/Library/Artifacts/62/62841401d52c718809492eee6aada631 b/Library/Artifacts/62/62841401d52c718809492eee6aada631 new file mode 100644 index 0000000..cc91f1d Binary files /dev/null and b/Library/Artifacts/62/62841401d52c718809492eee6aada631 differ diff --git a/Library/Artifacts/62/62ee87e8df75b7e0cf1324baf8d0d472 b/Library/Artifacts/62/62ee87e8df75b7e0cf1324baf8d0d472 new file mode 100644 index 0000000..43068ed Binary files /dev/null and b/Library/Artifacts/62/62ee87e8df75b7e0cf1324baf8d0d472 differ diff --git a/Library/Artifacts/63/6318029ca6768c6687f141636b5a619f b/Library/Artifacts/63/6318029ca6768c6687f141636b5a619f new file mode 100644 index 0000000..23551df Binary files /dev/null and b/Library/Artifacts/63/6318029ca6768c6687f141636b5a619f differ diff --git a/Library/Artifacts/63/636eb8f0b1e6fc89a9f646514eb497d1 b/Library/Artifacts/63/636eb8f0b1e6fc89a9f646514eb497d1 new file mode 100644 index 0000000..e06ab98 Binary files /dev/null and b/Library/Artifacts/63/636eb8f0b1e6fc89a9f646514eb497d1 differ diff --git a/Library/Artifacts/63/637cda96ce2013807e2d7b23098f1694 b/Library/Artifacts/63/637cda96ce2013807e2d7b23098f1694 new file mode 100644 index 0000000..b0815c4 Binary files /dev/null and b/Library/Artifacts/63/637cda96ce2013807e2d7b23098f1694 differ diff --git a/Library/Artifacts/63/6384bb91f8a288b9a52b0ebbb520fca8 b/Library/Artifacts/63/6384bb91f8a288b9a52b0ebbb520fca8 new file mode 100644 index 0000000..0eba624 Binary files /dev/null and b/Library/Artifacts/63/6384bb91f8a288b9a52b0ebbb520fca8 differ diff --git a/Library/Artifacts/63/63cee5dd360ed4dd8811b7f6f4c9a1c4 b/Library/Artifacts/63/63cee5dd360ed4dd8811b7f6f4c9a1c4 new file mode 100644 index 0000000..6b37301 Binary files /dev/null and b/Library/Artifacts/63/63cee5dd360ed4dd8811b7f6f4c9a1c4 differ diff --git a/Library/Artifacts/63/63d77619a6be7e40a1bb21c1bb7b8b0f b/Library/Artifacts/63/63d77619a6be7e40a1bb21c1bb7b8b0f new file mode 100644 index 0000000..3133f1c Binary files /dev/null and b/Library/Artifacts/63/63d77619a6be7e40a1bb21c1bb7b8b0f differ diff --git a/Library/Artifacts/64/64147dd10a53dd0c1312d9031f9c1e26 b/Library/Artifacts/64/64147dd10a53dd0c1312d9031f9c1e26 new file mode 100644 index 0000000..75f1f23 Binary files /dev/null and b/Library/Artifacts/64/64147dd10a53dd0c1312d9031f9c1e26 differ diff --git a/Library/Artifacts/64/643839f774b3d8572d7c03d663627708 b/Library/Artifacts/64/643839f774b3d8572d7c03d663627708 new file mode 100644 index 0000000..d213f9e Binary files /dev/null and b/Library/Artifacts/64/643839f774b3d8572d7c03d663627708 differ diff --git a/Library/Artifacts/64/6449efa59a374c4104f7681b14259df2 b/Library/Artifacts/64/6449efa59a374c4104f7681b14259df2 new file mode 100644 index 0000000..558d3a0 Binary files /dev/null and b/Library/Artifacts/64/6449efa59a374c4104f7681b14259df2 differ diff --git a/Library/Artifacts/65/650ea8a7729258f1c22a00d0372500ce b/Library/Artifacts/65/650ea8a7729258f1c22a00d0372500ce new file mode 100644 index 0000000..f96bc5b Binary files /dev/null and b/Library/Artifacts/65/650ea8a7729258f1c22a00d0372500ce differ diff --git a/Library/Artifacts/65/652bec208b28b2499e586f6feafbcdc7 b/Library/Artifacts/65/652bec208b28b2499e586f6feafbcdc7 new file mode 100644 index 0000000..035ce90 Binary files /dev/null and b/Library/Artifacts/65/652bec208b28b2499e586f6feafbcdc7 differ diff --git a/Library/Artifacts/65/653e4a547c5f4be0df5fb14f2eab7fc9 b/Library/Artifacts/65/653e4a547c5f4be0df5fb14f2eab7fc9 new file mode 100644 index 0000000..ea5dd6d Binary files /dev/null and b/Library/Artifacts/65/653e4a547c5f4be0df5fb14f2eab7fc9 differ diff --git a/Library/Artifacts/65/654c7abd5d70a93e7f623ae95387a43a b/Library/Artifacts/65/654c7abd5d70a93e7f623ae95387a43a new file mode 100644 index 0000000..ca4c352 Binary files /dev/null and b/Library/Artifacts/65/654c7abd5d70a93e7f623ae95387a43a differ diff --git a/Library/Artifacts/65/654c92b5a6bb5a6895be1728f24f5360 b/Library/Artifacts/65/654c92b5a6bb5a6895be1728f24f5360 new file mode 100644 index 0000000..65a1d5c Binary files /dev/null and b/Library/Artifacts/65/654c92b5a6bb5a6895be1728f24f5360 differ diff --git a/Library/Artifacts/65/657ca52a6a08033969f5ffa7632ae272 b/Library/Artifacts/65/657ca52a6a08033969f5ffa7632ae272 new file mode 100644 index 0000000..25ac685 Binary files /dev/null and b/Library/Artifacts/65/657ca52a6a08033969f5ffa7632ae272 differ diff --git a/Library/Artifacts/65/65995dac577dd04bb5b42369ccdb1733 b/Library/Artifacts/65/65995dac577dd04bb5b42369ccdb1733 new file mode 100644 index 0000000..3d8e7e2 Binary files /dev/null and b/Library/Artifacts/65/65995dac577dd04bb5b42369ccdb1733 differ diff --git a/Library/Artifacts/65/659bc6fdbc89a9fd07d139eacda98e44 b/Library/Artifacts/65/659bc6fdbc89a9fd07d139eacda98e44 new file mode 100644 index 0000000..8074205 Binary files /dev/null and b/Library/Artifacts/65/659bc6fdbc89a9fd07d139eacda98e44 differ diff --git a/Library/Artifacts/65/659f2c8c9540dbda5a39bed1e742df4a b/Library/Artifacts/65/659f2c8c9540dbda5a39bed1e742df4a new file mode 100644 index 0000000..ee0aebe Binary files /dev/null and b/Library/Artifacts/65/659f2c8c9540dbda5a39bed1e742df4a differ diff --git a/Library/Artifacts/65/65b6489f81bcb4347034fd70ec81fac2 b/Library/Artifacts/65/65b6489f81bcb4347034fd70ec81fac2 new file mode 100644 index 0000000..3fec903 Binary files /dev/null and b/Library/Artifacts/65/65b6489f81bcb4347034fd70ec81fac2 differ diff --git a/Library/Artifacts/65/65c68dbd991d61c9fbd9421bd364e530 b/Library/Artifacts/65/65c68dbd991d61c9fbd9421bd364e530 new file mode 100644 index 0000000..f866299 Binary files /dev/null and b/Library/Artifacts/65/65c68dbd991d61c9fbd9421bd364e530 differ diff --git a/Library/Artifacts/65/65dc9f7515b43102aa5c14c023a2e0ed b/Library/Artifacts/65/65dc9f7515b43102aa5c14c023a2e0ed new file mode 100644 index 0000000..33dc15a Binary files /dev/null and b/Library/Artifacts/65/65dc9f7515b43102aa5c14c023a2e0ed differ diff --git a/Library/Artifacts/65/65efc2b905e2ab0c84bb9739e9819aab b/Library/Artifacts/65/65efc2b905e2ab0c84bb9739e9819aab new file mode 100644 index 0000000..04908cf Binary files /dev/null and b/Library/Artifacts/65/65efc2b905e2ab0c84bb9739e9819aab differ diff --git a/Library/Artifacts/66/6618a33ea480ac61c334cefe955e7bd9 b/Library/Artifacts/66/6618a33ea480ac61c334cefe955e7bd9 new file mode 100644 index 0000000..67b013a Binary files /dev/null and b/Library/Artifacts/66/6618a33ea480ac61c334cefe955e7bd9 differ diff --git a/Library/Artifacts/66/661b86003cca3b615926e6a034857de0 b/Library/Artifacts/66/661b86003cca3b615926e6a034857de0 new file mode 100644 index 0000000..a5987fe Binary files /dev/null and b/Library/Artifacts/66/661b86003cca3b615926e6a034857de0 differ diff --git a/Library/Artifacts/66/6642b40bf0c6ecc61bd72f584880c8a4 b/Library/Artifacts/66/6642b40bf0c6ecc61bd72f584880c8a4 new file mode 100644 index 0000000..9c87144 Binary files /dev/null and b/Library/Artifacts/66/6642b40bf0c6ecc61bd72f584880c8a4 differ diff --git a/Library/Artifacts/66/6663190d8c70dd8b8f57cf7a420109be b/Library/Artifacts/66/6663190d8c70dd8b8f57cf7a420109be new file mode 100644 index 0000000..912f34e Binary files /dev/null and b/Library/Artifacts/66/6663190d8c70dd8b8f57cf7a420109be differ diff --git a/Library/Artifacts/66/66b9fb553319d98531ded592a422d854 b/Library/Artifacts/66/66b9fb553319d98531ded592a422d854 new file mode 100644 index 0000000..4c78172 Binary files /dev/null and b/Library/Artifacts/66/66b9fb553319d98531ded592a422d854 differ diff --git a/Library/Artifacts/66/66c9823ddde09cbd89c36d592bead8cf b/Library/Artifacts/66/66c9823ddde09cbd89c36d592bead8cf new file mode 100644 index 0000000..ada6b9a Binary files /dev/null and b/Library/Artifacts/66/66c9823ddde09cbd89c36d592bead8cf differ diff --git a/Library/Artifacts/66/66cedd01000eb5ccbaa2dc041631402e b/Library/Artifacts/66/66cedd01000eb5ccbaa2dc041631402e new file mode 100644 index 0000000..ce1a06f Binary files /dev/null and b/Library/Artifacts/66/66cedd01000eb5ccbaa2dc041631402e differ diff --git a/Library/Artifacts/66/66d753cd71b97b56ce720832d066c2f6 b/Library/Artifacts/66/66d753cd71b97b56ce720832d066c2f6 new file mode 100644 index 0000000..f115965 Binary files /dev/null and b/Library/Artifacts/66/66d753cd71b97b56ce720832d066c2f6 differ diff --git a/Library/Artifacts/66/66ef3d94abc75b21a2633194f6df5d05 b/Library/Artifacts/66/66ef3d94abc75b21a2633194f6df5d05 new file mode 100644 index 0000000..c746dcb Binary files /dev/null and b/Library/Artifacts/66/66ef3d94abc75b21a2633194f6df5d05 differ diff --git a/Library/Artifacts/66/66f5928ad36627139e1c423123a049b1 b/Library/Artifacts/66/66f5928ad36627139e1c423123a049b1 new file mode 100644 index 0000000..7d1d8e0 Binary files /dev/null and b/Library/Artifacts/66/66f5928ad36627139e1c423123a049b1 differ diff --git a/Library/Artifacts/67/6714a07631b742b7bdbadb5b800e7c28 b/Library/Artifacts/67/6714a07631b742b7bdbadb5b800e7c28 new file mode 100644 index 0000000..e7f59ba Binary files /dev/null and b/Library/Artifacts/67/6714a07631b742b7bdbadb5b800e7c28 differ diff --git a/Library/Artifacts/67/671bc05a01c6733856f7032257a614a4 b/Library/Artifacts/67/671bc05a01c6733856f7032257a614a4 new file mode 100644 index 0000000..0237e4c Binary files /dev/null and b/Library/Artifacts/67/671bc05a01c6733856f7032257a614a4 differ diff --git a/Library/Artifacts/67/6785a4a6e109e7514790789f86c157b5 b/Library/Artifacts/67/6785a4a6e109e7514790789f86c157b5 new file mode 100644 index 0000000..ebdd95c Binary files /dev/null and b/Library/Artifacts/67/6785a4a6e109e7514790789f86c157b5 differ diff --git a/Library/Artifacts/67/678e2caa05e15f12d1a86d358430a4d2 b/Library/Artifacts/67/678e2caa05e15f12d1a86d358430a4d2 new file mode 100644 index 0000000..f74087b Binary files /dev/null and b/Library/Artifacts/67/678e2caa05e15f12d1a86d358430a4d2 differ diff --git a/Library/Artifacts/67/67a1cb7d5d87f873fbec9836ca16f6db b/Library/Artifacts/67/67a1cb7d5d87f873fbec9836ca16f6db new file mode 100644 index 0000000..348466f Binary files /dev/null and b/Library/Artifacts/67/67a1cb7d5d87f873fbec9836ca16f6db differ diff --git a/Library/Artifacts/67/67c60043fe9bbf5a841b055192c55159 b/Library/Artifacts/67/67c60043fe9bbf5a841b055192c55159 new file mode 100644 index 0000000..b4c3076 Binary files /dev/null and b/Library/Artifacts/67/67c60043fe9bbf5a841b055192c55159 differ diff --git a/Library/Artifacts/68/680b7ca72fa7b7e034e0fde86d1f23a8 b/Library/Artifacts/68/680b7ca72fa7b7e034e0fde86d1f23a8 new file mode 100644 index 0000000..d9bdd04 Binary files /dev/null and b/Library/Artifacts/68/680b7ca72fa7b7e034e0fde86d1f23a8 differ diff --git a/Library/Artifacts/68/6838d43d2de70cbea3cf543ae89b229d b/Library/Artifacts/68/6838d43d2de70cbea3cf543ae89b229d new file mode 100644 index 0000000..cae8039 Binary files /dev/null and b/Library/Artifacts/68/6838d43d2de70cbea3cf543ae89b229d differ diff --git a/Library/Artifacts/68/6843adbd98f2950cc193c8c7fcbe8b7c b/Library/Artifacts/68/6843adbd98f2950cc193c8c7fcbe8b7c new file mode 100644 index 0000000..137cb19 Binary files /dev/null and b/Library/Artifacts/68/6843adbd98f2950cc193c8c7fcbe8b7c differ diff --git a/Library/Artifacts/68/684981d8d23c96dcd7f2bd972fb71a32 b/Library/Artifacts/68/684981d8d23c96dcd7f2bd972fb71a32 new file mode 100644 index 0000000..19b92d6 Binary files /dev/null and b/Library/Artifacts/68/684981d8d23c96dcd7f2bd972fb71a32 differ diff --git a/Library/Artifacts/68/6850e58c6ac29c89fd7fa5c727551682 b/Library/Artifacts/68/6850e58c6ac29c89fd7fa5c727551682 new file mode 100644 index 0000000..5d263eb Binary files /dev/null and b/Library/Artifacts/68/6850e58c6ac29c89fd7fa5c727551682 differ diff --git a/Library/Artifacts/68/68820181adb00fe91dc938024a1c76eb b/Library/Artifacts/68/68820181adb00fe91dc938024a1c76eb new file mode 100644 index 0000000..1e8109b Binary files /dev/null and b/Library/Artifacts/68/68820181adb00fe91dc938024a1c76eb differ diff --git a/Library/Artifacts/68/68b184f0f139dcd3873c5529b7721c67 b/Library/Artifacts/68/68b184f0f139dcd3873c5529b7721c67 new file mode 100644 index 0000000..af05a37 Binary files /dev/null and b/Library/Artifacts/68/68b184f0f139dcd3873c5529b7721c67 differ diff --git a/Library/Artifacts/68/68c674f8631eaf8a0eaf0753489e8d71 b/Library/Artifacts/68/68c674f8631eaf8a0eaf0753489e8d71 new file mode 100644 index 0000000..5a60cd0 Binary files /dev/null and b/Library/Artifacts/68/68c674f8631eaf8a0eaf0753489e8d71 differ diff --git a/Library/Artifacts/68/68cf762a072af1a8effb5bac15604b8a b/Library/Artifacts/68/68cf762a072af1a8effb5bac15604b8a new file mode 100644 index 0000000..368fd06 Binary files /dev/null and b/Library/Artifacts/68/68cf762a072af1a8effb5bac15604b8a differ diff --git a/Library/Artifacts/68/68e106616ac6d16a425ec7b1b9c24893 b/Library/Artifacts/68/68e106616ac6d16a425ec7b1b9c24893 new file mode 100644 index 0000000..551875d Binary files /dev/null and b/Library/Artifacts/68/68e106616ac6d16a425ec7b1b9c24893 differ diff --git a/Library/Artifacts/69/691e85931ae77897f4a2bcd9b61cca1e b/Library/Artifacts/69/691e85931ae77897f4a2bcd9b61cca1e new file mode 100644 index 0000000..dc0918b Binary files /dev/null and b/Library/Artifacts/69/691e85931ae77897f4a2bcd9b61cca1e differ diff --git a/Library/Artifacts/69/698f81893593d3d5195b2b2847429776 b/Library/Artifacts/69/698f81893593d3d5195b2b2847429776 new file mode 100644 index 0000000..1ae1dfb Binary files /dev/null and b/Library/Artifacts/69/698f81893593d3d5195b2b2847429776 differ diff --git a/Library/Artifacts/69/69acd7bde421e51fbfd07cb2515e5fec b/Library/Artifacts/69/69acd7bde421e51fbfd07cb2515e5fec new file mode 100644 index 0000000..0a3cb36 Binary files /dev/null and b/Library/Artifacts/69/69acd7bde421e51fbfd07cb2515e5fec differ diff --git a/Library/Artifacts/69/69bce74e3fa80a894713e0e13daf54f0 b/Library/Artifacts/69/69bce74e3fa80a894713e0e13daf54f0 new file mode 100644 index 0000000..1019143 Binary files /dev/null and b/Library/Artifacts/69/69bce74e3fa80a894713e0e13daf54f0 differ diff --git a/Library/Artifacts/69/69cadbac803e273914e91006d02573c7 b/Library/Artifacts/69/69cadbac803e273914e91006d02573c7 new file mode 100644 index 0000000..a4c8b5d Binary files /dev/null and b/Library/Artifacts/69/69cadbac803e273914e91006d02573c7 differ diff --git a/Library/Artifacts/6a/6a2c3063be086f5c6e64a9024b8e200f b/Library/Artifacts/6a/6a2c3063be086f5c6e64a9024b8e200f new file mode 100644 index 0000000..c27614b Binary files /dev/null and b/Library/Artifacts/6a/6a2c3063be086f5c6e64a9024b8e200f differ diff --git a/Library/Artifacts/6a/6a2edf76c0e65324a26d931a6f1435e9 b/Library/Artifacts/6a/6a2edf76c0e65324a26d931a6f1435e9 new file mode 100644 index 0000000..adfcb02 Binary files /dev/null and b/Library/Artifacts/6a/6a2edf76c0e65324a26d931a6f1435e9 differ diff --git a/Library/Artifacts/6a/6a8a18002d9bbc5bcb8c1f5ec12b7f69 b/Library/Artifacts/6a/6a8a18002d9bbc5bcb8c1f5ec12b7f69 new file mode 100644 index 0000000..be2ac7c Binary files /dev/null and b/Library/Artifacts/6a/6a8a18002d9bbc5bcb8c1f5ec12b7f69 differ diff --git a/Library/Artifacts/6a/6aa9a22638b12258eabbf918c26e3c5f b/Library/Artifacts/6a/6aa9a22638b12258eabbf918c26e3c5f new file mode 100644 index 0000000..34c9694 Binary files /dev/null and b/Library/Artifacts/6a/6aa9a22638b12258eabbf918c26e3c5f differ diff --git a/Library/Artifacts/6a/6aed547cfcf9c2f65c92930a3b27afd7 b/Library/Artifacts/6a/6aed547cfcf9c2f65c92930a3b27afd7 new file mode 100644 index 0000000..aa26269 Binary files /dev/null and b/Library/Artifacts/6a/6aed547cfcf9c2f65c92930a3b27afd7 differ diff --git a/Library/Artifacts/6b/6b01dbabaa0f92e67cec9fbfc2fcf7c1 b/Library/Artifacts/6b/6b01dbabaa0f92e67cec9fbfc2fcf7c1 new file mode 100644 index 0000000..6fc51fa Binary files /dev/null and b/Library/Artifacts/6b/6b01dbabaa0f92e67cec9fbfc2fcf7c1 differ diff --git a/Library/Artifacts/6b/6b31a71a6e72ce0075b5a543f27db87c b/Library/Artifacts/6b/6b31a71a6e72ce0075b5a543f27db87c new file mode 100644 index 0000000..e968dea Binary files /dev/null and b/Library/Artifacts/6b/6b31a71a6e72ce0075b5a543f27db87c differ diff --git a/Library/Artifacts/6b/6b3d4cea480efe8e00b3d083dbd455ec b/Library/Artifacts/6b/6b3d4cea480efe8e00b3d083dbd455ec new file mode 100644 index 0000000..61ab1f4 Binary files /dev/null and b/Library/Artifacts/6b/6b3d4cea480efe8e00b3d083dbd455ec differ diff --git a/Library/Artifacts/6b/6b5f30af957dc68889c642dc6cbde174 b/Library/Artifacts/6b/6b5f30af957dc68889c642dc6cbde174 new file mode 100644 index 0000000..80916f5 Binary files /dev/null and b/Library/Artifacts/6b/6b5f30af957dc68889c642dc6cbde174 differ diff --git a/Library/Artifacts/6b/6b740df0b27e7084e6b9489ede8b6382 b/Library/Artifacts/6b/6b740df0b27e7084e6b9489ede8b6382 new file mode 100644 index 0000000..4806677 Binary files /dev/null and b/Library/Artifacts/6b/6b740df0b27e7084e6b9489ede8b6382 differ diff --git a/Library/Artifacts/6b/6b7d68b413ffb3a5459e8f510452ebc3 b/Library/Artifacts/6b/6b7d68b413ffb3a5459e8f510452ebc3 new file mode 100644 index 0000000..47be9c0 Binary files /dev/null and b/Library/Artifacts/6b/6b7d68b413ffb3a5459e8f510452ebc3 differ diff --git a/Library/Artifacts/6b/6b954208896b836ed95414c0b0ed1035 b/Library/Artifacts/6b/6b954208896b836ed95414c0b0ed1035 new file mode 100644 index 0000000..b54a890 Binary files /dev/null and b/Library/Artifacts/6b/6b954208896b836ed95414c0b0ed1035 differ diff --git a/Library/Artifacts/6b/6bae8d1dc09292ea8f174a1ffe7162a2 b/Library/Artifacts/6b/6bae8d1dc09292ea8f174a1ffe7162a2 new file mode 100644 index 0000000..12e5195 Binary files /dev/null and b/Library/Artifacts/6b/6bae8d1dc09292ea8f174a1ffe7162a2 differ diff --git a/Library/Artifacts/6b/6bb345b1f6fd782774425d16e064a5fa b/Library/Artifacts/6b/6bb345b1f6fd782774425d16e064a5fa new file mode 100644 index 0000000..2b13bc5 Binary files /dev/null and b/Library/Artifacts/6b/6bb345b1f6fd782774425d16e064a5fa differ diff --git a/Library/Artifacts/6b/6bcba6954ed3cc1d26bfb24c51a227e4 b/Library/Artifacts/6b/6bcba6954ed3cc1d26bfb24c51a227e4 new file mode 100644 index 0000000..55100dc Binary files /dev/null and b/Library/Artifacts/6b/6bcba6954ed3cc1d26bfb24c51a227e4 differ diff --git a/Library/Artifacts/6c/6c048dbbc2ff7df83ae66eb810bb5e51 b/Library/Artifacts/6c/6c048dbbc2ff7df83ae66eb810bb5e51 new file mode 100644 index 0000000..9d98cdc Binary files /dev/null and b/Library/Artifacts/6c/6c048dbbc2ff7df83ae66eb810bb5e51 differ diff --git a/Library/Artifacts/6c/6c07244481791ee2f73062a7e5a2f1e5 b/Library/Artifacts/6c/6c07244481791ee2f73062a7e5a2f1e5 new file mode 100644 index 0000000..ec9f6a5 Binary files /dev/null and b/Library/Artifacts/6c/6c07244481791ee2f73062a7e5a2f1e5 differ diff --git a/Library/Artifacts/6c/6c473ef84c17b6ece9b94ea4220c1de6 b/Library/Artifacts/6c/6c473ef84c17b6ece9b94ea4220c1de6 new file mode 100644 index 0000000..a366cbf Binary files /dev/null and b/Library/Artifacts/6c/6c473ef84c17b6ece9b94ea4220c1de6 differ diff --git a/Library/Artifacts/6c/6c67d0ef36b1f6aedac9273f7c6affbb b/Library/Artifacts/6c/6c67d0ef36b1f6aedac9273f7c6affbb new file mode 100644 index 0000000..90959e8 Binary files /dev/null and b/Library/Artifacts/6c/6c67d0ef36b1f6aedac9273f7c6affbb differ diff --git a/Library/Artifacts/6c/6c68999f70f27ff7c436d7d5ebec0443 b/Library/Artifacts/6c/6c68999f70f27ff7c436d7d5ebec0443 new file mode 100644 index 0000000..b810d61 Binary files /dev/null and b/Library/Artifacts/6c/6c68999f70f27ff7c436d7d5ebec0443 differ diff --git a/Library/Artifacts/6c/6c9222af31ae69cae2020dab89b14961 b/Library/Artifacts/6c/6c9222af31ae69cae2020dab89b14961 new file mode 100644 index 0000000..3b9457d Binary files /dev/null and b/Library/Artifacts/6c/6c9222af31ae69cae2020dab89b14961 differ diff --git a/Library/Artifacts/6c/6c924df507920c74f1f6b75280298ea9 b/Library/Artifacts/6c/6c924df507920c74f1f6b75280298ea9 new file mode 100644 index 0000000..8952007 Binary files /dev/null and b/Library/Artifacts/6c/6c924df507920c74f1f6b75280298ea9 differ diff --git a/Library/Artifacts/6c/6cdc5579fb63ef11652025b6ebdd70a7 b/Library/Artifacts/6c/6cdc5579fb63ef11652025b6ebdd70a7 new file mode 100644 index 0000000..f29d0e3 Binary files /dev/null and b/Library/Artifacts/6c/6cdc5579fb63ef11652025b6ebdd70a7 differ diff --git a/Library/Artifacts/6c/6ce4ce7ebd1125527abea75e0c0b5656 b/Library/Artifacts/6c/6ce4ce7ebd1125527abea75e0c0b5656 new file mode 100644 index 0000000..b2a49a3 Binary files /dev/null and b/Library/Artifacts/6c/6ce4ce7ebd1125527abea75e0c0b5656 differ diff --git a/Library/Artifacts/6c/6cf9b68aa8ad3324ff114591df23787e b/Library/Artifacts/6c/6cf9b68aa8ad3324ff114591df23787e new file mode 100644 index 0000000..233a554 Binary files /dev/null and b/Library/Artifacts/6c/6cf9b68aa8ad3324ff114591df23787e differ diff --git a/Library/Artifacts/6c/6cfb18651e44e4693f896649995dbd64 b/Library/Artifacts/6c/6cfb18651e44e4693f896649995dbd64 new file mode 100644 index 0000000..88448fe Binary files /dev/null and b/Library/Artifacts/6c/6cfb18651e44e4693f896649995dbd64 differ diff --git a/Library/Artifacts/6d/6d08405bc5e83ea5dea42c318fd9a292 b/Library/Artifacts/6d/6d08405bc5e83ea5dea42c318fd9a292 new file mode 100644 index 0000000..f6f0435 Binary files /dev/null and b/Library/Artifacts/6d/6d08405bc5e83ea5dea42c318fd9a292 differ diff --git a/Library/Artifacts/6d/6d405555545641568828b224df08b1f5 b/Library/Artifacts/6d/6d405555545641568828b224df08b1f5 new file mode 100644 index 0000000..51e569a Binary files /dev/null and b/Library/Artifacts/6d/6d405555545641568828b224df08b1f5 differ diff --git a/Library/Artifacts/6d/6d65a15dae809a4cac2dfb403852a8b1 b/Library/Artifacts/6d/6d65a15dae809a4cac2dfb403852a8b1 new file mode 100644 index 0000000..120aa57 Binary files /dev/null and b/Library/Artifacts/6d/6d65a15dae809a4cac2dfb403852a8b1 differ diff --git a/Library/Artifacts/6d/6d89a42de08e08016b92752b53a56a48 b/Library/Artifacts/6d/6d89a42de08e08016b92752b53a56a48 new file mode 100644 index 0000000..d9c5b20 Binary files /dev/null and b/Library/Artifacts/6d/6d89a42de08e08016b92752b53a56a48 differ diff --git a/Library/Artifacts/6d/6dac216c93932908e0be7c52ea84cec0 b/Library/Artifacts/6d/6dac216c93932908e0be7c52ea84cec0 new file mode 100644 index 0000000..9d05eba Binary files /dev/null and b/Library/Artifacts/6d/6dac216c93932908e0be7c52ea84cec0 differ diff --git a/Library/Artifacts/6d/6db4b2144818629d3f1f8eb0a6060c50 b/Library/Artifacts/6d/6db4b2144818629d3f1f8eb0a6060c50 new file mode 100644 index 0000000..a301aad Binary files /dev/null and b/Library/Artifacts/6d/6db4b2144818629d3f1f8eb0a6060c50 differ diff --git a/Library/Artifacts/6d/6dc191e6d262af96202744d3a986f325 b/Library/Artifacts/6d/6dc191e6d262af96202744d3a986f325 new file mode 100644 index 0000000..16a5c1c Binary files /dev/null and b/Library/Artifacts/6d/6dc191e6d262af96202744d3a986f325 differ diff --git a/Library/Artifacts/6d/6dca9e561ad0bb8c3e3b7a22fd5a381d b/Library/Artifacts/6d/6dca9e561ad0bb8c3e3b7a22fd5a381d new file mode 100644 index 0000000..2b6361f Binary files /dev/null and b/Library/Artifacts/6d/6dca9e561ad0bb8c3e3b7a22fd5a381d differ diff --git a/Library/Artifacts/6d/6de23d21d3f7e2a7dad1af7d5f9064ce b/Library/Artifacts/6d/6de23d21d3f7e2a7dad1af7d5f9064ce new file mode 100644 index 0000000..74cee7d Binary files /dev/null and b/Library/Artifacts/6d/6de23d21d3f7e2a7dad1af7d5f9064ce differ diff --git a/Library/Artifacts/6e/6e8bcbc3a2e352a1a27edd2140c09f1d b/Library/Artifacts/6e/6e8bcbc3a2e352a1a27edd2140c09f1d new file mode 100644 index 0000000..5e37872 Binary files /dev/null and b/Library/Artifacts/6e/6e8bcbc3a2e352a1a27edd2140c09f1d differ diff --git a/Library/Artifacts/6e/6e99c5c20def185124a6dd443a5daebd b/Library/Artifacts/6e/6e99c5c20def185124a6dd443a5daebd new file mode 100644 index 0000000..0d3db57 Binary files /dev/null and b/Library/Artifacts/6e/6e99c5c20def185124a6dd443a5daebd differ diff --git a/Library/Artifacts/6e/6eb6ff3f37a3eeea023bab5c9dc2df76 b/Library/Artifacts/6e/6eb6ff3f37a3eeea023bab5c9dc2df76 new file mode 100644 index 0000000..a472641 Binary files /dev/null and b/Library/Artifacts/6e/6eb6ff3f37a3eeea023bab5c9dc2df76 differ diff --git a/Library/Artifacts/6e/6ebccf086d3db9c7d407a22af8e41341 b/Library/Artifacts/6e/6ebccf086d3db9c7d407a22af8e41341 new file mode 100644 index 0000000..c6818ee Binary files /dev/null and b/Library/Artifacts/6e/6ebccf086d3db9c7d407a22af8e41341 differ diff --git a/Library/Artifacts/6e/6ece5606c0d91afb9cc6971d7156353c b/Library/Artifacts/6e/6ece5606c0d91afb9cc6971d7156353c new file mode 100644 index 0000000..41fe660 Binary files /dev/null and b/Library/Artifacts/6e/6ece5606c0d91afb9cc6971d7156353c differ diff --git a/Library/Artifacts/6e/6ed23fba6dc1817ed4b4936cbec87876 b/Library/Artifacts/6e/6ed23fba6dc1817ed4b4936cbec87876 new file mode 100644 index 0000000..6cb2939 Binary files /dev/null and b/Library/Artifacts/6e/6ed23fba6dc1817ed4b4936cbec87876 differ diff --git a/Library/Artifacts/6e/6ede3aadb286ffa89bb708f275cd877d b/Library/Artifacts/6e/6ede3aadb286ffa89bb708f275cd877d new file mode 100644 index 0000000..e682db8 Binary files /dev/null and b/Library/Artifacts/6e/6ede3aadb286ffa89bb708f275cd877d differ diff --git a/Library/Artifacts/6e/6ef915b8f66fc7e7ad487c9e92401ea6 b/Library/Artifacts/6e/6ef915b8f66fc7e7ad487c9e92401ea6 new file mode 100644 index 0000000..6761422 Binary files /dev/null and b/Library/Artifacts/6e/6ef915b8f66fc7e7ad487c9e92401ea6 differ diff --git a/Library/Artifacts/6e/6ef93b93d5996d41b5b82ba2abe1507c b/Library/Artifacts/6e/6ef93b93d5996d41b5b82ba2abe1507c new file mode 100644 index 0000000..1663e12 Binary files /dev/null and b/Library/Artifacts/6e/6ef93b93d5996d41b5b82ba2abe1507c differ diff --git a/Library/Artifacts/6f/6f0384937bd7c81a29c177e5583bb3dd b/Library/Artifacts/6f/6f0384937bd7c81a29c177e5583bb3dd new file mode 100644 index 0000000..1834b15 Binary files /dev/null and b/Library/Artifacts/6f/6f0384937bd7c81a29c177e5583bb3dd differ diff --git a/Library/Artifacts/6f/6f03e4699be757071df2d3def87fa73d b/Library/Artifacts/6f/6f03e4699be757071df2d3def87fa73d new file mode 100644 index 0000000..947efd6 Binary files /dev/null and b/Library/Artifacts/6f/6f03e4699be757071df2d3def87fa73d differ diff --git a/Library/Artifacts/6f/6f541ba6200c4f01f59f9a9817aee224 b/Library/Artifacts/6f/6f541ba6200c4f01f59f9a9817aee224 new file mode 100644 index 0000000..354b917 Binary files /dev/null and b/Library/Artifacts/6f/6f541ba6200c4f01f59f9a9817aee224 differ diff --git a/Library/Artifacts/6f/6f68f431a9edd5208c90561963609f64 b/Library/Artifacts/6f/6f68f431a9edd5208c90561963609f64 new file mode 100644 index 0000000..1d8277e Binary files /dev/null and b/Library/Artifacts/6f/6f68f431a9edd5208c90561963609f64 differ diff --git a/Library/Artifacts/6f/6f8f78d2f8eaac83320c86c5a6e4a562 b/Library/Artifacts/6f/6f8f78d2f8eaac83320c86c5a6e4a562 new file mode 100644 index 0000000..792eb1f Binary files /dev/null and b/Library/Artifacts/6f/6f8f78d2f8eaac83320c86c5a6e4a562 differ diff --git a/Library/Artifacts/6f/6fa79a63935caf640ca61f74d6ece43c b/Library/Artifacts/6f/6fa79a63935caf640ca61f74d6ece43c new file mode 100644 index 0000000..233156f Binary files /dev/null and b/Library/Artifacts/6f/6fa79a63935caf640ca61f74d6ece43c differ diff --git a/Library/Artifacts/6f/6faaf401de9d925a06deb01031203d44 b/Library/Artifacts/6f/6faaf401de9d925a06deb01031203d44 new file mode 100644 index 0000000..b20da55 Binary files /dev/null and b/Library/Artifacts/6f/6faaf401de9d925a06deb01031203d44 differ diff --git a/Library/Artifacts/6f/6fcadeb44d6a27e4dd82d60700c5a525 b/Library/Artifacts/6f/6fcadeb44d6a27e4dd82d60700c5a525 new file mode 100644 index 0000000..f1caa16 Binary files /dev/null and b/Library/Artifacts/6f/6fcadeb44d6a27e4dd82d60700c5a525 differ diff --git a/Library/Artifacts/6f/6fda87b9d035a5f724f78b6f2e50b22d b/Library/Artifacts/6f/6fda87b9d035a5f724f78b6f2e50b22d new file mode 100644 index 0000000..7ef5a59 Binary files /dev/null and b/Library/Artifacts/6f/6fda87b9d035a5f724f78b6f2e50b22d differ diff --git a/Library/Artifacts/70/704a4df6bb33968c07d174803928b436 b/Library/Artifacts/70/704a4df6bb33968c07d174803928b436 new file mode 100644 index 0000000..27713d5 Binary files /dev/null and b/Library/Artifacts/70/704a4df6bb33968c07d174803928b436 differ diff --git a/Library/Artifacts/70/70781be143096fd0896d5d0ff1007b9c b/Library/Artifacts/70/70781be143096fd0896d5d0ff1007b9c new file mode 100644 index 0000000..cbb85f5 Binary files /dev/null and b/Library/Artifacts/70/70781be143096fd0896d5d0ff1007b9c differ diff --git a/Library/Artifacts/70/707a41314de64240835e0323ee427685 b/Library/Artifacts/70/707a41314de64240835e0323ee427685 new file mode 100644 index 0000000..4a60d3f Binary files /dev/null and b/Library/Artifacts/70/707a41314de64240835e0323ee427685 differ diff --git a/Library/Artifacts/70/7087622b29c72cbf726ea2f0bbef2a2e b/Library/Artifacts/70/7087622b29c72cbf726ea2f0bbef2a2e new file mode 100644 index 0000000..0f04cf9 Binary files /dev/null and b/Library/Artifacts/70/7087622b29c72cbf726ea2f0bbef2a2e differ diff --git a/Library/Artifacts/70/70e3cf866eb53b55569970a697583e2c b/Library/Artifacts/70/70e3cf866eb53b55569970a697583e2c new file mode 100644 index 0000000..c1a0db3 Binary files /dev/null and b/Library/Artifacts/70/70e3cf866eb53b55569970a697583e2c differ diff --git a/Library/Artifacts/70/70fd6124e619f29602c3888e88a33548 b/Library/Artifacts/70/70fd6124e619f29602c3888e88a33548 new file mode 100644 index 0000000..07f6414 Binary files /dev/null and b/Library/Artifacts/70/70fd6124e619f29602c3888e88a33548 differ diff --git a/Library/Artifacts/71/71001563d1810302e2f17c00ca02c464 b/Library/Artifacts/71/71001563d1810302e2f17c00ca02c464 new file mode 100644 index 0000000..0e1b58f Binary files /dev/null and b/Library/Artifacts/71/71001563d1810302e2f17c00ca02c464 differ diff --git a/Library/Artifacts/71/712fe8e7d883fa9c8abc5fede705203a b/Library/Artifacts/71/712fe8e7d883fa9c8abc5fede705203a new file mode 100644 index 0000000..9fbf766 Binary files /dev/null and b/Library/Artifacts/71/712fe8e7d883fa9c8abc5fede705203a differ diff --git a/Library/Artifacts/71/71339cf3baa8baa133eacb5def70a22e b/Library/Artifacts/71/71339cf3baa8baa133eacb5def70a22e new file mode 100644 index 0000000..96e09ba Binary files /dev/null and b/Library/Artifacts/71/71339cf3baa8baa133eacb5def70a22e differ diff --git a/Library/Artifacts/71/71648f2da3331085f31926706721faef b/Library/Artifacts/71/71648f2da3331085f31926706721faef new file mode 100644 index 0000000..d1a6236 Binary files /dev/null and b/Library/Artifacts/71/71648f2da3331085f31926706721faef differ diff --git a/Library/Artifacts/71/719e0b7c9dd24438899a4d2660e7efe7 b/Library/Artifacts/71/719e0b7c9dd24438899a4d2660e7efe7 new file mode 100644 index 0000000..b6d7e11 Binary files /dev/null and b/Library/Artifacts/71/719e0b7c9dd24438899a4d2660e7efe7 differ diff --git a/Library/Artifacts/71/71b1cf657d94ff8b63b342602256db33 b/Library/Artifacts/71/71b1cf657d94ff8b63b342602256db33 new file mode 100644 index 0000000..3383775 Binary files /dev/null and b/Library/Artifacts/71/71b1cf657d94ff8b63b342602256db33 differ diff --git a/Library/Artifacts/71/71dc6531880cf417b15ac7595c9b196f b/Library/Artifacts/71/71dc6531880cf417b15ac7595c9b196f new file mode 100644 index 0000000..ad530be Binary files /dev/null and b/Library/Artifacts/71/71dc6531880cf417b15ac7595c9b196f differ diff --git a/Library/Artifacts/71/71fc375403dfb34d6990a1b7082a81f6 b/Library/Artifacts/71/71fc375403dfb34d6990a1b7082a81f6 new file mode 100644 index 0000000..27ad44c Binary files /dev/null and b/Library/Artifacts/71/71fc375403dfb34d6990a1b7082a81f6 differ diff --git a/Library/Artifacts/72/720565920b4a70a0905b791f22b1ca8f b/Library/Artifacts/72/720565920b4a70a0905b791f22b1ca8f new file mode 100644 index 0000000..d316722 Binary files /dev/null and b/Library/Artifacts/72/720565920b4a70a0905b791f22b1ca8f differ diff --git a/Library/Artifacts/72/7211df72a9b55f1140490a464afb3498 b/Library/Artifacts/72/7211df72a9b55f1140490a464afb3498 new file mode 100644 index 0000000..60a32fc Binary files /dev/null and b/Library/Artifacts/72/7211df72a9b55f1140490a464afb3498 differ diff --git a/Library/Artifacts/72/72180e05c23bb6249a436c63b3d0da05 b/Library/Artifacts/72/72180e05c23bb6249a436c63b3d0da05 new file mode 100644 index 0000000..3376098 Binary files /dev/null and b/Library/Artifacts/72/72180e05c23bb6249a436c63b3d0da05 differ diff --git a/Library/Artifacts/72/7230e29e85d07db43bb2909bca93b9ab b/Library/Artifacts/72/7230e29e85d07db43bb2909bca93b9ab new file mode 100644 index 0000000..cdd6b45 Binary files /dev/null and b/Library/Artifacts/72/7230e29e85d07db43bb2909bca93b9ab differ diff --git a/Library/Artifacts/72/72539622b4b6fff28fba9e3bbf532857 b/Library/Artifacts/72/72539622b4b6fff28fba9e3bbf532857 new file mode 100644 index 0000000..8a17743 Binary files /dev/null and b/Library/Artifacts/72/72539622b4b6fff28fba9e3bbf532857 differ diff --git a/Library/Artifacts/72/728ce5402a39df76409639e1da75fbf6 b/Library/Artifacts/72/728ce5402a39df76409639e1da75fbf6 new file mode 100644 index 0000000..27a3fcb Binary files /dev/null and b/Library/Artifacts/72/728ce5402a39df76409639e1da75fbf6 differ diff --git a/Library/Artifacts/72/72928687dd42696a67c2a3677e1730c4 b/Library/Artifacts/72/72928687dd42696a67c2a3677e1730c4 new file mode 100644 index 0000000..493cd10 Binary files /dev/null and b/Library/Artifacts/72/72928687dd42696a67c2a3677e1730c4 differ diff --git a/Library/Artifacts/72/72a6f38a8ccc9ae1316d9f47ad70a28f b/Library/Artifacts/72/72a6f38a8ccc9ae1316d9f47ad70a28f new file mode 100644 index 0000000..483baa9 Binary files /dev/null and b/Library/Artifacts/72/72a6f38a8ccc9ae1316d9f47ad70a28f differ diff --git a/Library/Artifacts/72/72d838f880a814b583c9878abd7b918e b/Library/Artifacts/72/72d838f880a814b583c9878abd7b918e new file mode 100644 index 0000000..eaebcc9 Binary files /dev/null and b/Library/Artifacts/72/72d838f880a814b583c9878abd7b918e differ diff --git a/Library/Artifacts/73/733847a19ac2e69689a990877514207d b/Library/Artifacts/73/733847a19ac2e69689a990877514207d new file mode 100644 index 0000000..c1a9052 Binary files /dev/null and b/Library/Artifacts/73/733847a19ac2e69689a990877514207d differ diff --git a/Library/Artifacts/73/7352e0aa84f712066fc26bcfcf30ee85 b/Library/Artifacts/73/7352e0aa84f712066fc26bcfcf30ee85 new file mode 100644 index 0000000..fd016a0 Binary files /dev/null and b/Library/Artifacts/73/7352e0aa84f712066fc26bcfcf30ee85 differ diff --git a/Library/Artifacts/73/736337ab725711daf5e4cfb742e0c3b3 b/Library/Artifacts/73/736337ab725711daf5e4cfb742e0c3b3 new file mode 100644 index 0000000..49b01b6 Binary files /dev/null and b/Library/Artifacts/73/736337ab725711daf5e4cfb742e0c3b3 differ diff --git a/Library/Artifacts/73/7375612d7bd2daf94019880b2f2682a3 b/Library/Artifacts/73/7375612d7bd2daf94019880b2f2682a3 new file mode 100644 index 0000000..f9402fd Binary files /dev/null and b/Library/Artifacts/73/7375612d7bd2daf94019880b2f2682a3 differ diff --git a/Library/Artifacts/73/7389d2ea5681fc0aa1b6af3506f794ca b/Library/Artifacts/73/7389d2ea5681fc0aa1b6af3506f794ca new file mode 100644 index 0000000..1d0f02e Binary files /dev/null and b/Library/Artifacts/73/7389d2ea5681fc0aa1b6af3506f794ca differ diff --git a/Library/Artifacts/73/739e4763d1e19fa379fa179e51dd1df3 b/Library/Artifacts/73/739e4763d1e19fa379fa179e51dd1df3 new file mode 100644 index 0000000..8961cf7 Binary files /dev/null and b/Library/Artifacts/73/739e4763d1e19fa379fa179e51dd1df3 differ diff --git a/Library/Artifacts/73/73aca5b0f22f1200fcec31da5d96dad1 b/Library/Artifacts/73/73aca5b0f22f1200fcec31da5d96dad1 new file mode 100644 index 0000000..c187d4a Binary files /dev/null and b/Library/Artifacts/73/73aca5b0f22f1200fcec31da5d96dad1 differ diff --git a/Library/Artifacts/73/73c46c4d174a28199831b23e19bbdf58 b/Library/Artifacts/73/73c46c4d174a28199831b23e19bbdf58 new file mode 100644 index 0000000..1efc826 Binary files /dev/null and b/Library/Artifacts/73/73c46c4d174a28199831b23e19bbdf58 differ diff --git a/Library/Artifacts/73/73d6a34541bf0be7d477ec68db129ef2 b/Library/Artifacts/73/73d6a34541bf0be7d477ec68db129ef2 new file mode 100644 index 0000000..2c25d27 Binary files /dev/null and b/Library/Artifacts/73/73d6a34541bf0be7d477ec68db129ef2 differ diff --git a/Library/Artifacts/74/740e26d20150dff22ac4f5ea7ff4f6d7 b/Library/Artifacts/74/740e26d20150dff22ac4f5ea7ff4f6d7 new file mode 100644 index 0000000..654127b Binary files /dev/null and b/Library/Artifacts/74/740e26d20150dff22ac4f5ea7ff4f6d7 differ diff --git a/Library/Artifacts/74/741980e94c4491a6a3424c0ece38cf2a b/Library/Artifacts/74/741980e94c4491a6a3424c0ece38cf2a new file mode 100644 index 0000000..4f937e9 Binary files /dev/null and b/Library/Artifacts/74/741980e94c4491a6a3424c0ece38cf2a differ diff --git a/Library/Artifacts/74/741f21d568bf47376f245dc3ee00f6f0 b/Library/Artifacts/74/741f21d568bf47376f245dc3ee00f6f0 new file mode 100644 index 0000000..e65adf1 Binary files /dev/null and b/Library/Artifacts/74/741f21d568bf47376f245dc3ee00f6f0 differ diff --git a/Library/Artifacts/74/7464a6deeb72e4f3f1ab1e9e9eae73a1 b/Library/Artifacts/74/7464a6deeb72e4f3f1ab1e9e9eae73a1 new file mode 100644 index 0000000..e96e272 Binary files /dev/null and b/Library/Artifacts/74/7464a6deeb72e4f3f1ab1e9e9eae73a1 differ diff --git a/Library/Artifacts/74/74693d06342339bf58de033c63cf97d0 b/Library/Artifacts/74/74693d06342339bf58de033c63cf97d0 new file mode 100644 index 0000000..7311d37 Binary files /dev/null and b/Library/Artifacts/74/74693d06342339bf58de033c63cf97d0 differ diff --git a/Library/Artifacts/74/748848d693e6d17dde90f1da1034c917 b/Library/Artifacts/74/748848d693e6d17dde90f1da1034c917 new file mode 100644 index 0000000..a93e492 Binary files /dev/null and b/Library/Artifacts/74/748848d693e6d17dde90f1da1034c917 differ diff --git a/Library/Artifacts/74/74a96fe071044d35e74910a8cb36da60 b/Library/Artifacts/74/74a96fe071044d35e74910a8cb36da60 new file mode 100644 index 0000000..c2056a5 Binary files /dev/null and b/Library/Artifacts/74/74a96fe071044d35e74910a8cb36da60 differ diff --git a/Library/Artifacts/74/74b84aeb0abb92f8128e2858db348eb5 b/Library/Artifacts/74/74b84aeb0abb92f8128e2858db348eb5 new file mode 100644 index 0000000..d583604 Binary files /dev/null and b/Library/Artifacts/74/74b84aeb0abb92f8128e2858db348eb5 differ diff --git a/Library/Artifacts/74/74d5e6b82e5619f991b2d0ea9f8e74cf b/Library/Artifacts/74/74d5e6b82e5619f991b2d0ea9f8e74cf new file mode 100644 index 0000000..a58bf56 Binary files /dev/null and b/Library/Artifacts/74/74d5e6b82e5619f991b2d0ea9f8e74cf differ diff --git a/Library/Artifacts/74/74d7d620fcf4a11a3bfba0d690d5b116 b/Library/Artifacts/74/74d7d620fcf4a11a3bfba0d690d5b116 new file mode 100644 index 0000000..64d91f4 Binary files /dev/null and b/Library/Artifacts/74/74d7d620fcf4a11a3bfba0d690d5b116 differ diff --git a/Library/Artifacts/74/74d85cad9fedc6be7916fd3568a91fa3 b/Library/Artifacts/74/74d85cad9fedc6be7916fd3568a91fa3 new file mode 100644 index 0000000..80180a3 Binary files /dev/null and b/Library/Artifacts/74/74d85cad9fedc6be7916fd3568a91fa3 differ diff --git a/Library/Artifacts/74/74e8ae365aed8b147044d072c55b2099 b/Library/Artifacts/74/74e8ae365aed8b147044d072c55b2099 new file mode 100644 index 0000000..a171986 Binary files /dev/null and b/Library/Artifacts/74/74e8ae365aed8b147044d072c55b2099 differ diff --git a/Library/Artifacts/74/74f51349c6a3f2540991fe17f3a834fd b/Library/Artifacts/74/74f51349c6a3f2540991fe17f3a834fd new file mode 100644 index 0000000..11541e0 Binary files /dev/null and b/Library/Artifacts/74/74f51349c6a3f2540991fe17f3a834fd differ diff --git a/Library/Artifacts/75/750d5d9571090cdce6940ce55b2d714b b/Library/Artifacts/75/750d5d9571090cdce6940ce55b2d714b new file mode 100644 index 0000000..e5320a5 Binary files /dev/null and b/Library/Artifacts/75/750d5d9571090cdce6940ce55b2d714b differ diff --git a/Library/Artifacts/75/7561511f41ab5b8c2b6b1b4b82a1de46 b/Library/Artifacts/75/7561511f41ab5b8c2b6b1b4b82a1de46 new file mode 100644 index 0000000..31c9f39 Binary files /dev/null and b/Library/Artifacts/75/7561511f41ab5b8c2b6b1b4b82a1de46 differ diff --git a/Library/Artifacts/75/759fa782a1a19355fc7154f167b8e057 b/Library/Artifacts/75/759fa782a1a19355fc7154f167b8e057 new file mode 100644 index 0000000..24b3158 Binary files /dev/null and b/Library/Artifacts/75/759fa782a1a19355fc7154f167b8e057 differ diff --git a/Library/Artifacts/75/75a9a9a3e36d261a0bf8a6b1d550f481 b/Library/Artifacts/75/75a9a9a3e36d261a0bf8a6b1d550f481 new file mode 100644 index 0000000..320f3ae Binary files /dev/null and b/Library/Artifacts/75/75a9a9a3e36d261a0bf8a6b1d550f481 differ diff --git a/Library/Artifacts/75/75d34c1a5bb1d28cc9fdac98761b52fb b/Library/Artifacts/75/75d34c1a5bb1d28cc9fdac98761b52fb new file mode 100644 index 0000000..140056d Binary files /dev/null and b/Library/Artifacts/75/75d34c1a5bb1d28cc9fdac98761b52fb differ diff --git a/Library/Artifacts/75/75d397d5fad9e7ed078bc19995564eba b/Library/Artifacts/75/75d397d5fad9e7ed078bc19995564eba new file mode 100644 index 0000000..511e913 Binary files /dev/null and b/Library/Artifacts/75/75d397d5fad9e7ed078bc19995564eba differ diff --git a/Library/Artifacts/76/7632a9fb294c23099912419f56606aa4 b/Library/Artifacts/76/7632a9fb294c23099912419f56606aa4 new file mode 100644 index 0000000..2a6679c Binary files /dev/null and b/Library/Artifacts/76/7632a9fb294c23099912419f56606aa4 differ diff --git a/Library/Artifacts/76/7638544190fc3c2c2ed892b1dc23b703 b/Library/Artifacts/76/7638544190fc3c2c2ed892b1dc23b703 new file mode 100644 index 0000000..985e374 Binary files /dev/null and b/Library/Artifacts/76/7638544190fc3c2c2ed892b1dc23b703 differ diff --git a/Library/Artifacts/76/76430bbe2e87dea9fe177a06461efb57 b/Library/Artifacts/76/76430bbe2e87dea9fe177a06461efb57 new file mode 100644 index 0000000..3d31682 Binary files /dev/null and b/Library/Artifacts/76/76430bbe2e87dea9fe177a06461efb57 differ diff --git a/Library/Artifacts/76/765580612b217319cdb6ef6af7dd4b7e b/Library/Artifacts/76/765580612b217319cdb6ef6af7dd4b7e new file mode 100644 index 0000000..fc2bee3 Binary files /dev/null and b/Library/Artifacts/76/765580612b217319cdb6ef6af7dd4b7e differ diff --git a/Library/Artifacts/76/766c47005c7f474070d13cba1a6173d9 b/Library/Artifacts/76/766c47005c7f474070d13cba1a6173d9 new file mode 100644 index 0000000..6634f91 Binary files /dev/null and b/Library/Artifacts/76/766c47005c7f474070d13cba1a6173d9 differ diff --git a/Library/Artifacts/76/768fedb8928b00ad57b263a597e7c02b b/Library/Artifacts/76/768fedb8928b00ad57b263a597e7c02b new file mode 100644 index 0000000..585c877 Binary files /dev/null and b/Library/Artifacts/76/768fedb8928b00ad57b263a597e7c02b differ diff --git a/Library/Artifacts/76/7696351a66e0f075a2d338b8e5b2a13a b/Library/Artifacts/76/7696351a66e0f075a2d338b8e5b2a13a new file mode 100644 index 0000000..64c417b Binary files /dev/null and b/Library/Artifacts/76/7696351a66e0f075a2d338b8e5b2a13a differ diff --git a/Library/Artifacts/76/76ac1555fd528dba6481c4f0d6a43008 b/Library/Artifacts/76/76ac1555fd528dba6481c4f0d6a43008 new file mode 100644 index 0000000..b783c48 Binary files /dev/null and b/Library/Artifacts/76/76ac1555fd528dba6481c4f0d6a43008 differ diff --git a/Library/Artifacts/77/7710832029f4e0a421476061068fca68 b/Library/Artifacts/77/7710832029f4e0a421476061068fca68 new file mode 100644 index 0000000..000c2ac Binary files /dev/null and b/Library/Artifacts/77/7710832029f4e0a421476061068fca68 differ diff --git a/Library/Artifacts/77/773a4370343a72d42c71fade4c634c75 b/Library/Artifacts/77/773a4370343a72d42c71fade4c634c75 new file mode 100644 index 0000000..7078127 Binary files /dev/null and b/Library/Artifacts/77/773a4370343a72d42c71fade4c634c75 differ diff --git a/Library/Artifacts/77/776d547067068851cbd09684eb1b39ce b/Library/Artifacts/77/776d547067068851cbd09684eb1b39ce new file mode 100644 index 0000000..f150094 Binary files /dev/null and b/Library/Artifacts/77/776d547067068851cbd09684eb1b39ce differ diff --git a/Library/Artifacts/77/77b99c4cc378a21c761e36a3a087df40 b/Library/Artifacts/77/77b99c4cc378a21c761e36a3a087df40 new file mode 100644 index 0000000..8d6b8c1 Binary files /dev/null and b/Library/Artifacts/77/77b99c4cc378a21c761e36a3a087df40 differ diff --git a/Library/Artifacts/77/77d42f05c01aa16622344c16cfafe3a5 b/Library/Artifacts/77/77d42f05c01aa16622344c16cfafe3a5 new file mode 100644 index 0000000..b03832e Binary files /dev/null and b/Library/Artifacts/77/77d42f05c01aa16622344c16cfafe3a5 differ diff --git a/Library/Artifacts/77/77d8207c352935924aa9f34303f6c34d b/Library/Artifacts/77/77d8207c352935924aa9f34303f6c34d new file mode 100644 index 0000000..5643118 Binary files /dev/null and b/Library/Artifacts/77/77d8207c352935924aa9f34303f6c34d differ diff --git a/Library/Artifacts/77/77e3249b8c012891855b3e655e8290c7 b/Library/Artifacts/77/77e3249b8c012891855b3e655e8290c7 new file mode 100644 index 0000000..71041e9 Binary files /dev/null and b/Library/Artifacts/77/77e3249b8c012891855b3e655e8290c7 differ diff --git a/Library/Artifacts/78/7808c154cf09768b6b1b29474f47efc7 b/Library/Artifacts/78/7808c154cf09768b6b1b29474f47efc7 new file mode 100644 index 0000000..9c532f8 Binary files /dev/null and b/Library/Artifacts/78/7808c154cf09768b6b1b29474f47efc7 differ diff --git a/Library/Artifacts/78/780cc80d7508b154021b1925eae5803e b/Library/Artifacts/78/780cc80d7508b154021b1925eae5803e new file mode 100644 index 0000000..5d6124c Binary files /dev/null and b/Library/Artifacts/78/780cc80d7508b154021b1925eae5803e differ diff --git a/Library/Artifacts/78/781f33ecd09e4bb4f01a285f9220e7e0 b/Library/Artifacts/78/781f33ecd09e4bb4f01a285f9220e7e0 new file mode 100644 index 0000000..54fe444 Binary files /dev/null and b/Library/Artifacts/78/781f33ecd09e4bb4f01a285f9220e7e0 differ diff --git a/Library/Artifacts/78/781f805d25d96780137301b83ee8f838 b/Library/Artifacts/78/781f805d25d96780137301b83ee8f838 new file mode 100644 index 0000000..6a591d7 Binary files /dev/null and b/Library/Artifacts/78/781f805d25d96780137301b83ee8f838 differ diff --git a/Library/Artifacts/78/7846694d71d87b26f5a9a1001c74747c b/Library/Artifacts/78/7846694d71d87b26f5a9a1001c74747c new file mode 100644 index 0000000..5a32fd9 Binary files /dev/null and b/Library/Artifacts/78/7846694d71d87b26f5a9a1001c74747c differ diff --git a/Library/Artifacts/78/78b4759c0502557e238b96ca4caaaaab b/Library/Artifacts/78/78b4759c0502557e238b96ca4caaaaab new file mode 100644 index 0000000..bf4da36 Binary files /dev/null and b/Library/Artifacts/78/78b4759c0502557e238b96ca4caaaaab differ diff --git a/Library/Artifacts/78/78babe2a0108a922284a039e04704687 b/Library/Artifacts/78/78babe2a0108a922284a039e04704687 new file mode 100644 index 0000000..c02ba88 Binary files /dev/null and b/Library/Artifacts/78/78babe2a0108a922284a039e04704687 differ diff --git a/Library/Artifacts/79/7917d599996b3e98c85f639e675be54b b/Library/Artifacts/79/7917d599996b3e98c85f639e675be54b new file mode 100644 index 0000000..2297bbc Binary files /dev/null and b/Library/Artifacts/79/7917d599996b3e98c85f639e675be54b differ diff --git a/Library/Artifacts/79/791db0ad5c91366f20d006d2b6e4eba6 b/Library/Artifacts/79/791db0ad5c91366f20d006d2b6e4eba6 new file mode 100644 index 0000000..ba63c5e Binary files /dev/null and b/Library/Artifacts/79/791db0ad5c91366f20d006d2b6e4eba6 differ diff --git a/Library/Artifacts/79/793509efa36c9d86aeedca6ac2d05627 b/Library/Artifacts/79/793509efa36c9d86aeedca6ac2d05627 new file mode 100644 index 0000000..565fd54 Binary files /dev/null and b/Library/Artifacts/79/793509efa36c9d86aeedca6ac2d05627 differ diff --git a/Library/Artifacts/79/79387664eee53bb083bf582e9c463f5d b/Library/Artifacts/79/79387664eee53bb083bf582e9c463f5d new file mode 100644 index 0000000..b784c23 Binary files /dev/null and b/Library/Artifacts/79/79387664eee53bb083bf582e9c463f5d differ diff --git a/Library/Artifacts/79/793a37359b656e45411c76aa10f2fc23 b/Library/Artifacts/79/793a37359b656e45411c76aa10f2fc23 new file mode 100644 index 0000000..a3a9d3f Binary files /dev/null and b/Library/Artifacts/79/793a37359b656e45411c76aa10f2fc23 differ diff --git a/Library/Artifacts/79/794f90927f5d852936725b4873f533bc b/Library/Artifacts/79/794f90927f5d852936725b4873f533bc new file mode 100644 index 0000000..05c609a Binary files /dev/null and b/Library/Artifacts/79/794f90927f5d852936725b4873f533bc differ diff --git a/Library/Artifacts/79/7950087862407c046dd6f54a6dbba271 b/Library/Artifacts/79/7950087862407c046dd6f54a6dbba271 new file mode 100644 index 0000000..a4659f5 Binary files /dev/null and b/Library/Artifacts/79/7950087862407c046dd6f54a6dbba271 differ diff --git a/Library/Artifacts/79/79744a1bb8f487bae39a956702c0fef6 b/Library/Artifacts/79/79744a1bb8f487bae39a956702c0fef6 new file mode 100644 index 0000000..bcf1a05 Binary files /dev/null and b/Library/Artifacts/79/79744a1bb8f487bae39a956702c0fef6 differ diff --git a/Library/Artifacts/79/79a0bcca23a0a23058971200f5a9c704 b/Library/Artifacts/79/79a0bcca23a0a23058971200f5a9c704 new file mode 100644 index 0000000..266d39b Binary files /dev/null and b/Library/Artifacts/79/79a0bcca23a0a23058971200f5a9c704 differ diff --git a/Library/Artifacts/79/79e506e29790278633591d5f443954c0 b/Library/Artifacts/79/79e506e29790278633591d5f443954c0 new file mode 100644 index 0000000..6d56580 Binary files /dev/null and b/Library/Artifacts/79/79e506e29790278633591d5f443954c0 differ diff --git a/Library/Artifacts/79/79ec9924523cab891e1402fd42acd369 b/Library/Artifacts/79/79ec9924523cab891e1402fd42acd369 new file mode 100644 index 0000000..7964e9b Binary files /dev/null and b/Library/Artifacts/79/79ec9924523cab891e1402fd42acd369 differ diff --git a/Library/Artifacts/79/79ef2833ef6dc744fb4231a04935ab94 b/Library/Artifacts/79/79ef2833ef6dc744fb4231a04935ab94 new file mode 100644 index 0000000..1d0bc60 Binary files /dev/null and b/Library/Artifacts/79/79ef2833ef6dc744fb4231a04935ab94 differ diff --git a/Library/Artifacts/7a/7a045987e088354d7e1be44a83f1d7dc b/Library/Artifacts/7a/7a045987e088354d7e1be44a83f1d7dc new file mode 100644 index 0000000..add87dc Binary files /dev/null and b/Library/Artifacts/7a/7a045987e088354d7e1be44a83f1d7dc differ diff --git a/Library/Artifacts/7a/7a1ddd4bb62494c94d9a519402133b72 b/Library/Artifacts/7a/7a1ddd4bb62494c94d9a519402133b72 new file mode 100644 index 0000000..a9fbb89 Binary files /dev/null and b/Library/Artifacts/7a/7a1ddd4bb62494c94d9a519402133b72 differ diff --git a/Library/Artifacts/7a/7a4da30694cbb6fccdbe22bbe808bf4d b/Library/Artifacts/7a/7a4da30694cbb6fccdbe22bbe808bf4d new file mode 100644 index 0000000..62406fe Binary files /dev/null and b/Library/Artifacts/7a/7a4da30694cbb6fccdbe22bbe808bf4d differ diff --git a/Library/Artifacts/7a/7a8384ccfc815773717fa94d5dcf5bac b/Library/Artifacts/7a/7a8384ccfc815773717fa94d5dcf5bac new file mode 100644 index 0000000..c17b72b Binary files /dev/null and b/Library/Artifacts/7a/7a8384ccfc815773717fa94d5dcf5bac differ diff --git a/Library/Artifacts/7a/7aa8adc24145ee1764cd0aeebbbded7e b/Library/Artifacts/7a/7aa8adc24145ee1764cd0aeebbbded7e new file mode 100644 index 0000000..cf6dc4d Binary files /dev/null and b/Library/Artifacts/7a/7aa8adc24145ee1764cd0aeebbbded7e differ diff --git a/Library/Artifacts/7a/7ac925f11fdfd4f05919119d635becf4 b/Library/Artifacts/7a/7ac925f11fdfd4f05919119d635becf4 new file mode 100644 index 0000000..8e11709 Binary files /dev/null and b/Library/Artifacts/7a/7ac925f11fdfd4f05919119d635becf4 differ diff --git a/Library/Artifacts/7b/7b00af584e209f9b673149e1f2d6bc3c b/Library/Artifacts/7b/7b00af584e209f9b673149e1f2d6bc3c new file mode 100644 index 0000000..f04e7d0 Binary files /dev/null and b/Library/Artifacts/7b/7b00af584e209f9b673149e1f2d6bc3c differ diff --git a/Library/Artifacts/7b/7b09f74aec556b6ae1aeea776424218b b/Library/Artifacts/7b/7b09f74aec556b6ae1aeea776424218b new file mode 100644 index 0000000..62cb4a8 Binary files /dev/null and b/Library/Artifacts/7b/7b09f74aec556b6ae1aeea776424218b differ diff --git a/Library/Artifacts/7b/7b1378a132fbb719d99619588c3f0927 b/Library/Artifacts/7b/7b1378a132fbb719d99619588c3f0927 new file mode 100644 index 0000000..1ddb382 Binary files /dev/null and b/Library/Artifacts/7b/7b1378a132fbb719d99619588c3f0927 differ diff --git a/Library/Artifacts/7b/7b1c9fcfffeef6e6b3cfad403b12213b b/Library/Artifacts/7b/7b1c9fcfffeef6e6b3cfad403b12213b new file mode 100644 index 0000000..1cc1323 Binary files /dev/null and b/Library/Artifacts/7b/7b1c9fcfffeef6e6b3cfad403b12213b differ diff --git a/Library/Artifacts/7b/7b8d0350440e48f581ed5a588f13b60f b/Library/Artifacts/7b/7b8d0350440e48f581ed5a588f13b60f new file mode 100644 index 0000000..45c789f Binary files /dev/null and b/Library/Artifacts/7b/7b8d0350440e48f581ed5a588f13b60f differ diff --git a/Library/Artifacts/7b/7b9be7590cb6274c911988bd06431f36 b/Library/Artifacts/7b/7b9be7590cb6274c911988bd06431f36 new file mode 100644 index 0000000..edd76c6 Binary files /dev/null and b/Library/Artifacts/7b/7b9be7590cb6274c911988bd06431f36 differ diff --git a/Library/Artifacts/7b/7bbe3a2965baa610c7d6d0347f2a85ae b/Library/Artifacts/7b/7bbe3a2965baa610c7d6d0347f2a85ae new file mode 100644 index 0000000..b509585 Binary files /dev/null and b/Library/Artifacts/7b/7bbe3a2965baa610c7d6d0347f2a85ae differ diff --git a/Library/Artifacts/7b/7bcf1c1dac433557299f90223a6b1796 b/Library/Artifacts/7b/7bcf1c1dac433557299f90223a6b1796 new file mode 100644 index 0000000..7ba63e2 Binary files /dev/null and b/Library/Artifacts/7b/7bcf1c1dac433557299f90223a6b1796 differ diff --git a/Library/Artifacts/7b/7bd0685948ff17000413a22a4beaad6e b/Library/Artifacts/7b/7bd0685948ff17000413a22a4beaad6e new file mode 100644 index 0000000..1708600 Binary files /dev/null and b/Library/Artifacts/7b/7bd0685948ff17000413a22a4beaad6e differ diff --git a/Library/Artifacts/7b/7bef4ec9784c3ed029ab132a88f35476 b/Library/Artifacts/7b/7bef4ec9784c3ed029ab132a88f35476 new file mode 100644 index 0000000..afd3265 Binary files /dev/null and b/Library/Artifacts/7b/7bef4ec9784c3ed029ab132a88f35476 differ diff --git a/Library/Artifacts/7c/7c675934479e238232ff7d74637d30d9 b/Library/Artifacts/7c/7c675934479e238232ff7d74637d30d9 new file mode 100644 index 0000000..3908c43 Binary files /dev/null and b/Library/Artifacts/7c/7c675934479e238232ff7d74637d30d9 differ diff --git a/Library/Artifacts/7c/7c7ee789290ff70b06dea25743db598e b/Library/Artifacts/7c/7c7ee789290ff70b06dea25743db598e new file mode 100644 index 0000000..bdf6394 Binary files /dev/null and b/Library/Artifacts/7c/7c7ee789290ff70b06dea25743db598e differ diff --git a/Library/Artifacts/7c/7c97c493dafce68bb2b711f1e7c82cc6 b/Library/Artifacts/7c/7c97c493dafce68bb2b711f1e7c82cc6 new file mode 100644 index 0000000..bf7b746 Binary files /dev/null and b/Library/Artifacts/7c/7c97c493dafce68bb2b711f1e7c82cc6 differ diff --git a/Library/Artifacts/7d/7d0e9506c60c5240ce78cbcf4c379e8d b/Library/Artifacts/7d/7d0e9506c60c5240ce78cbcf4c379e8d new file mode 100644 index 0000000..4ecb8f9 Binary files /dev/null and b/Library/Artifacts/7d/7d0e9506c60c5240ce78cbcf4c379e8d differ diff --git a/Library/Artifacts/7d/7d21d3bc040ade030d5ff02c920beb64 b/Library/Artifacts/7d/7d21d3bc040ade030d5ff02c920beb64 new file mode 100644 index 0000000..c99ab4a Binary files /dev/null and b/Library/Artifacts/7d/7d21d3bc040ade030d5ff02c920beb64 differ diff --git a/Library/Artifacts/7d/7d2b1b311591fc74b13b637f7eb260d9 b/Library/Artifacts/7d/7d2b1b311591fc74b13b637f7eb260d9 new file mode 100644 index 0000000..e7ed25e Binary files /dev/null and b/Library/Artifacts/7d/7d2b1b311591fc74b13b637f7eb260d9 differ diff --git a/Library/Artifacts/7d/7d2db6423461342c0e79f7c086cf764a b/Library/Artifacts/7d/7d2db6423461342c0e79f7c086cf764a new file mode 100644 index 0000000..f135ccb Binary files /dev/null and b/Library/Artifacts/7d/7d2db6423461342c0e79f7c086cf764a differ diff --git a/Library/Artifacts/7d/7d70f61d9e589c1dd5525f83718470d4 b/Library/Artifacts/7d/7d70f61d9e589c1dd5525f83718470d4 new file mode 100644 index 0000000..776b588 Binary files /dev/null and b/Library/Artifacts/7d/7d70f61d9e589c1dd5525f83718470d4 differ diff --git a/Library/Artifacts/7d/7da164043ef2827af300bea71f293c3b b/Library/Artifacts/7d/7da164043ef2827af300bea71f293c3b new file mode 100644 index 0000000..446dd0e Binary files /dev/null and b/Library/Artifacts/7d/7da164043ef2827af300bea71f293c3b differ diff --git a/Library/Artifacts/7d/7da18670ab481664763f927afb758561 b/Library/Artifacts/7d/7da18670ab481664763f927afb758561 new file mode 100644 index 0000000..f4f6d73 Binary files /dev/null and b/Library/Artifacts/7d/7da18670ab481664763f927afb758561 differ diff --git a/Library/Artifacts/7d/7da8f1d8ecba2bccfca2e3d9f303a68c b/Library/Artifacts/7d/7da8f1d8ecba2bccfca2e3d9f303a68c new file mode 100644 index 0000000..c93abae Binary files /dev/null and b/Library/Artifacts/7d/7da8f1d8ecba2bccfca2e3d9f303a68c differ diff --git a/Library/Artifacts/7d/7db1fd873b680fa0312e746063f154ec b/Library/Artifacts/7d/7db1fd873b680fa0312e746063f154ec new file mode 100644 index 0000000..35e9177 Binary files /dev/null and b/Library/Artifacts/7d/7db1fd873b680fa0312e746063f154ec differ diff --git a/Library/Artifacts/7d/7dbdb42a1ef4a23ed110f078f133d3cc b/Library/Artifacts/7d/7dbdb42a1ef4a23ed110f078f133d3cc new file mode 100644 index 0000000..a091dce Binary files /dev/null and b/Library/Artifacts/7d/7dbdb42a1ef4a23ed110f078f133d3cc differ diff --git a/Library/Artifacts/7d/7dfe761b9d773af94e12b70f5d079a59 b/Library/Artifacts/7d/7dfe761b9d773af94e12b70f5d079a59 new file mode 100644 index 0000000..900743d Binary files /dev/null and b/Library/Artifacts/7d/7dfe761b9d773af94e12b70f5d079a59 differ diff --git a/Library/Artifacts/7e/7e01561233644e028ea51dfa90cdfa74 b/Library/Artifacts/7e/7e01561233644e028ea51dfa90cdfa74 new file mode 100644 index 0000000..7b06c5d Binary files /dev/null and b/Library/Artifacts/7e/7e01561233644e028ea51dfa90cdfa74 differ diff --git a/Library/Artifacts/7e/7e8cb0b7e1a64b710886c10fc3211e10 b/Library/Artifacts/7e/7e8cb0b7e1a64b710886c10fc3211e10 new file mode 100644 index 0000000..b5c8bb9 Binary files /dev/null and b/Library/Artifacts/7e/7e8cb0b7e1a64b710886c10fc3211e10 differ diff --git a/Library/Artifacts/7e/7e99784a6c0b737ce62dff1a50fdfc10 b/Library/Artifacts/7e/7e99784a6c0b737ce62dff1a50fdfc10 new file mode 100644 index 0000000..b8f93d2 Binary files /dev/null and b/Library/Artifacts/7e/7e99784a6c0b737ce62dff1a50fdfc10 differ diff --git a/Library/Artifacts/7e/7eab22ed5040f50769d99f3e326667d3 b/Library/Artifacts/7e/7eab22ed5040f50769d99f3e326667d3 new file mode 100644 index 0000000..502ad23 Binary files /dev/null and b/Library/Artifacts/7e/7eab22ed5040f50769d99f3e326667d3 differ diff --git a/Library/Artifacts/7e/7eaccf2b35773b8fdef05e75a2ddc308 b/Library/Artifacts/7e/7eaccf2b35773b8fdef05e75a2ddc308 new file mode 100644 index 0000000..6a58ee6 Binary files /dev/null and b/Library/Artifacts/7e/7eaccf2b35773b8fdef05e75a2ddc308 differ diff --git a/Library/Artifacts/7e/7eea640a3472e6ebb57c0010d4d102fa b/Library/Artifacts/7e/7eea640a3472e6ebb57c0010d4d102fa new file mode 100644 index 0000000..b2770f7 Binary files /dev/null and b/Library/Artifacts/7e/7eea640a3472e6ebb57c0010d4d102fa differ diff --git a/Library/Artifacts/7f/7f15beca01df005a7012ea0762074c85 b/Library/Artifacts/7f/7f15beca01df005a7012ea0762074c85 new file mode 100644 index 0000000..16c64fc Binary files /dev/null and b/Library/Artifacts/7f/7f15beca01df005a7012ea0762074c85 differ diff --git a/Library/Artifacts/7f/7f2d9f0ec3722aa45fe2878537de3134 b/Library/Artifacts/7f/7f2d9f0ec3722aa45fe2878537de3134 new file mode 100644 index 0000000..eddd675 Binary files /dev/null and b/Library/Artifacts/7f/7f2d9f0ec3722aa45fe2878537de3134 differ diff --git a/Library/Artifacts/7f/7f50002218ff4e86c2f0f8c5b790f30d b/Library/Artifacts/7f/7f50002218ff4e86c2f0f8c5b790f30d new file mode 100644 index 0000000..0cb1133 Binary files /dev/null and b/Library/Artifacts/7f/7f50002218ff4e86c2f0f8c5b790f30d differ diff --git a/Library/Artifacts/7f/7f55cf182ecf35d6f5e74ebdebea4146 b/Library/Artifacts/7f/7f55cf182ecf35d6f5e74ebdebea4146 new file mode 100644 index 0000000..a0f4558 Binary files /dev/null and b/Library/Artifacts/7f/7f55cf182ecf35d6f5e74ebdebea4146 differ diff --git a/Library/Artifacts/7f/7f89745025fb3dc75b6295d5de43d6f4 b/Library/Artifacts/7f/7f89745025fb3dc75b6295d5de43d6f4 new file mode 100644 index 0000000..ee160bb Binary files /dev/null and b/Library/Artifacts/7f/7f89745025fb3dc75b6295d5de43d6f4 differ diff --git a/Library/Artifacts/7f/7f999102c4cd6d18d80e002aa038a923 b/Library/Artifacts/7f/7f999102c4cd6d18d80e002aa038a923 new file mode 100644 index 0000000..4c07734 Binary files /dev/null and b/Library/Artifacts/7f/7f999102c4cd6d18d80e002aa038a923 differ diff --git a/Library/Artifacts/7f/7fcfa4c99fa386f83a3489396a173a88 b/Library/Artifacts/7f/7fcfa4c99fa386f83a3489396a173a88 new file mode 100644 index 0000000..39dc66b Binary files /dev/null and b/Library/Artifacts/7f/7fcfa4c99fa386f83a3489396a173a88 differ diff --git a/Library/Artifacts/80/804e0f04ce749bcfd5f77a2f0e27b95b b/Library/Artifacts/80/804e0f04ce749bcfd5f77a2f0e27b95b new file mode 100644 index 0000000..eea702d Binary files /dev/null and b/Library/Artifacts/80/804e0f04ce749bcfd5f77a2f0e27b95b differ diff --git a/Library/Artifacts/80/806e28c47b5af70fa913df29e0917425 b/Library/Artifacts/80/806e28c47b5af70fa913df29e0917425 new file mode 100644 index 0000000..ec5f033 Binary files /dev/null and b/Library/Artifacts/80/806e28c47b5af70fa913df29e0917425 differ diff --git a/Library/Artifacts/80/807f4a77eccd8162269aefbb68e25b69 b/Library/Artifacts/80/807f4a77eccd8162269aefbb68e25b69 new file mode 100644 index 0000000..873e61e Binary files /dev/null and b/Library/Artifacts/80/807f4a77eccd8162269aefbb68e25b69 differ diff --git a/Library/Artifacts/80/80e82621fac69e42e11d96ea014b306a b/Library/Artifacts/80/80e82621fac69e42e11d96ea014b306a new file mode 100644 index 0000000..fba2b92 Binary files /dev/null and b/Library/Artifacts/80/80e82621fac69e42e11d96ea014b306a differ diff --git a/Library/Artifacts/81/8139ffee670d3a98389ad2645c7b63f8 b/Library/Artifacts/81/8139ffee670d3a98389ad2645c7b63f8 new file mode 100644 index 0000000..161f5ee Binary files /dev/null and b/Library/Artifacts/81/8139ffee670d3a98389ad2645c7b63f8 differ diff --git a/Library/Artifacts/81/816667776256f3ccbe070e584f8cea84 b/Library/Artifacts/81/816667776256f3ccbe070e584f8cea84 new file mode 100644 index 0000000..d12a020 Binary files /dev/null and b/Library/Artifacts/81/816667776256f3ccbe070e584f8cea84 differ diff --git a/Library/Artifacts/81/818aa263ce5d66cc49951af594683807 b/Library/Artifacts/81/818aa263ce5d66cc49951af594683807 new file mode 100644 index 0000000..e1a3466 Binary files /dev/null and b/Library/Artifacts/81/818aa263ce5d66cc49951af594683807 differ diff --git a/Library/Artifacts/81/818c2c4ab09fe7a3a3ecb4ac74ed28b7 b/Library/Artifacts/81/818c2c4ab09fe7a3a3ecb4ac74ed28b7 new file mode 100644 index 0000000..a36bb50 Binary files /dev/null and b/Library/Artifacts/81/818c2c4ab09fe7a3a3ecb4ac74ed28b7 differ diff --git a/Library/Artifacts/81/81b28733d4e11fa5b5d60dc8800919a6 b/Library/Artifacts/81/81b28733d4e11fa5b5d60dc8800919a6 new file mode 100644 index 0000000..8536ba6 Binary files /dev/null and b/Library/Artifacts/81/81b28733d4e11fa5b5d60dc8800919a6 differ diff --git a/Library/Artifacts/81/81fcbbb2b5cf7221bbd2f1067b3ae112 b/Library/Artifacts/81/81fcbbb2b5cf7221bbd2f1067b3ae112 new file mode 100644 index 0000000..ed70f70 Binary files /dev/null and b/Library/Artifacts/81/81fcbbb2b5cf7221bbd2f1067b3ae112 differ diff --git a/Library/Artifacts/82/8240316428c68dbaafc818ba3cbf6d23 b/Library/Artifacts/82/8240316428c68dbaafc818ba3cbf6d23 new file mode 100644 index 0000000..f7a0c1d Binary files /dev/null and b/Library/Artifacts/82/8240316428c68dbaafc818ba3cbf6d23 differ diff --git a/Library/Artifacts/82/826f933060fc58333bd19621634d9298 b/Library/Artifacts/82/826f933060fc58333bd19621634d9298 new file mode 100644 index 0000000..ce07ef9 Binary files /dev/null and b/Library/Artifacts/82/826f933060fc58333bd19621634d9298 differ diff --git a/Library/Artifacts/82/82abf2911692003303199ec84ca92bbb b/Library/Artifacts/82/82abf2911692003303199ec84ca92bbb new file mode 100644 index 0000000..a10acca Binary files /dev/null and b/Library/Artifacts/82/82abf2911692003303199ec84ca92bbb differ diff --git a/Library/Artifacts/83/832366e21d0abc4ba22a8c5c83d978db b/Library/Artifacts/83/832366e21d0abc4ba22a8c5c83d978db new file mode 100644 index 0000000..6884f1f Binary files /dev/null and b/Library/Artifacts/83/832366e21d0abc4ba22a8c5c83d978db differ diff --git a/Library/Artifacts/83/832eef47d5e59f25c706c51df0001fda b/Library/Artifacts/83/832eef47d5e59f25c706c51df0001fda new file mode 100644 index 0000000..ad37f76 Binary files /dev/null and b/Library/Artifacts/83/832eef47d5e59f25c706c51df0001fda differ diff --git a/Library/Artifacts/83/83312594c786a9def7b2c50d423f7a10 b/Library/Artifacts/83/83312594c786a9def7b2c50d423f7a10 new file mode 100644 index 0000000..9e189c8 Binary files /dev/null and b/Library/Artifacts/83/83312594c786a9def7b2c50d423f7a10 differ diff --git a/Library/Artifacts/83/83333c528ce716c3e83ca2de17c0775d b/Library/Artifacts/83/83333c528ce716c3e83ca2de17c0775d new file mode 100644 index 0000000..2240478 Binary files /dev/null and b/Library/Artifacts/83/83333c528ce716c3e83ca2de17c0775d differ diff --git a/Library/Artifacts/83/836332be8f8e792f01167fb567d3ed26 b/Library/Artifacts/83/836332be8f8e792f01167fb567d3ed26 new file mode 100644 index 0000000..089095e Binary files /dev/null and b/Library/Artifacts/83/836332be8f8e792f01167fb567d3ed26 differ diff --git a/Library/Artifacts/83/83dc5c3fbfcacabe4b7c0dbfce69d6ee b/Library/Artifacts/83/83dc5c3fbfcacabe4b7c0dbfce69d6ee new file mode 100644 index 0000000..caa2090 Binary files /dev/null and b/Library/Artifacts/83/83dc5c3fbfcacabe4b7c0dbfce69d6ee differ diff --git a/Library/Artifacts/83/83f017823883ae2351df4865de75ad1f b/Library/Artifacts/83/83f017823883ae2351df4865de75ad1f new file mode 100644 index 0000000..bc45f85 Binary files /dev/null and b/Library/Artifacts/83/83f017823883ae2351df4865de75ad1f differ diff --git a/Library/Artifacts/83/83f9eb4234a4cc16abdfc5a3999b9adc b/Library/Artifacts/83/83f9eb4234a4cc16abdfc5a3999b9adc new file mode 100644 index 0000000..28a376b Binary files /dev/null and b/Library/Artifacts/83/83f9eb4234a4cc16abdfc5a3999b9adc differ diff --git a/Library/Artifacts/84/841b6d8cd9696e3b59dcbf49e501a546 b/Library/Artifacts/84/841b6d8cd9696e3b59dcbf49e501a546 new file mode 100644 index 0000000..9fad916 Binary files /dev/null and b/Library/Artifacts/84/841b6d8cd9696e3b59dcbf49e501a546 differ diff --git a/Library/Artifacts/84/8435f902c39a43bb2175fc610e863426 b/Library/Artifacts/84/8435f902c39a43bb2175fc610e863426 new file mode 100644 index 0000000..d0ce631 Binary files /dev/null and b/Library/Artifacts/84/8435f902c39a43bb2175fc610e863426 differ diff --git a/Library/Artifacts/84/8437b53c2f7f982a156671835e518b5c b/Library/Artifacts/84/8437b53c2f7f982a156671835e518b5c new file mode 100644 index 0000000..0cba488 Binary files /dev/null and b/Library/Artifacts/84/8437b53c2f7f982a156671835e518b5c differ diff --git a/Library/Artifacts/84/843dfbb83f107c8232d5e6d6db672d08 b/Library/Artifacts/84/843dfbb83f107c8232d5e6d6db672d08 new file mode 100644 index 0000000..e2ebcdb Binary files /dev/null and b/Library/Artifacts/84/843dfbb83f107c8232d5e6d6db672d08 differ diff --git a/Library/Artifacts/84/8442afa112f0e07796390df2c919b93b b/Library/Artifacts/84/8442afa112f0e07796390df2c919b93b new file mode 100644 index 0000000..030d320 Binary files /dev/null and b/Library/Artifacts/84/8442afa112f0e07796390df2c919b93b differ diff --git a/Library/Artifacts/84/84633c807dfc6649428413f401d689fd b/Library/Artifacts/84/84633c807dfc6649428413f401d689fd new file mode 100644 index 0000000..eadce73 Binary files /dev/null and b/Library/Artifacts/84/84633c807dfc6649428413f401d689fd differ diff --git a/Library/Artifacts/84/848104788c0812b29a965eb358962b42 b/Library/Artifacts/84/848104788c0812b29a965eb358962b42 new file mode 100644 index 0000000..4f84b10 Binary files /dev/null and b/Library/Artifacts/84/848104788c0812b29a965eb358962b42 differ diff --git a/Library/Artifacts/84/848fa78f9096fd64f7829bb838b3306c b/Library/Artifacts/84/848fa78f9096fd64f7829bb838b3306c new file mode 100644 index 0000000..292e51b Binary files /dev/null and b/Library/Artifacts/84/848fa78f9096fd64f7829bb838b3306c differ diff --git a/Library/Artifacts/84/849ff48efdfb3bdb0f911f7924d13e2b b/Library/Artifacts/84/849ff48efdfb3bdb0f911f7924d13e2b new file mode 100644 index 0000000..4df16a0 Binary files /dev/null and b/Library/Artifacts/84/849ff48efdfb3bdb0f911f7924d13e2b differ diff --git a/Library/Artifacts/84/84e2696d26ef351dd2306db13e32873e b/Library/Artifacts/84/84e2696d26ef351dd2306db13e32873e new file mode 100644 index 0000000..7809dcf Binary files /dev/null and b/Library/Artifacts/84/84e2696d26ef351dd2306db13e32873e differ diff --git a/Library/Artifacts/84/84e5d8f7e6184e8da08723949ebda39c b/Library/Artifacts/84/84e5d8f7e6184e8da08723949ebda39c new file mode 100644 index 0000000..539a606 Binary files /dev/null and b/Library/Artifacts/84/84e5d8f7e6184e8da08723949ebda39c differ diff --git a/Library/Artifacts/84/84e79ed52d875371bfda2ce5ecc72000 b/Library/Artifacts/84/84e79ed52d875371bfda2ce5ecc72000 new file mode 100644 index 0000000..eb81f93 Binary files /dev/null and b/Library/Artifacts/84/84e79ed52d875371bfda2ce5ecc72000 differ diff --git a/Library/Artifacts/85/85228920a6366b9b699905599882704f b/Library/Artifacts/85/85228920a6366b9b699905599882704f new file mode 100644 index 0000000..2f7ec6d Binary files /dev/null and b/Library/Artifacts/85/85228920a6366b9b699905599882704f differ diff --git a/Library/Artifacts/85/855800e9a9227bc92d1f1af755dc1664 b/Library/Artifacts/85/855800e9a9227bc92d1f1af755dc1664 new file mode 100644 index 0000000..de016a4 Binary files /dev/null and b/Library/Artifacts/85/855800e9a9227bc92d1f1af755dc1664 differ diff --git a/Library/Artifacts/85/8567b6d79f1fd00b08f98bb90b605cb8 b/Library/Artifacts/85/8567b6d79f1fd00b08f98bb90b605cb8 new file mode 100644 index 0000000..6dc9585 Binary files /dev/null and b/Library/Artifacts/85/8567b6d79f1fd00b08f98bb90b605cb8 differ diff --git a/Library/Artifacts/85/85c9b223384f2d321bad364b289bee33 b/Library/Artifacts/85/85c9b223384f2d321bad364b289bee33 new file mode 100644 index 0000000..2b6b177 Binary files /dev/null and b/Library/Artifacts/85/85c9b223384f2d321bad364b289bee33 differ diff --git a/Library/Artifacts/85/85ca3f62c48495ee5fec85a4b9cb30d4 b/Library/Artifacts/85/85ca3f62c48495ee5fec85a4b9cb30d4 new file mode 100644 index 0000000..547dd1f Binary files /dev/null and b/Library/Artifacts/85/85ca3f62c48495ee5fec85a4b9cb30d4 differ diff --git a/Library/Artifacts/86/860535c0f85e941a2bffc55e13ed34f0 b/Library/Artifacts/86/860535c0f85e941a2bffc55e13ed34f0 new file mode 100644 index 0000000..ae70087 Binary files /dev/null and b/Library/Artifacts/86/860535c0f85e941a2bffc55e13ed34f0 differ diff --git a/Library/Artifacts/86/8629c5bad4907ef782d10d8affddf2c5 b/Library/Artifacts/86/8629c5bad4907ef782d10d8affddf2c5 new file mode 100644 index 0000000..abc6cf4 Binary files /dev/null and b/Library/Artifacts/86/8629c5bad4907ef782d10d8affddf2c5 differ diff --git a/Library/Artifacts/86/86dd970dae45c27d7f2c7cf0a239d8f1 b/Library/Artifacts/86/86dd970dae45c27d7f2c7cf0a239d8f1 new file mode 100644 index 0000000..01e4cb0 Binary files /dev/null and b/Library/Artifacts/86/86dd970dae45c27d7f2c7cf0a239d8f1 differ diff --git a/Library/Artifacts/86/86ef3786f6b4740eeb6167a249dfe2cc b/Library/Artifacts/86/86ef3786f6b4740eeb6167a249dfe2cc new file mode 100644 index 0000000..7646f5c Binary files /dev/null and b/Library/Artifacts/86/86ef3786f6b4740eeb6167a249dfe2cc differ diff --git a/Library/Artifacts/86/86ff07ce576898f0ddf03979e125a8c1 b/Library/Artifacts/86/86ff07ce576898f0ddf03979e125a8c1 new file mode 100644 index 0000000..f711640 Binary files /dev/null and b/Library/Artifacts/86/86ff07ce576898f0ddf03979e125a8c1 differ diff --git a/Library/Artifacts/87/870dae6ff1d32ff4e6ced04f7bd9a936 b/Library/Artifacts/87/870dae6ff1d32ff4e6ced04f7bd9a936 new file mode 100644 index 0000000..8221593 Binary files /dev/null and b/Library/Artifacts/87/870dae6ff1d32ff4e6ced04f7bd9a936 differ diff --git a/Library/Artifacts/87/875698a10608c7cc1e3c8591ef35eecb b/Library/Artifacts/87/875698a10608c7cc1e3c8591ef35eecb new file mode 100644 index 0000000..af5bf37 Binary files /dev/null and b/Library/Artifacts/87/875698a10608c7cc1e3c8591ef35eecb differ diff --git a/Library/Artifacts/87/876f971373e6653dff52b58ee911ccaa b/Library/Artifacts/87/876f971373e6653dff52b58ee911ccaa new file mode 100644 index 0000000..8d01e6a Binary files /dev/null and b/Library/Artifacts/87/876f971373e6653dff52b58ee911ccaa differ diff --git a/Library/Artifacts/87/87771e33b791998641f4ffc007a7327a b/Library/Artifacts/87/87771e33b791998641f4ffc007a7327a new file mode 100644 index 0000000..bd21bf1 Binary files /dev/null and b/Library/Artifacts/87/87771e33b791998641f4ffc007a7327a differ diff --git a/Library/Artifacts/87/87862fc464e25f76c3a0acfea483a31c b/Library/Artifacts/87/87862fc464e25f76c3a0acfea483a31c new file mode 100644 index 0000000..6fc7f24 Binary files /dev/null and b/Library/Artifacts/87/87862fc464e25f76c3a0acfea483a31c differ diff --git a/Library/Artifacts/87/87a3a86a43103863d2c2a0aa1416a636 b/Library/Artifacts/87/87a3a86a43103863d2c2a0aa1416a636 new file mode 100644 index 0000000..6f9387a Binary files /dev/null and b/Library/Artifacts/87/87a3a86a43103863d2c2a0aa1416a636 differ diff --git a/Library/Artifacts/88/880298488c84bec412fa396a4f348af8 b/Library/Artifacts/88/880298488c84bec412fa396a4f348af8 new file mode 100644 index 0000000..bb4e1d5 Binary files /dev/null and b/Library/Artifacts/88/880298488c84bec412fa396a4f348af8 differ diff --git a/Library/Artifacts/88/8845c5bad72b73bacf1159bfc23473e2 b/Library/Artifacts/88/8845c5bad72b73bacf1159bfc23473e2 new file mode 100644 index 0000000..7678d02 Binary files /dev/null and b/Library/Artifacts/88/8845c5bad72b73bacf1159bfc23473e2 differ diff --git a/Library/Artifacts/88/884eb2d0479fd2e3084bc70c15478308 b/Library/Artifacts/88/884eb2d0479fd2e3084bc70c15478308 new file mode 100644 index 0000000..9b89a2a Binary files /dev/null and b/Library/Artifacts/88/884eb2d0479fd2e3084bc70c15478308 differ diff --git a/Library/Artifacts/88/88577de03c235d1615ba974d79f7d678 b/Library/Artifacts/88/88577de03c235d1615ba974d79f7d678 new file mode 100644 index 0000000..8ac0c68 Binary files /dev/null and b/Library/Artifacts/88/88577de03c235d1615ba974d79f7d678 differ diff --git a/Library/Artifacts/88/885a56f12b3d3b3df22e00b2030072e9 b/Library/Artifacts/88/885a56f12b3d3b3df22e00b2030072e9 new file mode 100644 index 0000000..feb87c9 Binary files /dev/null and b/Library/Artifacts/88/885a56f12b3d3b3df22e00b2030072e9 differ diff --git a/Library/Artifacts/88/88883d8980372ade27e3d071b85ee311 b/Library/Artifacts/88/88883d8980372ade27e3d071b85ee311 new file mode 100644 index 0000000..6504296 Binary files /dev/null and b/Library/Artifacts/88/88883d8980372ade27e3d071b85ee311 differ diff --git a/Library/Artifacts/88/888f2b144663b2709c541fd95677ca67 b/Library/Artifacts/88/888f2b144663b2709c541fd95677ca67 new file mode 100644 index 0000000..f5055d4 Binary files /dev/null and b/Library/Artifacts/88/888f2b144663b2709c541fd95677ca67 differ diff --git a/Library/Artifacts/88/88902da40f62150e463d1bbd94796cd3 b/Library/Artifacts/88/88902da40f62150e463d1bbd94796cd3 new file mode 100644 index 0000000..e84b07f Binary files /dev/null and b/Library/Artifacts/88/88902da40f62150e463d1bbd94796cd3 differ diff --git a/Library/Artifacts/88/889ca86e20a358005137ac5d6c5a91bf b/Library/Artifacts/88/889ca86e20a358005137ac5d6c5a91bf new file mode 100644 index 0000000..14f8242 Binary files /dev/null and b/Library/Artifacts/88/889ca86e20a358005137ac5d6c5a91bf differ diff --git a/Library/Artifacts/88/88a07e2fd15589d8bc8bb7ed720399dd b/Library/Artifacts/88/88a07e2fd15589d8bc8bb7ed720399dd new file mode 100644 index 0000000..15ac2e0 Binary files /dev/null and b/Library/Artifacts/88/88a07e2fd15589d8bc8bb7ed720399dd differ diff --git a/Library/Artifacts/88/88a2b2fc3fc8686cdf3e238e5b7cb83c b/Library/Artifacts/88/88a2b2fc3fc8686cdf3e238e5b7cb83c new file mode 100644 index 0000000..4851306 Binary files /dev/null and b/Library/Artifacts/88/88a2b2fc3fc8686cdf3e238e5b7cb83c differ diff --git a/Library/Artifacts/88/88acb1294990084c13e3316708d68286 b/Library/Artifacts/88/88acb1294990084c13e3316708d68286 new file mode 100644 index 0000000..57066fb Binary files /dev/null and b/Library/Artifacts/88/88acb1294990084c13e3316708d68286 differ diff --git a/Library/Artifacts/88/88dd7a4f0ce32d833551f6423217c115 b/Library/Artifacts/88/88dd7a4f0ce32d833551f6423217c115 new file mode 100644 index 0000000..460e0f5 Binary files /dev/null and b/Library/Artifacts/88/88dd7a4f0ce32d833551f6423217c115 differ diff --git a/Library/Artifacts/89/89296a27058e6037d163b70cb03bdfd6 b/Library/Artifacts/89/89296a27058e6037d163b70cb03bdfd6 new file mode 100644 index 0000000..abcd78e Binary files /dev/null and b/Library/Artifacts/89/89296a27058e6037d163b70cb03bdfd6 differ diff --git a/Library/Artifacts/89/8950959ddebf4df0c8cddc872b239600 b/Library/Artifacts/89/8950959ddebf4df0c8cddc872b239600 new file mode 100644 index 0000000..a345090 Binary files /dev/null and b/Library/Artifacts/89/8950959ddebf4df0c8cddc872b239600 differ diff --git a/Library/Artifacts/89/8962bd9a7ed59e11ad62c5617ecdc8ce b/Library/Artifacts/89/8962bd9a7ed59e11ad62c5617ecdc8ce new file mode 100644 index 0000000..667bdfa Binary files /dev/null and b/Library/Artifacts/89/8962bd9a7ed59e11ad62c5617ecdc8ce differ diff --git a/Library/Artifacts/89/896d80bbda6c2db68d8cd69cb88e370d b/Library/Artifacts/89/896d80bbda6c2db68d8cd69cb88e370d new file mode 100644 index 0000000..82dd2ff Binary files /dev/null and b/Library/Artifacts/89/896d80bbda6c2db68d8cd69cb88e370d differ diff --git a/Library/Artifacts/89/89ac7bd6aecb8b5452e9a2b2d27ca88b b/Library/Artifacts/89/89ac7bd6aecb8b5452e9a2b2d27ca88b new file mode 100644 index 0000000..172a97f Binary files /dev/null and b/Library/Artifacts/89/89ac7bd6aecb8b5452e9a2b2d27ca88b differ diff --git a/Library/Artifacts/89/89e87464d9bfb1d39e531ee233514044 b/Library/Artifacts/89/89e87464d9bfb1d39e531ee233514044 new file mode 100644 index 0000000..683542a Binary files /dev/null and b/Library/Artifacts/89/89e87464d9bfb1d39e531ee233514044 differ diff --git a/Library/Artifacts/8a/8a00796497d02b511fe97e91afa7e5b4 b/Library/Artifacts/8a/8a00796497d02b511fe97e91afa7e5b4 new file mode 100644 index 0000000..bdff94f Binary files /dev/null and b/Library/Artifacts/8a/8a00796497d02b511fe97e91afa7e5b4 differ diff --git a/Library/Artifacts/8a/8a35f4c77fee017da6665e060203c258 b/Library/Artifacts/8a/8a35f4c77fee017da6665e060203c258 new file mode 100644 index 0000000..546141f Binary files /dev/null and b/Library/Artifacts/8a/8a35f4c77fee017da6665e060203c258 differ diff --git a/Library/Artifacts/8a/8a36cf29cc4a30a66d8b07303206ead9 b/Library/Artifacts/8a/8a36cf29cc4a30a66d8b07303206ead9 new file mode 100644 index 0000000..afb1c3b Binary files /dev/null and b/Library/Artifacts/8a/8a36cf29cc4a30a66d8b07303206ead9 differ diff --git a/Library/Artifacts/8a/8a38b826ce132f6a8b320fc9211ded43 b/Library/Artifacts/8a/8a38b826ce132f6a8b320fc9211ded43 new file mode 100644 index 0000000..717e816 Binary files /dev/null and b/Library/Artifacts/8a/8a38b826ce132f6a8b320fc9211ded43 differ diff --git a/Library/Artifacts/8a/8a3b0bbce774f9276f781155f5983266 b/Library/Artifacts/8a/8a3b0bbce774f9276f781155f5983266 new file mode 100644 index 0000000..f0ad9f1 Binary files /dev/null and b/Library/Artifacts/8a/8a3b0bbce774f9276f781155f5983266 differ diff --git a/Library/Artifacts/8a/8a76353ef78eb1e5795a60b0f58bd074 b/Library/Artifacts/8a/8a76353ef78eb1e5795a60b0f58bd074 new file mode 100644 index 0000000..be400a8 Binary files /dev/null and b/Library/Artifacts/8a/8a76353ef78eb1e5795a60b0f58bd074 differ diff --git a/Library/Artifacts/8a/8a83d3c6f27ff605e956829f526f5b63 b/Library/Artifacts/8a/8a83d3c6f27ff605e956829f526f5b63 new file mode 100644 index 0000000..3926f95 Binary files /dev/null and b/Library/Artifacts/8a/8a83d3c6f27ff605e956829f526f5b63 differ diff --git a/Library/Artifacts/8a/8a90293fb7e20d6140c060a7f3c1ac7a b/Library/Artifacts/8a/8a90293fb7e20d6140c060a7f3c1ac7a new file mode 100644 index 0000000..907bda1 Binary files /dev/null and b/Library/Artifacts/8a/8a90293fb7e20d6140c060a7f3c1ac7a differ diff --git a/Library/Artifacts/8a/8a9907ca198749bf8f6c6f8102a71cb1 b/Library/Artifacts/8a/8a9907ca198749bf8f6c6f8102a71cb1 new file mode 100644 index 0000000..6cc8d16 Binary files /dev/null and b/Library/Artifacts/8a/8a9907ca198749bf8f6c6f8102a71cb1 differ diff --git a/Library/Artifacts/8a/8a9cc2731c9f50943e6ccd10167ae1ee b/Library/Artifacts/8a/8a9cc2731c9f50943e6ccd10167ae1ee new file mode 100644 index 0000000..1dccd1f Binary files /dev/null and b/Library/Artifacts/8a/8a9cc2731c9f50943e6ccd10167ae1ee differ diff --git a/Library/Artifacts/8a/8aeaa2bad42199f0c3705da475409df0 b/Library/Artifacts/8a/8aeaa2bad42199f0c3705da475409df0 new file mode 100644 index 0000000..088aa6e Binary files /dev/null and b/Library/Artifacts/8a/8aeaa2bad42199f0c3705da475409df0 differ diff --git a/Library/Artifacts/8b/8b0865c636791fd08d8fb3d9e56bf244 b/Library/Artifacts/8b/8b0865c636791fd08d8fb3d9e56bf244 new file mode 100644 index 0000000..0b8452a Binary files /dev/null and b/Library/Artifacts/8b/8b0865c636791fd08d8fb3d9e56bf244 differ diff --git a/Library/Artifacts/8b/8b3ee9ae951636050c831bc8bce36f3d b/Library/Artifacts/8b/8b3ee9ae951636050c831bc8bce36f3d new file mode 100644 index 0000000..4ae0daa Binary files /dev/null and b/Library/Artifacts/8b/8b3ee9ae951636050c831bc8bce36f3d differ diff --git a/Library/Artifacts/8b/8b67bcd0b0bd12c28b810fed160796f9 b/Library/Artifacts/8b/8b67bcd0b0bd12c28b810fed160796f9 new file mode 100644 index 0000000..87ee88f Binary files /dev/null and b/Library/Artifacts/8b/8b67bcd0b0bd12c28b810fed160796f9 differ diff --git a/Library/Artifacts/8b/8b6fc07f24ed15f59ab43809c6f002bf b/Library/Artifacts/8b/8b6fc07f24ed15f59ab43809c6f002bf new file mode 100644 index 0000000..9c29c6d Binary files /dev/null and b/Library/Artifacts/8b/8b6fc07f24ed15f59ab43809c6f002bf differ diff --git a/Library/Artifacts/8b/8b812a6181ccea4697d500399cdbba99 b/Library/Artifacts/8b/8b812a6181ccea4697d500399cdbba99 new file mode 100644 index 0000000..a8ef9dd Binary files /dev/null and b/Library/Artifacts/8b/8b812a6181ccea4697d500399cdbba99 differ diff --git a/Library/Artifacts/8b/8ba52e4dc252913bbb09d3ed3218e056 b/Library/Artifacts/8b/8ba52e4dc252913bbb09d3ed3218e056 new file mode 100644 index 0000000..e8bbd46 Binary files /dev/null and b/Library/Artifacts/8b/8ba52e4dc252913bbb09d3ed3218e056 differ diff --git a/Library/Artifacts/8b/8bb611cff6011dcf8c0d9298e7572323 b/Library/Artifacts/8b/8bb611cff6011dcf8c0d9298e7572323 new file mode 100644 index 0000000..721f1e2 Binary files /dev/null and b/Library/Artifacts/8b/8bb611cff6011dcf8c0d9298e7572323 differ diff --git a/Library/Artifacts/8b/8bf44cce83a5e155bb97f36c44e54bbd b/Library/Artifacts/8b/8bf44cce83a5e155bb97f36c44e54bbd new file mode 100644 index 0000000..2c6cce8 Binary files /dev/null and b/Library/Artifacts/8b/8bf44cce83a5e155bb97f36c44e54bbd differ diff --git a/Library/Artifacts/8c/8c477fc6a35c6ec439837fe8fb25b438 b/Library/Artifacts/8c/8c477fc6a35c6ec439837fe8fb25b438 new file mode 100644 index 0000000..93177bd Binary files /dev/null and b/Library/Artifacts/8c/8c477fc6a35c6ec439837fe8fb25b438 differ diff --git a/Library/Artifacts/8c/8c6d1e3c735519b5f34a829b3fe7e8b4 b/Library/Artifacts/8c/8c6d1e3c735519b5f34a829b3fe7e8b4 new file mode 100644 index 0000000..6f849ba Binary files /dev/null and b/Library/Artifacts/8c/8c6d1e3c735519b5f34a829b3fe7e8b4 differ diff --git a/Library/Artifacts/8c/8cafde13c7bea08ba2cee88aea180eea b/Library/Artifacts/8c/8cafde13c7bea08ba2cee88aea180eea new file mode 100644 index 0000000..6037659 Binary files /dev/null and b/Library/Artifacts/8c/8cafde13c7bea08ba2cee88aea180eea differ diff --git a/Library/Artifacts/8c/8cd0297dbcfeff70e99202bcf65274ec b/Library/Artifacts/8c/8cd0297dbcfeff70e99202bcf65274ec new file mode 100644 index 0000000..3eb829a Binary files /dev/null and b/Library/Artifacts/8c/8cd0297dbcfeff70e99202bcf65274ec differ diff --git a/Library/Artifacts/8c/8cd504bd7964fa81fbacdb879e88c2f9 b/Library/Artifacts/8c/8cd504bd7964fa81fbacdb879e88c2f9 new file mode 100644 index 0000000..39a1743 Binary files /dev/null and b/Library/Artifacts/8c/8cd504bd7964fa81fbacdb879e88c2f9 differ diff --git a/Library/Artifacts/8c/8cf74902f6d9d5f1c571e436985f1d5e b/Library/Artifacts/8c/8cf74902f6d9d5f1c571e436985f1d5e new file mode 100644 index 0000000..9f9f91c Binary files /dev/null and b/Library/Artifacts/8c/8cf74902f6d9d5f1c571e436985f1d5e differ diff --git a/Library/Artifacts/8d/8d053ae4bb636848da2923053b35853e b/Library/Artifacts/8d/8d053ae4bb636848da2923053b35853e new file mode 100644 index 0000000..fb757d6 Binary files /dev/null and b/Library/Artifacts/8d/8d053ae4bb636848da2923053b35853e differ diff --git a/Library/Artifacts/8d/8d5885a4aa3043d5c5257c75a7d47a37 b/Library/Artifacts/8d/8d5885a4aa3043d5c5257c75a7d47a37 new file mode 100644 index 0000000..a9af95e Binary files /dev/null and b/Library/Artifacts/8d/8d5885a4aa3043d5c5257c75a7d47a37 differ diff --git a/Library/Artifacts/8d/8d5a2c4f51fa8478d53ccb51393f3c52 b/Library/Artifacts/8d/8d5a2c4f51fa8478d53ccb51393f3c52 new file mode 100644 index 0000000..1d02528 Binary files /dev/null and b/Library/Artifacts/8d/8d5a2c4f51fa8478d53ccb51393f3c52 differ diff --git a/Library/Artifacts/8d/8d6efb6cc395c138c9ac1fca939ab1c1 b/Library/Artifacts/8d/8d6efb6cc395c138c9ac1fca939ab1c1 new file mode 100644 index 0000000..3c01228 Binary files /dev/null and b/Library/Artifacts/8d/8d6efb6cc395c138c9ac1fca939ab1c1 differ diff --git a/Library/Artifacts/8d/8d78a402cf5735383b533bc29a38af73 b/Library/Artifacts/8d/8d78a402cf5735383b533bc29a38af73 new file mode 100644 index 0000000..ae82abc Binary files /dev/null and b/Library/Artifacts/8d/8d78a402cf5735383b533bc29a38af73 differ diff --git a/Library/Artifacts/8d/8d821bfa634425ad376b21750a8ca7de b/Library/Artifacts/8d/8d821bfa634425ad376b21750a8ca7de new file mode 100644 index 0000000..8d95087 Binary files /dev/null and b/Library/Artifacts/8d/8d821bfa634425ad376b21750a8ca7de differ diff --git a/Library/Artifacts/8d/8d8cf81bb9958e541022e67d3df116ca b/Library/Artifacts/8d/8d8cf81bb9958e541022e67d3df116ca new file mode 100644 index 0000000..ec1278e Binary files /dev/null and b/Library/Artifacts/8d/8d8cf81bb9958e541022e67d3df116ca differ diff --git a/Library/Artifacts/8d/8de6113db34866d77ceeb8718aa6489b b/Library/Artifacts/8d/8de6113db34866d77ceeb8718aa6489b new file mode 100644 index 0000000..918f22d Binary files /dev/null and b/Library/Artifacts/8d/8de6113db34866d77ceeb8718aa6489b differ diff --git a/Library/Artifacts/8d/8df524c7b3bb6cac2a093c0dbc019128 b/Library/Artifacts/8d/8df524c7b3bb6cac2a093c0dbc019128 new file mode 100644 index 0000000..43630bb Binary files /dev/null and b/Library/Artifacts/8d/8df524c7b3bb6cac2a093c0dbc019128 differ diff --git a/Library/Artifacts/8e/8e2103ec62b3c3781eb08a5ce9c00e0f b/Library/Artifacts/8e/8e2103ec62b3c3781eb08a5ce9c00e0f new file mode 100644 index 0000000..d00bac9 Binary files /dev/null and b/Library/Artifacts/8e/8e2103ec62b3c3781eb08a5ce9c00e0f differ diff --git a/Library/Artifacts/8e/8e23112d06b84c9d30eec5015cccfe7a b/Library/Artifacts/8e/8e23112d06b84c9d30eec5015cccfe7a new file mode 100644 index 0000000..2ef912a Binary files /dev/null and b/Library/Artifacts/8e/8e23112d06b84c9d30eec5015cccfe7a differ diff --git a/Library/Artifacts/8e/8e372c5e92f7b0bfb7d0a5fef938248c b/Library/Artifacts/8e/8e372c5e92f7b0bfb7d0a5fef938248c new file mode 100644 index 0000000..8b3a729 Binary files /dev/null and b/Library/Artifacts/8e/8e372c5e92f7b0bfb7d0a5fef938248c differ diff --git a/Library/Artifacts/8e/8e4483c08c1b70ba431541725b6c3997 b/Library/Artifacts/8e/8e4483c08c1b70ba431541725b6c3997 new file mode 100644 index 0000000..d15a4eb Binary files /dev/null and b/Library/Artifacts/8e/8e4483c08c1b70ba431541725b6c3997 differ diff --git a/Library/Artifacts/8e/8e6caf279cec133dfea4c3141f7e8ed4 b/Library/Artifacts/8e/8e6caf279cec133dfea4c3141f7e8ed4 new file mode 100644 index 0000000..6291636 Binary files /dev/null and b/Library/Artifacts/8e/8e6caf279cec133dfea4c3141f7e8ed4 differ diff --git a/Library/Artifacts/8e/8e98745fb2531b39a26cc824125370dd b/Library/Artifacts/8e/8e98745fb2531b39a26cc824125370dd new file mode 100644 index 0000000..d0f9852 Binary files /dev/null and b/Library/Artifacts/8e/8e98745fb2531b39a26cc824125370dd differ diff --git a/Library/Artifacts/8f/8f0d14f50ece19fa6e75d862838a803b b/Library/Artifacts/8f/8f0d14f50ece19fa6e75d862838a803b new file mode 100644 index 0000000..9a0b87d Binary files /dev/null and b/Library/Artifacts/8f/8f0d14f50ece19fa6e75d862838a803b differ diff --git a/Library/Artifacts/8f/8f138d3463ebd919d711644cdbecd154 b/Library/Artifacts/8f/8f138d3463ebd919d711644cdbecd154 new file mode 100644 index 0000000..79b83e0 Binary files /dev/null and b/Library/Artifacts/8f/8f138d3463ebd919d711644cdbecd154 differ diff --git a/Library/Artifacts/8f/8f18a0d5e4a62699f63380a277d33d48 b/Library/Artifacts/8f/8f18a0d5e4a62699f63380a277d33d48 new file mode 100644 index 0000000..615d0cb Binary files /dev/null and b/Library/Artifacts/8f/8f18a0d5e4a62699f63380a277d33d48 differ diff --git a/Library/Artifacts/8f/8f62229b953a1f740bf30e083fee8de3 b/Library/Artifacts/8f/8f62229b953a1f740bf30e083fee8de3 new file mode 100644 index 0000000..1040585 Binary files /dev/null and b/Library/Artifacts/8f/8f62229b953a1f740bf30e083fee8de3 differ diff --git a/Library/Artifacts/8f/8f706023d8a7654313b89e71cc050a01 b/Library/Artifacts/8f/8f706023d8a7654313b89e71cc050a01 new file mode 100644 index 0000000..f79ca36 Binary files /dev/null and b/Library/Artifacts/8f/8f706023d8a7654313b89e71cc050a01 differ diff --git a/Library/Artifacts/8f/8f73e983291bf54d72e77226168b9a3f b/Library/Artifacts/8f/8f73e983291bf54d72e77226168b9a3f new file mode 100644 index 0000000..4a1ba5c Binary files /dev/null and b/Library/Artifacts/8f/8f73e983291bf54d72e77226168b9a3f differ diff --git a/Library/Artifacts/8f/8fb26d54c663b8fdbe7872294e576ccb b/Library/Artifacts/8f/8fb26d54c663b8fdbe7872294e576ccb new file mode 100644 index 0000000..098f314 Binary files /dev/null and b/Library/Artifacts/8f/8fb26d54c663b8fdbe7872294e576ccb differ diff --git a/Library/Artifacts/8f/8fc88d5e0e448cc443cd85f71f8dc45e b/Library/Artifacts/8f/8fc88d5e0e448cc443cd85f71f8dc45e new file mode 100644 index 0000000..61437b2 Binary files /dev/null and b/Library/Artifacts/8f/8fc88d5e0e448cc443cd85f71f8dc45e differ diff --git a/Library/Artifacts/8f/8fd097ce8e937e5960960f1af104c6a9 b/Library/Artifacts/8f/8fd097ce8e937e5960960f1af104c6a9 new file mode 100644 index 0000000..97e9003 Binary files /dev/null and b/Library/Artifacts/8f/8fd097ce8e937e5960960f1af104c6a9 differ diff --git a/Library/Artifacts/90/9049e4e86919776da2041d88a55c7ad0 b/Library/Artifacts/90/9049e4e86919776da2041d88a55c7ad0 new file mode 100644 index 0000000..6fdbbe7 Binary files /dev/null and b/Library/Artifacts/90/9049e4e86919776da2041d88a55c7ad0 differ diff --git a/Library/Artifacts/90/9057f8f8269c90c5b86b24b8eb68e369 b/Library/Artifacts/90/9057f8f8269c90c5b86b24b8eb68e369 new file mode 100644 index 0000000..3763bd3 Binary files /dev/null and b/Library/Artifacts/90/9057f8f8269c90c5b86b24b8eb68e369 differ diff --git a/Library/Artifacts/90/906966c39cfe69a29df9a2b006ef1fd6 b/Library/Artifacts/90/906966c39cfe69a29df9a2b006ef1fd6 new file mode 100644 index 0000000..22065cd Binary files /dev/null and b/Library/Artifacts/90/906966c39cfe69a29df9a2b006ef1fd6 differ diff --git a/Library/Artifacts/90/906c2ce7de3c256c0c01f2ae17ee1f17 b/Library/Artifacts/90/906c2ce7de3c256c0c01f2ae17ee1f17 new file mode 100644 index 0000000..2f09c20 Binary files /dev/null and b/Library/Artifacts/90/906c2ce7de3c256c0c01f2ae17ee1f17 differ diff --git a/Library/Artifacts/90/906d2e7f4b8497479f39997c8703da2f b/Library/Artifacts/90/906d2e7f4b8497479f39997c8703da2f new file mode 100644 index 0000000..87de761 Binary files /dev/null and b/Library/Artifacts/90/906d2e7f4b8497479f39997c8703da2f differ diff --git a/Library/Artifacts/90/907735a02edfdef15c358d52896c82d2 b/Library/Artifacts/90/907735a02edfdef15c358d52896c82d2 new file mode 100644 index 0000000..52ecfc4 Binary files /dev/null and b/Library/Artifacts/90/907735a02edfdef15c358d52896c82d2 differ diff --git a/Library/Artifacts/90/90b6086686c2826c41cfb4d2645a217f b/Library/Artifacts/90/90b6086686c2826c41cfb4d2645a217f new file mode 100644 index 0000000..d4c565f Binary files /dev/null and b/Library/Artifacts/90/90b6086686c2826c41cfb4d2645a217f differ diff --git a/Library/Artifacts/90/90cc09186ea5222274ab8bcf5d68c8a9 b/Library/Artifacts/90/90cc09186ea5222274ab8bcf5d68c8a9 new file mode 100644 index 0000000..c75a577 Binary files /dev/null and b/Library/Artifacts/90/90cc09186ea5222274ab8bcf5d68c8a9 differ diff --git a/Library/Artifacts/91/913e0cd7d7385d49b85cb589d8137e82 b/Library/Artifacts/91/913e0cd7d7385d49b85cb589d8137e82 new file mode 100644 index 0000000..0ee064f Binary files /dev/null and b/Library/Artifacts/91/913e0cd7d7385d49b85cb589d8137e82 differ diff --git a/Library/Artifacts/91/914df38b745660481f98d411da038360 b/Library/Artifacts/91/914df38b745660481f98d411da038360 new file mode 100644 index 0000000..57f5579 Binary files /dev/null and b/Library/Artifacts/91/914df38b745660481f98d411da038360 differ diff --git a/Library/Artifacts/91/915c63344c5a34ea989da599ad126253 b/Library/Artifacts/91/915c63344c5a34ea989da599ad126253 new file mode 100644 index 0000000..eb1d1f3 Binary files /dev/null and b/Library/Artifacts/91/915c63344c5a34ea989da599ad126253 differ diff --git a/Library/Artifacts/91/91b0d23773a2a74168bcde36e87a4ce6 b/Library/Artifacts/91/91b0d23773a2a74168bcde36e87a4ce6 new file mode 100644 index 0000000..0b85aa1 Binary files /dev/null and b/Library/Artifacts/91/91b0d23773a2a74168bcde36e87a4ce6 differ diff --git a/Library/Artifacts/91/91bbc59e7eb64131edc2ac9d1dab0803 b/Library/Artifacts/91/91bbc59e7eb64131edc2ac9d1dab0803 new file mode 100644 index 0000000..34a71e9 Binary files /dev/null and b/Library/Artifacts/91/91bbc59e7eb64131edc2ac9d1dab0803 differ diff --git a/Library/Artifacts/91/91c18458066e1cd71ee9d1b37c1ee1af b/Library/Artifacts/91/91c18458066e1cd71ee9d1b37c1ee1af new file mode 100644 index 0000000..14b6c61 Binary files /dev/null and b/Library/Artifacts/91/91c18458066e1cd71ee9d1b37c1ee1af differ diff --git a/Library/Artifacts/91/91d2951addf173cecfb192a982a096ed b/Library/Artifacts/91/91d2951addf173cecfb192a982a096ed new file mode 100644 index 0000000..43b8d7b Binary files /dev/null and b/Library/Artifacts/91/91d2951addf173cecfb192a982a096ed differ diff --git a/Library/Artifacts/91/91fd97037bd70c485193c67c56f1be56 b/Library/Artifacts/91/91fd97037bd70c485193c67c56f1be56 new file mode 100644 index 0000000..b3c53a7 Binary files /dev/null and b/Library/Artifacts/91/91fd97037bd70c485193c67c56f1be56 differ diff --git a/Library/Artifacts/92/923686ae0cfd6ebffc401a5005379b50 b/Library/Artifacts/92/923686ae0cfd6ebffc401a5005379b50 new file mode 100644 index 0000000..ad2494e Binary files /dev/null and b/Library/Artifacts/92/923686ae0cfd6ebffc401a5005379b50 differ diff --git a/Library/Artifacts/92/9280db5a1f77ddcb62d3256cdbdb7cd0 b/Library/Artifacts/92/9280db5a1f77ddcb62d3256cdbdb7cd0 new file mode 100644 index 0000000..a88d3e5 Binary files /dev/null and b/Library/Artifacts/92/9280db5a1f77ddcb62d3256cdbdb7cd0 differ diff --git a/Library/Artifacts/92/92a89b9f433c8dd5ecdb44156a13aa4b b/Library/Artifacts/92/92a89b9f433c8dd5ecdb44156a13aa4b new file mode 100644 index 0000000..9adfc62 Binary files /dev/null and b/Library/Artifacts/92/92a89b9f433c8dd5ecdb44156a13aa4b differ diff --git a/Library/Artifacts/92/92c5bc4f211db84e6453f3e17cb0e969 b/Library/Artifacts/92/92c5bc4f211db84e6453f3e17cb0e969 new file mode 100644 index 0000000..95703b8 Binary files /dev/null and b/Library/Artifacts/92/92c5bc4f211db84e6453f3e17cb0e969 differ diff --git a/Library/Artifacts/92/92e72dc59029d3aef72d92d7f73e2407 b/Library/Artifacts/92/92e72dc59029d3aef72d92d7f73e2407 new file mode 100644 index 0000000..75f8a8b Binary files /dev/null and b/Library/Artifacts/92/92e72dc59029d3aef72d92d7f73e2407 differ diff --git a/Library/Artifacts/93/93109f51196d55ccbfbde7eb2ab18214 b/Library/Artifacts/93/93109f51196d55ccbfbde7eb2ab18214 new file mode 100644 index 0000000..8aded6d Binary files /dev/null and b/Library/Artifacts/93/93109f51196d55ccbfbde7eb2ab18214 differ diff --git a/Library/Artifacts/93/9314ed3cacbb4a78185bcb1477a696b4 b/Library/Artifacts/93/9314ed3cacbb4a78185bcb1477a696b4 new file mode 100644 index 0000000..5387390 Binary files /dev/null and b/Library/Artifacts/93/9314ed3cacbb4a78185bcb1477a696b4 differ diff --git a/Library/Artifacts/93/932e760195be1e29952b74e977f84c48 b/Library/Artifacts/93/932e760195be1e29952b74e977f84c48 new file mode 100644 index 0000000..6132453 Binary files /dev/null and b/Library/Artifacts/93/932e760195be1e29952b74e977f84c48 differ diff --git a/Library/Artifacts/93/93330b9eb3df5b2aca12a4fcd0e47bf0 b/Library/Artifacts/93/93330b9eb3df5b2aca12a4fcd0e47bf0 new file mode 100644 index 0000000..70e2c7c Binary files /dev/null and b/Library/Artifacts/93/93330b9eb3df5b2aca12a4fcd0e47bf0 differ diff --git a/Library/Artifacts/93/935bee424623d917bbb6bd56d0d579e8 b/Library/Artifacts/93/935bee424623d917bbb6bd56d0d579e8 new file mode 100644 index 0000000..8e45e51 Binary files /dev/null and b/Library/Artifacts/93/935bee424623d917bbb6bd56d0d579e8 differ diff --git a/Library/Artifacts/93/935e37a6d60401fe00ff2b14df9b980a b/Library/Artifacts/93/935e37a6d60401fe00ff2b14df9b980a new file mode 100644 index 0000000..43234e8 Binary files /dev/null and b/Library/Artifacts/93/935e37a6d60401fe00ff2b14df9b980a differ diff --git a/Library/Artifacts/93/93a121a287c5e0b53e8f6d3145133275 b/Library/Artifacts/93/93a121a287c5e0b53e8f6d3145133275 new file mode 100644 index 0000000..15d7864 Binary files /dev/null and b/Library/Artifacts/93/93a121a287c5e0b53e8f6d3145133275 differ diff --git a/Library/Artifacts/93/93e08a8eeb11e2683b42a054b1120672 b/Library/Artifacts/93/93e08a8eeb11e2683b42a054b1120672 new file mode 100644 index 0000000..a782a74 Binary files /dev/null and b/Library/Artifacts/93/93e08a8eeb11e2683b42a054b1120672 differ diff --git a/Library/Artifacts/93/93fc3012d797b749abde15f373285520 b/Library/Artifacts/93/93fc3012d797b749abde15f373285520 new file mode 100644 index 0000000..6b71348 Binary files /dev/null and b/Library/Artifacts/93/93fc3012d797b749abde15f373285520 differ diff --git a/Library/Artifacts/94/9419452fe231fe982f4fc888d149c9fe b/Library/Artifacts/94/9419452fe231fe982f4fc888d149c9fe new file mode 100644 index 0000000..32fe4bc Binary files /dev/null and b/Library/Artifacts/94/9419452fe231fe982f4fc888d149c9fe differ diff --git a/Library/Artifacts/94/943a6a77984fefdd0f8601f56dd5acad b/Library/Artifacts/94/943a6a77984fefdd0f8601f56dd5acad new file mode 100644 index 0000000..0ce93c4 Binary files /dev/null and b/Library/Artifacts/94/943a6a77984fefdd0f8601f56dd5acad differ diff --git a/Library/Artifacts/94/9441dd17b384f7c775f0e13aa662c33a b/Library/Artifacts/94/9441dd17b384f7c775f0e13aa662c33a new file mode 100644 index 0000000..6e65c22 Binary files /dev/null and b/Library/Artifacts/94/9441dd17b384f7c775f0e13aa662c33a differ diff --git a/Library/Artifacts/94/944d8a311fedd6df251a78c4fbdbb793 b/Library/Artifacts/94/944d8a311fedd6df251a78c4fbdbb793 new file mode 100644 index 0000000..f75f541 Binary files /dev/null and b/Library/Artifacts/94/944d8a311fedd6df251a78c4fbdbb793 differ diff --git a/Library/Artifacts/94/946e6b37e991ba32a41ae5e507bae6e0 b/Library/Artifacts/94/946e6b37e991ba32a41ae5e507bae6e0 new file mode 100644 index 0000000..fc82a80 Binary files /dev/null and b/Library/Artifacts/94/946e6b37e991ba32a41ae5e507bae6e0 differ diff --git a/Library/Artifacts/94/9476afd1ec523991926a986c4a60cf58 b/Library/Artifacts/94/9476afd1ec523991926a986c4a60cf58 new file mode 100644 index 0000000..05110e2 Binary files /dev/null and b/Library/Artifacts/94/9476afd1ec523991926a986c4a60cf58 differ diff --git a/Library/Artifacts/94/94811118f8516642c9743578d6921c23 b/Library/Artifacts/94/94811118f8516642c9743578d6921c23 new file mode 100644 index 0000000..1bbb923 Binary files /dev/null and b/Library/Artifacts/94/94811118f8516642c9743578d6921c23 differ diff --git a/Library/Artifacts/94/9499e2739917417928cf1be9de979b11 b/Library/Artifacts/94/9499e2739917417928cf1be9de979b11 new file mode 100644 index 0000000..58ca8ee Binary files /dev/null and b/Library/Artifacts/94/9499e2739917417928cf1be9de979b11 differ diff --git a/Library/Artifacts/95/9587f316fff35d34952fbe481a4d6b3c b/Library/Artifacts/95/9587f316fff35d34952fbe481a4d6b3c new file mode 100644 index 0000000..4c8e07a Binary files /dev/null and b/Library/Artifacts/95/9587f316fff35d34952fbe481a4d6b3c differ diff --git a/Library/Artifacts/95/9589f29ecca0155231fdb687bf0880d1 b/Library/Artifacts/95/9589f29ecca0155231fdb687bf0880d1 new file mode 100644 index 0000000..c643df8 Binary files /dev/null and b/Library/Artifacts/95/9589f29ecca0155231fdb687bf0880d1 differ diff --git a/Library/Artifacts/95/95e63735c5d7db41ffb1f31af9064730 b/Library/Artifacts/95/95e63735c5d7db41ffb1f31af9064730 new file mode 100644 index 0000000..55cbc1a Binary files /dev/null and b/Library/Artifacts/95/95e63735c5d7db41ffb1f31af9064730 differ diff --git a/Library/Artifacts/95/95eac1999d533b4f0bedd4a26d27178e b/Library/Artifacts/95/95eac1999d533b4f0bedd4a26d27178e new file mode 100644 index 0000000..8c91802 Binary files /dev/null and b/Library/Artifacts/95/95eac1999d533b4f0bedd4a26d27178e differ diff --git a/Library/Artifacts/96/9607dc11939eefffd94a181bfd5840bb b/Library/Artifacts/96/9607dc11939eefffd94a181bfd5840bb new file mode 100644 index 0000000..cbd849b Binary files /dev/null and b/Library/Artifacts/96/9607dc11939eefffd94a181bfd5840bb differ diff --git a/Library/Artifacts/96/961775b6c5ac26111b71af4b73387170 b/Library/Artifacts/96/961775b6c5ac26111b71af4b73387170 new file mode 100644 index 0000000..5ec4ddf Binary files /dev/null and b/Library/Artifacts/96/961775b6c5ac26111b71af4b73387170 differ diff --git a/Library/Artifacts/96/963baa0dea429f08814eefb3e246358a b/Library/Artifacts/96/963baa0dea429f08814eefb3e246358a new file mode 100644 index 0000000..3c0a0bc Binary files /dev/null and b/Library/Artifacts/96/963baa0dea429f08814eefb3e246358a differ diff --git a/Library/Artifacts/96/964c092ec4b07c509523e3d4d138971a b/Library/Artifacts/96/964c092ec4b07c509523e3d4d138971a new file mode 100644 index 0000000..3d27267 Binary files /dev/null and b/Library/Artifacts/96/964c092ec4b07c509523e3d4d138971a differ diff --git a/Library/Artifacts/96/96737a972be35c6a1f5f34819c8ac27d b/Library/Artifacts/96/96737a972be35c6a1f5f34819c8ac27d new file mode 100644 index 0000000..c7c9f2d Binary files /dev/null and b/Library/Artifacts/96/96737a972be35c6a1f5f34819c8ac27d differ diff --git a/Library/Artifacts/96/96849af882562b14e80ebd868f92685c b/Library/Artifacts/96/96849af882562b14e80ebd868f92685c new file mode 100644 index 0000000..fce87ca Binary files /dev/null and b/Library/Artifacts/96/96849af882562b14e80ebd868f92685c differ diff --git a/Library/Artifacts/96/96b61f692a85e3d3b7f5fab3e047c46f b/Library/Artifacts/96/96b61f692a85e3d3b7f5fab3e047c46f new file mode 100644 index 0000000..15664f7 Binary files /dev/null and b/Library/Artifacts/96/96b61f692a85e3d3b7f5fab3e047c46f differ diff --git a/Library/Artifacts/96/96d4c1db46741fb3d6cb5a2a428ded68 b/Library/Artifacts/96/96d4c1db46741fb3d6cb5a2a428ded68 new file mode 100644 index 0000000..b274156 Binary files /dev/null and b/Library/Artifacts/96/96d4c1db46741fb3d6cb5a2a428ded68 differ diff --git a/Library/Artifacts/96/96e09a8de2b64bd5d9346cf7b7d6e247 b/Library/Artifacts/96/96e09a8de2b64bd5d9346cf7b7d6e247 new file mode 100644 index 0000000..c4aef71 Binary files /dev/null and b/Library/Artifacts/96/96e09a8de2b64bd5d9346cf7b7d6e247 differ diff --git a/Library/Artifacts/96/96e5463ebeb7b23ef05072aad04fb546 b/Library/Artifacts/96/96e5463ebeb7b23ef05072aad04fb546 new file mode 100644 index 0000000..62e2ac6 Binary files /dev/null and b/Library/Artifacts/96/96e5463ebeb7b23ef05072aad04fb546 differ diff --git a/Library/Artifacts/97/97070c78237886dce9587043f2a9c8ec b/Library/Artifacts/97/97070c78237886dce9587043f2a9c8ec new file mode 100644 index 0000000..d4df1f1 Binary files /dev/null and b/Library/Artifacts/97/97070c78237886dce9587043f2a9c8ec differ diff --git a/Library/Artifacts/97/97e6f0ac20f7741c8be90fe5f53cba11 b/Library/Artifacts/97/97e6f0ac20f7741c8be90fe5f53cba11 new file mode 100644 index 0000000..b185d3b Binary files /dev/null and b/Library/Artifacts/97/97e6f0ac20f7741c8be90fe5f53cba11 differ diff --git a/Library/Artifacts/98/98175861af47945ce5cabf8c2cbff217 b/Library/Artifacts/98/98175861af47945ce5cabf8c2cbff217 new file mode 100644 index 0000000..c91e888 Binary files /dev/null and b/Library/Artifacts/98/98175861af47945ce5cabf8c2cbff217 differ diff --git a/Library/Artifacts/98/983db2868ec87735d1c8ba6a7cffb0f0 b/Library/Artifacts/98/983db2868ec87735d1c8ba6a7cffb0f0 new file mode 100644 index 0000000..b274d83 Binary files /dev/null and b/Library/Artifacts/98/983db2868ec87735d1c8ba6a7cffb0f0 differ diff --git a/Library/Artifacts/98/98afebb3c8351e8755d5b542221b8017 b/Library/Artifacts/98/98afebb3c8351e8755d5b542221b8017 new file mode 100644 index 0000000..54b8d45 Binary files /dev/null and b/Library/Artifacts/98/98afebb3c8351e8755d5b542221b8017 differ diff --git a/Library/Artifacts/98/98effa9d83b1ea3f30dd73cb6f9bee2b b/Library/Artifacts/98/98effa9d83b1ea3f30dd73cb6f9bee2b new file mode 100644 index 0000000..d676594 Binary files /dev/null and b/Library/Artifacts/98/98effa9d83b1ea3f30dd73cb6f9bee2b differ diff --git a/Library/Artifacts/99/991143ffc6985c4dbe15ab8b17ef4a6a b/Library/Artifacts/99/991143ffc6985c4dbe15ab8b17ef4a6a new file mode 100644 index 0000000..23f2da8 Binary files /dev/null and b/Library/Artifacts/99/991143ffc6985c4dbe15ab8b17ef4a6a differ diff --git a/Library/Artifacts/99/99562ef2d16a6f69be26c604f8ea4cf1 b/Library/Artifacts/99/99562ef2d16a6f69be26c604f8ea4cf1 new file mode 100644 index 0000000..12f75be Binary files /dev/null and b/Library/Artifacts/99/99562ef2d16a6f69be26c604f8ea4cf1 differ diff --git a/Library/Artifacts/99/9956e58d0af599af7fb679dd0b629cfb b/Library/Artifacts/99/9956e58d0af599af7fb679dd0b629cfb new file mode 100644 index 0000000..889e7ac Binary files /dev/null and b/Library/Artifacts/99/9956e58d0af599af7fb679dd0b629cfb differ diff --git a/Library/Artifacts/99/999cacb2f6d0854d22fadc90a50cafd6 b/Library/Artifacts/99/999cacb2f6d0854d22fadc90a50cafd6 new file mode 100644 index 0000000..50551e0 Binary files /dev/null and b/Library/Artifacts/99/999cacb2f6d0854d22fadc90a50cafd6 differ diff --git a/Library/Artifacts/99/99a5c1b332dc2168a37c36d8a9d8c678 b/Library/Artifacts/99/99a5c1b332dc2168a37c36d8a9d8c678 new file mode 100644 index 0000000..236aaae Binary files /dev/null and b/Library/Artifacts/99/99a5c1b332dc2168a37c36d8a9d8c678 differ diff --git a/Library/Artifacts/99/99aa09118090e043e69a1f369dc78ec5 b/Library/Artifacts/99/99aa09118090e043e69a1f369dc78ec5 new file mode 100644 index 0000000..99215b4 Binary files /dev/null and b/Library/Artifacts/99/99aa09118090e043e69a1f369dc78ec5 differ diff --git a/Library/Artifacts/99/99bf37e098a2d2f4fd798443f1fc8b46 b/Library/Artifacts/99/99bf37e098a2d2f4fd798443f1fc8b46 new file mode 100644 index 0000000..1b2f806 Binary files /dev/null and b/Library/Artifacts/99/99bf37e098a2d2f4fd798443f1fc8b46 differ diff --git a/Library/Artifacts/9a/9a1202488c2f55503c2d60e60801933c b/Library/Artifacts/9a/9a1202488c2f55503c2d60e60801933c new file mode 100644 index 0000000..efbda93 Binary files /dev/null and b/Library/Artifacts/9a/9a1202488c2f55503c2d60e60801933c differ diff --git a/Library/Artifacts/9a/9a76e6dd76965c3dabcd09bc60dfffa4 b/Library/Artifacts/9a/9a76e6dd76965c3dabcd09bc60dfffa4 new file mode 100644 index 0000000..2794f8b Binary files /dev/null and b/Library/Artifacts/9a/9a76e6dd76965c3dabcd09bc60dfffa4 differ diff --git a/Library/Artifacts/9a/9a8fd6bec3d199c26055ac0721b382f4 b/Library/Artifacts/9a/9a8fd6bec3d199c26055ac0721b382f4 new file mode 100644 index 0000000..f756dba Binary files /dev/null and b/Library/Artifacts/9a/9a8fd6bec3d199c26055ac0721b382f4 differ diff --git a/Library/Artifacts/9a/9ab179814e49c11f9d9ffb00d42d7c61 b/Library/Artifacts/9a/9ab179814e49c11f9d9ffb00d42d7c61 new file mode 100644 index 0000000..5899e2d Binary files /dev/null and b/Library/Artifacts/9a/9ab179814e49c11f9d9ffb00d42d7c61 differ diff --git a/Library/Artifacts/9a/9af7643e6b860282d64df91f58216427 b/Library/Artifacts/9a/9af7643e6b860282d64df91f58216427 new file mode 100644 index 0000000..7aa5a47 Binary files /dev/null and b/Library/Artifacts/9a/9af7643e6b860282d64df91f58216427 differ diff --git a/Library/Artifacts/9b/9b19c48fb09d4444c7619497e3660180 b/Library/Artifacts/9b/9b19c48fb09d4444c7619497e3660180 new file mode 100644 index 0000000..0e666ec Binary files /dev/null and b/Library/Artifacts/9b/9b19c48fb09d4444c7619497e3660180 differ diff --git a/Library/Artifacts/9b/9b1b721581119f31d740ba2485422e75 b/Library/Artifacts/9b/9b1b721581119f31d740ba2485422e75 new file mode 100644 index 0000000..620d5bf Binary files /dev/null and b/Library/Artifacts/9b/9b1b721581119f31d740ba2485422e75 differ diff --git a/Library/Artifacts/9b/9b213c50b18c3d98407372e4838397aa b/Library/Artifacts/9b/9b213c50b18c3d98407372e4838397aa new file mode 100644 index 0000000..84b9da3 Binary files /dev/null and b/Library/Artifacts/9b/9b213c50b18c3d98407372e4838397aa differ diff --git a/Library/Artifacts/9b/9b2bdc5bfc614b41eb176b2c700a143c b/Library/Artifacts/9b/9b2bdc5bfc614b41eb176b2c700a143c new file mode 100644 index 0000000..cf61aea Binary files /dev/null and b/Library/Artifacts/9b/9b2bdc5bfc614b41eb176b2c700a143c differ diff --git a/Library/Artifacts/9b/9b2f04e57c9da22ca20d2d44cc00050e b/Library/Artifacts/9b/9b2f04e57c9da22ca20d2d44cc00050e new file mode 100644 index 0000000..4a62706 Binary files /dev/null and b/Library/Artifacts/9b/9b2f04e57c9da22ca20d2d44cc00050e differ diff --git a/Library/Artifacts/9b/9b37d8931a441dd769af23cfe3d32a6b b/Library/Artifacts/9b/9b37d8931a441dd769af23cfe3d32a6b new file mode 100644 index 0000000..56a6895 Binary files /dev/null and b/Library/Artifacts/9b/9b37d8931a441dd769af23cfe3d32a6b differ diff --git a/Library/Artifacts/9b/9b59b2aa17363c84cd9bc4132192fe84 b/Library/Artifacts/9b/9b59b2aa17363c84cd9bc4132192fe84 new file mode 100644 index 0000000..590a3f1 Binary files /dev/null and b/Library/Artifacts/9b/9b59b2aa17363c84cd9bc4132192fe84 differ diff --git a/Library/Artifacts/9b/9b7c4912065cad8edb436d14080c968e b/Library/Artifacts/9b/9b7c4912065cad8edb436d14080c968e new file mode 100644 index 0000000..d153768 Binary files /dev/null and b/Library/Artifacts/9b/9b7c4912065cad8edb436d14080c968e differ diff --git a/Library/Artifacts/9b/9b87dad524e08d6b5b0d432807ab956e b/Library/Artifacts/9b/9b87dad524e08d6b5b0d432807ab956e new file mode 100644 index 0000000..583fe28 Binary files /dev/null and b/Library/Artifacts/9b/9b87dad524e08d6b5b0d432807ab956e differ diff --git a/Library/Artifacts/9b/9ba1a448eee1d906428a81504732359b b/Library/Artifacts/9b/9ba1a448eee1d906428a81504732359b new file mode 100644 index 0000000..2c26463 Binary files /dev/null and b/Library/Artifacts/9b/9ba1a448eee1d906428a81504732359b differ diff --git a/Library/Artifacts/9b/9bafc123b0c24c6ff62d6b0a59abe1f0 b/Library/Artifacts/9b/9bafc123b0c24c6ff62d6b0a59abe1f0 new file mode 100644 index 0000000..a32f39f Binary files /dev/null and b/Library/Artifacts/9b/9bafc123b0c24c6ff62d6b0a59abe1f0 differ diff --git a/Library/Artifacts/9b/9bb61e4064cce20fff242d8719ec225f b/Library/Artifacts/9b/9bb61e4064cce20fff242d8719ec225f new file mode 100644 index 0000000..9353a9d Binary files /dev/null and b/Library/Artifacts/9b/9bb61e4064cce20fff242d8719ec225f differ diff --git a/Library/Artifacts/9b/9be3fb09676f482783535d4ac6361164 b/Library/Artifacts/9b/9be3fb09676f482783535d4ac6361164 new file mode 100644 index 0000000..9003d67 Binary files /dev/null and b/Library/Artifacts/9b/9be3fb09676f482783535d4ac6361164 differ diff --git a/Library/Artifacts/9c/9c010fe7045bc53594406584c6833588 b/Library/Artifacts/9c/9c010fe7045bc53594406584c6833588 new file mode 100644 index 0000000..8c8a60c Binary files /dev/null and b/Library/Artifacts/9c/9c010fe7045bc53594406584c6833588 differ diff --git a/Library/Artifacts/9c/9c05b5596fa7a18aca5835294e295b20 b/Library/Artifacts/9c/9c05b5596fa7a18aca5835294e295b20 new file mode 100644 index 0000000..b8c9285 Binary files /dev/null and b/Library/Artifacts/9c/9c05b5596fa7a18aca5835294e295b20 differ diff --git a/Library/Artifacts/9c/9c3dd27772afe8a6a76445c07542c605 b/Library/Artifacts/9c/9c3dd27772afe8a6a76445c07542c605 new file mode 100644 index 0000000..07beb78 Binary files /dev/null and b/Library/Artifacts/9c/9c3dd27772afe8a6a76445c07542c605 differ diff --git a/Library/Artifacts/9c/9c59194a6da01d912f41fc56dfbf4e01 b/Library/Artifacts/9c/9c59194a6da01d912f41fc56dfbf4e01 new file mode 100644 index 0000000..1f4f23a Binary files /dev/null and b/Library/Artifacts/9c/9c59194a6da01d912f41fc56dfbf4e01 differ diff --git a/Library/Artifacts/9c/9c6ff6f199b704ebc5ea6332278cfe32 b/Library/Artifacts/9c/9c6ff6f199b704ebc5ea6332278cfe32 new file mode 100644 index 0000000..3313d0c Binary files /dev/null and b/Library/Artifacts/9c/9c6ff6f199b704ebc5ea6332278cfe32 differ diff --git a/Library/Artifacts/9c/9c8f91cee16b84a1126a815f21469a53 b/Library/Artifacts/9c/9c8f91cee16b84a1126a815f21469a53 new file mode 100644 index 0000000..73e207d Binary files /dev/null and b/Library/Artifacts/9c/9c8f91cee16b84a1126a815f21469a53 differ diff --git a/Library/Artifacts/9c/9c9f84d493c412ccd7f753ed29b2e4b9 b/Library/Artifacts/9c/9c9f84d493c412ccd7f753ed29b2e4b9 new file mode 100644 index 0000000..07874f8 Binary files /dev/null and b/Library/Artifacts/9c/9c9f84d493c412ccd7f753ed29b2e4b9 differ diff --git a/Library/Artifacts/9c/9cb8bd249cf3fc5dc54fa6f9432c6648 b/Library/Artifacts/9c/9cb8bd249cf3fc5dc54fa6f9432c6648 new file mode 100644 index 0000000..4921088 Binary files /dev/null and b/Library/Artifacts/9c/9cb8bd249cf3fc5dc54fa6f9432c6648 differ diff --git a/Library/Artifacts/9c/9cc4f90e68947f699599cb4cfbc45d52 b/Library/Artifacts/9c/9cc4f90e68947f699599cb4cfbc45d52 new file mode 100644 index 0000000..25f1517 Binary files /dev/null and b/Library/Artifacts/9c/9cc4f90e68947f699599cb4cfbc45d52 differ diff --git a/Library/Artifacts/9c/9cd821244090e90f9974cb5eb49dcb69 b/Library/Artifacts/9c/9cd821244090e90f9974cb5eb49dcb69 new file mode 100644 index 0000000..0ff7b38 Binary files /dev/null and b/Library/Artifacts/9c/9cd821244090e90f9974cb5eb49dcb69 differ diff --git a/Library/Artifacts/9d/9d058c05668437243841e83cbe805b93 b/Library/Artifacts/9d/9d058c05668437243841e83cbe805b93 new file mode 100644 index 0000000..ab9af1a Binary files /dev/null and b/Library/Artifacts/9d/9d058c05668437243841e83cbe805b93 differ diff --git a/Library/Artifacts/9d/9d0c18858a320c14ae572251a7fe3aa9 b/Library/Artifacts/9d/9d0c18858a320c14ae572251a7fe3aa9 new file mode 100644 index 0000000..dc96546 Binary files /dev/null and b/Library/Artifacts/9d/9d0c18858a320c14ae572251a7fe3aa9 differ diff --git a/Library/Artifacts/9d/9d16402d2706885010951243a60c57a3 b/Library/Artifacts/9d/9d16402d2706885010951243a60c57a3 new file mode 100644 index 0000000..973d602 Binary files /dev/null and b/Library/Artifacts/9d/9d16402d2706885010951243a60c57a3 differ diff --git a/Library/Artifacts/9d/9d3e041e2c7864b0191f410fada6b582 b/Library/Artifacts/9d/9d3e041e2c7864b0191f410fada6b582 new file mode 100644 index 0000000..840911f Binary files /dev/null and b/Library/Artifacts/9d/9d3e041e2c7864b0191f410fada6b582 differ diff --git a/Library/Artifacts/9d/9d41a0ff6f62f8c8ecdd3987cd3e5cca b/Library/Artifacts/9d/9d41a0ff6f62f8c8ecdd3987cd3e5cca new file mode 100644 index 0000000..f888e9f Binary files /dev/null and b/Library/Artifacts/9d/9d41a0ff6f62f8c8ecdd3987cd3e5cca differ diff --git a/Library/Artifacts/9d/9d4a8915be7eb20f90d57f0b022cb741 b/Library/Artifacts/9d/9d4a8915be7eb20f90d57f0b022cb741 new file mode 100644 index 0000000..a85a53d Binary files /dev/null and b/Library/Artifacts/9d/9d4a8915be7eb20f90d57f0b022cb741 differ diff --git a/Library/Artifacts/9d/9d5a4f8f2c03c48ff082efd77623b1c3 b/Library/Artifacts/9d/9d5a4f8f2c03c48ff082efd77623b1c3 new file mode 100644 index 0000000..ab389c3 Binary files /dev/null and b/Library/Artifacts/9d/9d5a4f8f2c03c48ff082efd77623b1c3 differ diff --git a/Library/Artifacts/9d/9d642b453e506e8fc25fe002c75532c8 b/Library/Artifacts/9d/9d642b453e506e8fc25fe002c75532c8 new file mode 100644 index 0000000..1ce5862 Binary files /dev/null and b/Library/Artifacts/9d/9d642b453e506e8fc25fe002c75532c8 differ diff --git a/Library/Artifacts/9d/9d77c0af185143ef8fb8da77c9819caf b/Library/Artifacts/9d/9d77c0af185143ef8fb8da77c9819caf new file mode 100644 index 0000000..ea3edd9 Binary files /dev/null and b/Library/Artifacts/9d/9d77c0af185143ef8fb8da77c9819caf differ diff --git a/Library/Artifacts/9d/9d928c9624d047cbc879fb1cab4f616e b/Library/Artifacts/9d/9d928c9624d047cbc879fb1cab4f616e new file mode 100644 index 0000000..39e58da Binary files /dev/null and b/Library/Artifacts/9d/9d928c9624d047cbc879fb1cab4f616e differ diff --git a/Library/Artifacts/9d/9d93b3447e8c6cfa689c64751381a651 b/Library/Artifacts/9d/9d93b3447e8c6cfa689c64751381a651 new file mode 100644 index 0000000..f83f7e4 Binary files /dev/null and b/Library/Artifacts/9d/9d93b3447e8c6cfa689c64751381a651 differ diff --git a/Library/Artifacts/9d/9d9a440f5785bbb4d0dc3b7095c94985 b/Library/Artifacts/9d/9d9a440f5785bbb4d0dc3b7095c94985 new file mode 100644 index 0000000..3faefab Binary files /dev/null and b/Library/Artifacts/9d/9d9a440f5785bbb4d0dc3b7095c94985 differ diff --git a/Library/Artifacts/9e/9ee5a9ff2ed1c81e73bfb5bb822fb4cf b/Library/Artifacts/9e/9ee5a9ff2ed1c81e73bfb5bb822fb4cf new file mode 100644 index 0000000..4ee75f9 Binary files /dev/null and b/Library/Artifacts/9e/9ee5a9ff2ed1c81e73bfb5bb822fb4cf differ diff --git a/Library/Artifacts/9f/9f130b3fc041196c931566ce3021f9f9 b/Library/Artifacts/9f/9f130b3fc041196c931566ce3021f9f9 new file mode 100644 index 0000000..0b26db5 Binary files /dev/null and b/Library/Artifacts/9f/9f130b3fc041196c931566ce3021f9f9 differ diff --git a/Library/Artifacts/9f/9f1a4a216fd96ad91ba30375578dc8c2 b/Library/Artifacts/9f/9f1a4a216fd96ad91ba30375578dc8c2 new file mode 100644 index 0000000..f7823ca Binary files /dev/null and b/Library/Artifacts/9f/9f1a4a216fd96ad91ba30375578dc8c2 differ diff --git a/Library/Artifacts/9f/9f39a0296b12ac1900971ec0fc3c8965 b/Library/Artifacts/9f/9f39a0296b12ac1900971ec0fc3c8965 new file mode 100644 index 0000000..08f2801 Binary files /dev/null and b/Library/Artifacts/9f/9f39a0296b12ac1900971ec0fc3c8965 differ diff --git a/Library/Artifacts/9f/9f9716e12fd74b8c25b792662453a9f2 b/Library/Artifacts/9f/9f9716e12fd74b8c25b792662453a9f2 new file mode 100644 index 0000000..ec783f0 Binary files /dev/null and b/Library/Artifacts/9f/9f9716e12fd74b8c25b792662453a9f2 differ diff --git a/Library/Artifacts/9f/9fd47734b8614ce9c31b98de1f1e060c b/Library/Artifacts/9f/9fd47734b8614ce9c31b98de1f1e060c new file mode 100644 index 0000000..effe078 Binary files /dev/null and b/Library/Artifacts/9f/9fd47734b8614ce9c31b98de1f1e060c differ diff --git a/Library/Artifacts/9f/9fe8ad37e743052e2eb2aaedbb0aa4bf b/Library/Artifacts/9f/9fe8ad37e743052e2eb2aaedbb0aa4bf new file mode 100644 index 0000000..bf744e6 Binary files /dev/null and b/Library/Artifacts/9f/9fe8ad37e743052e2eb2aaedbb0aa4bf differ diff --git a/Library/Artifacts/a0/a000f50c771e7a8a6e87083813f5314e b/Library/Artifacts/a0/a000f50c771e7a8a6e87083813f5314e new file mode 100644 index 0000000..eb7a080 Binary files /dev/null and b/Library/Artifacts/a0/a000f50c771e7a8a6e87083813f5314e differ diff --git a/Library/Artifacts/a0/a0015a51af777837ce59cc2f6bf0cc28 b/Library/Artifacts/a0/a0015a51af777837ce59cc2f6bf0cc28 new file mode 100644 index 0000000..8f1f19b Binary files /dev/null and b/Library/Artifacts/a0/a0015a51af777837ce59cc2f6bf0cc28 differ diff --git a/Library/Artifacts/a0/a01f75434615b399112efbc019d0bcfe b/Library/Artifacts/a0/a01f75434615b399112efbc019d0bcfe new file mode 100644 index 0000000..bde5724 Binary files /dev/null and b/Library/Artifacts/a0/a01f75434615b399112efbc019d0bcfe differ diff --git a/Library/Artifacts/a0/a030c7ba3d62cb8f54cc309844e446cf b/Library/Artifacts/a0/a030c7ba3d62cb8f54cc309844e446cf new file mode 100644 index 0000000..8fc3e23 Binary files /dev/null and b/Library/Artifacts/a0/a030c7ba3d62cb8f54cc309844e446cf differ diff --git a/Library/Artifacts/a0/a0326353f4b2832461ed73653c28985e b/Library/Artifacts/a0/a0326353f4b2832461ed73653c28985e new file mode 100644 index 0000000..3310db5 Binary files /dev/null and b/Library/Artifacts/a0/a0326353f4b2832461ed73653c28985e differ diff --git a/Library/Artifacts/a0/a0357fab123c7c807b02cc072637b3d2 b/Library/Artifacts/a0/a0357fab123c7c807b02cc072637b3d2 new file mode 100644 index 0000000..758f6a7 Binary files /dev/null and b/Library/Artifacts/a0/a0357fab123c7c807b02cc072637b3d2 differ diff --git a/Library/Artifacts/a0/a03d243fc43b68e8b4c0ec40ad658765 b/Library/Artifacts/a0/a03d243fc43b68e8b4c0ec40ad658765 new file mode 100644 index 0000000..a77dac7 Binary files /dev/null and b/Library/Artifacts/a0/a03d243fc43b68e8b4c0ec40ad658765 differ diff --git a/Library/Artifacts/a0/a03e4fc030bf18b1b570d7123d92ad00 b/Library/Artifacts/a0/a03e4fc030bf18b1b570d7123d92ad00 new file mode 100644 index 0000000..7896ae3 Binary files /dev/null and b/Library/Artifacts/a0/a03e4fc030bf18b1b570d7123d92ad00 differ diff --git a/Library/Artifacts/a0/a055a1e3667d97d0da344d7bd76081aa b/Library/Artifacts/a0/a055a1e3667d97d0da344d7bd76081aa new file mode 100644 index 0000000..d42e38f Binary files /dev/null and b/Library/Artifacts/a0/a055a1e3667d97d0da344d7bd76081aa differ diff --git a/Library/Artifacts/a0/a0637a2723752eec106643b6476693c9 b/Library/Artifacts/a0/a0637a2723752eec106643b6476693c9 new file mode 100644 index 0000000..93bfb44 Binary files /dev/null and b/Library/Artifacts/a0/a0637a2723752eec106643b6476693c9 differ diff --git a/Library/Artifacts/a0/a06aba686413459698a7e536652d773b b/Library/Artifacts/a0/a06aba686413459698a7e536652d773b new file mode 100644 index 0000000..dad316e Binary files /dev/null and b/Library/Artifacts/a0/a06aba686413459698a7e536652d773b differ diff --git a/Library/Artifacts/a0/a0f53d802b0c8490c802fba54b937ea1 b/Library/Artifacts/a0/a0f53d802b0c8490c802fba54b937ea1 new file mode 100644 index 0000000..6f42b55 Binary files /dev/null and b/Library/Artifacts/a0/a0f53d802b0c8490c802fba54b937ea1 differ diff --git a/Library/Artifacts/a1/a1177990a8ef2f4f0f702d1b2a35ce96 b/Library/Artifacts/a1/a1177990a8ef2f4f0f702d1b2a35ce96 new file mode 100644 index 0000000..a54dd15 Binary files /dev/null and b/Library/Artifacts/a1/a1177990a8ef2f4f0f702d1b2a35ce96 differ diff --git a/Library/Artifacts/a1/a11e2cd37e7da32ee8a1a68ccb24a012 b/Library/Artifacts/a1/a11e2cd37e7da32ee8a1a68ccb24a012 new file mode 100644 index 0000000..3dae4fe Binary files /dev/null and b/Library/Artifacts/a1/a11e2cd37e7da32ee8a1a68ccb24a012 differ diff --git a/Library/Artifacts/a1/a138f33e85845cc0c5e9f6042f41bf12 b/Library/Artifacts/a1/a138f33e85845cc0c5e9f6042f41bf12 new file mode 100644 index 0000000..c2c2e98 Binary files /dev/null and b/Library/Artifacts/a1/a138f33e85845cc0c5e9f6042f41bf12 differ diff --git a/Library/Artifacts/a1/a159aa33cefa15faaabbdf2b1382f581 b/Library/Artifacts/a1/a159aa33cefa15faaabbdf2b1382f581 new file mode 100644 index 0000000..5351767 Binary files /dev/null and b/Library/Artifacts/a1/a159aa33cefa15faaabbdf2b1382f581 differ diff --git a/Library/Artifacts/a1/a175f4572f7d3dabc0df5bdd667ac645 b/Library/Artifacts/a1/a175f4572f7d3dabc0df5bdd667ac645 new file mode 100644 index 0000000..b7d3070 Binary files /dev/null and b/Library/Artifacts/a1/a175f4572f7d3dabc0df5bdd667ac645 differ diff --git a/Library/Artifacts/a1/a179bf03ede3b8fdeb140d610a855460 b/Library/Artifacts/a1/a179bf03ede3b8fdeb140d610a855460 new file mode 100644 index 0000000..68c3008 Binary files /dev/null and b/Library/Artifacts/a1/a179bf03ede3b8fdeb140d610a855460 differ diff --git a/Library/Artifacts/a1/a1beaa0c9a3109b59a03e1a680abfec3 b/Library/Artifacts/a1/a1beaa0c9a3109b59a03e1a680abfec3 new file mode 100644 index 0000000..2cfeb60 Binary files /dev/null and b/Library/Artifacts/a1/a1beaa0c9a3109b59a03e1a680abfec3 differ diff --git a/Library/Artifacts/a1/a1cffa97e3311b0354df53b82a065faa b/Library/Artifacts/a1/a1cffa97e3311b0354df53b82a065faa new file mode 100644 index 0000000..14b722d Binary files /dev/null and b/Library/Artifacts/a1/a1cffa97e3311b0354df53b82a065faa differ diff --git a/Library/Artifacts/a1/a1d45fe560f81814d95929393e648409 b/Library/Artifacts/a1/a1d45fe560f81814d95929393e648409 new file mode 100644 index 0000000..cc95b55 Binary files /dev/null and b/Library/Artifacts/a1/a1d45fe560f81814d95929393e648409 differ diff --git a/Library/Artifacts/a1/a1fa771a10b9ccb09caa2cae237bfc33 b/Library/Artifacts/a1/a1fa771a10b9ccb09caa2cae237bfc33 new file mode 100644 index 0000000..94f5818 Binary files /dev/null and b/Library/Artifacts/a1/a1fa771a10b9ccb09caa2cae237bfc33 differ diff --git a/Library/Artifacts/a2/a208a2cffc7b69bd7bd56c92783694c4 b/Library/Artifacts/a2/a208a2cffc7b69bd7bd56c92783694c4 new file mode 100644 index 0000000..1d3d0de Binary files /dev/null and b/Library/Artifacts/a2/a208a2cffc7b69bd7bd56c92783694c4 differ diff --git a/Library/Artifacts/a2/a2346336dc372cb4366040921776b4f0 b/Library/Artifacts/a2/a2346336dc372cb4366040921776b4f0 new file mode 100644 index 0000000..351bccc Binary files /dev/null and b/Library/Artifacts/a2/a2346336dc372cb4366040921776b4f0 differ diff --git a/Library/Artifacts/a2/a27f4f979b4a369838613351321f25ca b/Library/Artifacts/a2/a27f4f979b4a369838613351321f25ca new file mode 100644 index 0000000..04771f1 Binary files /dev/null and b/Library/Artifacts/a2/a27f4f979b4a369838613351321f25ca differ diff --git a/Library/Artifacts/a2/a2a22cf50a1fe882b2af72b4ff5a5a26 b/Library/Artifacts/a2/a2a22cf50a1fe882b2af72b4ff5a5a26 new file mode 100644 index 0000000..267ecbe Binary files /dev/null and b/Library/Artifacts/a2/a2a22cf50a1fe882b2af72b4ff5a5a26 differ diff --git a/Library/Artifacts/a2/a2c78a47287749cdd891356f87e2b09d b/Library/Artifacts/a2/a2c78a47287749cdd891356f87e2b09d new file mode 100644 index 0000000..60c0170 Binary files /dev/null and b/Library/Artifacts/a2/a2c78a47287749cdd891356f87e2b09d differ diff --git a/Library/Artifacts/a3/a30f2d9b206d62c98f50221765b09f8e b/Library/Artifacts/a3/a30f2d9b206d62c98f50221765b09f8e new file mode 100644 index 0000000..951fed7 Binary files /dev/null and b/Library/Artifacts/a3/a30f2d9b206d62c98f50221765b09f8e differ diff --git a/Library/Artifacts/a3/a332bf9dfd46d1541fd87999c5cdd9d2 b/Library/Artifacts/a3/a332bf9dfd46d1541fd87999c5cdd9d2 new file mode 100644 index 0000000..931bb56 Binary files /dev/null and b/Library/Artifacts/a3/a332bf9dfd46d1541fd87999c5cdd9d2 differ diff --git a/Library/Artifacts/a3/a361c192c228a83e04b12dc6fcb6eea8 b/Library/Artifacts/a3/a361c192c228a83e04b12dc6fcb6eea8 new file mode 100644 index 0000000..7adb823 Binary files /dev/null and b/Library/Artifacts/a3/a361c192c228a83e04b12dc6fcb6eea8 differ diff --git a/Library/Artifacts/a3/a36441a4fba47582f9cf48f24f0a69a7 b/Library/Artifacts/a3/a36441a4fba47582f9cf48f24f0a69a7 new file mode 100644 index 0000000..09db67f Binary files /dev/null and b/Library/Artifacts/a3/a36441a4fba47582f9cf48f24f0a69a7 differ diff --git a/Library/Artifacts/a3/a3674ba93b268635ffb0ccb615d90d58 b/Library/Artifacts/a3/a3674ba93b268635ffb0ccb615d90d58 new file mode 100644 index 0000000..02e503d Binary files /dev/null and b/Library/Artifacts/a3/a3674ba93b268635ffb0ccb615d90d58 differ diff --git a/Library/Artifacts/a3/a38b94856da25b5ccaca4ec461b7fa2a b/Library/Artifacts/a3/a38b94856da25b5ccaca4ec461b7fa2a new file mode 100644 index 0000000..b7e0708 Binary files /dev/null and b/Library/Artifacts/a3/a38b94856da25b5ccaca4ec461b7fa2a differ diff --git a/Library/Artifacts/a3/a3be5f75015307ffb86d5b0e02929a0b b/Library/Artifacts/a3/a3be5f75015307ffb86d5b0e02929a0b new file mode 100644 index 0000000..71019f2 Binary files /dev/null and b/Library/Artifacts/a3/a3be5f75015307ffb86d5b0e02929a0b differ diff --git a/Library/Artifacts/a3/a3eaa505c703935bfee91162fce49305 b/Library/Artifacts/a3/a3eaa505c703935bfee91162fce49305 new file mode 100644 index 0000000..9755dc3 Binary files /dev/null and b/Library/Artifacts/a3/a3eaa505c703935bfee91162fce49305 differ diff --git a/Library/Artifacts/a3/a3fb35dd9abcb8fcaa8a1dd25f641c3e b/Library/Artifacts/a3/a3fb35dd9abcb8fcaa8a1dd25f641c3e new file mode 100644 index 0000000..0e76314 Binary files /dev/null and b/Library/Artifacts/a3/a3fb35dd9abcb8fcaa8a1dd25f641c3e differ diff --git a/Library/Artifacts/a4/a42d9f9f861a8de5a59093cb164ecdb8 b/Library/Artifacts/a4/a42d9f9f861a8de5a59093cb164ecdb8 new file mode 100644 index 0000000..0e71188 Binary files /dev/null and b/Library/Artifacts/a4/a42d9f9f861a8de5a59093cb164ecdb8 differ diff --git a/Library/Artifacts/a4/a436d0e2c1994e7072ed540cce15382e b/Library/Artifacts/a4/a436d0e2c1994e7072ed540cce15382e new file mode 100644 index 0000000..8dde708 Binary files /dev/null and b/Library/Artifacts/a4/a436d0e2c1994e7072ed540cce15382e differ diff --git a/Library/Artifacts/a4/a4429249d9d8e123374938389bdf076b b/Library/Artifacts/a4/a4429249d9d8e123374938389bdf076b new file mode 100644 index 0000000..3903acb Binary files /dev/null and b/Library/Artifacts/a4/a4429249d9d8e123374938389bdf076b differ diff --git a/Library/Artifacts/a4/a478098d6bf1ccf3ceecf269048f0c52 b/Library/Artifacts/a4/a478098d6bf1ccf3ceecf269048f0c52 new file mode 100644 index 0000000..3f2cb52 Binary files /dev/null and b/Library/Artifacts/a4/a478098d6bf1ccf3ceecf269048f0c52 differ diff --git a/Library/Artifacts/a4/a483e7e8c93c8a9bca5dd3a7cd56ec9d b/Library/Artifacts/a4/a483e7e8c93c8a9bca5dd3a7cd56ec9d new file mode 100644 index 0000000..4c78ef8 Binary files /dev/null and b/Library/Artifacts/a4/a483e7e8c93c8a9bca5dd3a7cd56ec9d differ diff --git a/Library/Artifacts/a4/a485184c39db801ff3cfe1e5a3dee230 b/Library/Artifacts/a4/a485184c39db801ff3cfe1e5a3dee230 new file mode 100644 index 0000000..e4f6c7f Binary files /dev/null and b/Library/Artifacts/a4/a485184c39db801ff3cfe1e5a3dee230 differ diff --git a/Library/Artifacts/a4/a4898f58fd985af805a5018da0596057 b/Library/Artifacts/a4/a4898f58fd985af805a5018da0596057 new file mode 100644 index 0000000..80f2200 Binary files /dev/null and b/Library/Artifacts/a4/a4898f58fd985af805a5018da0596057 differ diff --git a/Library/Artifacts/a4/a499a69e73833a5572897f6f3d51499b b/Library/Artifacts/a4/a499a69e73833a5572897f6f3d51499b new file mode 100644 index 0000000..ceae0d3 Binary files /dev/null and b/Library/Artifacts/a4/a499a69e73833a5572897f6f3d51499b differ diff --git a/Library/Artifacts/a4/a4b1107159cbf78fb59dc2b78e33635e b/Library/Artifacts/a4/a4b1107159cbf78fb59dc2b78e33635e new file mode 100644 index 0000000..62c3385 Binary files /dev/null and b/Library/Artifacts/a4/a4b1107159cbf78fb59dc2b78e33635e differ diff --git a/Library/Artifacts/a4/a4c271584ef83bfb6a085ddbdea359df b/Library/Artifacts/a4/a4c271584ef83bfb6a085ddbdea359df new file mode 100644 index 0000000..278103e Binary files /dev/null and b/Library/Artifacts/a4/a4c271584ef83bfb6a085ddbdea359df differ diff --git a/Library/Artifacts/a4/a4da03ab8bd9e37886711f74b5072b03 b/Library/Artifacts/a4/a4da03ab8bd9e37886711f74b5072b03 new file mode 100644 index 0000000..d72eba6 Binary files /dev/null and b/Library/Artifacts/a4/a4da03ab8bd9e37886711f74b5072b03 differ diff --git a/Library/Artifacts/a5/a5365e2afd6224b26596d79c7800c9f8 b/Library/Artifacts/a5/a5365e2afd6224b26596d79c7800c9f8 new file mode 100644 index 0000000..49bc468 Binary files /dev/null and b/Library/Artifacts/a5/a5365e2afd6224b26596d79c7800c9f8 differ diff --git a/Library/Artifacts/a5/a58edaf723143f3b0fb1497406b79717 b/Library/Artifacts/a5/a58edaf723143f3b0fb1497406b79717 new file mode 100644 index 0000000..d85f310 Binary files /dev/null and b/Library/Artifacts/a5/a58edaf723143f3b0fb1497406b79717 differ diff --git a/Library/Artifacts/a5/a5a938a019324814adfce8de364a2fb1 b/Library/Artifacts/a5/a5a938a019324814adfce8de364a2fb1 new file mode 100644 index 0000000..240ce5d Binary files /dev/null and b/Library/Artifacts/a5/a5a938a019324814adfce8de364a2fb1 differ diff --git a/Library/Artifacts/a5/a5b000f92f5337ef8c75536927386c0c b/Library/Artifacts/a5/a5b000f92f5337ef8c75536927386c0c new file mode 100644 index 0000000..50b6962 Binary files /dev/null and b/Library/Artifacts/a5/a5b000f92f5337ef8c75536927386c0c differ diff --git a/Library/Artifacts/a6/a604822fa6b92c0f12e5b46b86ac1286 b/Library/Artifacts/a6/a604822fa6b92c0f12e5b46b86ac1286 new file mode 100644 index 0000000..eff6d3a Binary files /dev/null and b/Library/Artifacts/a6/a604822fa6b92c0f12e5b46b86ac1286 differ diff --git a/Library/Artifacts/a6/a6340409df818e660d7ed78a6f8575d6 b/Library/Artifacts/a6/a6340409df818e660d7ed78a6f8575d6 new file mode 100644 index 0000000..3e38622 Binary files /dev/null and b/Library/Artifacts/a6/a6340409df818e660d7ed78a6f8575d6 differ diff --git a/Library/Artifacts/a6/a6c83e85a804dab1bd4cfbd3ee9ab291 b/Library/Artifacts/a6/a6c83e85a804dab1bd4cfbd3ee9ab291 new file mode 100644 index 0000000..d8ebb49 Binary files /dev/null and b/Library/Artifacts/a6/a6c83e85a804dab1bd4cfbd3ee9ab291 differ diff --git a/Library/Artifacts/a6/a6d5fa23a93634c6c34be4e9d1a8551d b/Library/Artifacts/a6/a6d5fa23a93634c6c34be4e9d1a8551d new file mode 100644 index 0000000..311d416 Binary files /dev/null and b/Library/Artifacts/a6/a6d5fa23a93634c6c34be4e9d1a8551d differ diff --git a/Library/Artifacts/a6/a6d8f1f5c4ec11ada51b146b7255086d b/Library/Artifacts/a6/a6d8f1f5c4ec11ada51b146b7255086d new file mode 100644 index 0000000..d2e9449 Binary files /dev/null and b/Library/Artifacts/a6/a6d8f1f5c4ec11ada51b146b7255086d differ diff --git a/Library/Artifacts/a6/a6f41b0060944da8af593e6b83cce947 b/Library/Artifacts/a6/a6f41b0060944da8af593e6b83cce947 new file mode 100644 index 0000000..a1071d3 Binary files /dev/null and b/Library/Artifacts/a6/a6f41b0060944da8af593e6b83cce947 differ diff --git a/Library/Artifacts/a6/a6f6bd45138c1220d970a8a5b6262a5f b/Library/Artifacts/a6/a6f6bd45138c1220d970a8a5b6262a5f new file mode 100644 index 0000000..c752b8b Binary files /dev/null and b/Library/Artifacts/a6/a6f6bd45138c1220d970a8a5b6262a5f differ diff --git a/Library/Artifacts/a7/a7106456c6eec96fbd8b1e9d903e603b b/Library/Artifacts/a7/a7106456c6eec96fbd8b1e9d903e603b new file mode 100644 index 0000000..198cc8c Binary files /dev/null and b/Library/Artifacts/a7/a7106456c6eec96fbd8b1e9d903e603b differ diff --git a/Library/Artifacts/a7/a73257752b3bb8d7ce052b37b4fac1d3 b/Library/Artifacts/a7/a73257752b3bb8d7ce052b37b4fac1d3 new file mode 100644 index 0000000..93e3e48 Binary files /dev/null and b/Library/Artifacts/a7/a73257752b3bb8d7ce052b37b4fac1d3 differ diff --git a/Library/Artifacts/a7/a75b70a666fd3a55194d9ca3cfa36577 b/Library/Artifacts/a7/a75b70a666fd3a55194d9ca3cfa36577 new file mode 100644 index 0000000..a34cdce Binary files /dev/null and b/Library/Artifacts/a7/a75b70a666fd3a55194d9ca3cfa36577 differ diff --git a/Library/Artifacts/a7/a767cdc53186a89136cec689994ab394 b/Library/Artifacts/a7/a767cdc53186a89136cec689994ab394 new file mode 100644 index 0000000..779dbc6 Binary files /dev/null and b/Library/Artifacts/a7/a767cdc53186a89136cec689994ab394 differ diff --git a/Library/Artifacts/a7/a77d410f78e6fc3b10b66710e9d06186 b/Library/Artifacts/a7/a77d410f78e6fc3b10b66710e9d06186 new file mode 100644 index 0000000..4ef8a46 Binary files /dev/null and b/Library/Artifacts/a7/a77d410f78e6fc3b10b66710e9d06186 differ diff --git a/Library/Artifacts/a7/a79a3bd29274b252a7293c784bf48ae6 b/Library/Artifacts/a7/a79a3bd29274b252a7293c784bf48ae6 new file mode 100644 index 0000000..5d5ae38 Binary files /dev/null and b/Library/Artifacts/a7/a79a3bd29274b252a7293c784bf48ae6 differ diff --git a/Library/Artifacts/a7/a7ee085ec6bcac23219b9e8e6b37b9d7 b/Library/Artifacts/a7/a7ee085ec6bcac23219b9e8e6b37b9d7 new file mode 100644 index 0000000..a313b98 Binary files /dev/null and b/Library/Artifacts/a7/a7ee085ec6bcac23219b9e8e6b37b9d7 differ diff --git a/Library/Artifacts/a8/a804d3e4bacdd93541ee5d6d85c3c294 b/Library/Artifacts/a8/a804d3e4bacdd93541ee5d6d85c3c294 new file mode 100644 index 0000000..187bd8d Binary files /dev/null and b/Library/Artifacts/a8/a804d3e4bacdd93541ee5d6d85c3c294 differ diff --git a/Library/Artifacts/a8/a80a2dc99579253fa80ed2c06536d104 b/Library/Artifacts/a8/a80a2dc99579253fa80ed2c06536d104 new file mode 100644 index 0000000..5b95b62 Binary files /dev/null and b/Library/Artifacts/a8/a80a2dc99579253fa80ed2c06536d104 differ diff --git a/Library/Artifacts/a8/a83a71e4dc0c9afb54d5adec6e6eea7c b/Library/Artifacts/a8/a83a71e4dc0c9afb54d5adec6e6eea7c new file mode 100644 index 0000000..f2d04da Binary files /dev/null and b/Library/Artifacts/a8/a83a71e4dc0c9afb54d5adec6e6eea7c differ diff --git a/Library/Artifacts/a8/a83e2a82322c816a8dac3daa34dd318d b/Library/Artifacts/a8/a83e2a82322c816a8dac3daa34dd318d new file mode 100644 index 0000000..ef8afaa Binary files /dev/null and b/Library/Artifacts/a8/a83e2a82322c816a8dac3daa34dd318d differ diff --git a/Library/Artifacts/a8/a83fc2898d22f326c3893d6b9eae1053 b/Library/Artifacts/a8/a83fc2898d22f326c3893d6b9eae1053 new file mode 100644 index 0000000..1be6a64 Binary files /dev/null and b/Library/Artifacts/a8/a83fc2898d22f326c3893d6b9eae1053 differ diff --git a/Library/Artifacts/a8/a855b516a27338256312b8878bf2ae50 b/Library/Artifacts/a8/a855b516a27338256312b8878bf2ae50 new file mode 100644 index 0000000..08e1796 Binary files /dev/null and b/Library/Artifacts/a8/a855b516a27338256312b8878bf2ae50 differ diff --git a/Library/Artifacts/a8/a873ee46c00cbe7f7c0883ef0bfb4d03 b/Library/Artifacts/a8/a873ee46c00cbe7f7c0883ef0bfb4d03 new file mode 100644 index 0000000..2520aaf Binary files /dev/null and b/Library/Artifacts/a8/a873ee46c00cbe7f7c0883ef0bfb4d03 differ diff --git a/Library/Artifacts/a8/a88ad1974eac72db049544ec343ed3cb b/Library/Artifacts/a8/a88ad1974eac72db049544ec343ed3cb new file mode 100644 index 0000000..038568a Binary files /dev/null and b/Library/Artifacts/a8/a88ad1974eac72db049544ec343ed3cb differ diff --git a/Library/Artifacts/a8/a88d70c1fe4d03ddac26463d45757f84 b/Library/Artifacts/a8/a88d70c1fe4d03ddac26463d45757f84 new file mode 100644 index 0000000..e845e52 Binary files /dev/null and b/Library/Artifacts/a8/a88d70c1fe4d03ddac26463d45757f84 differ diff --git a/Library/Artifacts/a8/a88fd1e3c7875400e1063e37502b4bd5 b/Library/Artifacts/a8/a88fd1e3c7875400e1063e37502b4bd5 new file mode 100644 index 0000000..55a05f3 Binary files /dev/null and b/Library/Artifacts/a8/a88fd1e3c7875400e1063e37502b4bd5 differ diff --git a/Library/Artifacts/a8/a8b05a16368ddb721f3fd1cfc0063b84 b/Library/Artifacts/a8/a8b05a16368ddb721f3fd1cfc0063b84 new file mode 100644 index 0000000..b0c3141 Binary files /dev/null and b/Library/Artifacts/a8/a8b05a16368ddb721f3fd1cfc0063b84 differ diff --git a/Library/Artifacts/a8/a8b78d933a766a16563c2a4f08e4e559 b/Library/Artifacts/a8/a8b78d933a766a16563c2a4f08e4e559 new file mode 100644 index 0000000..e3a4edd Binary files /dev/null and b/Library/Artifacts/a8/a8b78d933a766a16563c2a4f08e4e559 differ diff --git a/Library/Artifacts/a8/a8bd63276779fb1b01819c0ac6be3c57 b/Library/Artifacts/a8/a8bd63276779fb1b01819c0ac6be3c57 new file mode 100644 index 0000000..bc6b737 Binary files /dev/null and b/Library/Artifacts/a8/a8bd63276779fb1b01819c0ac6be3c57 differ diff --git a/Library/Artifacts/a8/a8e8fa5fb5bd7569664aeae5c3f33fd3 b/Library/Artifacts/a8/a8e8fa5fb5bd7569664aeae5c3f33fd3 new file mode 100644 index 0000000..2c2a2d6 Binary files /dev/null and b/Library/Artifacts/a8/a8e8fa5fb5bd7569664aeae5c3f33fd3 differ diff --git a/Library/Artifacts/a8/a8fa6522b4929ed2587886faf49ba8e7 b/Library/Artifacts/a8/a8fa6522b4929ed2587886faf49ba8e7 new file mode 100644 index 0000000..e12ec42 Binary files /dev/null and b/Library/Artifacts/a8/a8fa6522b4929ed2587886faf49ba8e7 differ diff --git a/Library/Artifacts/a9/a908922c91b138bb63b511cb2d4f1343 b/Library/Artifacts/a9/a908922c91b138bb63b511cb2d4f1343 new file mode 100644 index 0000000..bd92f1d Binary files /dev/null and b/Library/Artifacts/a9/a908922c91b138bb63b511cb2d4f1343 differ diff --git a/Library/Artifacts/a9/a9260591338e31b079b1ffe0ea60a6f0 b/Library/Artifacts/a9/a9260591338e31b079b1ffe0ea60a6f0 new file mode 100644 index 0000000..a60ad10 Binary files /dev/null and b/Library/Artifacts/a9/a9260591338e31b079b1ffe0ea60a6f0 differ diff --git a/Library/Artifacts/a9/a947ebfbfab988d866e3add31de9a9e3 b/Library/Artifacts/a9/a947ebfbfab988d866e3add31de9a9e3 new file mode 100644 index 0000000..79f7d61 Binary files /dev/null and b/Library/Artifacts/a9/a947ebfbfab988d866e3add31de9a9e3 differ diff --git a/Library/Artifacts/a9/a9807ed60a7046f901a082bd4c86f460 b/Library/Artifacts/a9/a9807ed60a7046f901a082bd4c86f460 new file mode 100644 index 0000000..be71205 Binary files /dev/null and b/Library/Artifacts/a9/a9807ed60a7046f901a082bd4c86f460 differ diff --git a/Library/Artifacts/a9/a98d1b2d040e78df865400ed5043dd3e b/Library/Artifacts/a9/a98d1b2d040e78df865400ed5043dd3e new file mode 100644 index 0000000..c1ce629 Binary files /dev/null and b/Library/Artifacts/a9/a98d1b2d040e78df865400ed5043dd3e differ diff --git a/Library/Artifacts/a9/a995725dc16d56e477c16b2e70d36740 b/Library/Artifacts/a9/a995725dc16d56e477c16b2e70d36740 new file mode 100644 index 0000000..cd0d974 Binary files /dev/null and b/Library/Artifacts/a9/a995725dc16d56e477c16b2e70d36740 differ diff --git a/Library/Artifacts/a9/a9a33ef72733126c6b65cafb1f632eb2 b/Library/Artifacts/a9/a9a33ef72733126c6b65cafb1f632eb2 new file mode 100644 index 0000000..5a840c9 Binary files /dev/null and b/Library/Artifacts/a9/a9a33ef72733126c6b65cafb1f632eb2 differ diff --git a/Library/Artifacts/a9/a9ae9d42cc6906e31c4c2e8731b10b8e b/Library/Artifacts/a9/a9ae9d42cc6906e31c4c2e8731b10b8e new file mode 100644 index 0000000..6e4f226 Binary files /dev/null and b/Library/Artifacts/a9/a9ae9d42cc6906e31c4c2e8731b10b8e differ diff --git a/Library/Artifacts/a9/a9b6ae5d176cad36bf342da8782b79ec b/Library/Artifacts/a9/a9b6ae5d176cad36bf342da8782b79ec new file mode 100644 index 0000000..a3f13ef Binary files /dev/null and b/Library/Artifacts/a9/a9b6ae5d176cad36bf342da8782b79ec differ diff --git a/Library/Artifacts/a9/a9cc21361cd9b4f186d265095b05e44d b/Library/Artifacts/a9/a9cc21361cd9b4f186d265095b05e44d new file mode 100644 index 0000000..ce5a938 Binary files /dev/null and b/Library/Artifacts/a9/a9cc21361cd9b4f186d265095b05e44d differ diff --git a/Library/Artifacts/a9/a9d2bf0ab1bf1e022cfeadae34691496 b/Library/Artifacts/a9/a9d2bf0ab1bf1e022cfeadae34691496 new file mode 100644 index 0000000..1f9b776 Binary files /dev/null and b/Library/Artifacts/a9/a9d2bf0ab1bf1e022cfeadae34691496 differ diff --git a/Library/Artifacts/a9/a9dbd76d43f2ec4656099e61297a93ff b/Library/Artifacts/a9/a9dbd76d43f2ec4656099e61297a93ff new file mode 100644 index 0000000..f76ee3a Binary files /dev/null and b/Library/Artifacts/a9/a9dbd76d43f2ec4656099e61297a93ff differ diff --git a/Library/Artifacts/a9/a9dcdbc0a836a2c614fa5dd06993663b b/Library/Artifacts/a9/a9dcdbc0a836a2c614fa5dd06993663b new file mode 100644 index 0000000..21e5026 Binary files /dev/null and b/Library/Artifacts/a9/a9dcdbc0a836a2c614fa5dd06993663b differ diff --git a/Library/Artifacts/aa/aa648354bba1a81903f335aacb48eb40 b/Library/Artifacts/aa/aa648354bba1a81903f335aacb48eb40 new file mode 100644 index 0000000..f8e19c8 Binary files /dev/null and b/Library/Artifacts/aa/aa648354bba1a81903f335aacb48eb40 differ diff --git a/Library/Artifacts/aa/aa6782057f1beb03181ad719df161ed1 b/Library/Artifacts/aa/aa6782057f1beb03181ad719df161ed1 new file mode 100644 index 0000000..169eb8b Binary files /dev/null and b/Library/Artifacts/aa/aa6782057f1beb03181ad719df161ed1 differ diff --git a/Library/Artifacts/ab/ab08c605c09681a5b893be6bb6fb6cdb b/Library/Artifacts/ab/ab08c605c09681a5b893be6bb6fb6cdb new file mode 100644 index 0000000..cffcbb3 Binary files /dev/null and b/Library/Artifacts/ab/ab08c605c09681a5b893be6bb6fb6cdb differ diff --git a/Library/Artifacts/ab/ab2289d09fe358978a32ed52e862783d b/Library/Artifacts/ab/ab2289d09fe358978a32ed52e862783d new file mode 100644 index 0000000..ac7859f Binary files /dev/null and b/Library/Artifacts/ab/ab2289d09fe358978a32ed52e862783d differ diff --git a/Library/Artifacts/ab/ab36203c277baffc99a4d11d8c76ca41 b/Library/Artifacts/ab/ab36203c277baffc99a4d11d8c76ca41 new file mode 100644 index 0000000..17bf1ef Binary files /dev/null and b/Library/Artifacts/ab/ab36203c277baffc99a4d11d8c76ca41 differ diff --git a/Library/Artifacts/ab/ab549e7616ca5ba27f0f00542bc73e8c b/Library/Artifacts/ab/ab549e7616ca5ba27f0f00542bc73e8c new file mode 100644 index 0000000..ab04c9e Binary files /dev/null and b/Library/Artifacts/ab/ab549e7616ca5ba27f0f00542bc73e8c differ diff --git a/Library/Artifacts/ab/abb2cb52eee7f05c45ac566eef5235ce b/Library/Artifacts/ab/abb2cb52eee7f05c45ac566eef5235ce new file mode 100644 index 0000000..0c8cf4d Binary files /dev/null and b/Library/Artifacts/ab/abb2cb52eee7f05c45ac566eef5235ce differ diff --git a/Library/Artifacts/ab/abc43e36ed6d4fa57323aba4accb2890 b/Library/Artifacts/ab/abc43e36ed6d4fa57323aba4accb2890 new file mode 100644 index 0000000..c7546d7 Binary files /dev/null and b/Library/Artifacts/ab/abc43e36ed6d4fa57323aba4accb2890 differ diff --git a/Library/Artifacts/ab/abc5e2e8719277536688292b7f4ec500 b/Library/Artifacts/ab/abc5e2e8719277536688292b7f4ec500 new file mode 100644 index 0000000..d66b62a Binary files /dev/null and b/Library/Artifacts/ab/abc5e2e8719277536688292b7f4ec500 differ diff --git a/Library/Artifacts/ab/abcb5364660d2f7174490de39c7c7e3f b/Library/Artifacts/ab/abcb5364660d2f7174490de39c7c7e3f new file mode 100644 index 0000000..bafd00b Binary files /dev/null and b/Library/Artifacts/ab/abcb5364660d2f7174490de39c7c7e3f differ diff --git a/Library/Artifacts/ab/abf1c012ec71f544a78e5cf0144d9d2b b/Library/Artifacts/ab/abf1c012ec71f544a78e5cf0144d9d2b new file mode 100644 index 0000000..5ad8c1f Binary files /dev/null and b/Library/Artifacts/ab/abf1c012ec71f544a78e5cf0144d9d2b differ diff --git a/Library/Artifacts/ab/abf58c319eda4027fccab8dee155b1fd b/Library/Artifacts/ab/abf58c319eda4027fccab8dee155b1fd new file mode 100644 index 0000000..5c25314 Binary files /dev/null and b/Library/Artifacts/ab/abf58c319eda4027fccab8dee155b1fd differ diff --git a/Library/Artifacts/ab/abfe0ca15be088b9dcfe631fe450304c b/Library/Artifacts/ab/abfe0ca15be088b9dcfe631fe450304c new file mode 100644 index 0000000..8d1da09 Binary files /dev/null and b/Library/Artifacts/ab/abfe0ca15be088b9dcfe631fe450304c differ diff --git a/Library/Artifacts/ac/ac9be08ff92e0156e2940233d130a7db b/Library/Artifacts/ac/ac9be08ff92e0156e2940233d130a7db new file mode 100644 index 0000000..b551082 Binary files /dev/null and b/Library/Artifacts/ac/ac9be08ff92e0156e2940233d130a7db differ diff --git a/Library/Artifacts/ac/aca093c7f2f045a7b6ec06396cfbfd14 b/Library/Artifacts/ac/aca093c7f2f045a7b6ec06396cfbfd14 new file mode 100644 index 0000000..f440117 Binary files /dev/null and b/Library/Artifacts/ac/aca093c7f2f045a7b6ec06396cfbfd14 differ diff --git a/Library/Artifacts/ac/acc66353ffb8a613166b1db9e51bf024 b/Library/Artifacts/ac/acc66353ffb8a613166b1db9e51bf024 new file mode 100644 index 0000000..9df35d8 Binary files /dev/null and b/Library/Artifacts/ac/acc66353ffb8a613166b1db9e51bf024 differ diff --git a/Library/Artifacts/ac/acc923ab03070dcaae95c4f9508c01b1 b/Library/Artifacts/ac/acc923ab03070dcaae95c4f9508c01b1 new file mode 100644 index 0000000..02313eb Binary files /dev/null and b/Library/Artifacts/ac/acc923ab03070dcaae95c4f9508c01b1 differ diff --git a/Library/Artifacts/ac/accc143fec9d49ab79f3bbbe5919e879 b/Library/Artifacts/ac/accc143fec9d49ab79f3bbbe5919e879 new file mode 100644 index 0000000..bbcf045 Binary files /dev/null and b/Library/Artifacts/ac/accc143fec9d49ab79f3bbbe5919e879 differ diff --git a/Library/Artifacts/ac/acd55f9ca29f0492bf9d5a8194b8a95b b/Library/Artifacts/ac/acd55f9ca29f0492bf9d5a8194b8a95b new file mode 100644 index 0000000..5f04b4d Binary files /dev/null and b/Library/Artifacts/ac/acd55f9ca29f0492bf9d5a8194b8a95b differ diff --git a/Library/Artifacts/ad/ad05fe0d2f10a67797e258a67915b73f b/Library/Artifacts/ad/ad05fe0d2f10a67797e258a67915b73f new file mode 100644 index 0000000..fc53e29 Binary files /dev/null and b/Library/Artifacts/ad/ad05fe0d2f10a67797e258a67915b73f differ diff --git a/Library/Artifacts/ad/ad40db2c3f251c401a10af5340bb1eee b/Library/Artifacts/ad/ad40db2c3f251c401a10af5340bb1eee new file mode 100644 index 0000000..30d7a97 Binary files /dev/null and b/Library/Artifacts/ad/ad40db2c3f251c401a10af5340bb1eee differ diff --git a/Library/Artifacts/ad/ad7d2ee3251f65f5eb2a7bf977e2553a b/Library/Artifacts/ad/ad7d2ee3251f65f5eb2a7bf977e2553a new file mode 100644 index 0000000..f1ee09f Binary files /dev/null and b/Library/Artifacts/ad/ad7d2ee3251f65f5eb2a7bf977e2553a differ diff --git a/Library/Artifacts/ad/adcaa92a87a11c83c6c0368c6a65ce8b b/Library/Artifacts/ad/adcaa92a87a11c83c6c0368c6a65ce8b new file mode 100644 index 0000000..c2c3558 Binary files /dev/null and b/Library/Artifacts/ad/adcaa92a87a11c83c6c0368c6a65ce8b differ diff --git a/Library/Artifacts/ad/add3807966f73f68a10333821d37c06b b/Library/Artifacts/ad/add3807966f73f68a10333821d37c06b new file mode 100644 index 0000000..6db2149 Binary files /dev/null and b/Library/Artifacts/ad/add3807966f73f68a10333821d37c06b differ diff --git a/Library/Artifacts/ad/ade0745e03211b925bed609b12f88d51 b/Library/Artifacts/ad/ade0745e03211b925bed609b12f88d51 new file mode 100644 index 0000000..dd245ef Binary files /dev/null and b/Library/Artifacts/ad/ade0745e03211b925bed609b12f88d51 differ diff --git a/Library/Artifacts/ad/ade2ae249a61e9f257d7d48b621cbed6 b/Library/Artifacts/ad/ade2ae249a61e9f257d7d48b621cbed6 new file mode 100644 index 0000000..6627086 Binary files /dev/null and b/Library/Artifacts/ad/ade2ae249a61e9f257d7d48b621cbed6 differ diff --git a/Library/Artifacts/ad/ade5ced6a749c6a151f0f3e54e2dad40 b/Library/Artifacts/ad/ade5ced6a749c6a151f0f3e54e2dad40 new file mode 100644 index 0000000..fb19f94 Binary files /dev/null and b/Library/Artifacts/ad/ade5ced6a749c6a151f0f3e54e2dad40 differ diff --git a/Library/Artifacts/ae/ae195aa0bdcf1b9310d442e3d60c75e7 b/Library/Artifacts/ae/ae195aa0bdcf1b9310d442e3d60c75e7 new file mode 100644 index 0000000..1bd738a Binary files /dev/null and b/Library/Artifacts/ae/ae195aa0bdcf1b9310d442e3d60c75e7 differ diff --git a/Library/Artifacts/ae/ae37ba3e05c523d525a73ef2f35e9627 b/Library/Artifacts/ae/ae37ba3e05c523d525a73ef2f35e9627 new file mode 100644 index 0000000..a564885 Binary files /dev/null and b/Library/Artifacts/ae/ae37ba3e05c523d525a73ef2f35e9627 differ diff --git a/Library/Artifacts/ae/ae41d6e0405a9b44a279b94902793889 b/Library/Artifacts/ae/ae41d6e0405a9b44a279b94902793889 new file mode 100644 index 0000000..99bde9c Binary files /dev/null and b/Library/Artifacts/ae/ae41d6e0405a9b44a279b94902793889 differ diff --git a/Library/Artifacts/ae/ae5f722d49f2847e2cfa55f1d1ca397d b/Library/Artifacts/ae/ae5f722d49f2847e2cfa55f1d1ca397d new file mode 100644 index 0000000..37c68f7 Binary files /dev/null and b/Library/Artifacts/ae/ae5f722d49f2847e2cfa55f1d1ca397d differ diff --git a/Library/Artifacts/ae/aebd32c181b964aae3576029ac0e292d b/Library/Artifacts/ae/aebd32c181b964aae3576029ac0e292d new file mode 100644 index 0000000..1f272cd Binary files /dev/null and b/Library/Artifacts/ae/aebd32c181b964aae3576029ac0e292d differ diff --git a/Library/Artifacts/ae/aefb0c70d83aaed8d3592797f812ca2c b/Library/Artifacts/ae/aefb0c70d83aaed8d3592797f812ca2c new file mode 100644 index 0000000..85ea5a3 Binary files /dev/null and b/Library/Artifacts/ae/aefb0c70d83aaed8d3592797f812ca2c differ diff --git a/Library/Artifacts/af/af3267512a9eb778daffb0e4c2330c82 b/Library/Artifacts/af/af3267512a9eb778daffb0e4c2330c82 new file mode 100644 index 0000000..7d7f98b Binary files /dev/null and b/Library/Artifacts/af/af3267512a9eb778daffb0e4c2330c82 differ diff --git a/Library/Artifacts/af/af3af66bf522cf9b4e94406ec2db7fb5 b/Library/Artifacts/af/af3af66bf522cf9b4e94406ec2db7fb5 new file mode 100644 index 0000000..9a7c582 Binary files /dev/null and b/Library/Artifacts/af/af3af66bf522cf9b4e94406ec2db7fb5 differ diff --git a/Library/Artifacts/af/af4aba79fa6ad2b6766ffbb2e5b971e8 b/Library/Artifacts/af/af4aba79fa6ad2b6766ffbb2e5b971e8 new file mode 100644 index 0000000..7ceca6c Binary files /dev/null and b/Library/Artifacts/af/af4aba79fa6ad2b6766ffbb2e5b971e8 differ diff --git a/Library/Artifacts/af/af9ce33374bec2522422b9f4277a9161 b/Library/Artifacts/af/af9ce33374bec2522422b9f4277a9161 new file mode 100644 index 0000000..8c8dc0a Binary files /dev/null and b/Library/Artifacts/af/af9ce33374bec2522422b9f4277a9161 differ diff --git a/Library/Artifacts/af/afced470979b3286a083e9d030c54d56 b/Library/Artifacts/af/afced470979b3286a083e9d030c54d56 new file mode 100644 index 0000000..2dd38cc Binary files /dev/null and b/Library/Artifacts/af/afced470979b3286a083e9d030c54d56 differ diff --git a/Library/Artifacts/af/aff2afd5f79c4dcd8b7d2d87c0f7caf1 b/Library/Artifacts/af/aff2afd5f79c4dcd8b7d2d87c0f7caf1 new file mode 100644 index 0000000..cf93ec7 Binary files /dev/null and b/Library/Artifacts/af/aff2afd5f79c4dcd8b7d2d87c0f7caf1 differ diff --git a/Library/Artifacts/b0/b0040c521fd3b341f9eab502fb836fda b/Library/Artifacts/b0/b0040c521fd3b341f9eab502fb836fda new file mode 100644 index 0000000..8e333c8 Binary files /dev/null and b/Library/Artifacts/b0/b0040c521fd3b341f9eab502fb836fda differ diff --git a/Library/Artifacts/b0/b02a1e1f0cefb628ff6c0d1ccf15b026 b/Library/Artifacts/b0/b02a1e1f0cefb628ff6c0d1ccf15b026 new file mode 100644 index 0000000..863692c Binary files /dev/null and b/Library/Artifacts/b0/b02a1e1f0cefb628ff6c0d1ccf15b026 differ diff --git a/Library/Artifacts/b0/b030454a0585d5768bb81bd63754f4ae b/Library/Artifacts/b0/b030454a0585d5768bb81bd63754f4ae new file mode 100644 index 0000000..483ad59 Binary files /dev/null and b/Library/Artifacts/b0/b030454a0585d5768bb81bd63754f4ae differ diff --git a/Library/Artifacts/b0/b04c96226b92b255925833748e25453b b/Library/Artifacts/b0/b04c96226b92b255925833748e25453b new file mode 100644 index 0000000..24a0675 Binary files /dev/null and b/Library/Artifacts/b0/b04c96226b92b255925833748e25453b differ diff --git a/Library/Artifacts/b0/b050b2a3e75c8e3f24c88a23ff0bdf1d b/Library/Artifacts/b0/b050b2a3e75c8e3f24c88a23ff0bdf1d new file mode 100644 index 0000000..9080856 Binary files /dev/null and b/Library/Artifacts/b0/b050b2a3e75c8e3f24c88a23ff0bdf1d differ diff --git a/Library/Artifacts/b0/b066bea681dce09ce59f12c41a68c8be b/Library/Artifacts/b0/b066bea681dce09ce59f12c41a68c8be new file mode 100644 index 0000000..10950b9 Binary files /dev/null and b/Library/Artifacts/b0/b066bea681dce09ce59f12c41a68c8be differ diff --git a/Library/Artifacts/b0/b0b4a678f04e00f767a1efff1a630f60 b/Library/Artifacts/b0/b0b4a678f04e00f767a1efff1a630f60 new file mode 100644 index 0000000..f54fcd8 Binary files /dev/null and b/Library/Artifacts/b0/b0b4a678f04e00f767a1efff1a630f60 differ diff --git a/Library/Artifacts/b0/b0d0a07789a4c64781788c87ac961860 b/Library/Artifacts/b0/b0d0a07789a4c64781788c87ac961860 new file mode 100644 index 0000000..a57104b Binary files /dev/null and b/Library/Artifacts/b0/b0d0a07789a4c64781788c87ac961860 differ diff --git a/Library/Artifacts/b1/b107cb9e928059411530dbfb70030f94 b/Library/Artifacts/b1/b107cb9e928059411530dbfb70030f94 new file mode 100644 index 0000000..ac5b036 Binary files /dev/null and b/Library/Artifacts/b1/b107cb9e928059411530dbfb70030f94 differ diff --git a/Library/Artifacts/b1/b10f8fca0529ac28d1bc190a98775dc1 b/Library/Artifacts/b1/b10f8fca0529ac28d1bc190a98775dc1 new file mode 100644 index 0000000..8d42b85 Binary files /dev/null and b/Library/Artifacts/b1/b10f8fca0529ac28d1bc190a98775dc1 differ diff --git a/Library/Artifacts/b1/b12f1765031e692cef1a3aa918432801 b/Library/Artifacts/b1/b12f1765031e692cef1a3aa918432801 new file mode 100644 index 0000000..8552df7 Binary files /dev/null and b/Library/Artifacts/b1/b12f1765031e692cef1a3aa918432801 differ diff --git a/Library/Artifacts/b1/b12fd780909f786429c1f45ae6cbb1f7 b/Library/Artifacts/b1/b12fd780909f786429c1f45ae6cbb1f7 new file mode 100644 index 0000000..cecae5f Binary files /dev/null and b/Library/Artifacts/b1/b12fd780909f786429c1f45ae6cbb1f7 differ diff --git a/Library/Artifacts/b1/b137ea388e6ebbd2a46e1bb485aafccd b/Library/Artifacts/b1/b137ea388e6ebbd2a46e1bb485aafccd new file mode 100644 index 0000000..72fe2c8 Binary files /dev/null and b/Library/Artifacts/b1/b137ea388e6ebbd2a46e1bb485aafccd differ diff --git a/Library/Artifacts/b1/b14afc89159bd6eb04ab103291785d59 b/Library/Artifacts/b1/b14afc89159bd6eb04ab103291785d59 new file mode 100644 index 0000000..ae2f62d Binary files /dev/null and b/Library/Artifacts/b1/b14afc89159bd6eb04ab103291785d59 differ diff --git a/Library/Artifacts/b1/b1cacc3c3880bfa8a13dd9e1b0a3292e b/Library/Artifacts/b1/b1cacc3c3880bfa8a13dd9e1b0a3292e new file mode 100644 index 0000000..11a7911 Binary files /dev/null and b/Library/Artifacts/b1/b1cacc3c3880bfa8a13dd9e1b0a3292e differ diff --git a/Library/Artifacts/b2/b2c575d81333340983e5083007c51513 b/Library/Artifacts/b2/b2c575d81333340983e5083007c51513 new file mode 100644 index 0000000..bb7bf64 Binary files /dev/null and b/Library/Artifacts/b2/b2c575d81333340983e5083007c51513 differ diff --git a/Library/Artifacts/b2/b2dab340fc8768e0032fc7dbeafdf79a b/Library/Artifacts/b2/b2dab340fc8768e0032fc7dbeafdf79a new file mode 100644 index 0000000..2cd13ba Binary files /dev/null and b/Library/Artifacts/b2/b2dab340fc8768e0032fc7dbeafdf79a differ diff --git a/Library/Artifacts/b2/b2fe93d61f2449148c511e85c1c290e3 b/Library/Artifacts/b2/b2fe93d61f2449148c511e85c1c290e3 new file mode 100644 index 0000000..5af0426 Binary files /dev/null and b/Library/Artifacts/b2/b2fe93d61f2449148c511e85c1c290e3 differ diff --git a/Library/Artifacts/b3/b3006a86f4a7adb17ba203510fdac120 b/Library/Artifacts/b3/b3006a86f4a7adb17ba203510fdac120 new file mode 100644 index 0000000..3ab2645 Binary files /dev/null and b/Library/Artifacts/b3/b3006a86f4a7adb17ba203510fdac120 differ diff --git a/Library/Artifacts/b3/b30ea54303c7357e95aaf6298cef0c56 b/Library/Artifacts/b3/b30ea54303c7357e95aaf6298cef0c56 new file mode 100644 index 0000000..ca55c06 Binary files /dev/null and b/Library/Artifacts/b3/b30ea54303c7357e95aaf6298cef0c56 differ diff --git a/Library/Artifacts/b3/b3164cdf5d8e904192fc5b30edc9b0d3 b/Library/Artifacts/b3/b3164cdf5d8e904192fc5b30edc9b0d3 new file mode 100644 index 0000000..97aafda Binary files /dev/null and b/Library/Artifacts/b3/b3164cdf5d8e904192fc5b30edc9b0d3 differ diff --git a/Library/Artifacts/b3/b3218c2105cbc219fa2c4d4615f97b13 b/Library/Artifacts/b3/b3218c2105cbc219fa2c4d4615f97b13 new file mode 100644 index 0000000..ac943a3 Binary files /dev/null and b/Library/Artifacts/b3/b3218c2105cbc219fa2c4d4615f97b13 differ diff --git a/Library/Artifacts/b3/b38ee610f577a40e80eb8975372a8132 b/Library/Artifacts/b3/b38ee610f577a40e80eb8975372a8132 new file mode 100644 index 0000000..6ac8ed6 Binary files /dev/null and b/Library/Artifacts/b3/b38ee610f577a40e80eb8975372a8132 differ diff --git a/Library/Artifacts/b3/b3976b9e17e35c705e5620b7f2b70a3e b/Library/Artifacts/b3/b3976b9e17e35c705e5620b7f2b70a3e new file mode 100644 index 0000000..9ad1b1b Binary files /dev/null and b/Library/Artifacts/b3/b3976b9e17e35c705e5620b7f2b70a3e differ diff --git a/Library/Artifacts/b3/b39d660add25eea498925ed73ef7c5a7 b/Library/Artifacts/b3/b39d660add25eea498925ed73ef7c5a7 new file mode 100644 index 0000000..e41b6a9 Binary files /dev/null and b/Library/Artifacts/b3/b39d660add25eea498925ed73ef7c5a7 differ diff --git a/Library/Artifacts/b3/b3a0264a83a5de04c8dc6844d593a991 b/Library/Artifacts/b3/b3a0264a83a5de04c8dc6844d593a991 new file mode 100644 index 0000000..632bdb9 Binary files /dev/null and b/Library/Artifacts/b3/b3a0264a83a5de04c8dc6844d593a991 differ diff --git a/Library/Artifacts/b3/b3a46eb1c985516f9629f93307752ec0 b/Library/Artifacts/b3/b3a46eb1c985516f9629f93307752ec0 new file mode 100644 index 0000000..fad38ec Binary files /dev/null and b/Library/Artifacts/b3/b3a46eb1c985516f9629f93307752ec0 differ diff --git a/Library/Artifacts/b3/b3e4d100782cd99089f6f68559e25c7d b/Library/Artifacts/b3/b3e4d100782cd99089f6f68559e25c7d new file mode 100644 index 0000000..12a10aa Binary files /dev/null and b/Library/Artifacts/b3/b3e4d100782cd99089f6f68559e25c7d differ diff --git a/Library/Artifacts/b4/b46c78631f95031590b6df7b34de3c04 b/Library/Artifacts/b4/b46c78631f95031590b6df7b34de3c04 new file mode 100644 index 0000000..34df323 Binary files /dev/null and b/Library/Artifacts/b4/b46c78631f95031590b6df7b34de3c04 differ diff --git a/Library/Artifacts/b4/b4919bd1e38abbd8f120a43dd293489a b/Library/Artifacts/b4/b4919bd1e38abbd8f120a43dd293489a new file mode 100644 index 0000000..04c60e1 Binary files /dev/null and b/Library/Artifacts/b4/b4919bd1e38abbd8f120a43dd293489a differ diff --git a/Library/Artifacts/b4/b4ade6bb48721d3d3f7eed5a20bda09c b/Library/Artifacts/b4/b4ade6bb48721d3d3f7eed5a20bda09c new file mode 100644 index 0000000..088925d Binary files /dev/null and b/Library/Artifacts/b4/b4ade6bb48721d3d3f7eed5a20bda09c differ diff --git a/Library/Artifacts/b4/b4eda56f715e2730cc713941a11a2132 b/Library/Artifacts/b4/b4eda56f715e2730cc713941a11a2132 new file mode 100644 index 0000000..9fcbbb4 Binary files /dev/null and b/Library/Artifacts/b4/b4eda56f715e2730cc713941a11a2132 differ diff --git a/Library/Artifacts/b5/b514895b402f270545780c32bab8faff b/Library/Artifacts/b5/b514895b402f270545780c32bab8faff new file mode 100644 index 0000000..12f5f39 Binary files /dev/null and b/Library/Artifacts/b5/b514895b402f270545780c32bab8faff differ diff --git a/Library/Artifacts/b5/b543e12fe75c47ffbfa939d8a57b6b7a b/Library/Artifacts/b5/b543e12fe75c47ffbfa939d8a57b6b7a new file mode 100644 index 0000000..c9b1399 Binary files /dev/null and b/Library/Artifacts/b5/b543e12fe75c47ffbfa939d8a57b6b7a differ diff --git a/Library/Artifacts/b5/b599fb3a8490a146790e45234392b25f b/Library/Artifacts/b5/b599fb3a8490a146790e45234392b25f new file mode 100644 index 0000000..c927beb Binary files /dev/null and b/Library/Artifacts/b5/b599fb3a8490a146790e45234392b25f differ diff --git a/Library/Artifacts/b5/b5a7f7b57b699b09bc23c8afe3e7c1aa b/Library/Artifacts/b5/b5a7f7b57b699b09bc23c8afe3e7c1aa new file mode 100644 index 0000000..9f65ca7 Binary files /dev/null and b/Library/Artifacts/b5/b5a7f7b57b699b09bc23c8afe3e7c1aa differ diff --git a/Library/Artifacts/b5/b5d08344c0e204a4e12adc10e94ab87a b/Library/Artifacts/b5/b5d08344c0e204a4e12adc10e94ab87a new file mode 100644 index 0000000..936158b Binary files /dev/null and b/Library/Artifacts/b5/b5d08344c0e204a4e12adc10e94ab87a differ diff --git a/Library/Artifacts/b5/b5eb92c23be5de81ca1c6b004845f86b b/Library/Artifacts/b5/b5eb92c23be5de81ca1c6b004845f86b new file mode 100644 index 0000000..d6cdbb7 Binary files /dev/null and b/Library/Artifacts/b5/b5eb92c23be5de81ca1c6b004845f86b differ diff --git a/Library/Artifacts/b5/b5ef5069d4d45800899392384a60fef0 b/Library/Artifacts/b5/b5ef5069d4d45800899392384a60fef0 new file mode 100644 index 0000000..34c62e9 Binary files /dev/null and b/Library/Artifacts/b5/b5ef5069d4d45800899392384a60fef0 differ diff --git a/Library/Artifacts/b6/b643e97c719dbecec92b664dc539b9be b/Library/Artifacts/b6/b643e97c719dbecec92b664dc539b9be new file mode 100644 index 0000000..0617167 Binary files /dev/null and b/Library/Artifacts/b6/b643e97c719dbecec92b664dc539b9be differ diff --git a/Library/Artifacts/b6/b649e637b553527ba842e4689a9bd39b b/Library/Artifacts/b6/b649e637b553527ba842e4689a9bd39b new file mode 100644 index 0000000..81453fe Binary files /dev/null and b/Library/Artifacts/b6/b649e637b553527ba842e4689a9bd39b differ diff --git a/Library/Artifacts/b6/b6a5d66fc23e132af0e25d00b754ba80 b/Library/Artifacts/b6/b6a5d66fc23e132af0e25d00b754ba80 new file mode 100644 index 0000000..489b0f0 Binary files /dev/null and b/Library/Artifacts/b6/b6a5d66fc23e132af0e25d00b754ba80 differ diff --git a/Library/Artifacts/b6/b6bb9df0071c5bbea75a3111427863ba b/Library/Artifacts/b6/b6bb9df0071c5bbea75a3111427863ba new file mode 100644 index 0000000..c4f069e Binary files /dev/null and b/Library/Artifacts/b6/b6bb9df0071c5bbea75a3111427863ba differ diff --git a/Library/Artifacts/b6/b6d14ba8f9765775b47603d2420a9171 b/Library/Artifacts/b6/b6d14ba8f9765775b47603d2420a9171 new file mode 100644 index 0000000..64265db Binary files /dev/null and b/Library/Artifacts/b6/b6d14ba8f9765775b47603d2420a9171 differ diff --git a/Library/Artifacts/b7/b71601253a002327d04643502f6b1fc7 b/Library/Artifacts/b7/b71601253a002327d04643502f6b1fc7 new file mode 100644 index 0000000..d7536c8 Binary files /dev/null and b/Library/Artifacts/b7/b71601253a002327d04643502f6b1fc7 differ diff --git a/Library/Artifacts/b7/b746dca03ab44b5e8a8979ca9cba53b4 b/Library/Artifacts/b7/b746dca03ab44b5e8a8979ca9cba53b4 new file mode 100644 index 0000000..7255464 Binary files /dev/null and b/Library/Artifacts/b7/b746dca03ab44b5e8a8979ca9cba53b4 differ diff --git a/Library/Artifacts/b7/b7cb9c4c7684286d0890193e73c32ab6 b/Library/Artifacts/b7/b7cb9c4c7684286d0890193e73c32ab6 new file mode 100644 index 0000000..8541de7 Binary files /dev/null and b/Library/Artifacts/b7/b7cb9c4c7684286d0890193e73c32ab6 differ diff --git a/Library/Artifacts/b7/b7efc1a87a971497a673aac413f5c4d1 b/Library/Artifacts/b7/b7efc1a87a971497a673aac413f5c4d1 new file mode 100644 index 0000000..1ae12fb Binary files /dev/null and b/Library/Artifacts/b7/b7efc1a87a971497a673aac413f5c4d1 differ diff --git a/Library/Artifacts/b7/b7f09c2a562cc868867921f7e0cf57d0 b/Library/Artifacts/b7/b7f09c2a562cc868867921f7e0cf57d0 new file mode 100644 index 0000000..7ece5a4 Binary files /dev/null and b/Library/Artifacts/b7/b7f09c2a562cc868867921f7e0cf57d0 differ diff --git a/Library/Artifacts/b8/b82c46038d01a07fd4ebf88b9730eb20 b/Library/Artifacts/b8/b82c46038d01a07fd4ebf88b9730eb20 new file mode 100644 index 0000000..2c40d6a Binary files /dev/null and b/Library/Artifacts/b8/b82c46038d01a07fd4ebf88b9730eb20 differ diff --git a/Library/Artifacts/b8/b831601a5d9cbf129a2fa340ac6f8800 b/Library/Artifacts/b8/b831601a5d9cbf129a2fa340ac6f8800 new file mode 100644 index 0000000..343997c Binary files /dev/null and b/Library/Artifacts/b8/b831601a5d9cbf129a2fa340ac6f8800 differ diff --git a/Library/Artifacts/b8/b85c5c67b676cd2692e8efbace7b5bb0 b/Library/Artifacts/b8/b85c5c67b676cd2692e8efbace7b5bb0 new file mode 100644 index 0000000..c6cfe52 Binary files /dev/null and b/Library/Artifacts/b8/b85c5c67b676cd2692e8efbace7b5bb0 differ diff --git a/Library/Artifacts/b8/b8ff95b36eafa872e4b88543cb17a597 b/Library/Artifacts/b8/b8ff95b36eafa872e4b88543cb17a597 new file mode 100644 index 0000000..6bb7bd9 Binary files /dev/null and b/Library/Artifacts/b8/b8ff95b36eafa872e4b88543cb17a597 differ diff --git a/Library/Artifacts/b9/b94cf2aa031af01694e3cb1c32b9b96f b/Library/Artifacts/b9/b94cf2aa031af01694e3cb1c32b9b96f new file mode 100644 index 0000000..9e37de7 Binary files /dev/null and b/Library/Artifacts/b9/b94cf2aa031af01694e3cb1c32b9b96f differ diff --git a/Library/Artifacts/b9/b950c08b576bd5880b578c9caa765b0d b/Library/Artifacts/b9/b950c08b576bd5880b578c9caa765b0d new file mode 100644 index 0000000..379a5a8 Binary files /dev/null and b/Library/Artifacts/b9/b950c08b576bd5880b578c9caa765b0d differ diff --git a/Library/Artifacts/b9/b955e015553ad7d5accf357ab7569caf b/Library/Artifacts/b9/b955e015553ad7d5accf357ab7569caf new file mode 100644 index 0000000..1d5f6ed Binary files /dev/null and b/Library/Artifacts/b9/b955e015553ad7d5accf357ab7569caf differ diff --git a/Library/Artifacts/b9/b988a8bf245607c5ac02eba4a7c811ac b/Library/Artifacts/b9/b988a8bf245607c5ac02eba4a7c811ac new file mode 100644 index 0000000..80c9892 Binary files /dev/null and b/Library/Artifacts/b9/b988a8bf245607c5ac02eba4a7c811ac differ diff --git a/Library/Artifacts/b9/b99077087657117a1aa314027324c00d b/Library/Artifacts/b9/b99077087657117a1aa314027324c00d new file mode 100644 index 0000000..7074617 Binary files /dev/null and b/Library/Artifacts/b9/b99077087657117a1aa314027324c00d differ diff --git a/Library/Artifacts/b9/b993b6fd085b4e599f027bbeedcee751 b/Library/Artifacts/b9/b993b6fd085b4e599f027bbeedcee751 new file mode 100644 index 0000000..f1f21fd Binary files /dev/null and b/Library/Artifacts/b9/b993b6fd085b4e599f027bbeedcee751 differ diff --git a/Library/Artifacts/b9/b998fa7a1900dfed9900715227336e0b b/Library/Artifacts/b9/b998fa7a1900dfed9900715227336e0b new file mode 100644 index 0000000..321af43 Binary files /dev/null and b/Library/Artifacts/b9/b998fa7a1900dfed9900715227336e0b differ diff --git a/Library/Artifacts/b9/b9a13357515e475570efef0434bf3900 b/Library/Artifacts/b9/b9a13357515e475570efef0434bf3900 new file mode 100644 index 0000000..c12a43a Binary files /dev/null and b/Library/Artifacts/b9/b9a13357515e475570efef0434bf3900 differ diff --git a/Library/Artifacts/b9/b9c50ef9d4e71ad29661dfa689946b16 b/Library/Artifacts/b9/b9c50ef9d4e71ad29661dfa689946b16 new file mode 100644 index 0000000..0c3c1b5 Binary files /dev/null and b/Library/Artifacts/b9/b9c50ef9d4e71ad29661dfa689946b16 differ diff --git a/Library/Artifacts/b9/b9de05d6e4a6f820bcbf32e18651e8ed b/Library/Artifacts/b9/b9de05d6e4a6f820bcbf32e18651e8ed new file mode 100644 index 0000000..c64c73c Binary files /dev/null and b/Library/Artifacts/b9/b9de05d6e4a6f820bcbf32e18651e8ed differ diff --git a/Library/Artifacts/ba/ba4cd960a81c0b7408a5708169986f47 b/Library/Artifacts/ba/ba4cd960a81c0b7408a5708169986f47 new file mode 100644 index 0000000..0cdd4b0 Binary files /dev/null and b/Library/Artifacts/ba/ba4cd960a81c0b7408a5708169986f47 differ diff --git a/Library/Artifacts/ba/ba69f8ba44441a0c2671ffb6c90ffe95 b/Library/Artifacts/ba/ba69f8ba44441a0c2671ffb6c90ffe95 new file mode 100644 index 0000000..4ba5b35 Binary files /dev/null and b/Library/Artifacts/ba/ba69f8ba44441a0c2671ffb6c90ffe95 differ diff --git a/Library/Artifacts/ba/ba6f667c87bf7271f92d3b3737dda5d8 b/Library/Artifacts/ba/ba6f667c87bf7271f92d3b3737dda5d8 new file mode 100644 index 0000000..1a2ce72 Binary files /dev/null and b/Library/Artifacts/ba/ba6f667c87bf7271f92d3b3737dda5d8 differ diff --git a/Library/Artifacts/ba/ba84f1ee04d4e107b6abd4ad964010eb b/Library/Artifacts/ba/ba84f1ee04d4e107b6abd4ad964010eb new file mode 100644 index 0000000..99aa788 Binary files /dev/null and b/Library/Artifacts/ba/ba84f1ee04d4e107b6abd4ad964010eb differ diff --git a/Library/Artifacts/ba/bad8e61e1d0036af69c31cd4792c0c82 b/Library/Artifacts/ba/bad8e61e1d0036af69c31cd4792c0c82 new file mode 100644 index 0000000..6f8d381 Binary files /dev/null and b/Library/Artifacts/ba/bad8e61e1d0036af69c31cd4792c0c82 differ diff --git a/Library/Artifacts/ba/bae0f0e6e27e42db68df2df1cca48c5f b/Library/Artifacts/ba/bae0f0e6e27e42db68df2df1cca48c5f new file mode 100644 index 0000000..497ec4b Binary files /dev/null and b/Library/Artifacts/ba/bae0f0e6e27e42db68df2df1cca48c5f differ diff --git a/Library/Artifacts/bb/bb128311bd78acc9b8e2df37e03fe764 b/Library/Artifacts/bb/bb128311bd78acc9b8e2df37e03fe764 new file mode 100644 index 0000000..25e4e09 Binary files /dev/null and b/Library/Artifacts/bb/bb128311bd78acc9b8e2df37e03fe764 differ diff --git a/Library/Artifacts/bb/bb155b60f19174a6ff66b51cc3034890 b/Library/Artifacts/bb/bb155b60f19174a6ff66b51cc3034890 new file mode 100644 index 0000000..423f7f5 Binary files /dev/null and b/Library/Artifacts/bb/bb155b60f19174a6ff66b51cc3034890 differ diff --git a/Library/Artifacts/bb/bb492350f74d43ffa1a0ce473fa4a698 b/Library/Artifacts/bb/bb492350f74d43ffa1a0ce473fa4a698 new file mode 100644 index 0000000..1b85000 Binary files /dev/null and b/Library/Artifacts/bb/bb492350f74d43ffa1a0ce473fa4a698 differ diff --git a/Library/Artifacts/bb/bb84742e47962694b571cead395dd4d2 b/Library/Artifacts/bb/bb84742e47962694b571cead395dd4d2 new file mode 100644 index 0000000..8670963 Binary files /dev/null and b/Library/Artifacts/bb/bb84742e47962694b571cead395dd4d2 differ diff --git a/Library/Artifacts/bc/bc04ba2a54921aba156f0b3faaf967c4 b/Library/Artifacts/bc/bc04ba2a54921aba156f0b3faaf967c4 new file mode 100644 index 0000000..70405da Binary files /dev/null and b/Library/Artifacts/bc/bc04ba2a54921aba156f0b3faaf967c4 differ diff --git a/Library/Artifacts/bc/bc13e52b0ae35d06603a1982a0ab10a3 b/Library/Artifacts/bc/bc13e52b0ae35d06603a1982a0ab10a3 new file mode 100644 index 0000000..0ab2977 Binary files /dev/null and b/Library/Artifacts/bc/bc13e52b0ae35d06603a1982a0ab10a3 differ diff --git a/Library/Artifacts/bc/bc217ac3b214874c268c0205bb10d114 b/Library/Artifacts/bc/bc217ac3b214874c268c0205bb10d114 new file mode 100644 index 0000000..1cdba2b Binary files /dev/null and b/Library/Artifacts/bc/bc217ac3b214874c268c0205bb10d114 differ diff --git a/Library/Artifacts/bc/bc227407310f4a610e0a0bef3c1234c0 b/Library/Artifacts/bc/bc227407310f4a610e0a0bef3c1234c0 new file mode 100644 index 0000000..da3612e Binary files /dev/null and b/Library/Artifacts/bc/bc227407310f4a610e0a0bef3c1234c0 differ diff --git a/Library/Artifacts/bc/bc385a1bd41361adb0e1ebad80a8ba99 b/Library/Artifacts/bc/bc385a1bd41361adb0e1ebad80a8ba99 new file mode 100644 index 0000000..113fff8 Binary files /dev/null and b/Library/Artifacts/bc/bc385a1bd41361adb0e1ebad80a8ba99 differ diff --git a/Library/Artifacts/bc/bc3f239d28924cf12d7983eb68a64858 b/Library/Artifacts/bc/bc3f239d28924cf12d7983eb68a64858 new file mode 100644 index 0000000..dec3320 Binary files /dev/null and b/Library/Artifacts/bc/bc3f239d28924cf12d7983eb68a64858 differ diff --git a/Library/Artifacts/bc/bc987072a8865b73a64e6cb1e076b4da b/Library/Artifacts/bc/bc987072a8865b73a64e6cb1e076b4da new file mode 100644 index 0000000..66c65ed Binary files /dev/null and b/Library/Artifacts/bc/bc987072a8865b73a64e6cb1e076b4da differ diff --git a/Library/Artifacts/bc/bcae020ca9275d28acfd2d4d1318aa79 b/Library/Artifacts/bc/bcae020ca9275d28acfd2d4d1318aa79 new file mode 100644 index 0000000..75be4e8 Binary files /dev/null and b/Library/Artifacts/bc/bcae020ca9275d28acfd2d4d1318aa79 differ diff --git a/Library/Artifacts/bc/bcdc226208ff78ee3fa000175ecb2ea0 b/Library/Artifacts/bc/bcdc226208ff78ee3fa000175ecb2ea0 new file mode 100644 index 0000000..0367942 Binary files /dev/null and b/Library/Artifacts/bc/bcdc226208ff78ee3fa000175ecb2ea0 differ diff --git a/Library/Artifacts/bc/bce10d1235f3c3f23d7eda928ae7a391 b/Library/Artifacts/bc/bce10d1235f3c3f23d7eda928ae7a391 new file mode 100644 index 0000000..aa1b9f7 Binary files /dev/null and b/Library/Artifacts/bc/bce10d1235f3c3f23d7eda928ae7a391 differ diff --git a/Library/Artifacts/bc/bcf2927fd792051e4e400dd854bd0515 b/Library/Artifacts/bc/bcf2927fd792051e4e400dd854bd0515 new file mode 100644 index 0000000..4af6165 Binary files /dev/null and b/Library/Artifacts/bc/bcf2927fd792051e4e400dd854bd0515 differ diff --git a/Library/Artifacts/bd/bd0a1a462337b36312de3a220d050106 b/Library/Artifacts/bd/bd0a1a462337b36312de3a220d050106 new file mode 100644 index 0000000..9621e40 Binary files /dev/null and b/Library/Artifacts/bd/bd0a1a462337b36312de3a220d050106 differ diff --git a/Library/Artifacts/bd/bd16726231d7cc8737a53e7313c8eb2e b/Library/Artifacts/bd/bd16726231d7cc8737a53e7313c8eb2e new file mode 100644 index 0000000..13d898e Binary files /dev/null and b/Library/Artifacts/bd/bd16726231d7cc8737a53e7313c8eb2e differ diff --git a/Library/Artifacts/bd/bd2d47745dba1290a985893cc6513d9d b/Library/Artifacts/bd/bd2d47745dba1290a985893cc6513d9d new file mode 100644 index 0000000..9be96ff Binary files /dev/null and b/Library/Artifacts/bd/bd2d47745dba1290a985893cc6513d9d differ diff --git a/Library/Artifacts/bd/bd38c552a5da2c1c0c65e526c5232426 b/Library/Artifacts/bd/bd38c552a5da2c1c0c65e526c5232426 new file mode 100644 index 0000000..4a0e287 Binary files /dev/null and b/Library/Artifacts/bd/bd38c552a5da2c1c0c65e526c5232426 differ diff --git a/Library/Artifacts/bd/bd7d861116935846e5b773b470fb31b9 b/Library/Artifacts/bd/bd7d861116935846e5b773b470fb31b9 new file mode 100644 index 0000000..66a9c36 Binary files /dev/null and b/Library/Artifacts/bd/bd7d861116935846e5b773b470fb31b9 differ diff --git a/Library/Artifacts/bd/bd87f697acfd3e5639e376903e8f776d b/Library/Artifacts/bd/bd87f697acfd3e5639e376903e8f776d new file mode 100644 index 0000000..5ab87d6 Binary files /dev/null and b/Library/Artifacts/bd/bd87f697acfd3e5639e376903e8f776d differ diff --git a/Library/Artifacts/bd/bd8883f07484068fd491a65a19c704a3 b/Library/Artifacts/bd/bd8883f07484068fd491a65a19c704a3 new file mode 100644 index 0000000..d91b3dd Binary files /dev/null and b/Library/Artifacts/bd/bd8883f07484068fd491a65a19c704a3 differ diff --git a/Library/Artifacts/bd/bd9076c7b50965123e468ec8d264292c b/Library/Artifacts/bd/bd9076c7b50965123e468ec8d264292c new file mode 100644 index 0000000..5c2cc87 Binary files /dev/null and b/Library/Artifacts/bd/bd9076c7b50965123e468ec8d264292c differ diff --git a/Library/Artifacts/bd/bd97ce8d9ee22450c00d7c5b13e03507 b/Library/Artifacts/bd/bd97ce8d9ee22450c00d7c5b13e03507 new file mode 100644 index 0000000..ad8cc58 Binary files /dev/null and b/Library/Artifacts/bd/bd97ce8d9ee22450c00d7c5b13e03507 differ diff --git a/Library/Artifacts/bd/bda8417b67addf36bc8a477499895d92 b/Library/Artifacts/bd/bda8417b67addf36bc8a477499895d92 new file mode 100644 index 0000000..6c58579 Binary files /dev/null and b/Library/Artifacts/bd/bda8417b67addf36bc8a477499895d92 differ diff --git a/Library/Artifacts/bd/bdcadaedeb0150d2cbc87bac530381e3 b/Library/Artifacts/bd/bdcadaedeb0150d2cbc87bac530381e3 new file mode 100644 index 0000000..9f9c197 Binary files /dev/null and b/Library/Artifacts/bd/bdcadaedeb0150d2cbc87bac530381e3 differ diff --git a/Library/Artifacts/bd/bdfa43259a050fb3d4488e2862eb9b50 b/Library/Artifacts/bd/bdfa43259a050fb3d4488e2862eb9b50 new file mode 100644 index 0000000..526e68b Binary files /dev/null and b/Library/Artifacts/bd/bdfa43259a050fb3d4488e2862eb9b50 differ diff --git a/Library/Artifacts/bd/bdfad9b99513f28ac1536ac8232897bd b/Library/Artifacts/bd/bdfad9b99513f28ac1536ac8232897bd new file mode 100644 index 0000000..b4ced61 Binary files /dev/null and b/Library/Artifacts/bd/bdfad9b99513f28ac1536ac8232897bd differ diff --git a/Library/Artifacts/be/be0bf0c76d594562d28669913605682b b/Library/Artifacts/be/be0bf0c76d594562d28669913605682b new file mode 100644 index 0000000..15a0cff Binary files /dev/null and b/Library/Artifacts/be/be0bf0c76d594562d28669913605682b differ diff --git a/Library/Artifacts/be/be24ae9dad9333d6070081bf46414c5d b/Library/Artifacts/be/be24ae9dad9333d6070081bf46414c5d new file mode 100644 index 0000000..11b4f19 Binary files /dev/null and b/Library/Artifacts/be/be24ae9dad9333d6070081bf46414c5d differ diff --git a/Library/Artifacts/be/be6c73849b6c1197aca27b4300eb6131 b/Library/Artifacts/be/be6c73849b6c1197aca27b4300eb6131 new file mode 100644 index 0000000..255c25e Binary files /dev/null and b/Library/Artifacts/be/be6c73849b6c1197aca27b4300eb6131 differ diff --git a/Library/Artifacts/be/be85ab9b4cbab5acfa987286ef3d1127 b/Library/Artifacts/be/be85ab9b4cbab5acfa987286ef3d1127 new file mode 100644 index 0000000..9d7b2fc Binary files /dev/null and b/Library/Artifacts/be/be85ab9b4cbab5acfa987286ef3d1127 differ diff --git a/Library/Artifacts/be/be8bffc2c3cc24f094fe6f6591564689 b/Library/Artifacts/be/be8bffc2c3cc24f094fe6f6591564689 new file mode 100644 index 0000000..0638733 Binary files /dev/null and b/Library/Artifacts/be/be8bffc2c3cc24f094fe6f6591564689 differ diff --git a/Library/Artifacts/be/be955d1ac237d1957a8a61ed15d45410 b/Library/Artifacts/be/be955d1ac237d1957a8a61ed15d45410 new file mode 100644 index 0000000..aca1e3b Binary files /dev/null and b/Library/Artifacts/be/be955d1ac237d1957a8a61ed15d45410 differ diff --git a/Library/Artifacts/be/beac40e5cbf7791c2231b2a980aa9148 b/Library/Artifacts/be/beac40e5cbf7791c2231b2a980aa9148 new file mode 100644 index 0000000..3136b1c Binary files /dev/null and b/Library/Artifacts/be/beac40e5cbf7791c2231b2a980aa9148 differ diff --git a/Library/Artifacts/be/beb684064651a4432abfb51535172fdd b/Library/Artifacts/be/beb684064651a4432abfb51535172fdd new file mode 100644 index 0000000..ba66d21 Binary files /dev/null and b/Library/Artifacts/be/beb684064651a4432abfb51535172fdd differ diff --git a/Library/Artifacts/be/beef4962062a1676295cad357a5933a9 b/Library/Artifacts/be/beef4962062a1676295cad357a5933a9 new file mode 100644 index 0000000..9ee3b56 Binary files /dev/null and b/Library/Artifacts/be/beef4962062a1676295cad357a5933a9 differ diff --git a/Library/Artifacts/be/bef434db2ba432715d53696cc936f1e1 b/Library/Artifacts/be/bef434db2ba432715d53696cc936f1e1 new file mode 100644 index 0000000..1681718 Binary files /dev/null and b/Library/Artifacts/be/bef434db2ba432715d53696cc936f1e1 differ diff --git a/Library/Artifacts/be/bef92ef860922058617f14c69e4bb3c1 b/Library/Artifacts/be/bef92ef860922058617f14c69e4bb3c1 new file mode 100644 index 0000000..e5d909e Binary files /dev/null and b/Library/Artifacts/be/bef92ef860922058617f14c69e4bb3c1 differ diff --git a/Library/Artifacts/bf/bf12d415930483d08632d3856e8a219c b/Library/Artifacts/bf/bf12d415930483d08632d3856e8a219c new file mode 100644 index 0000000..cefae3a Binary files /dev/null and b/Library/Artifacts/bf/bf12d415930483d08632d3856e8a219c differ diff --git a/Library/Artifacts/bf/bf364982bcfa58e1fee9e0f5d0764317 b/Library/Artifacts/bf/bf364982bcfa58e1fee9e0f5d0764317 new file mode 100644 index 0000000..169707a Binary files /dev/null and b/Library/Artifacts/bf/bf364982bcfa58e1fee9e0f5d0764317 differ diff --git a/Library/Artifacts/bf/bf427909f2206a022c2ed015e9a30a28 b/Library/Artifacts/bf/bf427909f2206a022c2ed015e9a30a28 new file mode 100644 index 0000000..882aa2d Binary files /dev/null and b/Library/Artifacts/bf/bf427909f2206a022c2ed015e9a30a28 differ diff --git a/Library/Artifacts/bf/bf565ea87938194e24fbfd7235550a58 b/Library/Artifacts/bf/bf565ea87938194e24fbfd7235550a58 new file mode 100644 index 0000000..657a96e Binary files /dev/null and b/Library/Artifacts/bf/bf565ea87938194e24fbfd7235550a58 differ diff --git a/Library/Artifacts/bf/bf6d030b1d49677ee4302625fa4e1068 b/Library/Artifacts/bf/bf6d030b1d49677ee4302625fa4e1068 new file mode 100644 index 0000000..d6e0762 Binary files /dev/null and b/Library/Artifacts/bf/bf6d030b1d49677ee4302625fa4e1068 differ diff --git a/Library/Artifacts/bf/bf9bf3e35bae89fdca54c6938e134288 b/Library/Artifacts/bf/bf9bf3e35bae89fdca54c6938e134288 new file mode 100644 index 0000000..a14a5f6 Binary files /dev/null and b/Library/Artifacts/bf/bf9bf3e35bae89fdca54c6938e134288 differ diff --git a/Library/Artifacts/bf/bfc66dc480ad0575184f35874624d8fa b/Library/Artifacts/bf/bfc66dc480ad0575184f35874624d8fa new file mode 100644 index 0000000..9c58a30 Binary files /dev/null and b/Library/Artifacts/bf/bfc66dc480ad0575184f35874624d8fa differ diff --git a/Library/Artifacts/bf/bfd4a207f8402588fa1b30e457038d09 b/Library/Artifacts/bf/bfd4a207f8402588fa1b30e457038d09 new file mode 100644 index 0000000..a7efe62 Binary files /dev/null and b/Library/Artifacts/bf/bfd4a207f8402588fa1b30e457038d09 differ diff --git a/Library/Artifacts/bf/bfd4d32df621ac8c3e2304cb6b79d169 b/Library/Artifacts/bf/bfd4d32df621ac8c3e2304cb6b79d169 new file mode 100644 index 0000000..6aa8005 Binary files /dev/null and b/Library/Artifacts/bf/bfd4d32df621ac8c3e2304cb6b79d169 differ diff --git a/Library/Artifacts/bf/bfe8cb190a2048078e96c3e4185cfd24 b/Library/Artifacts/bf/bfe8cb190a2048078e96c3e4185cfd24 new file mode 100644 index 0000000..e7a06e0 Binary files /dev/null and b/Library/Artifacts/bf/bfe8cb190a2048078e96c3e4185cfd24 differ diff --git a/Library/Artifacts/c0/c0108e1986504e9103b7de06ae46d64f b/Library/Artifacts/c0/c0108e1986504e9103b7de06ae46d64f new file mode 100644 index 0000000..99bb6e2 Binary files /dev/null and b/Library/Artifacts/c0/c0108e1986504e9103b7de06ae46d64f differ diff --git a/Library/Artifacts/c0/c0267963cb62bdf8b04bc66709950d16 b/Library/Artifacts/c0/c0267963cb62bdf8b04bc66709950d16 new file mode 100644 index 0000000..56c648c Binary files /dev/null and b/Library/Artifacts/c0/c0267963cb62bdf8b04bc66709950d16 differ diff --git a/Library/Artifacts/c0/c03ace36430a177dc3d39217b28b1e97 b/Library/Artifacts/c0/c03ace36430a177dc3d39217b28b1e97 new file mode 100644 index 0000000..15c7df5 Binary files /dev/null and b/Library/Artifacts/c0/c03ace36430a177dc3d39217b28b1e97 differ diff --git a/Library/Artifacts/c0/c03c5a55edb8174c8a03b88c99f2b204 b/Library/Artifacts/c0/c03c5a55edb8174c8a03b88c99f2b204 new file mode 100644 index 0000000..6cea4ef Binary files /dev/null and b/Library/Artifacts/c0/c03c5a55edb8174c8a03b88c99f2b204 differ diff --git a/Library/Artifacts/c0/c065523577cfc2e7c72017665a70dc85 b/Library/Artifacts/c0/c065523577cfc2e7c72017665a70dc85 new file mode 100644 index 0000000..aa7a7e6 Binary files /dev/null and b/Library/Artifacts/c0/c065523577cfc2e7c72017665a70dc85 differ diff --git a/Library/Artifacts/c0/c08c667ffa4c9ea9282a83e3b2ff8eed b/Library/Artifacts/c0/c08c667ffa4c9ea9282a83e3b2ff8eed new file mode 100644 index 0000000..c9c9442 Binary files /dev/null and b/Library/Artifacts/c0/c08c667ffa4c9ea9282a83e3b2ff8eed differ diff --git a/Library/Artifacts/c0/c09cc96372ec180c654a248a4ac12802 b/Library/Artifacts/c0/c09cc96372ec180c654a248a4ac12802 new file mode 100644 index 0000000..fa7139c Binary files /dev/null and b/Library/Artifacts/c0/c09cc96372ec180c654a248a4ac12802 differ diff --git a/Library/Artifacts/c0/c09eb2740ff35f047170ed265c1bf562 b/Library/Artifacts/c0/c09eb2740ff35f047170ed265c1bf562 new file mode 100644 index 0000000..7114d9f Binary files /dev/null and b/Library/Artifacts/c0/c09eb2740ff35f047170ed265c1bf562 differ diff --git a/Library/Artifacts/c0/c0bfd411670e2a5594d39a6274242606 b/Library/Artifacts/c0/c0bfd411670e2a5594d39a6274242606 new file mode 100644 index 0000000..6b0b8f1 Binary files /dev/null and b/Library/Artifacts/c0/c0bfd411670e2a5594d39a6274242606 differ diff --git a/Library/Artifacts/c0/c0c25d4d2ade855fd5815b42af5c4a3c b/Library/Artifacts/c0/c0c25d4d2ade855fd5815b42af5c4a3c new file mode 100644 index 0000000..4888b58 Binary files /dev/null and b/Library/Artifacts/c0/c0c25d4d2ade855fd5815b42af5c4a3c differ diff --git a/Library/Artifacts/c0/c0c972cb535ce43262489bec97f99730 b/Library/Artifacts/c0/c0c972cb535ce43262489bec97f99730 new file mode 100644 index 0000000..86a116b Binary files /dev/null and b/Library/Artifacts/c0/c0c972cb535ce43262489bec97f99730 differ diff --git a/Library/Artifacts/c0/c0dad5d32e7207a137b8711d7fc2e978 b/Library/Artifacts/c0/c0dad5d32e7207a137b8711d7fc2e978 new file mode 100644 index 0000000..f5696e6 Binary files /dev/null and b/Library/Artifacts/c0/c0dad5d32e7207a137b8711d7fc2e978 differ diff --git a/Library/Artifacts/c0/c0dc6d33f441e48588d14da5f933bc24 b/Library/Artifacts/c0/c0dc6d33f441e48588d14da5f933bc24 new file mode 100644 index 0000000..329550d Binary files /dev/null and b/Library/Artifacts/c0/c0dc6d33f441e48588d14da5f933bc24 differ diff --git a/Library/Artifacts/c0/c0f1f18b7434414aa44e9370b5bd9a39 b/Library/Artifacts/c0/c0f1f18b7434414aa44e9370b5bd9a39 new file mode 100644 index 0000000..f3af00d Binary files /dev/null and b/Library/Artifacts/c0/c0f1f18b7434414aa44e9370b5bd9a39 differ diff --git a/Library/Artifacts/c1/c123bfa34863b84c3a10cc6399f267b3 b/Library/Artifacts/c1/c123bfa34863b84c3a10cc6399f267b3 new file mode 100644 index 0000000..b411d40 Binary files /dev/null and b/Library/Artifacts/c1/c123bfa34863b84c3a10cc6399f267b3 differ diff --git a/Library/Artifacts/c1/c15f66caff6b7e848f03916d61cfdc89 b/Library/Artifacts/c1/c15f66caff6b7e848f03916d61cfdc89 new file mode 100644 index 0000000..73ae5ab Binary files /dev/null and b/Library/Artifacts/c1/c15f66caff6b7e848f03916d61cfdc89 differ diff --git a/Library/Artifacts/c1/c187268d2dbe8ce13fbea37df90c6a69 b/Library/Artifacts/c1/c187268d2dbe8ce13fbea37df90c6a69 new file mode 100644 index 0000000..8cce797 Binary files /dev/null and b/Library/Artifacts/c1/c187268d2dbe8ce13fbea37df90c6a69 differ diff --git a/Library/Artifacts/c1/c197a36559f465657fcc6fd0dc1cff27 b/Library/Artifacts/c1/c197a36559f465657fcc6fd0dc1cff27 new file mode 100644 index 0000000..3fa1294 Binary files /dev/null and b/Library/Artifacts/c1/c197a36559f465657fcc6fd0dc1cff27 differ diff --git a/Library/Artifacts/c1/c1bac313d00d8854173d794797d725c5 b/Library/Artifacts/c1/c1bac313d00d8854173d794797d725c5 new file mode 100644 index 0000000..4a17db9 Binary files /dev/null and b/Library/Artifacts/c1/c1bac313d00d8854173d794797d725c5 differ diff --git a/Library/Artifacts/c1/c1c30867e734f235f84f2b84d5ecc027 b/Library/Artifacts/c1/c1c30867e734f235f84f2b84d5ecc027 new file mode 100644 index 0000000..2ac9319 Binary files /dev/null and b/Library/Artifacts/c1/c1c30867e734f235f84f2b84d5ecc027 differ diff --git a/Library/Artifacts/c1/c1cdf6a6ed1cfe917a89fb4fa0f0c1e2 b/Library/Artifacts/c1/c1cdf6a6ed1cfe917a89fb4fa0f0c1e2 new file mode 100644 index 0000000..e1e0610 Binary files /dev/null and b/Library/Artifacts/c1/c1cdf6a6ed1cfe917a89fb4fa0f0c1e2 differ diff --git a/Library/Artifacts/c2/c2200e0be0cea93e758aecc47f8b2010 b/Library/Artifacts/c2/c2200e0be0cea93e758aecc47f8b2010 new file mode 100644 index 0000000..a38220d Binary files /dev/null and b/Library/Artifacts/c2/c2200e0be0cea93e758aecc47f8b2010 differ diff --git a/Library/Artifacts/c2/c22146c9c068b66d52597c4ec6129fcb b/Library/Artifacts/c2/c22146c9c068b66d52597c4ec6129fcb new file mode 100644 index 0000000..8c12e43 Binary files /dev/null and b/Library/Artifacts/c2/c22146c9c068b66d52597c4ec6129fcb differ diff --git a/Library/Artifacts/c2/c229b900922bd9c318f826f8a56cd795 b/Library/Artifacts/c2/c229b900922bd9c318f826f8a56cd795 new file mode 100644 index 0000000..f10eaa9 Binary files /dev/null and b/Library/Artifacts/c2/c229b900922bd9c318f826f8a56cd795 differ diff --git a/Library/Artifacts/c2/c25d40aa53d75d427be961b299599ac2 b/Library/Artifacts/c2/c25d40aa53d75d427be961b299599ac2 new file mode 100644 index 0000000..5d66413 Binary files /dev/null and b/Library/Artifacts/c2/c25d40aa53d75d427be961b299599ac2 differ diff --git a/Library/Artifacts/c2/c26eb8b2ec0e43dfc2760113f178fde9 b/Library/Artifacts/c2/c26eb8b2ec0e43dfc2760113f178fde9 new file mode 100644 index 0000000..bd1d0a2 Binary files /dev/null and b/Library/Artifacts/c2/c26eb8b2ec0e43dfc2760113f178fde9 differ diff --git a/Library/Artifacts/c2/c2777c0b3c2a6808dfd8427813c7c04d b/Library/Artifacts/c2/c2777c0b3c2a6808dfd8427813c7c04d new file mode 100644 index 0000000..f3a71b1 Binary files /dev/null and b/Library/Artifacts/c2/c2777c0b3c2a6808dfd8427813c7c04d differ diff --git a/Library/Artifacts/c2/c2d42743247a668f154d7807bc48592a b/Library/Artifacts/c2/c2d42743247a668f154d7807bc48592a new file mode 100644 index 0000000..3c94221 Binary files /dev/null and b/Library/Artifacts/c2/c2d42743247a668f154d7807bc48592a differ diff --git a/Library/Artifacts/c2/c2d7ffa5572eeb1679e6fad5dcda2660 b/Library/Artifacts/c2/c2d7ffa5572eeb1679e6fad5dcda2660 new file mode 100644 index 0000000..6623723 Binary files /dev/null and b/Library/Artifacts/c2/c2d7ffa5572eeb1679e6fad5dcda2660 differ diff --git a/Library/Artifacts/c2/c2de3bc5838a3835471ad6806d83b647 b/Library/Artifacts/c2/c2de3bc5838a3835471ad6806d83b647 new file mode 100644 index 0000000..61e3ffe Binary files /dev/null and b/Library/Artifacts/c2/c2de3bc5838a3835471ad6806d83b647 differ diff --git a/Library/Artifacts/c2/c2f0acbd6ab31297b4794b3aa2185c84 b/Library/Artifacts/c2/c2f0acbd6ab31297b4794b3aa2185c84 new file mode 100644 index 0000000..bb1f019 Binary files /dev/null and b/Library/Artifacts/c2/c2f0acbd6ab31297b4794b3aa2185c84 differ diff --git a/Library/Artifacts/c3/c33a849f33daa703082a588c55f6a1d6 b/Library/Artifacts/c3/c33a849f33daa703082a588c55f6a1d6 new file mode 100644 index 0000000..f2cd571 Binary files /dev/null and b/Library/Artifacts/c3/c33a849f33daa703082a588c55f6a1d6 differ diff --git a/Library/Artifacts/c3/c379405d8d32191ee54fd0c19fbe44de b/Library/Artifacts/c3/c379405d8d32191ee54fd0c19fbe44de new file mode 100644 index 0000000..570f0ab Binary files /dev/null and b/Library/Artifacts/c3/c379405d8d32191ee54fd0c19fbe44de differ diff --git a/Library/Artifacts/c3/c3af1140aab68c8ee7f5ea4e852941d4 b/Library/Artifacts/c3/c3af1140aab68c8ee7f5ea4e852941d4 new file mode 100644 index 0000000..66e0922 Binary files /dev/null and b/Library/Artifacts/c3/c3af1140aab68c8ee7f5ea4e852941d4 differ diff --git a/Library/Artifacts/c3/c3c7749e72cc897f4cc2baf33a3fe54f b/Library/Artifacts/c3/c3c7749e72cc897f4cc2baf33a3fe54f new file mode 100644 index 0000000..5bde7f3 Binary files /dev/null and b/Library/Artifacts/c3/c3c7749e72cc897f4cc2baf33a3fe54f differ diff --git a/Library/Artifacts/c4/c403c16071172ada384429b70a484c47 b/Library/Artifacts/c4/c403c16071172ada384429b70a484c47 new file mode 100644 index 0000000..6c752a9 Binary files /dev/null and b/Library/Artifacts/c4/c403c16071172ada384429b70a484c47 differ diff --git a/Library/Artifacts/c4/c405de6c1e2807cac65c1f9ca68c21c6 b/Library/Artifacts/c4/c405de6c1e2807cac65c1f9ca68c21c6 new file mode 100644 index 0000000..3967a4e Binary files /dev/null and b/Library/Artifacts/c4/c405de6c1e2807cac65c1f9ca68c21c6 differ diff --git a/Library/Artifacts/c4/c424693f448e89dee3f1dbd06b6348c1 b/Library/Artifacts/c4/c424693f448e89dee3f1dbd06b6348c1 new file mode 100644 index 0000000..4740959 Binary files /dev/null and b/Library/Artifacts/c4/c424693f448e89dee3f1dbd06b6348c1 differ diff --git a/Library/Artifacts/c4/c445d040cfe1c1f6c088cad69d4fcd4f b/Library/Artifacts/c4/c445d040cfe1c1f6c088cad69d4fcd4f new file mode 100644 index 0000000..5da5782 Binary files /dev/null and b/Library/Artifacts/c4/c445d040cfe1c1f6c088cad69d4fcd4f differ diff --git a/Library/Artifacts/c4/c47b88c03686827312620bdbfeff6099 b/Library/Artifacts/c4/c47b88c03686827312620bdbfeff6099 new file mode 100644 index 0000000..032de8b Binary files /dev/null and b/Library/Artifacts/c4/c47b88c03686827312620bdbfeff6099 differ diff --git a/Library/Artifacts/c4/c4a69bd93a01ecf1f79c4f485ecf1c41 b/Library/Artifacts/c4/c4a69bd93a01ecf1f79c4f485ecf1c41 new file mode 100644 index 0000000..eb09abc Binary files /dev/null and b/Library/Artifacts/c4/c4a69bd93a01ecf1f79c4f485ecf1c41 differ diff --git a/Library/Artifacts/c4/c4a70ed8709c49cafce353f34765668f b/Library/Artifacts/c4/c4a70ed8709c49cafce353f34765668f new file mode 100644 index 0000000..7bb595b Binary files /dev/null and b/Library/Artifacts/c4/c4a70ed8709c49cafce353f34765668f differ diff --git a/Library/Artifacts/c4/c4c6b0951794da9685a9853bd4873cbc b/Library/Artifacts/c4/c4c6b0951794da9685a9853bd4873cbc new file mode 100644 index 0000000..d3e15e4 Binary files /dev/null and b/Library/Artifacts/c4/c4c6b0951794da9685a9853bd4873cbc differ diff --git a/Library/Artifacts/c4/c4cd523ab3aa26df00f6e8a48e4ae638 b/Library/Artifacts/c4/c4cd523ab3aa26df00f6e8a48e4ae638 new file mode 100644 index 0000000..8b80b85 Binary files /dev/null and b/Library/Artifacts/c4/c4cd523ab3aa26df00f6e8a48e4ae638 differ diff --git a/Library/Artifacts/c4/c4f6586577874aafb2d147d3579d671e b/Library/Artifacts/c4/c4f6586577874aafb2d147d3579d671e new file mode 100644 index 0000000..e0449ad Binary files /dev/null and b/Library/Artifacts/c4/c4f6586577874aafb2d147d3579d671e differ diff --git a/Library/Artifacts/c4/c4f9ba5f21591026cc59cfe106c96814 b/Library/Artifacts/c4/c4f9ba5f21591026cc59cfe106c96814 new file mode 100644 index 0000000..1e569f8 Binary files /dev/null and b/Library/Artifacts/c4/c4f9ba5f21591026cc59cfe106c96814 differ diff --git a/Library/Artifacts/c5/c54455964a2e8a7ab309aca0710e04be b/Library/Artifacts/c5/c54455964a2e8a7ab309aca0710e04be new file mode 100644 index 0000000..752b17c Binary files /dev/null and b/Library/Artifacts/c5/c54455964a2e8a7ab309aca0710e04be differ diff --git a/Library/Artifacts/c5/c5591e10443fd08e7e4e04f6184f8138 b/Library/Artifacts/c5/c5591e10443fd08e7e4e04f6184f8138 new file mode 100644 index 0000000..9aed2d8 Binary files /dev/null and b/Library/Artifacts/c5/c5591e10443fd08e7e4e04f6184f8138 differ diff --git a/Library/Artifacts/c5/c5b57560b26247a5b3d4ce052f3a9c6d b/Library/Artifacts/c5/c5b57560b26247a5b3d4ce052f3a9c6d new file mode 100644 index 0000000..12a57b3 Binary files /dev/null and b/Library/Artifacts/c5/c5b57560b26247a5b3d4ce052f3a9c6d differ diff --git a/Library/Artifacts/c5/c5c0a8ddfe92a93198578c0419140148 b/Library/Artifacts/c5/c5c0a8ddfe92a93198578c0419140148 new file mode 100644 index 0000000..2751c5c Binary files /dev/null and b/Library/Artifacts/c5/c5c0a8ddfe92a93198578c0419140148 differ diff --git a/Library/Artifacts/c5/c5c8ed7a11313589e0898ad9c0b520c8 b/Library/Artifacts/c5/c5c8ed7a11313589e0898ad9c0b520c8 new file mode 100644 index 0000000..f210d11 Binary files /dev/null and b/Library/Artifacts/c5/c5c8ed7a11313589e0898ad9c0b520c8 differ diff --git a/Library/Artifacts/c5/c5c9dec00ae5a77fced9ac20c4d584c6 b/Library/Artifacts/c5/c5c9dec00ae5a77fced9ac20c4d584c6 new file mode 100644 index 0000000..0ccd86d Binary files /dev/null and b/Library/Artifacts/c5/c5c9dec00ae5a77fced9ac20c4d584c6 differ diff --git a/Library/Artifacts/c5/c5d6fcc7020bfcfdcd18505c12a959c1 b/Library/Artifacts/c5/c5d6fcc7020bfcfdcd18505c12a959c1 new file mode 100644 index 0000000..1bd3b90 Binary files /dev/null and b/Library/Artifacts/c5/c5d6fcc7020bfcfdcd18505c12a959c1 differ diff --git a/Library/Artifacts/c6/c60c6688dc5674d818602df0df06d19f b/Library/Artifacts/c6/c60c6688dc5674d818602df0df06d19f new file mode 100644 index 0000000..6b6f0d4 Binary files /dev/null and b/Library/Artifacts/c6/c60c6688dc5674d818602df0df06d19f differ diff --git a/Library/Artifacts/c6/c60da810637a726a6204ced9a68ad4b8 b/Library/Artifacts/c6/c60da810637a726a6204ced9a68ad4b8 new file mode 100644 index 0000000..2f83d5f Binary files /dev/null and b/Library/Artifacts/c6/c60da810637a726a6204ced9a68ad4b8 differ diff --git a/Library/Artifacts/c6/c650d02714333d8d85407b4297c3156c b/Library/Artifacts/c6/c650d02714333d8d85407b4297c3156c new file mode 100644 index 0000000..136007b Binary files /dev/null and b/Library/Artifacts/c6/c650d02714333d8d85407b4297c3156c differ diff --git a/Library/Artifacts/c6/c65a4453ee4799328a83abb3f218ab63 b/Library/Artifacts/c6/c65a4453ee4799328a83abb3f218ab63 new file mode 100644 index 0000000..542f921 Binary files /dev/null and b/Library/Artifacts/c6/c65a4453ee4799328a83abb3f218ab63 differ diff --git a/Library/Artifacts/c6/c69cd783be84fecaf75752a71516813a b/Library/Artifacts/c6/c69cd783be84fecaf75752a71516813a new file mode 100644 index 0000000..9e83f62 Binary files /dev/null and b/Library/Artifacts/c6/c69cd783be84fecaf75752a71516813a differ diff --git a/Library/Artifacts/c6/c69e1a73ca4bdd84aabdc2bdaa4479a0 b/Library/Artifacts/c6/c69e1a73ca4bdd84aabdc2bdaa4479a0 new file mode 100644 index 0000000..01623d6 Binary files /dev/null and b/Library/Artifacts/c6/c69e1a73ca4bdd84aabdc2bdaa4479a0 differ diff --git a/Library/Artifacts/c7/c749ad35abbee998f28727575ac522e3 b/Library/Artifacts/c7/c749ad35abbee998f28727575ac522e3 new file mode 100644 index 0000000..1bd5c72 Binary files /dev/null and b/Library/Artifacts/c7/c749ad35abbee998f28727575ac522e3 differ diff --git a/Library/Artifacts/c7/c76813265e5408ad51d06a504f52aa7e b/Library/Artifacts/c7/c76813265e5408ad51d06a504f52aa7e new file mode 100644 index 0000000..2965d58 Binary files /dev/null and b/Library/Artifacts/c7/c76813265e5408ad51d06a504f52aa7e differ diff --git a/Library/Artifacts/c7/c7824634711d3a83edb8329103080aa5 b/Library/Artifacts/c7/c7824634711d3a83edb8329103080aa5 new file mode 100644 index 0000000..6ed5693 Binary files /dev/null and b/Library/Artifacts/c7/c7824634711d3a83edb8329103080aa5 differ diff --git a/Library/Artifacts/c7/c79c2425ed4bddc036f4e6752dd90fbf b/Library/Artifacts/c7/c79c2425ed4bddc036f4e6752dd90fbf new file mode 100644 index 0000000..4556cba Binary files /dev/null and b/Library/Artifacts/c7/c79c2425ed4bddc036f4e6752dd90fbf differ diff --git a/Library/Artifacts/c7/c7c03e5cfa920f92c754f44e15165b69 b/Library/Artifacts/c7/c7c03e5cfa920f92c754f44e15165b69 new file mode 100644 index 0000000..3c7f936 Binary files /dev/null and b/Library/Artifacts/c7/c7c03e5cfa920f92c754f44e15165b69 differ diff --git a/Library/Artifacts/c7/c7c7c0e85a75ebc473a0ea087dde6cdd b/Library/Artifacts/c7/c7c7c0e85a75ebc473a0ea087dde6cdd new file mode 100644 index 0000000..8edd974 Binary files /dev/null and b/Library/Artifacts/c7/c7c7c0e85a75ebc473a0ea087dde6cdd differ diff --git a/Library/Artifacts/c7/c7e1451f2d2104f0f996f4e397372539 b/Library/Artifacts/c7/c7e1451f2d2104f0f996f4e397372539 new file mode 100644 index 0000000..6530e42 Binary files /dev/null and b/Library/Artifacts/c7/c7e1451f2d2104f0f996f4e397372539 differ diff --git a/Library/Artifacts/c7/c7e87a686df44722e00bccec76c4fc4c b/Library/Artifacts/c7/c7e87a686df44722e00bccec76c4fc4c new file mode 100644 index 0000000..ceca268 Binary files /dev/null and b/Library/Artifacts/c7/c7e87a686df44722e00bccec76c4fc4c differ diff --git a/Library/Artifacts/c8/c81031390643a1cb6f76f00ba6ef623e b/Library/Artifacts/c8/c81031390643a1cb6f76f00ba6ef623e new file mode 100644 index 0000000..33255ec Binary files /dev/null and b/Library/Artifacts/c8/c81031390643a1cb6f76f00ba6ef623e differ diff --git a/Library/Artifacts/c8/c8248b0d27c8030dfaa97092b2cf75ea b/Library/Artifacts/c8/c8248b0d27c8030dfaa97092b2cf75ea new file mode 100644 index 0000000..99ec858 Binary files /dev/null and b/Library/Artifacts/c8/c8248b0d27c8030dfaa97092b2cf75ea differ diff --git a/Library/Artifacts/c8/c85610fc143984ceef03b2fb7adff957 b/Library/Artifacts/c8/c85610fc143984ceef03b2fb7adff957 new file mode 100644 index 0000000..ab9ec70 Binary files /dev/null and b/Library/Artifacts/c8/c85610fc143984ceef03b2fb7adff957 differ diff --git a/Library/Artifacts/c8/c86361e84b91cc4b3e24421b8a6b2124 b/Library/Artifacts/c8/c86361e84b91cc4b3e24421b8a6b2124 new file mode 100644 index 0000000..38d41ca Binary files /dev/null and b/Library/Artifacts/c8/c86361e84b91cc4b3e24421b8a6b2124 differ diff --git a/Library/Artifacts/c8/c86eb93b0a6ac2ad21afe4a641a58564 b/Library/Artifacts/c8/c86eb93b0a6ac2ad21afe4a641a58564 new file mode 100644 index 0000000..32ded75 Binary files /dev/null and b/Library/Artifacts/c8/c86eb93b0a6ac2ad21afe4a641a58564 differ diff --git a/Library/Artifacts/c8/c87e78c999cef4fed2a485936ffa2e78 b/Library/Artifacts/c8/c87e78c999cef4fed2a485936ffa2e78 new file mode 100644 index 0000000..ac98d2d Binary files /dev/null and b/Library/Artifacts/c8/c87e78c999cef4fed2a485936ffa2e78 differ diff --git a/Library/Artifacts/c8/c896f200b9e0c617701c351e1ddda769 b/Library/Artifacts/c8/c896f200b9e0c617701c351e1ddda769 new file mode 100644 index 0000000..b89f740 Binary files /dev/null and b/Library/Artifacts/c8/c896f200b9e0c617701c351e1ddda769 differ diff --git a/Library/Artifacts/c9/c913c8801f4f0f8d4286a950d8dc7b27 b/Library/Artifacts/c9/c913c8801f4f0f8d4286a950d8dc7b27 new file mode 100644 index 0000000..b954641 Binary files /dev/null and b/Library/Artifacts/c9/c913c8801f4f0f8d4286a950d8dc7b27 differ diff --git a/Library/Artifacts/c9/c943067e00609668eda7e223d8fe09f4 b/Library/Artifacts/c9/c943067e00609668eda7e223d8fe09f4 new file mode 100644 index 0000000..c5232a3 Binary files /dev/null and b/Library/Artifacts/c9/c943067e00609668eda7e223d8fe09f4 differ diff --git a/Library/Artifacts/c9/c96c5d449fe9ab489b8c9db04460b0f1 b/Library/Artifacts/c9/c96c5d449fe9ab489b8c9db04460b0f1 new file mode 100644 index 0000000..5fa3702 Binary files /dev/null and b/Library/Artifacts/c9/c96c5d449fe9ab489b8c9db04460b0f1 differ diff --git a/Library/Artifacts/c9/c98a47bf0f25ef246006f166f81786ea b/Library/Artifacts/c9/c98a47bf0f25ef246006f166f81786ea new file mode 100644 index 0000000..5cabf9e Binary files /dev/null and b/Library/Artifacts/c9/c98a47bf0f25ef246006f166f81786ea differ diff --git a/Library/Artifacts/c9/c98d5e09cc7b04ac1edb13f98e26da59 b/Library/Artifacts/c9/c98d5e09cc7b04ac1edb13f98e26da59 new file mode 100644 index 0000000..d9763ba Binary files /dev/null and b/Library/Artifacts/c9/c98d5e09cc7b04ac1edb13f98e26da59 differ diff --git a/Library/Artifacts/c9/c9b5f79e546512d6679b9ccc97f6247a b/Library/Artifacts/c9/c9b5f79e546512d6679b9ccc97f6247a new file mode 100644 index 0000000..eec8cbc Binary files /dev/null and b/Library/Artifacts/c9/c9b5f79e546512d6679b9ccc97f6247a differ diff --git a/Library/Artifacts/c9/c9c676058b9d43b8d2704601c68cf21a b/Library/Artifacts/c9/c9c676058b9d43b8d2704601c68cf21a new file mode 100644 index 0000000..68daecd Binary files /dev/null and b/Library/Artifacts/c9/c9c676058b9d43b8d2704601c68cf21a differ diff --git a/Library/Artifacts/c9/c9c8a0b6df7f92d04eca94c100b7c941 b/Library/Artifacts/c9/c9c8a0b6df7f92d04eca94c100b7c941 new file mode 100644 index 0000000..2409bc4 Binary files /dev/null and b/Library/Artifacts/c9/c9c8a0b6df7f92d04eca94c100b7c941 differ diff --git a/Library/Artifacts/c9/c9cc4b7f48aec063fad3458a47b97c26 b/Library/Artifacts/c9/c9cc4b7f48aec063fad3458a47b97c26 new file mode 100644 index 0000000..371b5d6 Binary files /dev/null and b/Library/Artifacts/c9/c9cc4b7f48aec063fad3458a47b97c26 differ diff --git a/Library/Artifacts/c9/c9e1c324263104d598fc12b7ff0713f1 b/Library/Artifacts/c9/c9e1c324263104d598fc12b7ff0713f1 new file mode 100644 index 0000000..8e943b9 Binary files /dev/null and b/Library/Artifacts/c9/c9e1c324263104d598fc12b7ff0713f1 differ diff --git a/Library/Artifacts/ca/ca008eb46513a411a72873db6f89589b b/Library/Artifacts/ca/ca008eb46513a411a72873db6f89589b new file mode 100644 index 0000000..0639cdc Binary files /dev/null and b/Library/Artifacts/ca/ca008eb46513a411a72873db6f89589b differ diff --git a/Library/Artifacts/ca/ca0b268890ca579b3ac0a16bd7fd320d b/Library/Artifacts/ca/ca0b268890ca579b3ac0a16bd7fd320d new file mode 100644 index 0000000..a0a6673 Binary files /dev/null and b/Library/Artifacts/ca/ca0b268890ca579b3ac0a16bd7fd320d differ diff --git a/Library/Artifacts/ca/ca2f01ad3ab351f2322b194704e7406e b/Library/Artifacts/ca/ca2f01ad3ab351f2322b194704e7406e new file mode 100644 index 0000000..459ea73 Binary files /dev/null and b/Library/Artifacts/ca/ca2f01ad3ab351f2322b194704e7406e differ diff --git a/Library/Artifacts/ca/ca423dc348bf0cee1f16ca1de0c155cb b/Library/Artifacts/ca/ca423dc348bf0cee1f16ca1de0c155cb new file mode 100644 index 0000000..b7b5830 Binary files /dev/null and b/Library/Artifacts/ca/ca423dc348bf0cee1f16ca1de0c155cb differ diff --git a/Library/Artifacts/ca/ca4de5b7044b4279c5dfdf824fcd4218 b/Library/Artifacts/ca/ca4de5b7044b4279c5dfdf824fcd4218 new file mode 100644 index 0000000..7d80c6a Binary files /dev/null and b/Library/Artifacts/ca/ca4de5b7044b4279c5dfdf824fcd4218 differ diff --git a/Library/Artifacts/ca/ca5b2d37bd988d460a61d5e25add5a69 b/Library/Artifacts/ca/ca5b2d37bd988d460a61d5e25add5a69 new file mode 100644 index 0000000..cc894fc Binary files /dev/null and b/Library/Artifacts/ca/ca5b2d37bd988d460a61d5e25add5a69 differ diff --git a/Library/Artifacts/ca/ca5c2bb64d68b41ab3dd0be51f33afbf b/Library/Artifacts/ca/ca5c2bb64d68b41ab3dd0be51f33afbf new file mode 100644 index 0000000..5d0f9fa Binary files /dev/null and b/Library/Artifacts/ca/ca5c2bb64d68b41ab3dd0be51f33afbf differ diff --git a/Library/Artifacts/ca/ca67dc1a3fe111d94eced29c3ae1686f b/Library/Artifacts/ca/ca67dc1a3fe111d94eced29c3ae1686f new file mode 100644 index 0000000..14c69e3 Binary files /dev/null and b/Library/Artifacts/ca/ca67dc1a3fe111d94eced29c3ae1686f differ diff --git a/Library/Artifacts/ca/ca9ad3dfdd6eef7d4add38098c68829d b/Library/Artifacts/ca/ca9ad3dfdd6eef7d4add38098c68829d new file mode 100644 index 0000000..51011a3 Binary files /dev/null and b/Library/Artifacts/ca/ca9ad3dfdd6eef7d4add38098c68829d differ diff --git a/Library/Artifacts/ca/caa2e009be0229ad3163fd1425e4436c b/Library/Artifacts/ca/caa2e009be0229ad3163fd1425e4436c new file mode 100644 index 0000000..6965e0f Binary files /dev/null and b/Library/Artifacts/ca/caa2e009be0229ad3163fd1425e4436c differ diff --git a/Library/Artifacts/ca/cab7080f2e8dd6083e1fee18d6a8112c b/Library/Artifacts/ca/cab7080f2e8dd6083e1fee18d6a8112c new file mode 100644 index 0000000..fe87256 Binary files /dev/null and b/Library/Artifacts/ca/cab7080f2e8dd6083e1fee18d6a8112c differ diff --git a/Library/Artifacts/ca/cac784e7e705bb790e70abfc47dd6d3a b/Library/Artifacts/ca/cac784e7e705bb790e70abfc47dd6d3a new file mode 100644 index 0000000..dbd170f Binary files /dev/null and b/Library/Artifacts/ca/cac784e7e705bb790e70abfc47dd6d3a differ diff --git a/Library/Artifacts/ca/cadf6a9663d6e6b5f1fe2a56a0032ab9 b/Library/Artifacts/ca/cadf6a9663d6e6b5f1fe2a56a0032ab9 new file mode 100644 index 0000000..b4aeb82 Binary files /dev/null and b/Library/Artifacts/ca/cadf6a9663d6e6b5f1fe2a56a0032ab9 differ diff --git a/Library/Artifacts/ca/cae5885d304a4ac195f8bb08c604e31b b/Library/Artifacts/ca/cae5885d304a4ac195f8bb08c604e31b new file mode 100644 index 0000000..04c7fd5 Binary files /dev/null and b/Library/Artifacts/ca/cae5885d304a4ac195f8bb08c604e31b differ diff --git a/Library/Artifacts/ca/caec151ac63eb62a3552f98481541f42 b/Library/Artifacts/ca/caec151ac63eb62a3552f98481541f42 new file mode 100644 index 0000000..3f0c32e Binary files /dev/null and b/Library/Artifacts/ca/caec151ac63eb62a3552f98481541f42 differ diff --git a/Library/Artifacts/cb/cb0b470bf93d10c7a6a7df5a9c3f115f b/Library/Artifacts/cb/cb0b470bf93d10c7a6a7df5a9c3f115f new file mode 100644 index 0000000..7dffc46 Binary files /dev/null and b/Library/Artifacts/cb/cb0b470bf93d10c7a6a7df5a9c3f115f differ diff --git a/Library/Artifacts/cb/cb15b5e9a5a9d92ac44cf03ccd0b9a7f b/Library/Artifacts/cb/cb15b5e9a5a9d92ac44cf03ccd0b9a7f new file mode 100644 index 0000000..22366a7 Binary files /dev/null and b/Library/Artifacts/cb/cb15b5e9a5a9d92ac44cf03ccd0b9a7f differ diff --git a/Library/Artifacts/cb/cb356140b5716978f2b9f5e6187c2a85 b/Library/Artifacts/cb/cb356140b5716978f2b9f5e6187c2a85 new file mode 100644 index 0000000..37c1fee Binary files /dev/null and b/Library/Artifacts/cb/cb356140b5716978f2b9f5e6187c2a85 differ diff --git a/Library/Artifacts/cb/cb38a3ffb74250a92d6e2f9f17d8f4c3 b/Library/Artifacts/cb/cb38a3ffb74250a92d6e2f9f17d8f4c3 new file mode 100644 index 0000000..760be37 Binary files /dev/null and b/Library/Artifacts/cb/cb38a3ffb74250a92d6e2f9f17d8f4c3 differ diff --git a/Library/Artifacts/cb/cb6ec522da7803754ffe64f9635480fc b/Library/Artifacts/cb/cb6ec522da7803754ffe64f9635480fc new file mode 100644 index 0000000..2575012 Binary files /dev/null and b/Library/Artifacts/cb/cb6ec522da7803754ffe64f9635480fc differ diff --git a/Library/Artifacts/cb/cb7c2fe258b6876e73a5ff2badb6148e b/Library/Artifacts/cb/cb7c2fe258b6876e73a5ff2badb6148e new file mode 100644 index 0000000..5a81ad5 Binary files /dev/null and b/Library/Artifacts/cb/cb7c2fe258b6876e73a5ff2badb6148e differ diff --git a/Library/Artifacts/cb/cb7eebb6c52447b206764e94966228e0 b/Library/Artifacts/cb/cb7eebb6c52447b206764e94966228e0 new file mode 100644 index 0000000..b4b183b Binary files /dev/null and b/Library/Artifacts/cb/cb7eebb6c52447b206764e94966228e0 differ diff --git a/Library/Artifacts/cb/cb8c48ecb6ff36e31f577f04eb18fe67 b/Library/Artifacts/cb/cb8c48ecb6ff36e31f577f04eb18fe67 new file mode 100644 index 0000000..26804c1 Binary files /dev/null and b/Library/Artifacts/cb/cb8c48ecb6ff36e31f577f04eb18fe67 differ diff --git a/Library/Artifacts/cb/cb90a942ec9c64ca87aa205d0e373772 b/Library/Artifacts/cb/cb90a942ec9c64ca87aa205d0e373772 new file mode 100644 index 0000000..4013e48 Binary files /dev/null and b/Library/Artifacts/cb/cb90a942ec9c64ca87aa205d0e373772 differ diff --git a/Library/Artifacts/cb/cb92d89724b556bdc00a9ab2c0ee726e b/Library/Artifacts/cb/cb92d89724b556bdc00a9ab2c0ee726e new file mode 100644 index 0000000..e1ebb56 Binary files /dev/null and b/Library/Artifacts/cb/cb92d89724b556bdc00a9ab2c0ee726e differ diff --git a/Library/Artifacts/cb/cba135d19d0ab4728c21061939032831 b/Library/Artifacts/cb/cba135d19d0ab4728c21061939032831 new file mode 100644 index 0000000..dae0718 Binary files /dev/null and b/Library/Artifacts/cb/cba135d19d0ab4728c21061939032831 differ diff --git a/Library/Artifacts/cb/cbae3560326b96c5ef1e7dd3540a7b94 b/Library/Artifacts/cb/cbae3560326b96c5ef1e7dd3540a7b94 new file mode 100644 index 0000000..ff53521 Binary files /dev/null and b/Library/Artifacts/cb/cbae3560326b96c5ef1e7dd3540a7b94 differ diff --git a/Library/Artifacts/cb/cbe043f56fba22667708c2b7ac20a112 b/Library/Artifacts/cb/cbe043f56fba22667708c2b7ac20a112 new file mode 100644 index 0000000..c742b34 Binary files /dev/null and b/Library/Artifacts/cb/cbe043f56fba22667708c2b7ac20a112 differ diff --git a/Library/Artifacts/cb/cbe5def81b2e7a741c6423cc63ac88aa b/Library/Artifacts/cb/cbe5def81b2e7a741c6423cc63ac88aa new file mode 100644 index 0000000..83eefbb Binary files /dev/null and b/Library/Artifacts/cb/cbe5def81b2e7a741c6423cc63ac88aa differ diff --git a/Library/Artifacts/cb/cbf7f7f93d1b97df8b6cf0c0a8a155cd b/Library/Artifacts/cb/cbf7f7f93d1b97df8b6cf0c0a8a155cd new file mode 100644 index 0000000..2461597 Binary files /dev/null and b/Library/Artifacts/cb/cbf7f7f93d1b97df8b6cf0c0a8a155cd differ diff --git a/Library/Artifacts/cb/cbf8f0aaf01c7ef5f1002620a0f391ba b/Library/Artifacts/cb/cbf8f0aaf01c7ef5f1002620a0f391ba new file mode 100644 index 0000000..ab28ef7 Binary files /dev/null and b/Library/Artifacts/cb/cbf8f0aaf01c7ef5f1002620a0f391ba differ diff --git a/Library/Artifacts/cc/cc380f07be343654ae88847b0689309b b/Library/Artifacts/cc/cc380f07be343654ae88847b0689309b new file mode 100644 index 0000000..1f48b81 Binary files /dev/null and b/Library/Artifacts/cc/cc380f07be343654ae88847b0689309b differ diff --git a/Library/Artifacts/cc/cc6a6043639b7c58bbd49197fd5cd400 b/Library/Artifacts/cc/cc6a6043639b7c58bbd49197fd5cd400 new file mode 100644 index 0000000..cdfc0cb Binary files /dev/null and b/Library/Artifacts/cc/cc6a6043639b7c58bbd49197fd5cd400 differ diff --git a/Library/Artifacts/cc/ccc38c7f6379507131dae51f45dd5f6f b/Library/Artifacts/cc/ccc38c7f6379507131dae51f45dd5f6f new file mode 100644 index 0000000..563633e Binary files /dev/null and b/Library/Artifacts/cc/ccc38c7f6379507131dae51f45dd5f6f differ diff --git a/Library/Artifacts/cc/cccbb5d24fc9863a11db5fea150a7271 b/Library/Artifacts/cc/cccbb5d24fc9863a11db5fea150a7271 new file mode 100644 index 0000000..3a1d708 Binary files /dev/null and b/Library/Artifacts/cc/cccbb5d24fc9863a11db5fea150a7271 differ diff --git a/Library/Artifacts/cc/cccc640e962437cb02d59cf454154b84 b/Library/Artifacts/cc/cccc640e962437cb02d59cf454154b84 new file mode 100644 index 0000000..af5c014 Binary files /dev/null and b/Library/Artifacts/cc/cccc640e962437cb02d59cf454154b84 differ diff --git a/Library/Artifacts/cd/cd09abf6fedca002279dd92b45c97508 b/Library/Artifacts/cd/cd09abf6fedca002279dd92b45c97508 new file mode 100644 index 0000000..dba23cb Binary files /dev/null and b/Library/Artifacts/cd/cd09abf6fedca002279dd92b45c97508 differ diff --git a/Library/Artifacts/cd/cd0e4e5b0944e2e0239c9669c7a9b0eb b/Library/Artifacts/cd/cd0e4e5b0944e2e0239c9669c7a9b0eb new file mode 100644 index 0000000..97797cd Binary files /dev/null and b/Library/Artifacts/cd/cd0e4e5b0944e2e0239c9669c7a9b0eb differ diff --git a/Library/Artifacts/cd/cd3b43c99486ddcd45f098c8f38be719 b/Library/Artifacts/cd/cd3b43c99486ddcd45f098c8f38be719 new file mode 100644 index 0000000..188629c Binary files /dev/null and b/Library/Artifacts/cd/cd3b43c99486ddcd45f098c8f38be719 differ diff --git a/Library/Artifacts/cd/cd50ad19b2060e4a7afa2c242629ad75 b/Library/Artifacts/cd/cd50ad19b2060e4a7afa2c242629ad75 new file mode 100644 index 0000000..9f65b04 Binary files /dev/null and b/Library/Artifacts/cd/cd50ad19b2060e4a7afa2c242629ad75 differ diff --git a/Library/Artifacts/cd/cd8a0aea42b581bfd715e63d493b9b69 b/Library/Artifacts/cd/cd8a0aea42b581bfd715e63d493b9b69 new file mode 100644 index 0000000..0dea510 Binary files /dev/null and b/Library/Artifacts/cd/cd8a0aea42b581bfd715e63d493b9b69 differ diff --git a/Library/Artifacts/cd/cdb5bbe93e494f5faee7bdaffd22bb0d b/Library/Artifacts/cd/cdb5bbe93e494f5faee7bdaffd22bb0d new file mode 100644 index 0000000..d5dbd78 Binary files /dev/null and b/Library/Artifacts/cd/cdb5bbe93e494f5faee7bdaffd22bb0d differ diff --git a/Library/Artifacts/cd/cdd02d137c4f83cdf588bd954ce221d1 b/Library/Artifacts/cd/cdd02d137c4f83cdf588bd954ce221d1 new file mode 100644 index 0000000..1f02d11 Binary files /dev/null and b/Library/Artifacts/cd/cdd02d137c4f83cdf588bd954ce221d1 differ diff --git a/Library/Artifacts/cd/cdd06ca54553a0cbe49f4fb2f15a25d3 b/Library/Artifacts/cd/cdd06ca54553a0cbe49f4fb2f15a25d3 new file mode 100644 index 0000000..d8731b7 Binary files /dev/null and b/Library/Artifacts/cd/cdd06ca54553a0cbe49f4fb2f15a25d3 differ diff --git a/Library/Artifacts/ce/ce00eb82419eb1101a90729a33d30a29 b/Library/Artifacts/ce/ce00eb82419eb1101a90729a33d30a29 new file mode 100644 index 0000000..9868830 Binary files /dev/null and b/Library/Artifacts/ce/ce00eb82419eb1101a90729a33d30a29 differ diff --git a/Library/Artifacts/ce/ce2d2f2238fdd5eb5a9a10881f7e2495 b/Library/Artifacts/ce/ce2d2f2238fdd5eb5a9a10881f7e2495 new file mode 100644 index 0000000..698ff19 Binary files /dev/null and b/Library/Artifacts/ce/ce2d2f2238fdd5eb5a9a10881f7e2495 differ diff --git a/Library/Artifacts/ce/ce77271dc0b0c075f4b1de7d05339b28 b/Library/Artifacts/ce/ce77271dc0b0c075f4b1de7d05339b28 new file mode 100644 index 0000000..d09c3d8 Binary files /dev/null and b/Library/Artifacts/ce/ce77271dc0b0c075f4b1de7d05339b28 differ diff --git a/Library/Artifacts/ce/ce7d17bbacce14cfaa71d152016bf2b4 b/Library/Artifacts/ce/ce7d17bbacce14cfaa71d152016bf2b4 new file mode 100644 index 0000000..ab42aaa Binary files /dev/null and b/Library/Artifacts/ce/ce7d17bbacce14cfaa71d152016bf2b4 differ diff --git a/Library/Artifacts/ce/ceb08b013f93937df46ccb1cc2d91753 b/Library/Artifacts/ce/ceb08b013f93937df46ccb1cc2d91753 new file mode 100644 index 0000000..29b92c3 Binary files /dev/null and b/Library/Artifacts/ce/ceb08b013f93937df46ccb1cc2d91753 differ diff --git a/Library/Artifacts/ce/cebe401e669777b06e26c7e3c5b7f36f b/Library/Artifacts/ce/cebe401e669777b06e26c7e3c5b7f36f new file mode 100644 index 0000000..39e0773 Binary files /dev/null and b/Library/Artifacts/ce/cebe401e669777b06e26c7e3c5b7f36f differ diff --git a/Library/Artifacts/ce/cec8996fdffd7e219c94cce1764d1b71 b/Library/Artifacts/ce/cec8996fdffd7e219c94cce1764d1b71 new file mode 100644 index 0000000..0792609 Binary files /dev/null and b/Library/Artifacts/ce/cec8996fdffd7e219c94cce1764d1b71 differ diff --git a/Library/Artifacts/ce/cecf8da1b789a3a192e99c343b0fd8fb b/Library/Artifacts/ce/cecf8da1b789a3a192e99c343b0fd8fb new file mode 100644 index 0000000..076ddf1 Binary files /dev/null and b/Library/Artifacts/ce/cecf8da1b789a3a192e99c343b0fd8fb differ diff --git a/Library/Artifacts/ce/ced63d560c39ee0043bc065d08fb03e2 b/Library/Artifacts/ce/ced63d560c39ee0043bc065d08fb03e2 new file mode 100644 index 0000000..321ea83 Binary files /dev/null and b/Library/Artifacts/ce/ced63d560c39ee0043bc065d08fb03e2 differ diff --git a/Library/Artifacts/cf/cf14e6baa7fdbc8b565617dce70e05c6 b/Library/Artifacts/cf/cf14e6baa7fdbc8b565617dce70e05c6 new file mode 100644 index 0000000..d72b6f0 Binary files /dev/null and b/Library/Artifacts/cf/cf14e6baa7fdbc8b565617dce70e05c6 differ diff --git a/Library/Artifacts/cf/cf2906e4150f6e609b44a635eba24697 b/Library/Artifacts/cf/cf2906e4150f6e609b44a635eba24697 new file mode 100644 index 0000000..d6eec0e Binary files /dev/null and b/Library/Artifacts/cf/cf2906e4150f6e609b44a635eba24697 differ diff --git a/Library/Artifacts/cf/cf51011728257ac56bc48746e7ab8df1 b/Library/Artifacts/cf/cf51011728257ac56bc48746e7ab8df1 new file mode 100644 index 0000000..7a08477 Binary files /dev/null and b/Library/Artifacts/cf/cf51011728257ac56bc48746e7ab8df1 differ diff --git a/Library/Artifacts/cf/cf62bc709d8c4c3a8dceb126fb258a4a b/Library/Artifacts/cf/cf62bc709d8c4c3a8dceb126fb258a4a new file mode 100644 index 0000000..383f8fc Binary files /dev/null and b/Library/Artifacts/cf/cf62bc709d8c4c3a8dceb126fb258a4a differ diff --git a/Library/Artifacts/cf/cf652325ab3a5083c095512458327289 b/Library/Artifacts/cf/cf652325ab3a5083c095512458327289 new file mode 100644 index 0000000..7357b30 Binary files /dev/null and b/Library/Artifacts/cf/cf652325ab3a5083c095512458327289 differ diff --git a/Library/Artifacts/cf/cf7ba1bfa83c4c45c3bbcf0293120e31 b/Library/Artifacts/cf/cf7ba1bfa83c4c45c3bbcf0293120e31 new file mode 100644 index 0000000..69ffd80 Binary files /dev/null and b/Library/Artifacts/cf/cf7ba1bfa83c4c45c3bbcf0293120e31 differ diff --git a/Library/Artifacts/cf/cfd2a486b40abc14551ebe4b1f349c87 b/Library/Artifacts/cf/cfd2a486b40abc14551ebe4b1f349c87 new file mode 100644 index 0000000..83aeaec Binary files /dev/null and b/Library/Artifacts/cf/cfd2a486b40abc14551ebe4b1f349c87 differ diff --git a/Library/Artifacts/cf/cfdfdb6ef46bb47e4a1b13e0a72bf138 b/Library/Artifacts/cf/cfdfdb6ef46bb47e4a1b13e0a72bf138 new file mode 100644 index 0000000..3b0dab7 Binary files /dev/null and b/Library/Artifacts/cf/cfdfdb6ef46bb47e4a1b13e0a72bf138 differ diff --git a/Library/Artifacts/cf/cff5b65ba7f6aee0e01a13ec0b59b125 b/Library/Artifacts/cf/cff5b65ba7f6aee0e01a13ec0b59b125 new file mode 100644 index 0000000..b905b55 Binary files /dev/null and b/Library/Artifacts/cf/cff5b65ba7f6aee0e01a13ec0b59b125 differ diff --git a/Library/Artifacts/cf/cfff3296adc3a0c34d3b21fe78d41e46 b/Library/Artifacts/cf/cfff3296adc3a0c34d3b21fe78d41e46 new file mode 100644 index 0000000..b411a23 Binary files /dev/null and b/Library/Artifacts/cf/cfff3296adc3a0c34d3b21fe78d41e46 differ diff --git a/Library/Artifacts/d0/d005e3e1cec741eefdcd45b3869fe1aa b/Library/Artifacts/d0/d005e3e1cec741eefdcd45b3869fe1aa new file mode 100644 index 0000000..5b3b9a3 Binary files /dev/null and b/Library/Artifacts/d0/d005e3e1cec741eefdcd45b3869fe1aa differ diff --git a/Library/Artifacts/d0/d022af1c11e26d0d74ae351ec30421e0 b/Library/Artifacts/d0/d022af1c11e26d0d74ae351ec30421e0 new file mode 100644 index 0000000..735ada4 Binary files /dev/null and b/Library/Artifacts/d0/d022af1c11e26d0d74ae351ec30421e0 differ diff --git a/Library/Artifacts/d0/d0558b3e8f072d2cd67a5df55f31755d b/Library/Artifacts/d0/d0558b3e8f072d2cd67a5df55f31755d new file mode 100644 index 0000000..82a0d28 Binary files /dev/null and b/Library/Artifacts/d0/d0558b3e8f072d2cd67a5df55f31755d differ diff --git a/Library/Artifacts/d0/d07d54198d07297ac5f43f70b4f60c43 b/Library/Artifacts/d0/d07d54198d07297ac5f43f70b4f60c43 new file mode 100644 index 0000000..90953da Binary files /dev/null and b/Library/Artifacts/d0/d07d54198d07297ac5f43f70b4f60c43 differ diff --git a/Library/Artifacts/d0/d09b1b5b2c85633c66c436f6b5df9642 b/Library/Artifacts/d0/d09b1b5b2c85633c66c436f6b5df9642 new file mode 100644 index 0000000..cb19569 Binary files /dev/null and b/Library/Artifacts/d0/d09b1b5b2c85633c66c436f6b5df9642 differ diff --git a/Library/Artifacts/d0/d09cddbfbdb676c80bafe6047f817609 b/Library/Artifacts/d0/d09cddbfbdb676c80bafe6047f817609 new file mode 100644 index 0000000..ca9c1a4 Binary files /dev/null and b/Library/Artifacts/d0/d09cddbfbdb676c80bafe6047f817609 differ diff --git a/Library/Artifacts/d1/d1007d7a0e90904b059cea4f4d494a2e b/Library/Artifacts/d1/d1007d7a0e90904b059cea4f4d494a2e new file mode 100644 index 0000000..24becd5 Binary files /dev/null and b/Library/Artifacts/d1/d1007d7a0e90904b059cea4f4d494a2e differ diff --git a/Library/Artifacts/d1/d114ccdce5a00038cb83304c9c03aa92 b/Library/Artifacts/d1/d114ccdce5a00038cb83304c9c03aa92 new file mode 100644 index 0000000..c6e87b9 Binary files /dev/null and b/Library/Artifacts/d1/d114ccdce5a00038cb83304c9c03aa92 differ diff --git a/Library/Artifacts/d1/d11702640157297b057453bceea89450 b/Library/Artifacts/d1/d11702640157297b057453bceea89450 new file mode 100644 index 0000000..d407f63 Binary files /dev/null and b/Library/Artifacts/d1/d11702640157297b057453bceea89450 differ diff --git a/Library/Artifacts/d1/d14a06152b79cc28c60198cb89fbce91 b/Library/Artifacts/d1/d14a06152b79cc28c60198cb89fbce91 new file mode 100644 index 0000000..8ee1ce2 Binary files /dev/null and b/Library/Artifacts/d1/d14a06152b79cc28c60198cb89fbce91 differ diff --git a/Library/Artifacts/d1/d16ff5c758adfaad2df28db30f7d12dc b/Library/Artifacts/d1/d16ff5c758adfaad2df28db30f7d12dc new file mode 100644 index 0000000..2dd1df8 Binary files /dev/null and b/Library/Artifacts/d1/d16ff5c758adfaad2df28db30f7d12dc differ diff --git a/Library/Artifacts/d1/d172a47868aa6ceddc2b1f56b0a14bc9 b/Library/Artifacts/d1/d172a47868aa6ceddc2b1f56b0a14bc9 new file mode 100644 index 0000000..86ccc4e Binary files /dev/null and b/Library/Artifacts/d1/d172a47868aa6ceddc2b1f56b0a14bc9 differ diff --git a/Library/Artifacts/d1/d1961fd64f35902a632ec35c8dca7ef0 b/Library/Artifacts/d1/d1961fd64f35902a632ec35c8dca7ef0 new file mode 100644 index 0000000..d6fb20c Binary files /dev/null and b/Library/Artifacts/d1/d1961fd64f35902a632ec35c8dca7ef0 differ diff --git a/Library/Artifacts/d1/d1bbc0417d989e5bc1fc94b6d641dc1f b/Library/Artifacts/d1/d1bbc0417d989e5bc1fc94b6d641dc1f new file mode 100644 index 0000000..95ac87f Binary files /dev/null and b/Library/Artifacts/d1/d1bbc0417d989e5bc1fc94b6d641dc1f differ diff --git a/Library/Artifacts/d1/d1bc12177756ca34b977966bd7342dac b/Library/Artifacts/d1/d1bc12177756ca34b977966bd7342dac new file mode 100644 index 0000000..8e85268 Binary files /dev/null and b/Library/Artifacts/d1/d1bc12177756ca34b977966bd7342dac differ diff --git a/Library/Artifacts/d1/d1f28e3e6d9fa43760b2c51b3a26d7c3 b/Library/Artifacts/d1/d1f28e3e6d9fa43760b2c51b3a26d7c3 new file mode 100644 index 0000000..3c4ae37 Binary files /dev/null and b/Library/Artifacts/d1/d1f28e3e6d9fa43760b2c51b3a26d7c3 differ diff --git a/Library/Artifacts/d1/d1fbbfecb5407505f2f6fff7c786cdde b/Library/Artifacts/d1/d1fbbfecb5407505f2f6fff7c786cdde new file mode 100644 index 0000000..e77b720 Binary files /dev/null and b/Library/Artifacts/d1/d1fbbfecb5407505f2f6fff7c786cdde differ diff --git a/Library/Artifacts/d1/d1fc4d7eb1d7136708f98b2ef6dac45d b/Library/Artifacts/d1/d1fc4d7eb1d7136708f98b2ef6dac45d new file mode 100644 index 0000000..5196060 Binary files /dev/null and b/Library/Artifacts/d1/d1fc4d7eb1d7136708f98b2ef6dac45d differ diff --git a/Library/Artifacts/d2/d22ed544b88b062061737189d5ff0c8e b/Library/Artifacts/d2/d22ed544b88b062061737189d5ff0c8e new file mode 100644 index 0000000..170503c Binary files /dev/null and b/Library/Artifacts/d2/d22ed544b88b062061737189d5ff0c8e differ diff --git a/Library/Artifacts/d2/d2371640de7073a6f6f2c8e374c6328e b/Library/Artifacts/d2/d2371640de7073a6f6f2c8e374c6328e new file mode 100644 index 0000000..6029035 Binary files /dev/null and b/Library/Artifacts/d2/d2371640de7073a6f6f2c8e374c6328e differ diff --git a/Library/Artifacts/d2/d23dba897b7e01548b806ada210bd1a9 b/Library/Artifacts/d2/d23dba897b7e01548b806ada210bd1a9 new file mode 100644 index 0000000..ee55eb0 Binary files /dev/null and b/Library/Artifacts/d2/d23dba897b7e01548b806ada210bd1a9 differ diff --git a/Library/Artifacts/d2/d254a5c850436c16cdda2ecab166a424 b/Library/Artifacts/d2/d254a5c850436c16cdda2ecab166a424 new file mode 100644 index 0000000..67bb255 Binary files /dev/null and b/Library/Artifacts/d2/d254a5c850436c16cdda2ecab166a424 differ diff --git a/Library/Artifacts/d2/d2b6715f1fbaf3f50eeb58e321b5f46e b/Library/Artifacts/d2/d2b6715f1fbaf3f50eeb58e321b5f46e new file mode 100644 index 0000000..4b5b729 Binary files /dev/null and b/Library/Artifacts/d2/d2b6715f1fbaf3f50eeb58e321b5f46e differ diff --git a/Library/Artifacts/d2/d2be7ab9e6ecd2409ba470b58b1e908d b/Library/Artifacts/d2/d2be7ab9e6ecd2409ba470b58b1e908d new file mode 100644 index 0000000..c52e91a Binary files /dev/null and b/Library/Artifacts/d2/d2be7ab9e6ecd2409ba470b58b1e908d differ diff --git a/Library/Artifacts/d3/d311d03c8709679d2cdd30451ad901a2 b/Library/Artifacts/d3/d311d03c8709679d2cdd30451ad901a2 new file mode 100644 index 0000000..f046b24 Binary files /dev/null and b/Library/Artifacts/d3/d311d03c8709679d2cdd30451ad901a2 differ diff --git a/Library/Artifacts/d3/d33908cbd7ceefd3db3a83e277d091e6 b/Library/Artifacts/d3/d33908cbd7ceefd3db3a83e277d091e6 new file mode 100644 index 0000000..061c7c7 Binary files /dev/null and b/Library/Artifacts/d3/d33908cbd7ceefd3db3a83e277d091e6 differ diff --git a/Library/Artifacts/d3/d3a26f996cc3f4d21a9bc0c6037def4e b/Library/Artifacts/d3/d3a26f996cc3f4d21a9bc0c6037def4e new file mode 100644 index 0000000..ccd1566 Binary files /dev/null and b/Library/Artifacts/d3/d3a26f996cc3f4d21a9bc0c6037def4e differ diff --git a/Library/Artifacts/d3/d3c850399f7ab60a960c4c1ff086108e b/Library/Artifacts/d3/d3c850399f7ab60a960c4c1ff086108e new file mode 100644 index 0000000..8e1e87a Binary files /dev/null and b/Library/Artifacts/d3/d3c850399f7ab60a960c4c1ff086108e differ diff --git a/Library/Artifacts/d3/d3caaf6848eecdd3b04cda7101c64416 b/Library/Artifacts/d3/d3caaf6848eecdd3b04cda7101c64416 new file mode 100644 index 0000000..97be7f6 Binary files /dev/null and b/Library/Artifacts/d3/d3caaf6848eecdd3b04cda7101c64416 differ diff --git a/Library/Artifacts/d4/d40581d2299879d7087a0ba96bd12ab0 b/Library/Artifacts/d4/d40581d2299879d7087a0ba96bd12ab0 new file mode 100644 index 0000000..362853f Binary files /dev/null and b/Library/Artifacts/d4/d40581d2299879d7087a0ba96bd12ab0 differ diff --git a/Library/Artifacts/d4/d40f57679420e867dc83ca5f60a59466 b/Library/Artifacts/d4/d40f57679420e867dc83ca5f60a59466 new file mode 100644 index 0000000..75ec283 Binary files /dev/null and b/Library/Artifacts/d4/d40f57679420e867dc83ca5f60a59466 differ diff --git a/Library/Artifacts/d4/d436f29ac510ae69a625b34de1fae156 b/Library/Artifacts/d4/d436f29ac510ae69a625b34de1fae156 new file mode 100644 index 0000000..2ef5eec Binary files /dev/null and b/Library/Artifacts/d4/d436f29ac510ae69a625b34de1fae156 differ diff --git a/Library/Artifacts/d4/d4459f175ac79986734abd93c1c44e19 b/Library/Artifacts/d4/d4459f175ac79986734abd93c1c44e19 new file mode 100644 index 0000000..458c874 Binary files /dev/null and b/Library/Artifacts/d4/d4459f175ac79986734abd93c1c44e19 differ diff --git a/Library/Artifacts/d4/d449185d0d7b81c893f90916e3ffc5b9 b/Library/Artifacts/d4/d449185d0d7b81c893f90916e3ffc5b9 new file mode 100644 index 0000000..1c41eaa Binary files /dev/null and b/Library/Artifacts/d4/d449185d0d7b81c893f90916e3ffc5b9 differ diff --git a/Library/Artifacts/d4/d47101661a52c076da013255c5d774f3 b/Library/Artifacts/d4/d47101661a52c076da013255c5d774f3 new file mode 100644 index 0000000..a5079a3 Binary files /dev/null and b/Library/Artifacts/d4/d47101661a52c076da013255c5d774f3 differ diff --git a/Library/Artifacts/d4/d4de5579182a8bcfa04d6d2e8a639762 b/Library/Artifacts/d4/d4de5579182a8bcfa04d6d2e8a639762 new file mode 100644 index 0000000..1a8b5b1 Binary files /dev/null and b/Library/Artifacts/d4/d4de5579182a8bcfa04d6d2e8a639762 differ diff --git a/Library/Artifacts/d4/d4e2547b82b32d8396f1c6ccab964ae8 b/Library/Artifacts/d4/d4e2547b82b32d8396f1c6ccab964ae8 new file mode 100644 index 0000000..ac1391f Binary files /dev/null and b/Library/Artifacts/d4/d4e2547b82b32d8396f1c6ccab964ae8 differ diff --git a/Library/Artifacts/d4/d4e3244a60fce279bfa0267de4577aa1 b/Library/Artifacts/d4/d4e3244a60fce279bfa0267de4577aa1 new file mode 100644 index 0000000..0774c55 Binary files /dev/null and b/Library/Artifacts/d4/d4e3244a60fce279bfa0267de4577aa1 differ diff --git a/Library/Artifacts/d4/d4f1d51eadc559526fb68aba78ddcebd b/Library/Artifacts/d4/d4f1d51eadc559526fb68aba78ddcebd new file mode 100644 index 0000000..b7e55d2 Binary files /dev/null and b/Library/Artifacts/d4/d4f1d51eadc559526fb68aba78ddcebd differ diff --git a/Library/Artifacts/d5/d51ad8e234e4c149e79ba81df0b487b6 b/Library/Artifacts/d5/d51ad8e234e4c149e79ba81df0b487b6 new file mode 100644 index 0000000..0b00fc9 Binary files /dev/null and b/Library/Artifacts/d5/d51ad8e234e4c149e79ba81df0b487b6 differ diff --git a/Library/Artifacts/d5/d582f2d3c69eb61ffe92f5a0ddd04896 b/Library/Artifacts/d5/d582f2d3c69eb61ffe92f5a0ddd04896 new file mode 100644 index 0000000..dbe95b8 Binary files /dev/null and b/Library/Artifacts/d5/d582f2d3c69eb61ffe92f5a0ddd04896 differ diff --git a/Library/Artifacts/d5/d5e21934453d07abec0eaaed166feb36 b/Library/Artifacts/d5/d5e21934453d07abec0eaaed166feb36 new file mode 100644 index 0000000..5412a37 Binary files /dev/null and b/Library/Artifacts/d5/d5e21934453d07abec0eaaed166feb36 differ diff --git a/Library/Artifacts/d5/d5f1c2bde9f75e33718d32f8a3907fe1 b/Library/Artifacts/d5/d5f1c2bde9f75e33718d32f8a3907fe1 new file mode 100644 index 0000000..98b04eb Binary files /dev/null and b/Library/Artifacts/d5/d5f1c2bde9f75e33718d32f8a3907fe1 differ diff --git a/Library/Artifacts/d6/d67fd75da7bd992cc2ee850d020eafa3 b/Library/Artifacts/d6/d67fd75da7bd992cc2ee850d020eafa3 new file mode 100644 index 0000000..9aaaf35 Binary files /dev/null and b/Library/Artifacts/d6/d67fd75da7bd992cc2ee850d020eafa3 differ diff --git a/Library/Artifacts/d6/d682b7596cbda0b38927733530bc4c6f b/Library/Artifacts/d6/d682b7596cbda0b38927733530bc4c6f new file mode 100644 index 0000000..76b8775 Binary files /dev/null and b/Library/Artifacts/d6/d682b7596cbda0b38927733530bc4c6f differ diff --git a/Library/Artifacts/d6/d690d28be2225ec868fd354f880d9466 b/Library/Artifacts/d6/d690d28be2225ec868fd354f880d9466 new file mode 100644 index 0000000..39dd157 Binary files /dev/null and b/Library/Artifacts/d6/d690d28be2225ec868fd354f880d9466 differ diff --git a/Library/Artifacts/d6/d6a764f1be18fcf99a4461af6e00d61f b/Library/Artifacts/d6/d6a764f1be18fcf99a4461af6e00d61f new file mode 100644 index 0000000..95235a0 Binary files /dev/null and b/Library/Artifacts/d6/d6a764f1be18fcf99a4461af6e00d61f differ diff --git a/Library/Artifacts/d6/d6d53b8210b1d6a33c166d3ce84d6c22 b/Library/Artifacts/d6/d6d53b8210b1d6a33c166d3ce84d6c22 new file mode 100644 index 0000000..bf860b9 Binary files /dev/null and b/Library/Artifacts/d6/d6d53b8210b1d6a33c166d3ce84d6c22 differ diff --git a/Library/Artifacts/d7/d7105620eb418222beaa8e2dfea8a413 b/Library/Artifacts/d7/d7105620eb418222beaa8e2dfea8a413 new file mode 100644 index 0000000..ae1f581 Binary files /dev/null and b/Library/Artifacts/d7/d7105620eb418222beaa8e2dfea8a413 differ diff --git a/Library/Artifacts/d7/d7299e38a44ca562258f7c2155b2fceb b/Library/Artifacts/d7/d7299e38a44ca562258f7c2155b2fceb new file mode 100644 index 0000000..8619e58 Binary files /dev/null and b/Library/Artifacts/d7/d7299e38a44ca562258f7c2155b2fceb differ diff --git a/Library/Artifacts/d7/d748e6b01b6ac805a7c76a9c36d3f5a4 b/Library/Artifacts/d7/d748e6b01b6ac805a7c76a9c36d3f5a4 new file mode 100644 index 0000000..fd85bd6 Binary files /dev/null and b/Library/Artifacts/d7/d748e6b01b6ac805a7c76a9c36d3f5a4 differ diff --git a/Library/Artifacts/d7/d75117887a580954db2c36131b0f8651 b/Library/Artifacts/d7/d75117887a580954db2c36131b0f8651 new file mode 100644 index 0000000..cab260e Binary files /dev/null and b/Library/Artifacts/d7/d75117887a580954db2c36131b0f8651 differ diff --git a/Library/Artifacts/d7/d7b16799994762a12051809fdf98d994 b/Library/Artifacts/d7/d7b16799994762a12051809fdf98d994 new file mode 100644 index 0000000..cedb0c9 Binary files /dev/null and b/Library/Artifacts/d7/d7b16799994762a12051809fdf98d994 differ diff --git a/Library/Artifacts/d7/d7c57f213f42711810b53873988a6e04 b/Library/Artifacts/d7/d7c57f213f42711810b53873988a6e04 new file mode 100644 index 0000000..dcd8a54 Binary files /dev/null and b/Library/Artifacts/d7/d7c57f213f42711810b53873988a6e04 differ diff --git a/Library/Artifacts/d7/d7c5fd32f134151142d851c4d9aa5d26 b/Library/Artifacts/d7/d7c5fd32f134151142d851c4d9aa5d26 new file mode 100644 index 0000000..b59aeec Binary files /dev/null and b/Library/Artifacts/d7/d7c5fd32f134151142d851c4d9aa5d26 differ diff --git a/Library/Artifacts/d7/d7e8b720891879a431769082678ec303 b/Library/Artifacts/d7/d7e8b720891879a431769082678ec303 new file mode 100644 index 0000000..574b892 Binary files /dev/null and b/Library/Artifacts/d7/d7e8b720891879a431769082678ec303 differ diff --git a/Library/Artifacts/d7/d7f7e34a164453eb8dc6e4d2f4825549 b/Library/Artifacts/d7/d7f7e34a164453eb8dc6e4d2f4825549 new file mode 100644 index 0000000..ced999a Binary files /dev/null and b/Library/Artifacts/d7/d7f7e34a164453eb8dc6e4d2f4825549 differ diff --git a/Library/Artifacts/d8/d813ee6bf19420caf4f2c8551e106ab5 b/Library/Artifacts/d8/d813ee6bf19420caf4f2c8551e106ab5 new file mode 100644 index 0000000..9a584f5 Binary files /dev/null and b/Library/Artifacts/d8/d813ee6bf19420caf4f2c8551e106ab5 differ diff --git a/Library/Artifacts/d8/d82302f786d51f59085d327a42d81940 b/Library/Artifacts/d8/d82302f786d51f59085d327a42d81940 new file mode 100644 index 0000000..d140e9f Binary files /dev/null and b/Library/Artifacts/d8/d82302f786d51f59085d327a42d81940 differ diff --git a/Library/Artifacts/d8/d82fff654a7e33e503bab7de66c63766 b/Library/Artifacts/d8/d82fff654a7e33e503bab7de66c63766 new file mode 100644 index 0000000..218c573 Binary files /dev/null and b/Library/Artifacts/d8/d82fff654a7e33e503bab7de66c63766 differ diff --git a/Library/Artifacts/d8/d8516db28123e947d710e5c9c4c92e2f b/Library/Artifacts/d8/d8516db28123e947d710e5c9c4c92e2f new file mode 100644 index 0000000..769c676 Binary files /dev/null and b/Library/Artifacts/d8/d8516db28123e947d710e5c9c4c92e2f differ diff --git a/Library/Artifacts/d8/d883097f6cc96e1af949abea3bdaaa0d b/Library/Artifacts/d8/d883097f6cc96e1af949abea3bdaaa0d new file mode 100644 index 0000000..04a6b27 Binary files /dev/null and b/Library/Artifacts/d8/d883097f6cc96e1af949abea3bdaaa0d differ diff --git a/Library/Artifacts/d8/d8866840db73546d57a751385c7f02a6 b/Library/Artifacts/d8/d8866840db73546d57a751385c7f02a6 new file mode 100644 index 0000000..50cb2ea Binary files /dev/null and b/Library/Artifacts/d8/d8866840db73546d57a751385c7f02a6 differ diff --git a/Library/Artifacts/d8/d887c8065cb1246a2de3e8a0247feb1e b/Library/Artifacts/d8/d887c8065cb1246a2de3e8a0247feb1e new file mode 100644 index 0000000..bbd2100 Binary files /dev/null and b/Library/Artifacts/d8/d887c8065cb1246a2de3e8a0247feb1e differ diff --git a/Library/Artifacts/d8/d8df5750c3fae7af292ecb66dd5453c1 b/Library/Artifacts/d8/d8df5750c3fae7af292ecb66dd5453c1 new file mode 100644 index 0000000..1d930ae Binary files /dev/null and b/Library/Artifacts/d8/d8df5750c3fae7af292ecb66dd5453c1 differ diff --git a/Library/Artifacts/d8/d8e885418c44618dc09fbf6adeb5bdd0 b/Library/Artifacts/d8/d8e885418c44618dc09fbf6adeb5bdd0 new file mode 100644 index 0000000..ced98d4 Binary files /dev/null and b/Library/Artifacts/d8/d8e885418c44618dc09fbf6adeb5bdd0 differ diff --git a/Library/Artifacts/d9/d916007803cf3117d1f09a69b3aad6ca b/Library/Artifacts/d9/d916007803cf3117d1f09a69b3aad6ca new file mode 100644 index 0000000..27bc56b Binary files /dev/null and b/Library/Artifacts/d9/d916007803cf3117d1f09a69b3aad6ca differ diff --git a/Library/Artifacts/d9/d9a4ad4c156c8f72dfb9d88c4c6b23e4 b/Library/Artifacts/d9/d9a4ad4c156c8f72dfb9d88c4c6b23e4 new file mode 100644 index 0000000..8ad3c77 Binary files /dev/null and b/Library/Artifacts/d9/d9a4ad4c156c8f72dfb9d88c4c6b23e4 differ diff --git a/Library/Artifacts/d9/d9bd1e94ed043614e848113bc7263420 b/Library/Artifacts/d9/d9bd1e94ed043614e848113bc7263420 new file mode 100644 index 0000000..2dfd145 Binary files /dev/null and b/Library/Artifacts/d9/d9bd1e94ed043614e848113bc7263420 differ diff --git a/Library/Artifacts/d9/d9df71f068833fa9f96ec30dda35a676 b/Library/Artifacts/d9/d9df71f068833fa9f96ec30dda35a676 new file mode 100644 index 0000000..7b0b0c1 Binary files /dev/null and b/Library/Artifacts/d9/d9df71f068833fa9f96ec30dda35a676 differ diff --git a/Library/Artifacts/d9/d9eea9a72121cdd9615897a05e330aa9 b/Library/Artifacts/d9/d9eea9a72121cdd9615897a05e330aa9 new file mode 100644 index 0000000..69e8a8d Binary files /dev/null and b/Library/Artifacts/d9/d9eea9a72121cdd9615897a05e330aa9 differ diff --git a/Library/Artifacts/d9/d9f12384391c2e4c6d68e100d0ce59fc b/Library/Artifacts/d9/d9f12384391c2e4c6d68e100d0ce59fc new file mode 100644 index 0000000..13cddf2 Binary files /dev/null and b/Library/Artifacts/d9/d9f12384391c2e4c6d68e100d0ce59fc differ diff --git a/Library/Artifacts/da/da7cd1d48b4bb508877b1a401dc3c25e b/Library/Artifacts/da/da7cd1d48b4bb508877b1a401dc3c25e new file mode 100644 index 0000000..8157ac6 Binary files /dev/null and b/Library/Artifacts/da/da7cd1d48b4bb508877b1a401dc3c25e differ diff --git a/Library/Artifacts/da/da902439a0869bdbe9108bd6be330867 b/Library/Artifacts/da/da902439a0869bdbe9108bd6be330867 new file mode 100644 index 0000000..52560e7 Binary files /dev/null and b/Library/Artifacts/da/da902439a0869bdbe9108bd6be330867 differ diff --git a/Library/Artifacts/da/dabae7cc2ff263586bd0531c64a364f4 b/Library/Artifacts/da/dabae7cc2ff263586bd0531c64a364f4 new file mode 100644 index 0000000..fb87a11 Binary files /dev/null and b/Library/Artifacts/da/dabae7cc2ff263586bd0531c64a364f4 differ diff --git a/Library/Artifacts/da/dad854b56f2a09abb04e811ee6767502 b/Library/Artifacts/da/dad854b56f2a09abb04e811ee6767502 new file mode 100644 index 0000000..85bdb33 Binary files /dev/null and b/Library/Artifacts/da/dad854b56f2a09abb04e811ee6767502 differ diff --git a/Library/Artifacts/db/db07ecbd055f425b381ef29d51b02a4c b/Library/Artifacts/db/db07ecbd055f425b381ef29d51b02a4c new file mode 100644 index 0000000..22009f0 Binary files /dev/null and b/Library/Artifacts/db/db07ecbd055f425b381ef29d51b02a4c differ diff --git a/Library/Artifacts/db/db1d3a027adf6e618ecd05ede28a2692 b/Library/Artifacts/db/db1d3a027adf6e618ecd05ede28a2692 new file mode 100644 index 0000000..cc2c53c Binary files /dev/null and b/Library/Artifacts/db/db1d3a027adf6e618ecd05ede28a2692 differ diff --git a/Library/Artifacts/db/db33e788006966e7b7a49c16431734df b/Library/Artifacts/db/db33e788006966e7b7a49c16431734df new file mode 100644 index 0000000..5bb9371 Binary files /dev/null and b/Library/Artifacts/db/db33e788006966e7b7a49c16431734df differ diff --git a/Library/Artifacts/db/db4477b21ef3ac483bde14721f04dd5a b/Library/Artifacts/db/db4477b21ef3ac483bde14721f04dd5a new file mode 100644 index 0000000..4e793ae Binary files /dev/null and b/Library/Artifacts/db/db4477b21ef3ac483bde14721f04dd5a differ diff --git a/Library/Artifacts/db/db5842fab044c7abc11d9cfb7e8247a1 b/Library/Artifacts/db/db5842fab044c7abc11d9cfb7e8247a1 new file mode 100644 index 0000000..7af897b Binary files /dev/null and b/Library/Artifacts/db/db5842fab044c7abc11d9cfb7e8247a1 differ diff --git a/Library/Artifacts/db/db5eea617f134d0d5df0ce2f5f24a805 b/Library/Artifacts/db/db5eea617f134d0d5df0ce2f5f24a805 new file mode 100644 index 0000000..58f7340 Binary files /dev/null and b/Library/Artifacts/db/db5eea617f134d0d5df0ce2f5f24a805 differ diff --git a/Library/Artifacts/db/db625b9b910c2d883b3aa0cb185a6a74 b/Library/Artifacts/db/db625b9b910c2d883b3aa0cb185a6a74 new file mode 100644 index 0000000..c61b615 Binary files /dev/null and b/Library/Artifacts/db/db625b9b910c2d883b3aa0cb185a6a74 differ diff --git a/Library/Artifacts/db/db6c0d6e8a6b903ea61c6a1220bcc149 b/Library/Artifacts/db/db6c0d6e8a6b903ea61c6a1220bcc149 new file mode 100644 index 0000000..07d5bfe Binary files /dev/null and b/Library/Artifacts/db/db6c0d6e8a6b903ea61c6a1220bcc149 differ diff --git a/Library/Artifacts/db/db6f3a919fa25ae868d7efd62551d83c b/Library/Artifacts/db/db6f3a919fa25ae868d7efd62551d83c new file mode 100644 index 0000000..5e4b2fc Binary files /dev/null and b/Library/Artifacts/db/db6f3a919fa25ae868d7efd62551d83c differ diff --git a/Library/Artifacts/db/dbbf57fe1e0bd8ba3333c45472e69ed4 b/Library/Artifacts/db/dbbf57fe1e0bd8ba3333c45472e69ed4 new file mode 100644 index 0000000..6438d6e Binary files /dev/null and b/Library/Artifacts/db/dbbf57fe1e0bd8ba3333c45472e69ed4 differ diff --git a/Library/Artifacts/dc/dc24605c125b638998f8bb58740f718e b/Library/Artifacts/dc/dc24605c125b638998f8bb58740f718e new file mode 100644 index 0000000..8782250 Binary files /dev/null and b/Library/Artifacts/dc/dc24605c125b638998f8bb58740f718e differ diff --git a/Library/Artifacts/dc/dc31005b1e1f4a248e1cfce6c24df0e5 b/Library/Artifacts/dc/dc31005b1e1f4a248e1cfce6c24df0e5 new file mode 100644 index 0000000..1f63eef Binary files /dev/null and b/Library/Artifacts/dc/dc31005b1e1f4a248e1cfce6c24df0e5 differ diff --git a/Library/Artifacts/dc/dc384a7cda37a31385de79d9f95b4309 b/Library/Artifacts/dc/dc384a7cda37a31385de79d9f95b4309 new file mode 100644 index 0000000..4ad24f3 Binary files /dev/null and b/Library/Artifacts/dc/dc384a7cda37a31385de79d9f95b4309 differ diff --git a/Library/Artifacts/dc/dc5791c5f1d10f0092815371c05808fd b/Library/Artifacts/dc/dc5791c5f1d10f0092815371c05808fd new file mode 100644 index 0000000..3db3a6d Binary files /dev/null and b/Library/Artifacts/dc/dc5791c5f1d10f0092815371c05808fd differ diff --git a/Library/Artifacts/dc/dc5ca8b10985d50b3be26d8b742b65e7 b/Library/Artifacts/dc/dc5ca8b10985d50b3be26d8b742b65e7 new file mode 100644 index 0000000..a344355 Binary files /dev/null and b/Library/Artifacts/dc/dc5ca8b10985d50b3be26d8b742b65e7 differ diff --git a/Library/Artifacts/dc/dc6070f249943690250e68f82095cdf9 b/Library/Artifacts/dc/dc6070f249943690250e68f82095cdf9 new file mode 100644 index 0000000..71be487 Binary files /dev/null and b/Library/Artifacts/dc/dc6070f249943690250e68f82095cdf9 differ diff --git a/Library/Artifacts/dc/dcb623ff85c98b6e00dfc17678069ab3 b/Library/Artifacts/dc/dcb623ff85c98b6e00dfc17678069ab3 new file mode 100644 index 0000000..64455de Binary files /dev/null and b/Library/Artifacts/dc/dcb623ff85c98b6e00dfc17678069ab3 differ diff --git a/Library/Artifacts/dc/dcb642ab5e6a80292292041bf13810a6 b/Library/Artifacts/dc/dcb642ab5e6a80292292041bf13810a6 new file mode 100644 index 0000000..d7d2909 Binary files /dev/null and b/Library/Artifacts/dc/dcb642ab5e6a80292292041bf13810a6 differ diff --git a/Library/Artifacts/dc/dcf517937749b4c512d516d684004ee3 b/Library/Artifacts/dc/dcf517937749b4c512d516d684004ee3 new file mode 100644 index 0000000..e6fe135 Binary files /dev/null and b/Library/Artifacts/dc/dcf517937749b4c512d516d684004ee3 differ diff --git a/Library/Artifacts/dd/dd361b2b60f6147a2b057b4bfd1250bd b/Library/Artifacts/dd/dd361b2b60f6147a2b057b4bfd1250bd new file mode 100644 index 0000000..136c568 Binary files /dev/null and b/Library/Artifacts/dd/dd361b2b60f6147a2b057b4bfd1250bd differ diff --git a/Library/Artifacts/dd/dd3b66c8d51f0d88050c81ca0c6537bb b/Library/Artifacts/dd/dd3b66c8d51f0d88050c81ca0c6537bb new file mode 100644 index 0000000..3fc9020 Binary files /dev/null and b/Library/Artifacts/dd/dd3b66c8d51f0d88050c81ca0c6537bb differ diff --git a/Library/Artifacts/dd/dd46a856fc2c9696df814f3ff84bf1e7 b/Library/Artifacts/dd/dd46a856fc2c9696df814f3ff84bf1e7 new file mode 100644 index 0000000..c175d5c Binary files /dev/null and b/Library/Artifacts/dd/dd46a856fc2c9696df814f3ff84bf1e7 differ diff --git a/Library/Artifacts/dd/dd59c653ae4a6e02fb471b96238ec97b b/Library/Artifacts/dd/dd59c653ae4a6e02fb471b96238ec97b new file mode 100644 index 0000000..965c0bd Binary files /dev/null and b/Library/Artifacts/dd/dd59c653ae4a6e02fb471b96238ec97b differ diff --git a/Library/Artifacts/dd/ddb2d01c3c12337b8030d842ab8f6c44 b/Library/Artifacts/dd/ddb2d01c3c12337b8030d842ab8f6c44 new file mode 100644 index 0000000..decb9c8 Binary files /dev/null and b/Library/Artifacts/dd/ddb2d01c3c12337b8030d842ab8f6c44 differ diff --git a/Library/Artifacts/dd/ddd455403e3ad0a3dc1244f8d64888c5 b/Library/Artifacts/dd/ddd455403e3ad0a3dc1244f8d64888c5 new file mode 100644 index 0000000..05aa386 Binary files /dev/null and b/Library/Artifacts/dd/ddd455403e3ad0a3dc1244f8d64888c5 differ diff --git a/Library/Artifacts/dd/ddd4f178002559072992573362bc6729 b/Library/Artifacts/dd/ddd4f178002559072992573362bc6729 new file mode 100644 index 0000000..51e24cd Binary files /dev/null and b/Library/Artifacts/dd/ddd4f178002559072992573362bc6729 differ diff --git a/Library/Artifacts/de/de0387e4e41d7b0d56a0e56772d50f24 b/Library/Artifacts/de/de0387e4e41d7b0d56a0e56772d50f24 new file mode 100644 index 0000000..6555ef3 Binary files /dev/null and b/Library/Artifacts/de/de0387e4e41d7b0d56a0e56772d50f24 differ diff --git a/Library/Artifacts/de/de20ed61a70b77d13cbc1841cb7413a8 b/Library/Artifacts/de/de20ed61a70b77d13cbc1841cb7413a8 new file mode 100644 index 0000000..e436868 Binary files /dev/null and b/Library/Artifacts/de/de20ed61a70b77d13cbc1841cb7413a8 differ diff --git a/Library/Artifacts/de/de620f59b269bfa8046f4e361caa9fc3 b/Library/Artifacts/de/de620f59b269bfa8046f4e361caa9fc3 new file mode 100644 index 0000000..250cd0e Binary files /dev/null and b/Library/Artifacts/de/de620f59b269bfa8046f4e361caa9fc3 differ diff --git a/Library/Artifacts/de/de6d056c8f0767150c61ab0567613dd7 b/Library/Artifacts/de/de6d056c8f0767150c61ab0567613dd7 new file mode 100644 index 0000000..77ebe8c Binary files /dev/null and b/Library/Artifacts/de/de6d056c8f0767150c61ab0567613dd7 differ diff --git a/Library/Artifacts/de/de82e21afdd06e3317adc0baa6c200ab b/Library/Artifacts/de/de82e21afdd06e3317adc0baa6c200ab new file mode 100644 index 0000000..2ae3dcd Binary files /dev/null and b/Library/Artifacts/de/de82e21afdd06e3317adc0baa6c200ab differ diff --git a/Library/Artifacts/de/de8664b7e14e845851702f7bbe916edc b/Library/Artifacts/de/de8664b7e14e845851702f7bbe916edc new file mode 100644 index 0000000..bc704ce Binary files /dev/null and b/Library/Artifacts/de/de8664b7e14e845851702f7bbe916edc differ diff --git a/Library/Artifacts/de/de8e82bddbf23d4a0b11b07f6984888b b/Library/Artifacts/de/de8e82bddbf23d4a0b11b07f6984888b new file mode 100644 index 0000000..b150ee9 Binary files /dev/null and b/Library/Artifacts/de/de8e82bddbf23d4a0b11b07f6984888b differ diff --git a/Library/Artifacts/de/deafb66c368c09a56172567797ba1b87 b/Library/Artifacts/de/deafb66c368c09a56172567797ba1b87 new file mode 100644 index 0000000..ef90ad3 Binary files /dev/null and b/Library/Artifacts/de/deafb66c368c09a56172567797ba1b87 differ diff --git a/Library/Artifacts/de/dee823a4f7c2e2555e368a2b5f615596 b/Library/Artifacts/de/dee823a4f7c2e2555e368a2b5f615596 new file mode 100644 index 0000000..c3c2e38 Binary files /dev/null and b/Library/Artifacts/de/dee823a4f7c2e2555e368a2b5f615596 differ diff --git a/Library/Artifacts/df/df1243f41a648d38cde01d7b3b960fa7 b/Library/Artifacts/df/df1243f41a648d38cde01d7b3b960fa7 new file mode 100644 index 0000000..7b23786 Binary files /dev/null and b/Library/Artifacts/df/df1243f41a648d38cde01d7b3b960fa7 differ diff --git a/Library/Artifacts/df/df35c5dc332c26e127a742e13c69b1ef b/Library/Artifacts/df/df35c5dc332c26e127a742e13c69b1ef new file mode 100644 index 0000000..090cc66 Binary files /dev/null and b/Library/Artifacts/df/df35c5dc332c26e127a742e13c69b1ef differ diff --git a/Library/Artifacts/df/df497d53d15903a90aa122624bf56019 b/Library/Artifacts/df/df497d53d15903a90aa122624bf56019 new file mode 100644 index 0000000..2676356 Binary files /dev/null and b/Library/Artifacts/df/df497d53d15903a90aa122624bf56019 differ diff --git a/Library/Artifacts/df/df8c8a2d4e2619dee7da1e662819ad47 b/Library/Artifacts/df/df8c8a2d4e2619dee7da1e662819ad47 new file mode 100644 index 0000000..76dfbef Binary files /dev/null and b/Library/Artifacts/df/df8c8a2d4e2619dee7da1e662819ad47 differ diff --git a/Library/Artifacts/df/dfb177a5f1bda1c45787aa0edb6145c1 b/Library/Artifacts/df/dfb177a5f1bda1c45787aa0edb6145c1 new file mode 100644 index 0000000..c2067ae Binary files /dev/null and b/Library/Artifacts/df/dfb177a5f1bda1c45787aa0edb6145c1 differ diff --git a/Library/Artifacts/df/dfb71c208a0f5542015f123aaa68a7e5 b/Library/Artifacts/df/dfb71c208a0f5542015f123aaa68a7e5 new file mode 100644 index 0000000..1e35e06 Binary files /dev/null and b/Library/Artifacts/df/dfb71c208a0f5542015f123aaa68a7e5 differ diff --git a/Library/Artifacts/df/dfc90a569a6ed390cf376263fd9dfb00 b/Library/Artifacts/df/dfc90a569a6ed390cf376263fd9dfb00 new file mode 100644 index 0000000..461f1e9 Binary files /dev/null and b/Library/Artifacts/df/dfc90a569a6ed390cf376263fd9dfb00 differ diff --git a/Library/Artifacts/df/dfe2559ce554b93f86f5349040d0fb57 b/Library/Artifacts/df/dfe2559ce554b93f86f5349040d0fb57 new file mode 100644 index 0000000..b190aed Binary files /dev/null and b/Library/Artifacts/df/dfe2559ce554b93f86f5349040d0fb57 differ diff --git a/Library/Artifacts/df/dff19d3e9cf019f71a5b1677cea4d278 b/Library/Artifacts/df/dff19d3e9cf019f71a5b1677cea4d278 new file mode 100644 index 0000000..6ef61be Binary files /dev/null and b/Library/Artifacts/df/dff19d3e9cf019f71a5b1677cea4d278 differ diff --git a/Library/Artifacts/df/dff65532117312e0b6dba0dfa4542d7d b/Library/Artifacts/df/dff65532117312e0b6dba0dfa4542d7d new file mode 100644 index 0000000..5dfdb7d Binary files /dev/null and b/Library/Artifacts/df/dff65532117312e0b6dba0dfa4542d7d differ diff --git a/Library/Artifacts/e0/e0056529bdbaf5ddf4492e8804186c2b b/Library/Artifacts/e0/e0056529bdbaf5ddf4492e8804186c2b new file mode 100644 index 0000000..b382749 Binary files /dev/null and b/Library/Artifacts/e0/e0056529bdbaf5ddf4492e8804186c2b differ diff --git a/Library/Artifacts/e0/e00b09363b7149e00499788fde6ea724 b/Library/Artifacts/e0/e00b09363b7149e00499788fde6ea724 new file mode 100644 index 0000000..4d8807d Binary files /dev/null and b/Library/Artifacts/e0/e00b09363b7149e00499788fde6ea724 differ diff --git a/Library/Artifacts/e0/e01e05d06fb872cef6aca7f3ca5ecca0 b/Library/Artifacts/e0/e01e05d06fb872cef6aca7f3ca5ecca0 new file mode 100644 index 0000000..31769e1 Binary files /dev/null and b/Library/Artifacts/e0/e01e05d06fb872cef6aca7f3ca5ecca0 differ diff --git a/Library/Artifacts/e0/e029995e9b912bd2d8f2cc70f2fadcf9 b/Library/Artifacts/e0/e029995e9b912bd2d8f2cc70f2fadcf9 new file mode 100644 index 0000000..1d23231 Binary files /dev/null and b/Library/Artifacts/e0/e029995e9b912bd2d8f2cc70f2fadcf9 differ diff --git a/Library/Artifacts/e0/e0338dea8c6fe0303eacac83986bff39 b/Library/Artifacts/e0/e0338dea8c6fe0303eacac83986bff39 new file mode 100644 index 0000000..d73a4e9 Binary files /dev/null and b/Library/Artifacts/e0/e0338dea8c6fe0303eacac83986bff39 differ diff --git a/Library/Artifacts/e0/e052c1e3eda947518c2a7a31c666629f b/Library/Artifacts/e0/e052c1e3eda947518c2a7a31c666629f new file mode 100644 index 0000000..82cf384 Binary files /dev/null and b/Library/Artifacts/e0/e052c1e3eda947518c2a7a31c666629f differ diff --git a/Library/Artifacts/e0/e056f6d38981fd3c98d4b2894d808708 b/Library/Artifacts/e0/e056f6d38981fd3c98d4b2894d808708 new file mode 100644 index 0000000..376b6af Binary files /dev/null and b/Library/Artifacts/e0/e056f6d38981fd3c98d4b2894d808708 differ diff --git a/Library/Artifacts/e0/e07e8953c8769ce27798dea729b7c3ac b/Library/Artifacts/e0/e07e8953c8769ce27798dea729b7c3ac new file mode 100644 index 0000000..c1f690d Binary files /dev/null and b/Library/Artifacts/e0/e07e8953c8769ce27798dea729b7c3ac differ diff --git a/Library/Artifacts/e0/e0b5523cee494aa9aa6a2f97a197ebf2 b/Library/Artifacts/e0/e0b5523cee494aa9aa6a2f97a197ebf2 new file mode 100644 index 0000000..e3563b7 Binary files /dev/null and b/Library/Artifacts/e0/e0b5523cee494aa9aa6a2f97a197ebf2 differ diff --git a/Library/Artifacts/e0/e0b6b3b1890a130fb78c42cbeba0fadf b/Library/Artifacts/e0/e0b6b3b1890a130fb78c42cbeba0fadf new file mode 100644 index 0000000..a37415a Binary files /dev/null and b/Library/Artifacts/e0/e0b6b3b1890a130fb78c42cbeba0fadf differ diff --git a/Library/Artifacts/e0/e0b7b1be9ba3233f54bf07de618351d6 b/Library/Artifacts/e0/e0b7b1be9ba3233f54bf07de618351d6 new file mode 100644 index 0000000..e3a9030 Binary files /dev/null and b/Library/Artifacts/e0/e0b7b1be9ba3233f54bf07de618351d6 differ diff --git a/Library/Artifacts/e0/e0c01dd0dd57fae75ccb8a5a168d5abd b/Library/Artifacts/e0/e0c01dd0dd57fae75ccb8a5a168d5abd new file mode 100644 index 0000000..0cee74e Binary files /dev/null and b/Library/Artifacts/e0/e0c01dd0dd57fae75ccb8a5a168d5abd differ diff --git a/Library/Artifacts/e0/e0d31f6db2c47301a4bb86cfbc0c6853 b/Library/Artifacts/e0/e0d31f6db2c47301a4bb86cfbc0c6853 new file mode 100644 index 0000000..f22381b Binary files /dev/null and b/Library/Artifacts/e0/e0d31f6db2c47301a4bb86cfbc0c6853 differ diff --git a/Library/Artifacts/e0/e0d3bdd319bdb21f26f303e89aaab0af b/Library/Artifacts/e0/e0d3bdd319bdb21f26f303e89aaab0af new file mode 100644 index 0000000..6cb0e39 Binary files /dev/null and b/Library/Artifacts/e0/e0d3bdd319bdb21f26f303e89aaab0af differ diff --git a/Library/Artifacts/e1/e1039dd55d8685ba6803c8f77feae973 b/Library/Artifacts/e1/e1039dd55d8685ba6803c8f77feae973 new file mode 100644 index 0000000..e648a2f Binary files /dev/null and b/Library/Artifacts/e1/e1039dd55d8685ba6803c8f77feae973 differ diff --git a/Library/Artifacts/e1/e12f734ca327f7a4398268d9c6c0057f b/Library/Artifacts/e1/e12f734ca327f7a4398268d9c6c0057f new file mode 100644 index 0000000..791c769 Binary files /dev/null and b/Library/Artifacts/e1/e12f734ca327f7a4398268d9c6c0057f differ diff --git a/Library/Artifacts/e1/e1460b7fcb30f3412d499db310350f63 b/Library/Artifacts/e1/e1460b7fcb30f3412d499db310350f63 new file mode 100644 index 0000000..f2e9478 Binary files /dev/null and b/Library/Artifacts/e1/e1460b7fcb30f3412d499db310350f63 differ diff --git a/Library/Artifacts/e1/e15d3e9facf6db8bc02cdab925ffa64f b/Library/Artifacts/e1/e15d3e9facf6db8bc02cdab925ffa64f new file mode 100644 index 0000000..224344f Binary files /dev/null and b/Library/Artifacts/e1/e15d3e9facf6db8bc02cdab925ffa64f differ diff --git a/Library/Artifacts/e1/e16bb4d98688b3d502a100f105aa402f b/Library/Artifacts/e1/e16bb4d98688b3d502a100f105aa402f new file mode 100644 index 0000000..5b687ca Binary files /dev/null and b/Library/Artifacts/e1/e16bb4d98688b3d502a100f105aa402f differ diff --git a/Library/Artifacts/e1/e182a52bde9f6cc89e6ec4432db379fd b/Library/Artifacts/e1/e182a52bde9f6cc89e6ec4432db379fd new file mode 100644 index 0000000..12ef42a Binary files /dev/null and b/Library/Artifacts/e1/e182a52bde9f6cc89e6ec4432db379fd differ diff --git a/Library/Artifacts/e1/e1de426d173a8ca25d06a28422534625 b/Library/Artifacts/e1/e1de426d173a8ca25d06a28422534625 new file mode 100644 index 0000000..8c0d7fa Binary files /dev/null and b/Library/Artifacts/e1/e1de426d173a8ca25d06a28422534625 differ diff --git a/Library/Artifacts/e2/e2156a73eb8fe354cf0a344015fd7863 b/Library/Artifacts/e2/e2156a73eb8fe354cf0a344015fd7863 new file mode 100644 index 0000000..5e42c91 Binary files /dev/null and b/Library/Artifacts/e2/e2156a73eb8fe354cf0a344015fd7863 differ diff --git a/Library/Artifacts/e2/e230a0a039fc686f1077cd1498ec0905 b/Library/Artifacts/e2/e230a0a039fc686f1077cd1498ec0905 new file mode 100644 index 0000000..58f58ef Binary files /dev/null and b/Library/Artifacts/e2/e230a0a039fc686f1077cd1498ec0905 differ diff --git a/Library/Artifacts/e2/e256018512ec7b05f6b0ae7d449c9ffd b/Library/Artifacts/e2/e256018512ec7b05f6b0ae7d449c9ffd new file mode 100644 index 0000000..ad5a5d6 Binary files /dev/null and b/Library/Artifacts/e2/e256018512ec7b05f6b0ae7d449c9ffd differ diff --git a/Library/Artifacts/e2/e28efed6da90e900bde58c4dc336f8bd b/Library/Artifacts/e2/e28efed6da90e900bde58c4dc336f8bd new file mode 100644 index 0000000..9e89751 Binary files /dev/null and b/Library/Artifacts/e2/e28efed6da90e900bde58c4dc336f8bd differ diff --git a/Library/Artifacts/e2/e2b2839f83d01935ef654b5e778c7d30 b/Library/Artifacts/e2/e2b2839f83d01935ef654b5e778c7d30 new file mode 100644 index 0000000..d6dae31 Binary files /dev/null and b/Library/Artifacts/e2/e2b2839f83d01935ef654b5e778c7d30 differ diff --git a/Library/Artifacts/e2/e2f4f6255bf37c1fdcf45cd9cf54d2c5 b/Library/Artifacts/e2/e2f4f6255bf37c1fdcf45cd9cf54d2c5 new file mode 100644 index 0000000..b568195 Binary files /dev/null and b/Library/Artifacts/e2/e2f4f6255bf37c1fdcf45cd9cf54d2c5 differ diff --git a/Library/Artifacts/e2/e2fee65f5f3a88a7ba96d4c10110248d b/Library/Artifacts/e2/e2fee65f5f3a88a7ba96d4c10110248d new file mode 100644 index 0000000..d9bac70 Binary files /dev/null and b/Library/Artifacts/e2/e2fee65f5f3a88a7ba96d4c10110248d differ diff --git a/Library/Artifacts/e3/e30cecd8d12202b7658fb6ad56e663cb b/Library/Artifacts/e3/e30cecd8d12202b7658fb6ad56e663cb new file mode 100644 index 0000000..f6bbef3 Binary files /dev/null and b/Library/Artifacts/e3/e30cecd8d12202b7658fb6ad56e663cb differ diff --git a/Library/Artifacts/e3/e320b4ff94cdfeede52a632ef16b0469 b/Library/Artifacts/e3/e320b4ff94cdfeede52a632ef16b0469 new file mode 100644 index 0000000..38cd0a1 Binary files /dev/null and b/Library/Artifacts/e3/e320b4ff94cdfeede52a632ef16b0469 differ diff --git a/Library/Artifacts/e3/e3304895a6396b764e51e27c3e364cd3 b/Library/Artifacts/e3/e3304895a6396b764e51e27c3e364cd3 new file mode 100644 index 0000000..f3cb8ae Binary files /dev/null and b/Library/Artifacts/e3/e3304895a6396b764e51e27c3e364cd3 differ diff --git a/Library/Artifacts/e3/e3590f23e9f2bad2d71feba20493c3a3 b/Library/Artifacts/e3/e3590f23e9f2bad2d71feba20493c3a3 new file mode 100644 index 0000000..709531e Binary files /dev/null and b/Library/Artifacts/e3/e3590f23e9f2bad2d71feba20493c3a3 differ diff --git a/Library/Artifacts/e3/e35f18f813e7e2a9bda13f1315e8289a b/Library/Artifacts/e3/e35f18f813e7e2a9bda13f1315e8289a new file mode 100644 index 0000000..10211f1 Binary files /dev/null and b/Library/Artifacts/e3/e35f18f813e7e2a9bda13f1315e8289a differ diff --git a/Library/Artifacts/e3/e381e1b5641ada1cfe135687348f2906 b/Library/Artifacts/e3/e381e1b5641ada1cfe135687348f2906 new file mode 100644 index 0000000..4eb5147 Binary files /dev/null and b/Library/Artifacts/e3/e381e1b5641ada1cfe135687348f2906 differ diff --git a/Library/Artifacts/e3/e39fe972583a95626c958d43b9367e4e b/Library/Artifacts/e3/e39fe972583a95626c958d43b9367e4e new file mode 100644 index 0000000..f6b1e24 Binary files /dev/null and b/Library/Artifacts/e3/e39fe972583a95626c958d43b9367e4e differ diff --git a/Library/Artifacts/e3/e3cb61a0a49d612656350d7bd38651b6 b/Library/Artifacts/e3/e3cb61a0a49d612656350d7bd38651b6 new file mode 100644 index 0000000..830d070 Binary files /dev/null and b/Library/Artifacts/e3/e3cb61a0a49d612656350d7bd38651b6 differ diff --git a/Library/Artifacts/e3/e3cd0ec2372f49510d8a5ff6d07be01a b/Library/Artifacts/e3/e3cd0ec2372f49510d8a5ff6d07be01a new file mode 100644 index 0000000..1eac846 Binary files /dev/null and b/Library/Artifacts/e3/e3cd0ec2372f49510d8a5ff6d07be01a differ diff --git a/Library/Artifacts/e3/e3d70fe748ef051389c1dd272246c1ab b/Library/Artifacts/e3/e3d70fe748ef051389c1dd272246c1ab new file mode 100644 index 0000000..b912488 Binary files /dev/null and b/Library/Artifacts/e3/e3d70fe748ef051389c1dd272246c1ab differ diff --git a/Library/Artifacts/e4/e400045b061258a81aeefa77760958c8 b/Library/Artifacts/e4/e400045b061258a81aeefa77760958c8 new file mode 100644 index 0000000..5cec982 Binary files /dev/null and b/Library/Artifacts/e4/e400045b061258a81aeefa77760958c8 differ diff --git a/Library/Artifacts/e4/e4145136444538f4bd3d71453603a743 b/Library/Artifacts/e4/e4145136444538f4bd3d71453603a743 new file mode 100644 index 0000000..6e67c2d Binary files /dev/null and b/Library/Artifacts/e4/e4145136444538f4bd3d71453603a743 differ diff --git a/Library/Artifacts/e4/e41bd62f39d4e72224b0f9f302284eab b/Library/Artifacts/e4/e41bd62f39d4e72224b0f9f302284eab new file mode 100644 index 0000000..9249ce7 Binary files /dev/null and b/Library/Artifacts/e4/e41bd62f39d4e72224b0f9f302284eab differ diff --git a/Library/Artifacts/e4/e41f2b0b7c729e5b1b41ec9a145a51e6 b/Library/Artifacts/e4/e41f2b0b7c729e5b1b41ec9a145a51e6 new file mode 100644 index 0000000..037673f Binary files /dev/null and b/Library/Artifacts/e4/e41f2b0b7c729e5b1b41ec9a145a51e6 differ diff --git a/Library/Artifacts/e4/e4514d4a6da263ddbac228dc0039b682 b/Library/Artifacts/e4/e4514d4a6da263ddbac228dc0039b682 new file mode 100644 index 0000000..7142bf3 Binary files /dev/null and b/Library/Artifacts/e4/e4514d4a6da263ddbac228dc0039b682 differ diff --git a/Library/Artifacts/e4/e4682cffdad0441b84596e5174f56483 b/Library/Artifacts/e4/e4682cffdad0441b84596e5174f56483 new file mode 100644 index 0000000..24371d5 Binary files /dev/null and b/Library/Artifacts/e4/e4682cffdad0441b84596e5174f56483 differ diff --git a/Library/Artifacts/e4/e46866f11f38dd94e33b38ded2533e9b b/Library/Artifacts/e4/e46866f11f38dd94e33b38ded2533e9b new file mode 100644 index 0000000..8f0fa0a Binary files /dev/null and b/Library/Artifacts/e4/e46866f11f38dd94e33b38ded2533e9b differ diff --git a/Library/Artifacts/e4/e47dbf41e243292c2a4afb8cba9233b0 b/Library/Artifacts/e4/e47dbf41e243292c2a4afb8cba9233b0 new file mode 100644 index 0000000..b404c0a Binary files /dev/null and b/Library/Artifacts/e4/e47dbf41e243292c2a4afb8cba9233b0 differ diff --git a/Library/Artifacts/e4/e4da89fa9ae0f1d975a15a39a2e430b9 b/Library/Artifacts/e4/e4da89fa9ae0f1d975a15a39a2e430b9 new file mode 100644 index 0000000..7b4eaf7 Binary files /dev/null and b/Library/Artifacts/e4/e4da89fa9ae0f1d975a15a39a2e430b9 differ diff --git a/Library/Artifacts/e4/e4e12ef1ce4e651957be2673247e1317 b/Library/Artifacts/e4/e4e12ef1ce4e651957be2673247e1317 new file mode 100644 index 0000000..57c852d Binary files /dev/null and b/Library/Artifacts/e4/e4e12ef1ce4e651957be2673247e1317 differ diff --git a/Library/Artifacts/e4/e4f1c7091ad724f48fe0e4ecff2165cc b/Library/Artifacts/e4/e4f1c7091ad724f48fe0e4ecff2165cc new file mode 100644 index 0000000..0e44b78 Binary files /dev/null and b/Library/Artifacts/e4/e4f1c7091ad724f48fe0e4ecff2165cc differ diff --git a/Library/Artifacts/e5/e51224511fca273aef90ea1ee6ebb633 b/Library/Artifacts/e5/e51224511fca273aef90ea1ee6ebb633 new file mode 100644 index 0000000..1e5b798 Binary files /dev/null and b/Library/Artifacts/e5/e51224511fca273aef90ea1ee6ebb633 differ diff --git a/Library/Artifacts/e5/e527eedecfb29ca8a91b5b294f2e8ed7 b/Library/Artifacts/e5/e527eedecfb29ca8a91b5b294f2e8ed7 new file mode 100644 index 0000000..33b39ab Binary files /dev/null and b/Library/Artifacts/e5/e527eedecfb29ca8a91b5b294f2e8ed7 differ diff --git a/Library/Artifacts/e5/e544b8953954f1469bc153a1cd5423ca b/Library/Artifacts/e5/e544b8953954f1469bc153a1cd5423ca new file mode 100644 index 0000000..0344d6e Binary files /dev/null and b/Library/Artifacts/e5/e544b8953954f1469bc153a1cd5423ca differ diff --git a/Library/Artifacts/e5/e566373167a7b0568aef9a04b2b4c416 b/Library/Artifacts/e5/e566373167a7b0568aef9a04b2b4c416 new file mode 100644 index 0000000..4ef9708 Binary files /dev/null and b/Library/Artifacts/e5/e566373167a7b0568aef9a04b2b4c416 differ diff --git a/Library/Artifacts/e5/e598801c432f12986c7bd895cebfbf37 b/Library/Artifacts/e5/e598801c432f12986c7bd895cebfbf37 new file mode 100644 index 0000000..f513fe3 Binary files /dev/null and b/Library/Artifacts/e5/e598801c432f12986c7bd895cebfbf37 differ diff --git a/Library/Artifacts/e5/e5bc461740f119344513666fe902dcaf b/Library/Artifacts/e5/e5bc461740f119344513666fe902dcaf new file mode 100644 index 0000000..05c9565 Binary files /dev/null and b/Library/Artifacts/e5/e5bc461740f119344513666fe902dcaf differ diff --git a/Library/Artifacts/e5/e5ce70a3c4ff8d7520ca972dc4626a7c b/Library/Artifacts/e5/e5ce70a3c4ff8d7520ca972dc4626a7c new file mode 100644 index 0000000..048c48d Binary files /dev/null and b/Library/Artifacts/e5/e5ce70a3c4ff8d7520ca972dc4626a7c differ diff --git a/Library/Artifacts/e5/e5e5d2b633edbbf1a50bb42f13ff3c2c b/Library/Artifacts/e5/e5e5d2b633edbbf1a50bb42f13ff3c2c new file mode 100644 index 0000000..a37f444 Binary files /dev/null and b/Library/Artifacts/e5/e5e5d2b633edbbf1a50bb42f13ff3c2c differ diff --git a/Library/Artifacts/e6/e62da7e5afbe1f11353b5dcd8153ec11 b/Library/Artifacts/e6/e62da7e5afbe1f11353b5dcd8153ec11 new file mode 100644 index 0000000..8754536 Binary files /dev/null and b/Library/Artifacts/e6/e62da7e5afbe1f11353b5dcd8153ec11 differ diff --git a/Library/Artifacts/e6/e63d6b4ec5acdbd7461b6201461450e8 b/Library/Artifacts/e6/e63d6b4ec5acdbd7461b6201461450e8 new file mode 100644 index 0000000..788a52f Binary files /dev/null and b/Library/Artifacts/e6/e63d6b4ec5acdbd7461b6201461450e8 differ diff --git a/Library/Artifacts/e6/e69ab46f2894764e95671f295c8534b6 b/Library/Artifacts/e6/e69ab46f2894764e95671f295c8534b6 new file mode 100644 index 0000000..a2336d3 Binary files /dev/null and b/Library/Artifacts/e6/e69ab46f2894764e95671f295c8534b6 differ diff --git a/Library/Artifacts/e6/e6c144dc64756d1f60ce463ca8b3d23f b/Library/Artifacts/e6/e6c144dc64756d1f60ce463ca8b3d23f new file mode 100644 index 0000000..ed8f511 Binary files /dev/null and b/Library/Artifacts/e6/e6c144dc64756d1f60ce463ca8b3d23f differ diff --git a/Library/Artifacts/e6/e6f23386ac2e0eb9685beb281f918fe4 b/Library/Artifacts/e6/e6f23386ac2e0eb9685beb281f918fe4 new file mode 100644 index 0000000..f6b8d85 Binary files /dev/null and b/Library/Artifacts/e6/e6f23386ac2e0eb9685beb281f918fe4 differ diff --git a/Library/Artifacts/e6/e6f73aa5c8bed54ab01f0d51029d15f0 b/Library/Artifacts/e6/e6f73aa5c8bed54ab01f0d51029d15f0 new file mode 100644 index 0000000..9d6ffed Binary files /dev/null and b/Library/Artifacts/e6/e6f73aa5c8bed54ab01f0d51029d15f0 differ diff --git a/Library/Artifacts/e7/e76344aaaa95b29194615cf7feff121a b/Library/Artifacts/e7/e76344aaaa95b29194615cf7feff121a new file mode 100644 index 0000000..5d08f81 Binary files /dev/null and b/Library/Artifacts/e7/e76344aaaa95b29194615cf7feff121a differ diff --git a/Library/Artifacts/e7/e7b263108032b715bd16737b0c42efd2 b/Library/Artifacts/e7/e7b263108032b715bd16737b0c42efd2 new file mode 100644 index 0000000..1d8a0c6 Binary files /dev/null and b/Library/Artifacts/e7/e7b263108032b715bd16737b0c42efd2 differ diff --git a/Library/Artifacts/e7/e7c746e85ce54983e9e5588db8cbc622 b/Library/Artifacts/e7/e7c746e85ce54983e9e5588db8cbc622 new file mode 100644 index 0000000..dbe7b32 Binary files /dev/null and b/Library/Artifacts/e7/e7c746e85ce54983e9e5588db8cbc622 differ diff --git a/Library/Artifacts/e7/e7e9f849a86b6163b473394521e65f1d b/Library/Artifacts/e7/e7e9f849a86b6163b473394521e65f1d new file mode 100644 index 0000000..4483501 Binary files /dev/null and b/Library/Artifacts/e7/e7e9f849a86b6163b473394521e65f1d differ diff --git a/Library/Artifacts/e8/e8087262ac0f9ca5bfd119a67c282352 b/Library/Artifacts/e8/e8087262ac0f9ca5bfd119a67c282352 new file mode 100644 index 0000000..5a59dbe Binary files /dev/null and b/Library/Artifacts/e8/e8087262ac0f9ca5bfd119a67c282352 differ diff --git a/Library/Artifacts/e8/e8186933c0e57dc90379da22b5d6182f b/Library/Artifacts/e8/e8186933c0e57dc90379da22b5d6182f new file mode 100644 index 0000000..0f70f34 Binary files /dev/null and b/Library/Artifacts/e8/e8186933c0e57dc90379da22b5d6182f differ diff --git a/Library/Artifacts/e8/e8194503f58f07da5a97290070b0df24 b/Library/Artifacts/e8/e8194503f58f07da5a97290070b0df24 new file mode 100644 index 0000000..aabd9df Binary files /dev/null and b/Library/Artifacts/e8/e8194503f58f07da5a97290070b0df24 differ diff --git a/Library/Artifacts/e8/e871baf2c1201cf0f206ef2ca6be8392 b/Library/Artifacts/e8/e871baf2c1201cf0f206ef2ca6be8392 new file mode 100644 index 0000000..d144e6f Binary files /dev/null and b/Library/Artifacts/e8/e871baf2c1201cf0f206ef2ca6be8392 differ diff --git a/Library/Artifacts/e8/e8b0e33d2697d8f6562e6e064d70a0d7 b/Library/Artifacts/e8/e8b0e33d2697d8f6562e6e064d70a0d7 new file mode 100644 index 0000000..aecf668 Binary files /dev/null and b/Library/Artifacts/e8/e8b0e33d2697d8f6562e6e064d70a0d7 differ diff --git a/Library/Artifacts/e8/e8b79e4686166bcd13c4b5e54a6100c3 b/Library/Artifacts/e8/e8b79e4686166bcd13c4b5e54a6100c3 new file mode 100644 index 0000000..d19ae7b Binary files /dev/null and b/Library/Artifacts/e8/e8b79e4686166bcd13c4b5e54a6100c3 differ diff --git a/Library/Artifacts/e8/e8d8680414e97f556297629a4e418916 b/Library/Artifacts/e8/e8d8680414e97f556297629a4e418916 new file mode 100644 index 0000000..674b44d Binary files /dev/null and b/Library/Artifacts/e8/e8d8680414e97f556297629a4e418916 differ diff --git a/Library/Artifacts/e8/e8f60816727e4c97c027275ecc81db78 b/Library/Artifacts/e8/e8f60816727e4c97c027275ecc81db78 new file mode 100644 index 0000000..7392f4a Binary files /dev/null and b/Library/Artifacts/e8/e8f60816727e4c97c027275ecc81db78 differ diff --git a/Library/Artifacts/e9/e9123443241616c4dd73d5bb8e71b5a8 b/Library/Artifacts/e9/e9123443241616c4dd73d5bb8e71b5a8 new file mode 100644 index 0000000..66cd62e Binary files /dev/null and b/Library/Artifacts/e9/e9123443241616c4dd73d5bb8e71b5a8 differ diff --git a/Library/Artifacts/e9/e914fd27d8c8b5007cd0ab07c77f2444 b/Library/Artifacts/e9/e914fd27d8c8b5007cd0ab07c77f2444 new file mode 100644 index 0000000..ec6c935 Binary files /dev/null and b/Library/Artifacts/e9/e914fd27d8c8b5007cd0ab07c77f2444 differ diff --git a/Library/Artifacts/e9/e92ebdb7edd2821273f977d1dcf204c9 b/Library/Artifacts/e9/e92ebdb7edd2821273f977d1dcf204c9 new file mode 100644 index 0000000..b51a8ff Binary files /dev/null and b/Library/Artifacts/e9/e92ebdb7edd2821273f977d1dcf204c9 differ diff --git a/Library/Artifacts/e9/e950f97cc99739d47fd85669ca42bde7 b/Library/Artifacts/e9/e950f97cc99739d47fd85669ca42bde7 new file mode 100644 index 0000000..88ffa61 Binary files /dev/null and b/Library/Artifacts/e9/e950f97cc99739d47fd85669ca42bde7 differ diff --git a/Library/Artifacts/e9/e9be657ba200f22fe87878b1b48d7ccf b/Library/Artifacts/e9/e9be657ba200f22fe87878b1b48d7ccf new file mode 100644 index 0000000..fa142a6 Binary files /dev/null and b/Library/Artifacts/e9/e9be657ba200f22fe87878b1b48d7ccf differ diff --git a/Library/Artifacts/e9/e9d9f10a4c59b9f4d8484a658146a79f b/Library/Artifacts/e9/e9d9f10a4c59b9f4d8484a658146a79f new file mode 100644 index 0000000..da623a7 Binary files /dev/null and b/Library/Artifacts/e9/e9d9f10a4c59b9f4d8484a658146a79f differ diff --git a/Library/Artifacts/e9/e9e315f18db0b1913ae549c429384829 b/Library/Artifacts/e9/e9e315f18db0b1913ae549c429384829 new file mode 100644 index 0000000..e33c903 Binary files /dev/null and b/Library/Artifacts/e9/e9e315f18db0b1913ae549c429384829 differ diff --git a/Library/Artifacts/e9/e9ec32629aa46011c54d5d37dd3ad087 b/Library/Artifacts/e9/e9ec32629aa46011c54d5d37dd3ad087 new file mode 100644 index 0000000..2c9b34f Binary files /dev/null and b/Library/Artifacts/e9/e9ec32629aa46011c54d5d37dd3ad087 differ diff --git a/Library/Artifacts/ea/ea1f74981a22b414f397d182b613152c b/Library/Artifacts/ea/ea1f74981a22b414f397d182b613152c new file mode 100644 index 0000000..d1f7f4f Binary files /dev/null and b/Library/Artifacts/ea/ea1f74981a22b414f397d182b613152c differ diff --git a/Library/Artifacts/ea/ea4913aaf58cf4587ca28ce4b17bfeb0 b/Library/Artifacts/ea/ea4913aaf58cf4587ca28ce4b17bfeb0 new file mode 100644 index 0000000..0af8079 Binary files /dev/null and b/Library/Artifacts/ea/ea4913aaf58cf4587ca28ce4b17bfeb0 differ diff --git a/Library/Artifacts/ea/ea4b790c23ef99a2ddd46f7e261ba13c b/Library/Artifacts/ea/ea4b790c23ef99a2ddd46f7e261ba13c new file mode 100644 index 0000000..a3bca9f Binary files /dev/null and b/Library/Artifacts/ea/ea4b790c23ef99a2ddd46f7e261ba13c differ diff --git a/Library/Artifacts/ea/ea4ed3b31f1421345065e0cbcdac7a6f b/Library/Artifacts/ea/ea4ed3b31f1421345065e0cbcdac7a6f new file mode 100644 index 0000000..d91f840 Binary files /dev/null and b/Library/Artifacts/ea/ea4ed3b31f1421345065e0cbcdac7a6f differ diff --git a/Library/Artifacts/ea/ea617b4f8bf68b8ae7f046769844e790 b/Library/Artifacts/ea/ea617b4f8bf68b8ae7f046769844e790 new file mode 100644 index 0000000..ae22368 Binary files /dev/null and b/Library/Artifacts/ea/ea617b4f8bf68b8ae7f046769844e790 differ diff --git a/Library/Artifacts/ea/ea7889210f54d4ea8349791e5d7092d3 b/Library/Artifacts/ea/ea7889210f54d4ea8349791e5d7092d3 new file mode 100644 index 0000000..007de67 Binary files /dev/null and b/Library/Artifacts/ea/ea7889210f54d4ea8349791e5d7092d3 differ diff --git a/Library/Artifacts/ea/ea8c6b597578b99283f97111df38e7c3 b/Library/Artifacts/ea/ea8c6b597578b99283f97111df38e7c3 new file mode 100644 index 0000000..e9e2529 Binary files /dev/null and b/Library/Artifacts/ea/ea8c6b597578b99283f97111df38e7c3 differ diff --git a/Library/Artifacts/ea/eaaaad6dc076de95b895a727e0d88b62 b/Library/Artifacts/ea/eaaaad6dc076de95b895a727e0d88b62 new file mode 100644 index 0000000..65d80ce Binary files /dev/null and b/Library/Artifacts/ea/eaaaad6dc076de95b895a727e0d88b62 differ diff --git a/Library/Artifacts/ea/eadbfa47bad1b7531ade3d98ac185018 b/Library/Artifacts/ea/eadbfa47bad1b7531ade3d98ac185018 new file mode 100644 index 0000000..a8e7942 Binary files /dev/null and b/Library/Artifacts/ea/eadbfa47bad1b7531ade3d98ac185018 differ diff --git a/Library/Artifacts/ea/eaed8c0160f96f1eb3f6bac172a579c9 b/Library/Artifacts/ea/eaed8c0160f96f1eb3f6bac172a579c9 new file mode 100644 index 0000000..48bb18f Binary files /dev/null and b/Library/Artifacts/ea/eaed8c0160f96f1eb3f6bac172a579c9 differ diff --git a/Library/Artifacts/ea/eaef67a66a10e74aa8288b18c2acdcf1 b/Library/Artifacts/ea/eaef67a66a10e74aa8288b18c2acdcf1 new file mode 100644 index 0000000..5e8676f Binary files /dev/null and b/Library/Artifacts/ea/eaef67a66a10e74aa8288b18c2acdcf1 differ diff --git a/Library/Artifacts/eb/eb181b9d4bcdf4c36f629a99812ebae9 b/Library/Artifacts/eb/eb181b9d4bcdf4c36f629a99812ebae9 new file mode 100644 index 0000000..7ae71f2 Binary files /dev/null and b/Library/Artifacts/eb/eb181b9d4bcdf4c36f629a99812ebae9 differ diff --git a/Library/Artifacts/eb/eb197a71af7b98181f62a1ba68d66e65 b/Library/Artifacts/eb/eb197a71af7b98181f62a1ba68d66e65 new file mode 100644 index 0000000..a53c5d2 Binary files /dev/null and b/Library/Artifacts/eb/eb197a71af7b98181f62a1ba68d66e65 differ diff --git a/Library/Artifacts/eb/eb2ef1ef7ccecc64b09ce4b0f4e94ed5 b/Library/Artifacts/eb/eb2ef1ef7ccecc64b09ce4b0f4e94ed5 new file mode 100644 index 0000000..a93caf9 Binary files /dev/null and b/Library/Artifacts/eb/eb2ef1ef7ccecc64b09ce4b0f4e94ed5 differ diff --git a/Library/Artifacts/eb/eb717e094cd983b362bb3f6bef8bad4f b/Library/Artifacts/eb/eb717e094cd983b362bb3f6bef8bad4f new file mode 100644 index 0000000..07deae9 Binary files /dev/null and b/Library/Artifacts/eb/eb717e094cd983b362bb3f6bef8bad4f differ diff --git a/Library/Artifacts/eb/ebc36f17767e4b41a6ae65c1bbc6bd6d b/Library/Artifacts/eb/ebc36f17767e4b41a6ae65c1bbc6bd6d new file mode 100644 index 0000000..186adc7 Binary files /dev/null and b/Library/Artifacts/eb/ebc36f17767e4b41a6ae65c1bbc6bd6d differ diff --git a/Library/Artifacts/eb/ebd05906a43950bff5eb5a08b0e92688 b/Library/Artifacts/eb/ebd05906a43950bff5eb5a08b0e92688 new file mode 100644 index 0000000..d300449 Binary files /dev/null and b/Library/Artifacts/eb/ebd05906a43950bff5eb5a08b0e92688 differ diff --git a/Library/Artifacts/ec/ec3007019498ec5d22c7c075ad2040a3 b/Library/Artifacts/ec/ec3007019498ec5d22c7c075ad2040a3 new file mode 100644 index 0000000..44ac343 Binary files /dev/null and b/Library/Artifacts/ec/ec3007019498ec5d22c7c075ad2040a3 differ diff --git a/Library/Artifacts/ec/ec324142b98f1b50a85515e23eea79b5 b/Library/Artifacts/ec/ec324142b98f1b50a85515e23eea79b5 new file mode 100644 index 0000000..c95b175 Binary files /dev/null and b/Library/Artifacts/ec/ec324142b98f1b50a85515e23eea79b5 differ diff --git a/Library/Artifacts/ec/ec32bfaf7bb8eb616e5ff953be7888b5 b/Library/Artifacts/ec/ec32bfaf7bb8eb616e5ff953be7888b5 new file mode 100644 index 0000000..b41a1a3 Binary files /dev/null and b/Library/Artifacts/ec/ec32bfaf7bb8eb616e5ff953be7888b5 differ diff --git a/Library/Artifacts/ec/ec3f82ae84a60604ff30a9b384801385 b/Library/Artifacts/ec/ec3f82ae84a60604ff30a9b384801385 new file mode 100644 index 0000000..5a27243 Binary files /dev/null and b/Library/Artifacts/ec/ec3f82ae84a60604ff30a9b384801385 differ diff --git a/Library/Artifacts/ec/ec7029c306a333954b82924d6223ff63 b/Library/Artifacts/ec/ec7029c306a333954b82924d6223ff63 new file mode 100644 index 0000000..2997601 Binary files /dev/null and b/Library/Artifacts/ec/ec7029c306a333954b82924d6223ff63 differ diff --git a/Library/Artifacts/ec/ec8bc2809a83a1644218cf6db6d87eaa b/Library/Artifacts/ec/ec8bc2809a83a1644218cf6db6d87eaa new file mode 100644 index 0000000..0bdd12a Binary files /dev/null and b/Library/Artifacts/ec/ec8bc2809a83a1644218cf6db6d87eaa differ diff --git a/Library/Artifacts/ec/ece9676d571770035983f467920773d3 b/Library/Artifacts/ec/ece9676d571770035983f467920773d3 new file mode 100644 index 0000000..9f0e562 Binary files /dev/null and b/Library/Artifacts/ec/ece9676d571770035983f467920773d3 differ diff --git a/Library/Artifacts/ec/ecf6eb8f892763370d6580621e8f6946 b/Library/Artifacts/ec/ecf6eb8f892763370d6580621e8f6946 new file mode 100644 index 0000000..5061ce1 Binary files /dev/null and b/Library/Artifacts/ec/ecf6eb8f892763370d6580621e8f6946 differ diff --git a/Library/Artifacts/ec/ecfa12ace0421129a8495fda564268bd b/Library/Artifacts/ec/ecfa12ace0421129a8495fda564268bd new file mode 100644 index 0000000..d0da1ae Binary files /dev/null and b/Library/Artifacts/ec/ecfa12ace0421129a8495fda564268bd differ diff --git a/Library/Artifacts/ed/ed0aaf8c1aabcb1d654484b4568f47be b/Library/Artifacts/ed/ed0aaf8c1aabcb1d654484b4568f47be new file mode 100644 index 0000000..e274ae0 Binary files /dev/null and b/Library/Artifacts/ed/ed0aaf8c1aabcb1d654484b4568f47be differ diff --git a/Library/Artifacts/ed/ed2ad276dafd2dd18196fb9979baa78b b/Library/Artifacts/ed/ed2ad276dafd2dd18196fb9979baa78b new file mode 100644 index 0000000..aa10a9d Binary files /dev/null and b/Library/Artifacts/ed/ed2ad276dafd2dd18196fb9979baa78b differ diff --git a/Library/Artifacts/ed/ed693d74d4f0da5b7db03e5589e02df4 b/Library/Artifacts/ed/ed693d74d4f0da5b7db03e5589e02df4 new file mode 100644 index 0000000..3450603 Binary files /dev/null and b/Library/Artifacts/ed/ed693d74d4f0da5b7db03e5589e02df4 differ diff --git a/Library/Artifacts/ed/ed7d02f6fbf9102319fd1f1cfd258d3e b/Library/Artifacts/ed/ed7d02f6fbf9102319fd1f1cfd258d3e new file mode 100644 index 0000000..6bce9cb Binary files /dev/null and b/Library/Artifacts/ed/ed7d02f6fbf9102319fd1f1cfd258d3e differ diff --git a/Library/Artifacts/ed/edfc74fa0870b6792e4ba6dd7fc2eee5 b/Library/Artifacts/ed/edfc74fa0870b6792e4ba6dd7fc2eee5 new file mode 100644 index 0000000..4ca7c99 Binary files /dev/null and b/Library/Artifacts/ed/edfc74fa0870b6792e4ba6dd7fc2eee5 differ diff --git a/Library/Artifacts/ee/ee28bdaf0547ccf5eb92afc5c5ba0b56 b/Library/Artifacts/ee/ee28bdaf0547ccf5eb92afc5c5ba0b56 new file mode 100644 index 0000000..95b087e Binary files /dev/null and b/Library/Artifacts/ee/ee28bdaf0547ccf5eb92afc5c5ba0b56 differ diff --git a/Library/Artifacts/ee/ee3450c5491902196b095e2da197d56f b/Library/Artifacts/ee/ee3450c5491902196b095e2da197d56f new file mode 100644 index 0000000..0e2876a Binary files /dev/null and b/Library/Artifacts/ee/ee3450c5491902196b095e2da197d56f differ diff --git a/Library/Artifacts/ee/ee4d81c6476a59252af6d952ebe7329e b/Library/Artifacts/ee/ee4d81c6476a59252af6d952ebe7329e new file mode 100644 index 0000000..34dd2ad Binary files /dev/null and b/Library/Artifacts/ee/ee4d81c6476a59252af6d952ebe7329e differ diff --git a/Library/Artifacts/ee/ee7b781eba3009dc7d55ed164afb7360 b/Library/Artifacts/ee/ee7b781eba3009dc7d55ed164afb7360 new file mode 100644 index 0000000..5a68580 Binary files /dev/null and b/Library/Artifacts/ee/ee7b781eba3009dc7d55ed164afb7360 differ diff --git a/Library/Artifacts/ee/eedc52a97e12804abeb956a285f65db3 b/Library/Artifacts/ee/eedc52a97e12804abeb956a285f65db3 new file mode 100644 index 0000000..88e8035 Binary files /dev/null and b/Library/Artifacts/ee/eedc52a97e12804abeb956a285f65db3 differ diff --git a/Library/Artifacts/ee/eeea054cd1446841cae88d2fe0195a4b b/Library/Artifacts/ee/eeea054cd1446841cae88d2fe0195a4b new file mode 100644 index 0000000..23822e8 Binary files /dev/null and b/Library/Artifacts/ee/eeea054cd1446841cae88d2fe0195a4b differ diff --git a/Library/Artifacts/ee/eeeb69033062f8ac56f87fdb1712dab9 b/Library/Artifacts/ee/eeeb69033062f8ac56f87fdb1712dab9 new file mode 100644 index 0000000..ede3871 Binary files /dev/null and b/Library/Artifacts/ee/eeeb69033062f8ac56f87fdb1712dab9 differ diff --git a/Library/Artifacts/ee/eef77647741d148fcc22287a24be3462 b/Library/Artifacts/ee/eef77647741d148fcc22287a24be3462 new file mode 100644 index 0000000..f02b82f Binary files /dev/null and b/Library/Artifacts/ee/eef77647741d148fcc22287a24be3462 differ diff --git a/Library/Artifacts/ef/ef2eeeecf3583df1e5be87ca17f6f9a7 b/Library/Artifacts/ef/ef2eeeecf3583df1e5be87ca17f6f9a7 new file mode 100644 index 0000000..f3be121 Binary files /dev/null and b/Library/Artifacts/ef/ef2eeeecf3583df1e5be87ca17f6f9a7 differ diff --git a/Library/Artifacts/ef/ef9ac1e6224248890caf013ed8a10046 b/Library/Artifacts/ef/ef9ac1e6224248890caf013ed8a10046 new file mode 100644 index 0000000..94c59fb Binary files /dev/null and b/Library/Artifacts/ef/ef9ac1e6224248890caf013ed8a10046 differ diff --git a/Library/Artifacts/ef/efbe409eae444f9aaa1ef9e8b9f23770 b/Library/Artifacts/ef/efbe409eae444f9aaa1ef9e8b9f23770 new file mode 100644 index 0000000..dd57115 Binary files /dev/null and b/Library/Artifacts/ef/efbe409eae444f9aaa1ef9e8b9f23770 differ diff --git a/Library/Artifacts/ef/efcd5feabd3d88493e34141b71a55627 b/Library/Artifacts/ef/efcd5feabd3d88493e34141b71a55627 new file mode 100644 index 0000000..5a86f76 Binary files /dev/null and b/Library/Artifacts/ef/efcd5feabd3d88493e34141b71a55627 differ diff --git a/Library/Artifacts/f0/f00702cacbc5fe87aa2289446e35bc35 b/Library/Artifacts/f0/f00702cacbc5fe87aa2289446e35bc35 new file mode 100644 index 0000000..2289554 Binary files /dev/null and b/Library/Artifacts/f0/f00702cacbc5fe87aa2289446e35bc35 differ diff --git a/Library/Artifacts/f0/f02e9a3d0f056eb75320fd75c1d16c52 b/Library/Artifacts/f0/f02e9a3d0f056eb75320fd75c1d16c52 new file mode 100644 index 0000000..1272900 Binary files /dev/null and b/Library/Artifacts/f0/f02e9a3d0f056eb75320fd75c1d16c52 differ diff --git a/Library/Artifacts/f0/f06a04a2330b7e95bc9e3daa7c9e98ae b/Library/Artifacts/f0/f06a04a2330b7e95bc9e3daa7c9e98ae new file mode 100644 index 0000000..795a132 Binary files /dev/null and b/Library/Artifacts/f0/f06a04a2330b7e95bc9e3daa7c9e98ae differ diff --git a/Library/Artifacts/f0/f0845b1c9b21fbe45d4f45ff57a7db89 b/Library/Artifacts/f0/f0845b1c9b21fbe45d4f45ff57a7db89 new file mode 100644 index 0000000..2708d44 Binary files /dev/null and b/Library/Artifacts/f0/f0845b1c9b21fbe45d4f45ff57a7db89 differ diff --git a/Library/Artifacts/f0/f091619c416b57cb25fcf3998a335c0b b/Library/Artifacts/f0/f091619c416b57cb25fcf3998a335c0b new file mode 100644 index 0000000..e326c89 Binary files /dev/null and b/Library/Artifacts/f0/f091619c416b57cb25fcf3998a335c0b differ diff --git a/Library/Artifacts/f0/f09ea2858492fb0ad6e5e76f9a9d89aa b/Library/Artifacts/f0/f09ea2858492fb0ad6e5e76f9a9d89aa new file mode 100644 index 0000000..6ab6d9b Binary files /dev/null and b/Library/Artifacts/f0/f09ea2858492fb0ad6e5e76f9a9d89aa differ diff --git a/Library/Artifacts/f1/f12de7caf464177e1ba0016d041ea748 b/Library/Artifacts/f1/f12de7caf464177e1ba0016d041ea748 new file mode 100644 index 0000000..a8bd9ca Binary files /dev/null and b/Library/Artifacts/f1/f12de7caf464177e1ba0016d041ea748 differ diff --git a/Library/Artifacts/f1/f16f873bf5febf2db446ba6d75245476 b/Library/Artifacts/f1/f16f873bf5febf2db446ba6d75245476 new file mode 100644 index 0000000..3ffa0ac Binary files /dev/null and b/Library/Artifacts/f1/f16f873bf5febf2db446ba6d75245476 differ diff --git a/Library/Artifacts/f1/f1980659d15a493954c5e78470a586de b/Library/Artifacts/f1/f1980659d15a493954c5e78470a586de new file mode 100644 index 0000000..23a53a8 Binary files /dev/null and b/Library/Artifacts/f1/f1980659d15a493954c5e78470a586de differ diff --git a/Library/Artifacts/f1/f1ac08e48411f7b06fe4af16fb4d9db5 b/Library/Artifacts/f1/f1ac08e48411f7b06fe4af16fb4d9db5 new file mode 100644 index 0000000..bd13f39 Binary files /dev/null and b/Library/Artifacts/f1/f1ac08e48411f7b06fe4af16fb4d9db5 differ diff --git a/Library/Artifacts/f1/f1e65515c2c0f803d3027a20a0477306 b/Library/Artifacts/f1/f1e65515c2c0f803d3027a20a0477306 new file mode 100644 index 0000000..dd920ff Binary files /dev/null and b/Library/Artifacts/f1/f1e65515c2c0f803d3027a20a0477306 differ diff --git a/Library/Artifacts/f2/f202617872c2d0ce01fce17b0b4ca0a2 b/Library/Artifacts/f2/f202617872c2d0ce01fce17b0b4ca0a2 new file mode 100644 index 0000000..1dc970e Binary files /dev/null and b/Library/Artifacts/f2/f202617872c2d0ce01fce17b0b4ca0a2 differ diff --git a/Library/Artifacts/f2/f211426ff36338ad4f79c23cf4d8a2b9 b/Library/Artifacts/f2/f211426ff36338ad4f79c23cf4d8a2b9 new file mode 100644 index 0000000..2464c33 Binary files /dev/null and b/Library/Artifacts/f2/f211426ff36338ad4f79c23cf4d8a2b9 differ diff --git a/Library/Artifacts/f2/f2177e9437ce20ac91deb128ba014f6f b/Library/Artifacts/f2/f2177e9437ce20ac91deb128ba014f6f new file mode 100644 index 0000000..9e6e348 Binary files /dev/null and b/Library/Artifacts/f2/f2177e9437ce20ac91deb128ba014f6f differ diff --git a/Library/Artifacts/f2/f224e6604198a0533b5e58b9d672fc93 b/Library/Artifacts/f2/f224e6604198a0533b5e58b9d672fc93 new file mode 100644 index 0000000..316b33d Binary files /dev/null and b/Library/Artifacts/f2/f224e6604198a0533b5e58b9d672fc93 differ diff --git a/Library/Artifacts/f2/f228052a5d635b166628734a2f111772 b/Library/Artifacts/f2/f228052a5d635b166628734a2f111772 new file mode 100644 index 0000000..1420c72 Binary files /dev/null and b/Library/Artifacts/f2/f228052a5d635b166628734a2f111772 differ diff --git a/Library/Artifacts/f2/f2307e71b6d93d433028411947057872 b/Library/Artifacts/f2/f2307e71b6d93d433028411947057872 new file mode 100644 index 0000000..2e4e8bc Binary files /dev/null and b/Library/Artifacts/f2/f2307e71b6d93d433028411947057872 differ diff --git a/Library/Artifacts/f2/f236d6164ec99112c47442f423bad353 b/Library/Artifacts/f2/f236d6164ec99112c47442f423bad353 new file mode 100644 index 0000000..c4f3653 Binary files /dev/null and b/Library/Artifacts/f2/f236d6164ec99112c47442f423bad353 differ diff --git a/Library/Artifacts/f2/f2682d9663a7511dd04431f93d7e1af8 b/Library/Artifacts/f2/f2682d9663a7511dd04431f93d7e1af8 new file mode 100644 index 0000000..0565491 Binary files /dev/null and b/Library/Artifacts/f2/f2682d9663a7511dd04431f93d7e1af8 differ diff --git a/Library/Artifacts/f2/f26b9da992c64e58abef517484acab3b b/Library/Artifacts/f2/f26b9da992c64e58abef517484acab3b new file mode 100644 index 0000000..4263510 Binary files /dev/null and b/Library/Artifacts/f2/f26b9da992c64e58abef517484acab3b differ diff --git a/Library/Artifacts/f2/f289f3fd07853fb34360624980e9164a b/Library/Artifacts/f2/f289f3fd07853fb34360624980e9164a new file mode 100644 index 0000000..39ed702 Binary files /dev/null and b/Library/Artifacts/f2/f289f3fd07853fb34360624980e9164a differ diff --git a/Library/Artifacts/f2/f2a18b4676192b3360e3e1eab35d22e0 b/Library/Artifacts/f2/f2a18b4676192b3360e3e1eab35d22e0 new file mode 100644 index 0000000..835ce21 Binary files /dev/null and b/Library/Artifacts/f2/f2a18b4676192b3360e3e1eab35d22e0 differ diff --git a/Library/Artifacts/f2/f2e0e71ced9a97915ee9a463db53a360 b/Library/Artifacts/f2/f2e0e71ced9a97915ee9a463db53a360 new file mode 100644 index 0000000..00353fc Binary files /dev/null and b/Library/Artifacts/f2/f2e0e71ced9a97915ee9a463db53a360 differ diff --git a/Library/Artifacts/f2/f2e47f972b078f94ea8c43f53cb543bd b/Library/Artifacts/f2/f2e47f972b078f94ea8c43f53cb543bd new file mode 100644 index 0000000..0217469 Binary files /dev/null and b/Library/Artifacts/f2/f2e47f972b078f94ea8c43f53cb543bd differ diff --git a/Library/Artifacts/f2/f2f226de7e74578de5c48ccfe1cdacfa b/Library/Artifacts/f2/f2f226de7e74578de5c48ccfe1cdacfa new file mode 100644 index 0000000..a26607f Binary files /dev/null and b/Library/Artifacts/f2/f2f226de7e74578de5c48ccfe1cdacfa differ diff --git a/Library/Artifacts/f3/f30ea35af0480485b7dd68e331fd7a26 b/Library/Artifacts/f3/f30ea35af0480485b7dd68e331fd7a26 new file mode 100644 index 0000000..9e05997 Binary files /dev/null and b/Library/Artifacts/f3/f30ea35af0480485b7dd68e331fd7a26 differ diff --git a/Library/Artifacts/f3/f31261bf2ede6dcb0442b7934723d214 b/Library/Artifacts/f3/f31261bf2ede6dcb0442b7934723d214 new file mode 100644 index 0000000..87694ba Binary files /dev/null and b/Library/Artifacts/f3/f31261bf2ede6dcb0442b7934723d214 differ diff --git a/Library/Artifacts/f3/f3430ed44671f499f3cd377253acc918 b/Library/Artifacts/f3/f3430ed44671f499f3cd377253acc918 new file mode 100644 index 0000000..8dfbfb6 Binary files /dev/null and b/Library/Artifacts/f3/f3430ed44671f499f3cd377253acc918 differ diff --git a/Library/Artifacts/f3/f34653fad53327e61bea978fc2e0b305 b/Library/Artifacts/f3/f34653fad53327e61bea978fc2e0b305 new file mode 100644 index 0000000..b1ffaf0 Binary files /dev/null and b/Library/Artifacts/f3/f34653fad53327e61bea978fc2e0b305 differ diff --git a/Library/Artifacts/f3/f35b9348cc95fbeb7beea790620c83f3 b/Library/Artifacts/f3/f35b9348cc95fbeb7beea790620c83f3 new file mode 100644 index 0000000..84b2544 Binary files /dev/null and b/Library/Artifacts/f3/f35b9348cc95fbeb7beea790620c83f3 differ diff --git a/Library/Artifacts/f3/f3628ae6dad1b882dfdb4a832587c413 b/Library/Artifacts/f3/f3628ae6dad1b882dfdb4a832587c413 new file mode 100644 index 0000000..b303543 Binary files /dev/null and b/Library/Artifacts/f3/f3628ae6dad1b882dfdb4a832587c413 differ diff --git a/Library/Artifacts/f3/f3638755206cc2e91fba964e77138afc b/Library/Artifacts/f3/f3638755206cc2e91fba964e77138afc new file mode 100644 index 0000000..062cfa0 Binary files /dev/null and b/Library/Artifacts/f3/f3638755206cc2e91fba964e77138afc differ diff --git a/Library/Artifacts/f3/f36af909b68baef3fe49a4da5811219e b/Library/Artifacts/f3/f36af909b68baef3fe49a4da5811219e new file mode 100644 index 0000000..a827f3a Binary files /dev/null and b/Library/Artifacts/f3/f36af909b68baef3fe49a4da5811219e differ diff --git a/Library/Artifacts/f3/f3c70cee4ff8ab8862bba68a33010c99 b/Library/Artifacts/f3/f3c70cee4ff8ab8862bba68a33010c99 new file mode 100644 index 0000000..5f10282 Binary files /dev/null and b/Library/Artifacts/f3/f3c70cee4ff8ab8862bba68a33010c99 differ diff --git a/Library/Artifacts/f3/f3f2a982747d6ddd9c8d3738c6771777 b/Library/Artifacts/f3/f3f2a982747d6ddd9c8d3738c6771777 new file mode 100644 index 0000000..f5115ad Binary files /dev/null and b/Library/Artifacts/f3/f3f2a982747d6ddd9c8d3738c6771777 differ diff --git a/Library/Artifacts/f4/f42164235ea2d11040e6fd5f3e4b9bfa b/Library/Artifacts/f4/f42164235ea2d11040e6fd5f3e4b9bfa new file mode 100644 index 0000000..d5ed039 Binary files /dev/null and b/Library/Artifacts/f4/f42164235ea2d11040e6fd5f3e4b9bfa differ diff --git a/Library/Artifacts/f4/f425d36b02d57c03e00cc8d2fd77f5db b/Library/Artifacts/f4/f425d36b02d57c03e00cc8d2fd77f5db new file mode 100644 index 0000000..a617a84 Binary files /dev/null and b/Library/Artifacts/f4/f425d36b02d57c03e00cc8d2fd77f5db differ diff --git a/Library/Artifacts/f4/f42eada0f297bb05903d7f8721a010e5 b/Library/Artifacts/f4/f42eada0f297bb05903d7f8721a010e5 new file mode 100644 index 0000000..744f8e9 Binary files /dev/null and b/Library/Artifacts/f4/f42eada0f297bb05903d7f8721a010e5 differ diff --git a/Library/Artifacts/f4/f4518122061e8dce38fdc1f64ae49fda b/Library/Artifacts/f4/f4518122061e8dce38fdc1f64ae49fda new file mode 100644 index 0000000..bf260fd Binary files /dev/null and b/Library/Artifacts/f4/f4518122061e8dce38fdc1f64ae49fda differ diff --git a/Library/Artifacts/f4/f48bbe883bf858e4bb0c7f266dd9a5f0 b/Library/Artifacts/f4/f48bbe883bf858e4bb0c7f266dd9a5f0 new file mode 100644 index 0000000..57d6d23 Binary files /dev/null and b/Library/Artifacts/f4/f48bbe883bf858e4bb0c7f266dd9a5f0 differ diff --git a/Library/Artifacts/f4/f49722526d679efd5eaea5109ae99712 b/Library/Artifacts/f4/f49722526d679efd5eaea5109ae99712 new file mode 100644 index 0000000..a98960a Binary files /dev/null and b/Library/Artifacts/f4/f49722526d679efd5eaea5109ae99712 differ diff --git a/Library/Artifacts/f4/f4a9b6bbd5f72d9ceefdf69ba48aabca b/Library/Artifacts/f4/f4a9b6bbd5f72d9ceefdf69ba48aabca new file mode 100644 index 0000000..e006520 Binary files /dev/null and b/Library/Artifacts/f4/f4a9b6bbd5f72d9ceefdf69ba48aabca differ diff --git a/Library/Artifacts/f4/f4cd3abdb40d2835be9e8e84898165c3 b/Library/Artifacts/f4/f4cd3abdb40d2835be9e8e84898165c3 new file mode 100644 index 0000000..d3bfaf8 Binary files /dev/null and b/Library/Artifacts/f4/f4cd3abdb40d2835be9e8e84898165c3 differ diff --git a/Library/Artifacts/f4/f4df491532798ad4ffce21c5238c12ad b/Library/Artifacts/f4/f4df491532798ad4ffce21c5238c12ad new file mode 100644 index 0000000..02ea9a3 Binary files /dev/null and b/Library/Artifacts/f4/f4df491532798ad4ffce21c5238c12ad differ diff --git a/Library/Artifacts/f5/f53f340afb5afd82c21eda24325d7613 b/Library/Artifacts/f5/f53f340afb5afd82c21eda24325d7613 new file mode 100644 index 0000000..4d14ba1 Binary files /dev/null and b/Library/Artifacts/f5/f53f340afb5afd82c21eda24325d7613 differ diff --git a/Library/Artifacts/f5/f57c8e76981f6f46d9bbc48ee7f56814 b/Library/Artifacts/f5/f57c8e76981f6f46d9bbc48ee7f56814 new file mode 100644 index 0000000..b49e708 Binary files /dev/null and b/Library/Artifacts/f5/f57c8e76981f6f46d9bbc48ee7f56814 differ diff --git a/Library/Artifacts/f5/f59361a829d0df5894b9e2c14ef4a2f1 b/Library/Artifacts/f5/f59361a829d0df5894b9e2c14ef4a2f1 new file mode 100644 index 0000000..54fa50a Binary files /dev/null and b/Library/Artifacts/f5/f59361a829d0df5894b9e2c14ef4a2f1 differ diff --git a/Library/Artifacts/f5/f5ae4b852b3bbba8a4cb6551bdff594e b/Library/Artifacts/f5/f5ae4b852b3bbba8a4cb6551bdff594e new file mode 100644 index 0000000..824663f Binary files /dev/null and b/Library/Artifacts/f5/f5ae4b852b3bbba8a4cb6551bdff594e differ diff --git a/Library/Artifacts/f5/f5c4fa80c70126fba5f8dc08d9cddcfe b/Library/Artifacts/f5/f5c4fa80c70126fba5f8dc08d9cddcfe new file mode 100644 index 0000000..3b1c9ef Binary files /dev/null and b/Library/Artifacts/f5/f5c4fa80c70126fba5f8dc08d9cddcfe differ diff --git a/Library/Artifacts/f6/f6175fd6540b08d00528f25053872094 b/Library/Artifacts/f6/f6175fd6540b08d00528f25053872094 new file mode 100644 index 0000000..0770c25 Binary files /dev/null and b/Library/Artifacts/f6/f6175fd6540b08d00528f25053872094 differ diff --git a/Library/Artifacts/f6/f66df22f45f79bc5a76adb37f99ca827 b/Library/Artifacts/f6/f66df22f45f79bc5a76adb37f99ca827 new file mode 100644 index 0000000..5413265 Binary files /dev/null and b/Library/Artifacts/f6/f66df22f45f79bc5a76adb37f99ca827 differ diff --git a/Library/Artifacts/f6/f69c4ff99b3a222b9ec4e073055cbaf9 b/Library/Artifacts/f6/f69c4ff99b3a222b9ec4e073055cbaf9 new file mode 100644 index 0000000..28c1154 Binary files /dev/null and b/Library/Artifacts/f6/f69c4ff99b3a222b9ec4e073055cbaf9 differ diff --git a/Library/Artifacts/f6/f6a560ffd59eff8af3e3d2182edd27f9 b/Library/Artifacts/f6/f6a560ffd59eff8af3e3d2182edd27f9 new file mode 100644 index 0000000..d1c34b5 Binary files /dev/null and b/Library/Artifacts/f6/f6a560ffd59eff8af3e3d2182edd27f9 differ diff --git a/Library/Artifacts/f7/f7274cf6ca8b359c12d58e6e7e7408f4 b/Library/Artifacts/f7/f7274cf6ca8b359c12d58e6e7e7408f4 new file mode 100644 index 0000000..4e07cce Binary files /dev/null and b/Library/Artifacts/f7/f7274cf6ca8b359c12d58e6e7e7408f4 differ diff --git a/Library/Artifacts/f7/f76a8f73df4285e8131fe384200f6c74 b/Library/Artifacts/f7/f76a8f73df4285e8131fe384200f6c74 new file mode 100644 index 0000000..21f9306 Binary files /dev/null and b/Library/Artifacts/f7/f76a8f73df4285e8131fe384200f6c74 differ diff --git a/Library/Artifacts/f7/f7c3dccb87fe3bce1546fba2b4a43e36 b/Library/Artifacts/f7/f7c3dccb87fe3bce1546fba2b4a43e36 new file mode 100644 index 0000000..9e41f14 Binary files /dev/null and b/Library/Artifacts/f7/f7c3dccb87fe3bce1546fba2b4a43e36 differ diff --git a/Library/Artifacts/f7/f7ccfb326622e2ce75e45a9573ce12f0 b/Library/Artifacts/f7/f7ccfb326622e2ce75e45a9573ce12f0 new file mode 100644 index 0000000..49c1e93 Binary files /dev/null and b/Library/Artifacts/f7/f7ccfb326622e2ce75e45a9573ce12f0 differ diff --git a/Library/Artifacts/f7/f7e7ac583377c8e15742523a664baeb7 b/Library/Artifacts/f7/f7e7ac583377c8e15742523a664baeb7 new file mode 100644 index 0000000..4aceb12 Binary files /dev/null and b/Library/Artifacts/f7/f7e7ac583377c8e15742523a664baeb7 differ diff --git a/Library/Artifacts/f8/f8044753f86401ce4b44fd53fd8a81d0 b/Library/Artifacts/f8/f8044753f86401ce4b44fd53fd8a81d0 new file mode 100644 index 0000000..47506b9 Binary files /dev/null and b/Library/Artifacts/f8/f8044753f86401ce4b44fd53fd8a81d0 differ diff --git a/Library/Artifacts/f8/f819b13ef22b3c859e184523c3deffc6 b/Library/Artifacts/f8/f819b13ef22b3c859e184523c3deffc6 new file mode 100644 index 0000000..9ab6962 Binary files /dev/null and b/Library/Artifacts/f8/f819b13ef22b3c859e184523c3deffc6 differ diff --git a/Library/Artifacts/f8/f81bdfd3e6305537663759a8cf752d39 b/Library/Artifacts/f8/f81bdfd3e6305537663759a8cf752d39 new file mode 100644 index 0000000..dd34bab Binary files /dev/null and b/Library/Artifacts/f8/f81bdfd3e6305537663759a8cf752d39 differ diff --git a/Library/Artifacts/f8/f81e30bf72c62f18b4d415e47ffbab79 b/Library/Artifacts/f8/f81e30bf72c62f18b4d415e47ffbab79 new file mode 100644 index 0000000..4808795 Binary files /dev/null and b/Library/Artifacts/f8/f81e30bf72c62f18b4d415e47ffbab79 differ diff --git a/Library/Artifacts/f8/f82e2ac198e0329f82a248421ee0dc6b b/Library/Artifacts/f8/f82e2ac198e0329f82a248421ee0dc6b new file mode 100644 index 0000000..f0f1792 Binary files /dev/null and b/Library/Artifacts/f8/f82e2ac198e0329f82a248421ee0dc6b differ diff --git a/Library/Artifacts/f8/f835abbe30b6b5f4544c1ac8afedd826 b/Library/Artifacts/f8/f835abbe30b6b5f4544c1ac8afedd826 new file mode 100644 index 0000000..62da41c Binary files /dev/null and b/Library/Artifacts/f8/f835abbe30b6b5f4544c1ac8afedd826 differ diff --git a/Library/Artifacts/f8/f87dafbe497145fe873f49d6caf90a92 b/Library/Artifacts/f8/f87dafbe497145fe873f49d6caf90a92 new file mode 100644 index 0000000..75d34b2 Binary files /dev/null and b/Library/Artifacts/f8/f87dafbe497145fe873f49d6caf90a92 differ diff --git a/Library/Artifacts/f8/f87ea962951188ac3b91a21838c7a14a b/Library/Artifacts/f8/f87ea962951188ac3b91a21838c7a14a new file mode 100644 index 0000000..2210fa7 Binary files /dev/null and b/Library/Artifacts/f8/f87ea962951188ac3b91a21838c7a14a differ diff --git a/Library/Artifacts/f8/f896c2c2abdad50ed8030697b8094923 b/Library/Artifacts/f8/f896c2c2abdad50ed8030697b8094923 new file mode 100644 index 0000000..ebbd157 Binary files /dev/null and b/Library/Artifacts/f8/f896c2c2abdad50ed8030697b8094923 differ diff --git a/Library/Artifacts/f8/f8a6667a2e875bd2f2c7aec8ed418d59 b/Library/Artifacts/f8/f8a6667a2e875bd2f2c7aec8ed418d59 new file mode 100644 index 0000000..5965366 Binary files /dev/null and b/Library/Artifacts/f8/f8a6667a2e875bd2f2c7aec8ed418d59 differ diff --git a/Library/Artifacts/f8/f8b1e4bfae2ba8dbfd9d971dbb8c64b5 b/Library/Artifacts/f8/f8b1e4bfae2ba8dbfd9d971dbb8c64b5 new file mode 100644 index 0000000..02141aa Binary files /dev/null and b/Library/Artifacts/f8/f8b1e4bfae2ba8dbfd9d971dbb8c64b5 differ diff --git a/Library/Artifacts/f8/f8c2dba26200c96ea7bd86f6fcaa24f8 b/Library/Artifacts/f8/f8c2dba26200c96ea7bd86f6fcaa24f8 new file mode 100644 index 0000000..d6c09bb Binary files /dev/null and b/Library/Artifacts/f8/f8c2dba26200c96ea7bd86f6fcaa24f8 differ diff --git a/Library/Artifacts/f8/f8cac4a044d7ab4a6223c1da2405b634 b/Library/Artifacts/f8/f8cac4a044d7ab4a6223c1da2405b634 new file mode 100644 index 0000000..b7b7ef7 Binary files /dev/null and b/Library/Artifacts/f8/f8cac4a044d7ab4a6223c1da2405b634 differ diff --git a/Library/Artifacts/f8/f8ed0abe2bb57065ac79f2c99e636f48 b/Library/Artifacts/f8/f8ed0abe2bb57065ac79f2c99e636f48 new file mode 100644 index 0000000..50381c8 Binary files /dev/null and b/Library/Artifacts/f8/f8ed0abe2bb57065ac79f2c99e636f48 differ diff --git a/Library/Artifacts/f9/f9075ce0f07b40dfddb2790f6e1c2eb5 b/Library/Artifacts/f9/f9075ce0f07b40dfddb2790f6e1c2eb5 new file mode 100644 index 0000000..0b0c07a Binary files /dev/null and b/Library/Artifacts/f9/f9075ce0f07b40dfddb2790f6e1c2eb5 differ diff --git a/Library/Artifacts/f9/f934ad3ec259e442045763fa27043bf7 b/Library/Artifacts/f9/f934ad3ec259e442045763fa27043bf7 new file mode 100644 index 0000000..b5c6836 Binary files /dev/null and b/Library/Artifacts/f9/f934ad3ec259e442045763fa27043bf7 differ diff --git a/Library/Artifacts/f9/f9500b26ba3e0933d1f8538937d38650 b/Library/Artifacts/f9/f9500b26ba3e0933d1f8538937d38650 new file mode 100644 index 0000000..d0b3169 Binary files /dev/null and b/Library/Artifacts/f9/f9500b26ba3e0933d1f8538937d38650 differ diff --git a/Library/Artifacts/f9/f95e8c3bd4cc3a66af0f6eb85f769d49 b/Library/Artifacts/f9/f95e8c3bd4cc3a66af0f6eb85f769d49 new file mode 100644 index 0000000..b9b8f6a Binary files /dev/null and b/Library/Artifacts/f9/f95e8c3bd4cc3a66af0f6eb85f769d49 differ diff --git a/Library/Artifacts/f9/f963009259235c101ddd696d9ea4bd76 b/Library/Artifacts/f9/f963009259235c101ddd696d9ea4bd76 new file mode 100644 index 0000000..88bccdb Binary files /dev/null and b/Library/Artifacts/f9/f963009259235c101ddd696d9ea4bd76 differ diff --git a/Library/Artifacts/f9/f969a4a601276eb3bee8ded0e146624f b/Library/Artifacts/f9/f969a4a601276eb3bee8ded0e146624f new file mode 100644 index 0000000..1f6bf31 Binary files /dev/null and b/Library/Artifacts/f9/f969a4a601276eb3bee8ded0e146624f differ diff --git a/Library/Artifacts/f9/f97326c9fe74e41c784316e74cb3a069 b/Library/Artifacts/f9/f97326c9fe74e41c784316e74cb3a069 new file mode 100644 index 0000000..048117b Binary files /dev/null and b/Library/Artifacts/f9/f97326c9fe74e41c784316e74cb3a069 differ diff --git a/Library/Artifacts/f9/f99caf3dc64af3e23a1c65c6959929a2 b/Library/Artifacts/f9/f99caf3dc64af3e23a1c65c6959929a2 new file mode 100644 index 0000000..250c4f8 Binary files /dev/null and b/Library/Artifacts/f9/f99caf3dc64af3e23a1c65c6959929a2 differ diff --git a/Library/Artifacts/fa/fa1ec13152c6eeafb13eaf7362adff4e b/Library/Artifacts/fa/fa1ec13152c6eeafb13eaf7362adff4e new file mode 100644 index 0000000..3d2d5c0 Binary files /dev/null and b/Library/Artifacts/fa/fa1ec13152c6eeafb13eaf7362adff4e differ diff --git a/Library/Artifacts/fa/fa40db706e389ced03eb443413b1be23 b/Library/Artifacts/fa/fa40db706e389ced03eb443413b1be23 new file mode 100644 index 0000000..589de94 Binary files /dev/null and b/Library/Artifacts/fa/fa40db706e389ced03eb443413b1be23 differ diff --git a/Library/Artifacts/fa/fa4ef6900a5d769dc7f5a69872cdfb92 b/Library/Artifacts/fa/fa4ef6900a5d769dc7f5a69872cdfb92 new file mode 100644 index 0000000..2bcf499 Binary files /dev/null and b/Library/Artifacts/fa/fa4ef6900a5d769dc7f5a69872cdfb92 differ diff --git a/Library/Artifacts/fa/fa5cc878462ed5be4624a839dfa8ca17 b/Library/Artifacts/fa/fa5cc878462ed5be4624a839dfa8ca17 new file mode 100644 index 0000000..3856aef Binary files /dev/null and b/Library/Artifacts/fa/fa5cc878462ed5be4624a839dfa8ca17 differ diff --git a/Library/Artifacts/fa/fa6c35879fca9dd43eb2ca5280fcac61 b/Library/Artifacts/fa/fa6c35879fca9dd43eb2ca5280fcac61 new file mode 100644 index 0000000..c6ca807 Binary files /dev/null and b/Library/Artifacts/fa/fa6c35879fca9dd43eb2ca5280fcac61 differ diff --git a/Library/Artifacts/fa/fa6ed7867d78b4c74939626f556067b1 b/Library/Artifacts/fa/fa6ed7867d78b4c74939626f556067b1 new file mode 100644 index 0000000..ff85195 Binary files /dev/null and b/Library/Artifacts/fa/fa6ed7867d78b4c74939626f556067b1 differ diff --git a/Library/Artifacts/fa/fa6f859785ad0f62ad0002d874de3be3 b/Library/Artifacts/fa/fa6f859785ad0f62ad0002d874de3be3 new file mode 100644 index 0000000..f9a3389 Binary files /dev/null and b/Library/Artifacts/fa/fa6f859785ad0f62ad0002d874de3be3 differ diff --git a/Library/Artifacts/fa/fa9d4218bc89ab57530025f2729835d0 b/Library/Artifacts/fa/fa9d4218bc89ab57530025f2729835d0 new file mode 100644 index 0000000..cc8072d Binary files /dev/null and b/Library/Artifacts/fa/fa9d4218bc89ab57530025f2729835d0 differ diff --git a/Library/Artifacts/fa/faafb2fc3be02fec46cfa5c129fd57b6 b/Library/Artifacts/fa/faafb2fc3be02fec46cfa5c129fd57b6 new file mode 100644 index 0000000..f9dff94 Binary files /dev/null and b/Library/Artifacts/fa/faafb2fc3be02fec46cfa5c129fd57b6 differ diff --git a/Library/Artifacts/fa/fab07503f847d0c7156d5a20f9f350dd b/Library/Artifacts/fa/fab07503f847d0c7156d5a20f9f350dd new file mode 100644 index 0000000..8280b95 Binary files /dev/null and b/Library/Artifacts/fa/fab07503f847d0c7156d5a20f9f350dd differ diff --git a/Library/Artifacts/fa/fab71c43052832b687f5d0977febfacb b/Library/Artifacts/fa/fab71c43052832b687f5d0977febfacb new file mode 100644 index 0000000..0235b52 Binary files /dev/null and b/Library/Artifacts/fa/fab71c43052832b687f5d0977febfacb differ diff --git a/Library/Artifacts/fa/fac302cc821140f0b9351b13235b0834 b/Library/Artifacts/fa/fac302cc821140f0b9351b13235b0834 new file mode 100644 index 0000000..32fe95b Binary files /dev/null and b/Library/Artifacts/fa/fac302cc821140f0b9351b13235b0834 differ diff --git a/Library/Artifacts/fa/fac39ea653e0d530f1ce2d995dd48c73 b/Library/Artifacts/fa/fac39ea653e0d530f1ce2d995dd48c73 new file mode 100644 index 0000000..89649ee Binary files /dev/null and b/Library/Artifacts/fa/fac39ea653e0d530f1ce2d995dd48c73 differ diff --git a/Library/Artifacts/fa/fad4d0eaeae112d867393eecf09817e7 b/Library/Artifacts/fa/fad4d0eaeae112d867393eecf09817e7 new file mode 100644 index 0000000..b4ef869 Binary files /dev/null and b/Library/Artifacts/fa/fad4d0eaeae112d867393eecf09817e7 differ diff --git a/Library/Artifacts/fa/fae17abefa72fac7dfadba8937b46dcb b/Library/Artifacts/fa/fae17abefa72fac7dfadba8937b46dcb new file mode 100644 index 0000000..0c6fbb9 Binary files /dev/null and b/Library/Artifacts/fa/fae17abefa72fac7dfadba8937b46dcb differ diff --git a/Library/Artifacts/fa/fae65ed39ada4fe86eba38332e7b3173 b/Library/Artifacts/fa/fae65ed39ada4fe86eba38332e7b3173 new file mode 100644 index 0000000..d116268 Binary files /dev/null and b/Library/Artifacts/fa/fae65ed39ada4fe86eba38332e7b3173 differ diff --git a/Library/Artifacts/fb/fb01dd32902c56ab4219b81935b00490 b/Library/Artifacts/fb/fb01dd32902c56ab4219b81935b00490 new file mode 100644 index 0000000..4895318 Binary files /dev/null and b/Library/Artifacts/fb/fb01dd32902c56ab4219b81935b00490 differ diff --git a/Library/Artifacts/fb/fb02eff1e4c31f72334f7b76733c1946 b/Library/Artifacts/fb/fb02eff1e4c31f72334f7b76733c1946 new file mode 100644 index 0000000..40992f3 Binary files /dev/null and b/Library/Artifacts/fb/fb02eff1e4c31f72334f7b76733c1946 differ diff --git a/Library/Artifacts/fb/fb12cfadc7634b417c972b82b7746769 b/Library/Artifacts/fb/fb12cfadc7634b417c972b82b7746769 new file mode 100644 index 0000000..6f79ca5 Binary files /dev/null and b/Library/Artifacts/fb/fb12cfadc7634b417c972b82b7746769 differ diff --git a/Library/Artifacts/fb/fb18d210b6d094e0e4532d763389fe82 b/Library/Artifacts/fb/fb18d210b6d094e0e4532d763389fe82 new file mode 100644 index 0000000..22aa57f Binary files /dev/null and b/Library/Artifacts/fb/fb18d210b6d094e0e4532d763389fe82 differ diff --git a/Library/Artifacts/fb/fb1d71e2cd07e161f0a5b253a128c49c b/Library/Artifacts/fb/fb1d71e2cd07e161f0a5b253a128c49c new file mode 100644 index 0000000..45659bb Binary files /dev/null and b/Library/Artifacts/fb/fb1d71e2cd07e161f0a5b253a128c49c differ diff --git a/Library/Artifacts/fb/fb3ab62a99f6e9474be14996f1f1f9f5 b/Library/Artifacts/fb/fb3ab62a99f6e9474be14996f1f1f9f5 new file mode 100644 index 0000000..b1fcc33 Binary files /dev/null and b/Library/Artifacts/fb/fb3ab62a99f6e9474be14996f1f1f9f5 differ diff --git a/Library/Artifacts/fb/fb42c995c482c7db59b82905cd128694 b/Library/Artifacts/fb/fb42c995c482c7db59b82905cd128694 new file mode 100644 index 0000000..80d2221 Binary files /dev/null and b/Library/Artifacts/fb/fb42c995c482c7db59b82905cd128694 differ diff --git a/Library/Artifacts/fb/fb4a28467b25c541a208e5779dafcb5b b/Library/Artifacts/fb/fb4a28467b25c541a208e5779dafcb5b new file mode 100644 index 0000000..18de23d Binary files /dev/null and b/Library/Artifacts/fb/fb4a28467b25c541a208e5779dafcb5b differ diff --git a/Library/Artifacts/fb/fb59d33362e7be9dc280cbd6cf1ad5d7 b/Library/Artifacts/fb/fb59d33362e7be9dc280cbd6cf1ad5d7 new file mode 100644 index 0000000..3c26d74 Binary files /dev/null and b/Library/Artifacts/fb/fb59d33362e7be9dc280cbd6cf1ad5d7 differ diff --git a/Library/Artifacts/fb/fba1b42bfb6ffa218599469dd6725b89 b/Library/Artifacts/fb/fba1b42bfb6ffa218599469dd6725b89 new file mode 100644 index 0000000..bf10ba7 Binary files /dev/null and b/Library/Artifacts/fb/fba1b42bfb6ffa218599469dd6725b89 differ diff --git a/Library/Artifacts/fb/fbc2de8039c9856979fa410520ac267d b/Library/Artifacts/fb/fbc2de8039c9856979fa410520ac267d new file mode 100644 index 0000000..80a9a99 Binary files /dev/null and b/Library/Artifacts/fb/fbc2de8039c9856979fa410520ac267d differ diff --git a/Library/Artifacts/fb/fbd84cc2d50ece3b486c6150220a623d b/Library/Artifacts/fb/fbd84cc2d50ece3b486c6150220a623d new file mode 100644 index 0000000..fd79893 Binary files /dev/null and b/Library/Artifacts/fb/fbd84cc2d50ece3b486c6150220a623d differ diff --git a/Library/Artifacts/fc/fc145d667dd11396d2164d9f7c2322ef b/Library/Artifacts/fc/fc145d667dd11396d2164d9f7c2322ef new file mode 100644 index 0000000..b5bfbdd Binary files /dev/null and b/Library/Artifacts/fc/fc145d667dd11396d2164d9f7c2322ef differ diff --git a/Library/Artifacts/fc/fc24c2bbc1d8db0975f2bc77c89cd155 b/Library/Artifacts/fc/fc24c2bbc1d8db0975f2bc77c89cd155 new file mode 100644 index 0000000..f1ac60f Binary files /dev/null and b/Library/Artifacts/fc/fc24c2bbc1d8db0975f2bc77c89cd155 differ diff --git a/Library/Artifacts/fc/fc33073da773b804ebc9e1e9f19b0977 b/Library/Artifacts/fc/fc33073da773b804ebc9e1e9f19b0977 new file mode 100644 index 0000000..2cd5aa2 Binary files /dev/null and b/Library/Artifacts/fc/fc33073da773b804ebc9e1e9f19b0977 differ diff --git a/Library/Artifacts/fc/fc452b80f5fb9f9099bd24be8dcffef2 b/Library/Artifacts/fc/fc452b80f5fb9f9099bd24be8dcffef2 new file mode 100644 index 0000000..2b33255 Binary files /dev/null and b/Library/Artifacts/fc/fc452b80f5fb9f9099bd24be8dcffef2 differ diff --git a/Library/Artifacts/fc/fc4c1572293016e616973a3e96c7deae b/Library/Artifacts/fc/fc4c1572293016e616973a3e96c7deae new file mode 100644 index 0000000..62bf4cf Binary files /dev/null and b/Library/Artifacts/fc/fc4c1572293016e616973a3e96c7deae differ diff --git a/Library/Artifacts/fc/fc5c770cd672c07d05937280fbd62b82 b/Library/Artifacts/fc/fc5c770cd672c07d05937280fbd62b82 new file mode 100644 index 0000000..b743969 Binary files /dev/null and b/Library/Artifacts/fc/fc5c770cd672c07d05937280fbd62b82 differ diff --git a/Library/Artifacts/fc/fc6474af022677df5e88f3a9ba5ab7dc b/Library/Artifacts/fc/fc6474af022677df5e88f3a9ba5ab7dc new file mode 100644 index 0000000..cc57eb5 Binary files /dev/null and b/Library/Artifacts/fc/fc6474af022677df5e88f3a9ba5ab7dc differ diff --git a/Library/Artifacts/fc/fc6feb7626df851817e1612c43a23680 b/Library/Artifacts/fc/fc6feb7626df851817e1612c43a23680 new file mode 100644 index 0000000..966aac2 Binary files /dev/null and b/Library/Artifacts/fc/fc6feb7626df851817e1612c43a23680 differ diff --git a/Library/Artifacts/fc/fc8bb2ff00460c1941e4856c71f89355 b/Library/Artifacts/fc/fc8bb2ff00460c1941e4856c71f89355 new file mode 100644 index 0000000..5732817 Binary files /dev/null and b/Library/Artifacts/fc/fc8bb2ff00460c1941e4856c71f89355 differ diff --git a/Library/Artifacts/fc/fc98ed8003149a9c2719d10c45cc478c b/Library/Artifacts/fc/fc98ed8003149a9c2719d10c45cc478c new file mode 100644 index 0000000..b08c344 Binary files /dev/null and b/Library/Artifacts/fc/fc98ed8003149a9c2719d10c45cc478c differ diff --git a/Library/Artifacts/fc/fca17cff38bd99c0fbeef59d4bf306dc b/Library/Artifacts/fc/fca17cff38bd99c0fbeef59d4bf306dc new file mode 100644 index 0000000..881e639 Binary files /dev/null and b/Library/Artifacts/fc/fca17cff38bd99c0fbeef59d4bf306dc differ diff --git a/Library/Artifacts/fc/fca4f19ca80aa66c33119696b313849c b/Library/Artifacts/fc/fca4f19ca80aa66c33119696b313849c new file mode 100644 index 0000000..a039446 Binary files /dev/null and b/Library/Artifacts/fc/fca4f19ca80aa66c33119696b313849c differ diff --git a/Library/Artifacts/fc/fcc73cc7b70b9d0a2ac85050a5d1062a b/Library/Artifacts/fc/fcc73cc7b70b9d0a2ac85050a5d1062a new file mode 100644 index 0000000..bff4b95 Binary files /dev/null and b/Library/Artifacts/fc/fcc73cc7b70b9d0a2ac85050a5d1062a differ diff --git a/Library/Artifacts/fc/fcefe457280e1b20bf2912badccf6bf8 b/Library/Artifacts/fc/fcefe457280e1b20bf2912badccf6bf8 new file mode 100644 index 0000000..5da373d Binary files /dev/null and b/Library/Artifacts/fc/fcefe457280e1b20bf2912badccf6bf8 differ diff --git a/Library/Artifacts/fd/fd0ca9f75c87950bfa082f955c7741d5 b/Library/Artifacts/fd/fd0ca9f75c87950bfa082f955c7741d5 new file mode 100644 index 0000000..af06ca6 Binary files /dev/null and b/Library/Artifacts/fd/fd0ca9f75c87950bfa082f955c7741d5 differ diff --git a/Library/Artifacts/fd/fd7085faef90b0bbe88b5451f1c83656 b/Library/Artifacts/fd/fd7085faef90b0bbe88b5451f1c83656 new file mode 100644 index 0000000..bc28ee8 Binary files /dev/null and b/Library/Artifacts/fd/fd7085faef90b0bbe88b5451f1c83656 differ diff --git a/Library/Artifacts/fd/fd88996fe3f491a7a2b2f04219a8b294 b/Library/Artifacts/fd/fd88996fe3f491a7a2b2f04219a8b294 new file mode 100644 index 0000000..92136fc Binary files /dev/null and b/Library/Artifacts/fd/fd88996fe3f491a7a2b2f04219a8b294 differ diff --git a/Library/Artifacts/fd/fda2f2694dc64205ddd0b986f34f98d6 b/Library/Artifacts/fd/fda2f2694dc64205ddd0b986f34f98d6 new file mode 100644 index 0000000..017d168 Binary files /dev/null and b/Library/Artifacts/fd/fda2f2694dc64205ddd0b986f34f98d6 differ diff --git a/Library/Artifacts/fd/fdbc2faf383f1edb0e2b542c022811cd b/Library/Artifacts/fd/fdbc2faf383f1edb0e2b542c022811cd new file mode 100644 index 0000000..d14e7e2 Binary files /dev/null and b/Library/Artifacts/fd/fdbc2faf383f1edb0e2b542c022811cd differ diff --git a/Library/Artifacts/fd/fdcc6f79c4f16e4fa401b942f2535214 b/Library/Artifacts/fd/fdcc6f79c4f16e4fa401b942f2535214 new file mode 100644 index 0000000..13e6972 Binary files /dev/null and b/Library/Artifacts/fd/fdcc6f79c4f16e4fa401b942f2535214 differ diff --git a/Library/Artifacts/fd/fdd26b85aa3b46525587860f7aab3885 b/Library/Artifacts/fd/fdd26b85aa3b46525587860f7aab3885 new file mode 100644 index 0000000..f40a6ad Binary files /dev/null and b/Library/Artifacts/fd/fdd26b85aa3b46525587860f7aab3885 differ diff --git a/Library/Artifacts/fd/fde0bd2ffcf51882c1c58054a57c94bd b/Library/Artifacts/fd/fde0bd2ffcf51882c1c58054a57c94bd new file mode 100644 index 0000000..8fde5c3 Binary files /dev/null and b/Library/Artifacts/fd/fde0bd2ffcf51882c1c58054a57c94bd differ diff --git a/Library/Artifacts/fd/fde74b51e76f0c75a0864c588affd360 b/Library/Artifacts/fd/fde74b51e76f0c75a0864c588affd360 new file mode 100644 index 0000000..a8971a1 Binary files /dev/null and b/Library/Artifacts/fd/fde74b51e76f0c75a0864c588affd360 differ diff --git a/Library/Artifacts/fe/fe2055a65fcc0fb242dc9dc30f35ce77 b/Library/Artifacts/fe/fe2055a65fcc0fb242dc9dc30f35ce77 new file mode 100644 index 0000000..6aeed11 Binary files /dev/null and b/Library/Artifacts/fe/fe2055a65fcc0fb242dc9dc30f35ce77 differ diff --git a/Library/Artifacts/fe/fe3705b98c3193a609ec3901efc98d98 b/Library/Artifacts/fe/fe3705b98c3193a609ec3901efc98d98 new file mode 100644 index 0000000..8d4813b Binary files /dev/null and b/Library/Artifacts/fe/fe3705b98c3193a609ec3901efc98d98 differ diff --git a/Library/Artifacts/fe/fe4dee993b356eac923b7f3187bf1052 b/Library/Artifacts/fe/fe4dee993b356eac923b7f3187bf1052 new file mode 100644 index 0000000..6fb4954 Binary files /dev/null and b/Library/Artifacts/fe/fe4dee993b356eac923b7f3187bf1052 differ diff --git a/Library/Artifacts/fe/fe7cd3dedbfc6f42f32fa8f5600d320d b/Library/Artifacts/fe/fe7cd3dedbfc6f42f32fa8f5600d320d new file mode 100644 index 0000000..1aed25c Binary files /dev/null and b/Library/Artifacts/fe/fe7cd3dedbfc6f42f32fa8f5600d320d differ diff --git a/Library/Artifacts/fe/fea4ac43047f7c4f5a4c3fbab9431bb0 b/Library/Artifacts/fe/fea4ac43047f7c4f5a4c3fbab9431bb0 new file mode 100644 index 0000000..e7d9f9c Binary files /dev/null and b/Library/Artifacts/fe/fea4ac43047f7c4f5a4c3fbab9431bb0 differ diff --git a/Library/Artifacts/fe/fea5e47c3da40764529674ebbb925057 b/Library/Artifacts/fe/fea5e47c3da40764529674ebbb925057 new file mode 100644 index 0000000..ead6cc1 Binary files /dev/null and b/Library/Artifacts/fe/fea5e47c3da40764529674ebbb925057 differ diff --git a/Library/Artifacts/fe/fed9537608397a55a823976099392bb2 b/Library/Artifacts/fe/fed9537608397a55a823976099392bb2 new file mode 100644 index 0000000..3011172 Binary files /dev/null and b/Library/Artifacts/fe/fed9537608397a55a823976099392bb2 differ diff --git a/Library/Artifacts/fe/fefe7ce2aa942966ee713d7a8be29b91 b/Library/Artifacts/fe/fefe7ce2aa942966ee713d7a8be29b91 new file mode 100644 index 0000000..cde6ead Binary files /dev/null and b/Library/Artifacts/fe/fefe7ce2aa942966ee713d7a8be29b91 differ diff --git a/Library/Artifacts/ff/ff05a35f7854e15718666281d16a6c80 b/Library/Artifacts/ff/ff05a35f7854e15718666281d16a6c80 new file mode 100644 index 0000000..bad2245 Binary files /dev/null and b/Library/Artifacts/ff/ff05a35f7854e15718666281d16a6c80 differ diff --git a/Library/Artifacts/ff/ff08910b779457d53ba365791ad4e73d b/Library/Artifacts/ff/ff08910b779457d53ba365791ad4e73d new file mode 100644 index 0000000..ffa893b Binary files /dev/null and b/Library/Artifacts/ff/ff08910b779457d53ba365791ad4e73d differ diff --git a/Library/Artifacts/ff/ff3501bfd520ae14383428586e256d07 b/Library/Artifacts/ff/ff3501bfd520ae14383428586e256d07 new file mode 100644 index 0000000..de24ad9 Binary files /dev/null and b/Library/Artifacts/ff/ff3501bfd520ae14383428586e256d07 differ diff --git a/Library/Artifacts/ff/ff47b1b2f93218bee583c92542510735 b/Library/Artifacts/ff/ff47b1b2f93218bee583c92542510735 new file mode 100644 index 0000000..5e3c113 Binary files /dev/null and b/Library/Artifacts/ff/ff47b1b2f93218bee583c92542510735 differ diff --git a/Library/Artifacts/ff/ff49020d126d47b9c0e0a3ecc33e74a7 b/Library/Artifacts/ff/ff49020d126d47b9c0e0a3ecc33e74a7 new file mode 100644 index 0000000..ba7e9a9 Binary files /dev/null and b/Library/Artifacts/ff/ff49020d126d47b9c0e0a3ecc33e74a7 differ diff --git a/Library/Artifacts/ff/ff6a43b925451e79711acd382def3c44 b/Library/Artifacts/ff/ff6a43b925451e79711acd382def3c44 new file mode 100644 index 0000000..394877f Binary files /dev/null and b/Library/Artifacts/ff/ff6a43b925451e79711acd382def3c44 differ diff --git a/Library/Artifacts/ff/ffb87e486bc7a9a5369cee4801e442bb b/Library/Artifacts/ff/ffb87e486bc7a9a5369cee4801e442bb new file mode 100644 index 0000000..2ab4cee Binary files /dev/null and b/Library/Artifacts/ff/ffb87e486bc7a9a5369cee4801e442bb differ diff --git a/Library/Artifacts/ff/ffd0557ed2ff801d48559b2c482b2ad3 b/Library/Artifacts/ff/ffd0557ed2ff801d48559b2c482b2ad3 new file mode 100644 index 0000000..4266eca Binary files /dev/null and b/Library/Artifacts/ff/ffd0557ed2ff801d48559b2c482b2ad3 differ diff --git a/Library/Artifacts/ff/ffe0c8e34c0e02a5d046c44208bb50d6 b/Library/Artifacts/ff/ffe0c8e34c0e02a5d046c44208bb50d6 new file mode 100644 index 0000000..4e1642f Binary files /dev/null and b/Library/Artifacts/ff/ffe0c8e34c0e02a5d046c44208bb50d6 differ diff --git a/Library/AssetImportState b/Library/AssetImportState new file mode 100644 index 0000000..21c67d7 --- /dev/null +++ b/Library/AssetImportState @@ -0,0 +1 @@ +-2;0;0;0;-1 \ No newline at end of file diff --git a/Library/BuildPlayer.prefs b/Library/BuildPlayer.prefs new file mode 100644 index 0000000..e69de29 diff --git a/Library/BuildSettings.asset b/Library/BuildSettings.asset new file mode 100644 index 0000000..ba3bcfd Binary files /dev/null and b/Library/BuildSettings.asset differ diff --git a/Library/CurrentLayout-default.dwlt b/Library/CurrentLayout-default.dwlt new file mode 100644 index 0000000..71256cb --- /dev/null +++ b/Library/CurrentLayout-default.dwlt @@ -0,0 +1,939 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12004, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_PixelRect: + serializedVersion: 2 + x: 0 + y: 73 + width: 1280 + height: 647 + m_ShowMode: 4 + m_Title: Project + m_RootView: {fileID: 2} + m_MinSize: {x: 875, y: 300} + m_MaxSize: {x: 10000, y: 10000} + m_Maximized: 1 +--- !u!114 &2 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12008, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 3} + - {fileID: 5} + - {fileID: 4} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1280 + height: 647 + m_MinSize: {x: 875, y: 300} + m_MaxSize: {x: 10000, y: 10000} +--- !u!114 &3 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12011, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1280 + height: 30 + m_MinSize: {x: 0, y: 0} + m_MaxSize: {x: 0, y: 0} + m_LastLoadedLayoutName: +--- !u!114 &4 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12042, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 627 + width: 1280 + height: 20 + m_MinSize: {x: 0, y: 0} + m_MaxSize: {x: 0, y: 0} +--- !u!114 &5 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 6} + - {fileID: 7} + - {fileID: 10} + m_Position: + serializedVersion: 2 + x: 0 + y: 30 + width: 1280 + height: 597 + m_MinSize: {x: 709, y: 492} + m_MaxSize: {x: 18004, y: 14042} + vertical: 0 + controlID: 96 +--- !u!114 &6 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: GameView + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 733 + height: 597 + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_ActualView: {fileID: 12} + m_Panes: + - {fileID: 12} + - {fileID: 13} + - {fileID: 11} + - {fileID: 14} + - {fileID: 15} + - {fileID: 17} + m_Selected: 0 + m_LastSelected: 5 +--- !u!114 &7 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 8} + - {fileID: 9} + m_Position: + serializedVersion: 2 + x: 733 + y: 0 + width: 232 + height: 597 + m_MinSize: {x: 232, y: 492} + m_MaxSize: {x: 10002, y: 14042} + vertical: 1 + controlID: 44 +--- !u!114 &8 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: SceneHierarchyWindow + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 232 + height: 282 + m_MinSize: {x: 202, y: 221} + m_MaxSize: {x: 4002, y: 4021} + m_ActualView: {fileID: 16} + m_Panes: + - {fileID: 16} + m_Selected: 0 + m_LastSelected: 0 +--- !u!114 &9 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: ProjectBrowser + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 282 + width: 232 + height: 315 + m_MinSize: {x: 232, y: 271} + m_MaxSize: {x: 10002, y: 10021} + m_ActualView: {fileID: 18} + m_Panes: + - {fileID: 18} + - {fileID: 19} + m_Selected: 0 + m_LastSelected: 0 +--- !u!114 &10 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: InspectorWindow + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 965 + y: 0 + width: 315 + height: 597 + m_MinSize: {x: 276, y: 71} + m_MaxSize: {x: 4001, y: 4021} + m_ActualView: {fileID: 20} + m_Panes: + - {fileID: 20} + - {fileID: 21} + m_Selected: 0 + m_LastSelected: 1 +--- !u!114 &11 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13854, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 300, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Project Settings + m_Image: {fileID: -5712115415447495865, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 0 + y: 103 + width: 661 + height: 576 + m_ViewDataDictionary: {fileID: 0} + m_PosLeft: {x: 0, y: 0} + m_PosRight: {x: 0, y: 0} + m_Scope: 1 + m_SplitterFlex: 0.19477911 +--- !u!114 &12 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12015, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Game + m_Image: {fileID: -6423792434712278376, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 0 + y: 103 + width: 732 + height: 576 + m_ViewDataDictionary: {fileID: 0} + m_SerializedViewsNames: [] + m_SerializedViewsValues: [] + m_PlayModeViewName: GameView + m_ShowGizmos: 0 + m_TargetDisplay: 0 + m_ClearColor: {r: 0, g: 0, b: 0, a: 0} + m_TargetSize: {x: 732, y: 555} + m_TextureFilterMode: 0 + m_TextureHideFlags: 61 + m_RenderIMGUI: 1 + m_MaximizeOnPlay: 0 + m_VSyncEnabled: 0 + m_Gizmos: 0 + m_Stats: 0 + m_SelectedSizes: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 + m_ZoomArea: + m_HRangeLocked: 0 + m_VRangeLocked: 0 + hZoomLockedByDefault: 0 + vZoomLockedByDefault: 0 + m_HBaseRangeMin: -366 + m_HBaseRangeMax: 366 + m_VBaseRangeMin: -277.5 + m_VBaseRangeMax: 277.5 + m_HAllowExceedBaseRangeMin: 1 + m_HAllowExceedBaseRangeMax: 1 + m_VAllowExceedBaseRangeMin: 1 + m_VAllowExceedBaseRangeMax: 1 + m_ScaleWithWindow: 0 + m_HSlider: 0 + m_VSlider: 0 + m_IgnoreScrollWheelUntilClicked: 0 + m_EnableMouseInput: 1 + m_EnableSliderZoomHorizontal: 0 + m_EnableSliderZoomVertical: 0 + m_UniformScale: 1 + m_UpDirection: 1 + m_DrawArea: + serializedVersion: 2 + x: 0 + y: 21 + width: 732 + height: 555 + m_Scale: {x: 1, y: 1} + m_Translation: {x: 366, y: 277.5} + m_MarginLeft: 0 + m_MarginRight: 0 + m_MarginTop: 0 + m_MarginBottom: 0 + m_LastShownAreaInsideMargins: + serializedVersion: 2 + x: -366 + y: -277.5 + width: 732 + height: 555 + m_MinimalGUI: 1 + m_defaultScale: 1 + m_LastWindowPixelSize: {x: 732, y: 576} + m_ClearInEditMode: 1 + m_NoCameraWarning: 1 + m_LowResolutionForAspectRatios: 01000000000100000101 + m_XRRenderMode: 0 + m_RenderTexture: {fileID: 0} +--- !u!114 &13 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12013, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Scene + m_Image: {fileID: 2593428753322112591, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 0 + y: 103 + width: 732 + height: 576 + m_ViewDataDictionary: {fileID: 0} + m_ShowContextualTools: 0 + m_WindowGUID: ef38e75046bd08a4fa41255c31f82bbe + m_Gizmos: 0 + m_SceneIsLit: 0 + m_SceneLighting: 1 + m_2DMode: 0 + m_isRotationLocked: 0 + m_PlayAudio: 0 + m_AudioPlay: 0 + m_Position: + m_Target: {x: 0.03390503, y: -0.11697388, z: -0.02947998} + speed: 2 + m_Value: {x: 0.03390503, y: -0.11697388, z: -0.02947998} + m_RenderMode: 0 + m_CameraMode: + drawMode: 0 + name: Shaded + section: Shading Mode + m_ValidateTrueMetals: 0 + m_DoValidateTrueMetals: 0 + m_ExposureSliderValue: 0 + m_ExposureSliderMax: 10 + m_SceneViewState: + showFog: 0 + showMaterialUpdate: 0 + showSkybox: 0 + showFlares: 0 + showImageEffects: 0 + showParticleSystems: 0 + m_Grid: + xGrid: + m_Fade: + m_Target: 0 + speed: 2 + m_Value: 0 + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Pivot: {x: 0, y: 0, z: 0} + m_Size: {x: 0, y: 0} + yGrid: + m_Fade: + m_Target: 1 + speed: 2 + m_Value: 1 + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Pivot: {x: 0, y: 0, z: 0} + m_Size: {x: 1, y: 1} + zGrid: + m_Fade: + m_Target: 0 + speed: 2 + m_Value: 1 + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Pivot: {x: 0, y: 0, z: 0} + m_Size: {x: 1, y: 1} + m_ShowGrid: 1 + m_GridAxis: 1 + m_gridOpacity: 0.5 + m_Rotation: + m_Target: {x: -0.11193799, y: -0.07564929, z: 0.008547075, w: -0.9908049} + speed: 2 + m_Value: {x: -0.11193686, y: -0.075648524, z: 0.0085469885, w: -0.9907949} + m_Size: + m_Target: 0.35521138 + speed: 2 + m_Value: 0.35521138 + m_Ortho: + m_Target: 1 + speed: 2 + m_Value: 1 + m_CameraSettings: + m_Speed: 1 + m_SpeedNormalized: 0.49748743 + m_SpeedMin: 0.01 + m_SpeedMax: 2 + m_EasingEnabled: 1 + m_EasingDuration: 0.4 + m_AccelerationEnabled: 1 + m_FieldOfView: 90 + m_NearClip: 0.03 + m_FarClip: 10000 + m_DynamicClip: 1 + m_OcclusionCulling: 0 + m_LastSceneViewRotation: {x: 0, y: 0, z: 0, w: 0} + m_LastSceneViewOrtho: 0 + m_ReplacementShader: {fileID: 0} + m_ReplacementString: + m_SceneVisActive: 1 + m_LastLockedObject: {fileID: 0} + m_ViewIsLockedToObject: 0 +--- !u!114 &14 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12111, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 400, y: 100} + m_MaxSize: {x: 2048, y: 2048} + m_TitleContent: + m_Text: Asset Store + m_Image: {fileID: -8693916549880196297, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 0 + y: 103 + width: 661 + height: 576 + m_ViewDataDictionary: {fileID: 0} +--- !u!114 &15 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13953, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 700, y: 250} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Package Manager + m_Image: {fileID: -2824328813065806953, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 0 + y: 103 + width: 661 + height: 576 + m_ViewDataDictionary: {fileID: 0} + m_SplitPaneLeftWidth: 240 +--- !u!114 &16 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Hierarchy + m_Image: {fileID: 7966133145522015247, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 733 + y: 103 + width: 230 + height: 261 + m_ViewDataDictionary: {fileID: 0} + m_SceneHierarchy: + m_TreeViewState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: f0350000 + m_LastClickedID: 13808 + m_ExpandedIDs: 60fbffff + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 0 + m_ClientGUIView: {fileID: 8} + m_SearchString: + m_ExpandedScenes: [] + m_CurrenRootInstanceID: 0 + m_LockTracker: + m_IsLocked: 0 + m_CurrentSortingName: TransformSorting + m_WindowGUID: 34cc8f3d68d8d134792b4358ac27df63 +--- !u!114 &17 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12003, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 100, y: 100} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Console + m_Image: {fileID: -4327648978806127646, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 0 + y: 103 + width: 732 + height: 576 + m_ViewDataDictionary: {fileID: 0} +--- !u!114 &18 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 230, y: 250} + m_MaxSize: {x: 10000, y: 10000} + m_TitleContent: + m_Text: Project + m_Image: {fileID: -5467254957812901981, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 733 + y: 385 + width: 230 + height: 294 + m_ViewDataDictionary: {fileID: 0} + m_SearchFilter: + m_NameFilter: + m_ClassNames: [] + m_AssetLabels: [] + m_AssetBundleNames: [] + m_VersionControlStates: [] + m_SoftLockControlStates: [] + m_ReferencingInstanceIDs: + m_SceneHandles: + m_ShowAllHits: 0 + m_SkipHidden: 0 + m_SearchArea: 1 + m_Folders: [] + m_ViewMode: 0 + m_StartGridSize: 64 + m_LastFolders: [] + m_LastFoldersGridSize: -1 + m_LastProjectPath: C:\dofdev\Pixelgon + m_LockTracker: + m_IsLocked: 0 + m_FolderTreeState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: 22310000 + m_LastClickedID: 12578 + m_ExpandedIDs: 0000000086360000883600008a3600008c3600008e36000090360000 + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 0} + m_SearchString: + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_AssetTreeState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: + m_LastClickedID: 0 + m_ExpandedIDs: ffffffff0000000086360000883600008a3600008c3600008e36000090360000 + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 9} + m_SearchString: + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_ListAreaState: + m_SelectedInstanceIDs: + m_LastClickedInstanceID: 0 + m_HadKeyboardFocusLastEvent: 0 + m_ExpandedInstanceIDs: c6230000 + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 0} + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_NewAssetIndexInList: -1 + m_ScrollPosition: {x: 0, y: 0} + m_GridSize: 64 + m_SkipHiddenPackages: 0 + m_DirectoriesAreaWidth: 115 +--- !u!114 &19 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12373, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 100, y: 100} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Audio Mixer + m_Image: {fileID: 2344599766593239149, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 725 + y: 518 + width: 387 + height: 491 + m_ViewDataDictionary: {fileID: 0} + m_MixersTreeState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: + m_LastClickedID: 13150 + m_ExpandedIDs: 12eb343c + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 0 + m_ClientGUIView: {fileID: 0} + m_SearchString: + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_LayoutStripsOnTop: + m_VerticalSplitter: + ID: 0 + splitterInitialOffset: 0 + currentActiveSplitter: -1 + realSizes: 4100000023000000 + relativeSizes: + - 0.65 + - 0.35000002 + minSizes: 5500000069000000 + maxSizes: 0000000000000000 + lastTotalSize: 0 + splitSize: 6 + xOffset: 0 + m_HorizontalSplitter: + ID: 0 + splitterInitialOffset: 0 + currentActiveSplitter: -1 + realSizes: 3c0000003c0000003c0000003c000000 + relativeSizes: + - 0.25 + - 0.25 + - 0.25 + - 0.25 + minSizes: 55000000550000005500000055000000 + maxSizes: 00000000000000000000000000000000 + lastTotalSize: 0 + splitSize: 6 + xOffset: 0 + m_LayoutStripsOnRight: + m_VerticalSplitter: + ID: 0 + splitterInitialOffset: 0 + currentActiveSplitter: -1 + realSizes: 3c0000003c0000003c0000003c000000 + relativeSizes: + - 0.25 + - 0.25 + - 0.25 + - 0.25 + minSizes: 64000000550000005500000055000000 + maxSizes: 00000000000000000000000000000000 + lastTotalSize: 0 + splitSize: 6 + xOffset: 0 + m_HorizontalSplitter: + ID: 152 + splitterInitialOffset: 0 + currentActiveSplitter: -1 + realSizes: a0000000e4000000 + relativeSizes: + - 0.3 + - 0.7 + minSizes: a0000000a0000000 + maxSizes: 0000000000000000 + lastTotalSize: 388 + splitSize: 6 + xOffset: -1 + m_SectionOrder: 00000000030000000100000002000000 + m_LayoutMode: 1 + m_SortGroupsAlphabetically: 0 + m_ShowReferencedBuses: 1 + m_ShowBusConnections: 0 + m_ShowBusConnectionsOfSelection: 0 +--- !u!114 &20 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 275, y: 50} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Inspector + m_Image: {fileID: -2667387946076563598, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 965 + y: 103 + width: 314 + height: 576 + m_ViewDataDictionary: {fileID: 0} + m_OpenAddComponentMenu: 0 + m_ObjectsLockedBeforeSerialization: [] + m_InstanceIDsLockedBeforeSerialization: + m_LockTracker: + m_IsLocked: 0 + m_PreviewResizer: + m_CachedPref: -160 + m_ControlHash: -371814159 + m_PrefName: Preview_InspectorPreview + m_PreviewWindow: {fileID: 0} + m_LastInspectedObjectInstanceID: -1 + m_LastVerticalScrollValue: 496 +--- !u!114 &21 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12079, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 390, y: 390} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Lighting + m_Image: {fileID: -1347227620855488341, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 894 + y: 103 + width: 385 + height: 576 + m_ViewDataDictionary: {fileID: 0} diff --git a/Library/EditorOnlyScriptingSettings.json b/Library/EditorOnlyScriptingSettings.json new file mode 100644 index 0000000..8e1824c --- /dev/null +++ b/Library/EditorOnlyScriptingSettings.json @@ -0,0 +1 @@ +{"m_DefineSymbols":[],"m_AllowUnsafeCode":false} \ No newline at end of file diff --git a/Library/EditorSnapSettings.asset b/Library/EditorSnapSettings.asset new file mode 100644 index 0000000..7a90624 --- /dev/null +++ b/Library/EditorSnapSettings.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13954, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_SnapEnabled: 0 + m_SnapSettings: + m_SnapValue: {x: 0.25, y: 0.25, z: 0.25} + m_SnapMultiplier: {x: 2048, y: 2048, z: 2048} + m_Rotation: 15 + m_Scale: 1 diff --git a/Library/EditorUserBuildSettings.asset b/Library/EditorUserBuildSettings.asset new file mode 100644 index 0000000..83fdc3e Binary files /dev/null and b/Library/EditorUserBuildSettings.asset differ diff --git a/Library/EditorUserSettings.asset b/Library/EditorUserSettings.asset new file mode 100644 index 0000000..4681d1d --- /dev/null +++ b/Library/EditorUserSettings.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!162 &1 +EditorUserSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_ConfigSettings: + vcSharedLogLevel: + value: 0d5e400f0650 + flags: 0 + m_VCAutomaticAdd: 1 + m_VCDebugCom: 0 + m_VCDebugCmd: 0 + m_VCDebugOut: 0 + m_SemanticMergeMode: 2 + m_VCShowFailedCheckout: 1 + m_VCOverwriteFailedCheckoutAssets: 1 + m_VCOverlayIcons: 1 + m_VCAllowAsyncUpdate: 0 diff --git a/Library/InspectorExpandedItems.asset b/Library/InspectorExpandedItems.asset new file mode 100644 index 0000000..bedf041 Binary files /dev/null and b/Library/InspectorExpandedItems.asset differ diff --git a/Library/LastSceneManagerSetup.txt b/Library/LastSceneManagerSetup.txt new file mode 100644 index 0000000..ea7e7ee --- /dev/null +++ b/Library/LastSceneManagerSetup.txt @@ -0,0 +1,5 @@ +sceneSetups: +- path: Assets/Scenes/Main.unity + isLoaded: 1 + isActive: 1 + isSubScene: 0 diff --git a/Library/LibraryFormatVersion.txt b/Library/LibraryFormatVersion.txt new file mode 100644 index 0000000..6185f09 --- /dev/null +++ b/Library/LibraryFormatVersion.txt @@ -0,0 +1,2 @@ +unityRebuildLibraryVersion: 11 +unityForwardCompatibleVersion: 40 diff --git a/Library/MonoManager.asset b/Library/MonoManager.asset new file mode 100644 index 0000000..9776f45 Binary files /dev/null and b/Library/MonoManager.asset differ diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/.npmignore b/Library/PackageCache/com.unity.collab-proxy@1.2.16/.npmignore new file mode 100644 index 0000000..1586aea --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/.npmignore @@ -0,0 +1,6 @@ + +automation/** +utr_output/** +.Editor/** +.yamato/** +*.zip* \ No newline at end of file diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md b/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md new file mode 100644 index 0000000..3c6c85d --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md @@ -0,0 +1,31 @@ +# Changelog +All notable changes to this package will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [1.2.16] - 2019-02-11 +Update stylesheet to pass USS validation + +## [1.2.15] - 2018-11-16 +Added support for non-experimental UIElements. + +## [1.2.11] - 2018-09-04 +Made some performance improvements to reduce impact on ReloadAssemblies. + +## [1.2.9] - 2018-08-13 +Test issues for the Collab History Window are now fixed. + +## [1.2.7] - 2018-08-07 +Toolbar drop-down will no longer show up when package is uninstalled. + +## [1.2.6] - 2018-06-15 +Fixed an issue where Collab's History window wouldn't load properly. + +## [1.2.5] - 2018-05-21 +This is the first release of *Unity Package CollabProxy*. + +### Added +- Collab history and toolbar windows +- Collab view and presenter classes +- Collab Editor tests for view and presenter diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md.meta new file mode 100644 index 0000000..38274a6 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 782c49e6e68074dc7ba12c95537825ce +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md b/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md new file mode 100644 index 0000000..57808d5 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md @@ -0,0 +1,9 @@ + + + + Unity.CollabProxy.Dependencies + 1.1.0-experimental + Rohit Garg + Dependencies for the CollabProxy package + + diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md.meta new file mode 100644 index 0000000..24e45c2 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 470530e667ad4475786b28fa3187ce95 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Documentation~/collab-proxy.md b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Documentation~/collab-proxy.md new file mode 100644 index 0000000..c1800d6 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Documentation~/collab-proxy.md @@ -0,0 +1,5 @@ +# About Unity Collaborate + +Collaborate is a simple way for teams to save, share, and sync their Unity project. + +Please refer to the online documentation [here.](https://docs.unity3d.com/Manual/UnityCollaborate.html) \ No newline at end of file diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor.meta new file mode 100644 index 0000000..b54ca87 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d31e5d760880a4e52a3a75322481d0d2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs new file mode 100644 index 0000000..d7266b6 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; +using UnityEngine; + +[assembly: InternalsVisibleTo("Unity.CollabProxy.EditorTests")] diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs.meta new file mode 100644 index 0000000..e384b31 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d4ef26aa386b44923b61c9c4b505a67c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab.meta new file mode 100644 index 0000000..694fc4e --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c18cb9388313e4287ad5895ee735c47d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs new file mode 100644 index 0000000..029ce1c --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs @@ -0,0 +1,24 @@ +using UnityEditor; +using UnityEditor.Collaboration; +using UnityEngine; + +namespace CollabProxy.UI +{ + [InitializeOnLoad] + public class Bootstrap + { + private const float kCollabToolbarButtonWidth = 78.0f; + + static Bootstrap() + { + Collab.ShowHistoryWindow = CollabHistoryWindow.ShowHistoryWindow; + Collab.ShowToolbarAtPosition = CollabToolbarWindow.ShowCenteredAtPosition; + Collab.IsToolbarVisible = CollabToolbarWindow.IsVisible; + Collab.CloseToolbar = CollabToolbarWindow.CloseToolbar; + Toolbar.AddSubToolbar(new CollabToolbarButton + { + Width = kCollabToolbarButtonWidth + }); + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs.meta new file mode 100644 index 0000000..641d54b --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8aa8171e088f94069bbd1978a053f7dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs new file mode 100644 index 0000000..c7f90aa --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs @@ -0,0 +1,21 @@ +using System; + +namespace UnityEditor.Collaboration +{ + internal static class CollabAnalytics + { + [Serializable] + private struct CollabUserActionAnalyticsEvent + { + public string category; + public string action; + } + + public static void SendUserAction(string category, string action) + { + EditorAnalytics.SendCollabUserAction(new CollabUserActionAnalyticsEvent() { category = category, action = action }); + } + + public static readonly string historyCategoryString = "History"; + }; +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs.meta new file mode 100644 index 0000000..2f46e9b --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f944311c8fff2479fa3ba741f6039fc8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs new file mode 100644 index 0000000..b855bce --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs @@ -0,0 +1,330 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using UnityEditor.Collaboration; + +#if UNITY_2019_1_OR_NEWER +using UnityEditor.UIElements; +using UnityEngine.UIElements; +#else +using UnityEditor.Experimental.UIElements; +using UnityEngine.Experimental.UIElements; +using UnityEngine.Experimental.UIElements.StyleEnums; +#endif + +using UnityEngine; +using UnityEditor.Connect; + +namespace UnityEditor +{ + internal class CollabHistoryWindow : EditorWindow, ICollabHistoryWindow + { +#if UNITY_2019_1_OR_NEWER + private const string ResourcesPath = "Packages/com.unity.collab-proxy/Editor/Resources/Styles/"; +#else + private const string ResourcesPath = "StyleSheets/"; +#endif + + + const string kWindowTitle = "Collab History"; + const string kServiceUrl = "developer.cloud.unity3d.com"; + + [MenuItem("Window/Asset Management/Collab History", false, 1)] + public static void ShowHistoryWindow() + { + EditorWindow.GetWindow(kWindowTitle); + } + + [MenuItem("Window/Asset Management/Collab History", true)] + public static bool ValidateShowHistoryWindow() + { + return Collab.instance.IsCollabEnabledForCurrentProject(); + } + + CollabHistoryPresenter m_Presenter; + Dictionary m_Views; + List m_HistoryItems = new List(); + HistoryState m_State; + VisualElement m_Container; + PagedListView m_Pager; + ScrollView m_HistoryView; + int m_ItemsPerPage = 5; + string m_InProgressRev; + bool m_RevisionActionsEnabled; + + public CollabHistoryWindow() + { + minSize = new Vector2(275, 50); + } + + public void OnEnable() + { + SetupGUI(); + name = "CollabHistory"; + + if (m_Presenter == null) + { + m_Presenter = new CollabHistoryPresenter(this, new CollabHistoryItemFactory(), new RevisionsService(Collab.instance, UnityConnect.instance)); + } + m_Presenter.OnWindowEnabled(); + } + + public void OnDisable() + { + m_Presenter.OnWindowDisabled(); + } + + public bool revisionActionsEnabled + { + get { return m_RevisionActionsEnabled; } + set + { + if (m_RevisionActionsEnabled == value) + return; + + m_RevisionActionsEnabled = value; + foreach (var historyItem in m_HistoryItems) + { + historyItem.RevisionActionsEnabled = value; + } + } + } + + private void AddStyleSheetPath(VisualElement root, string path) + { +#if UNITY_2019_1_OR_NEWER + root.styleSheets.Add(EditorGUIUtility.Load(path) as StyleSheet); +#else + root.AddStyleSheetPath(path); +#endif + } + + + public void SetupGUI() + { +#if UNITY_2019_1_OR_NEWER + var root = this.rootVisualElement; +#else + var root = this.GetRootVisualContainer(); +#endif + AddStyleSheetPath(root, ResourcesPath + "CollabHistoryCommon.uss"); + if (EditorGUIUtility.isProSkin) + { + AddStyleSheetPath(root, ResourcesPath + "CollabHistoryDark.uss"); + } + else + { + AddStyleSheetPath(root, ResourcesPath + "CollabHistoryLight.uss"); + } + + m_Container = new VisualElement(); + m_Container.StretchToParentSize(); + root.Add(m_Container); + + m_Pager = new PagedListView() + { + name = "PagedElement", + pageSize = m_ItemsPerPage + }; + + var errorView = new StatusView() + { + message = "An Error Occurred", + icon = EditorGUIUtility.LoadIconRequired("Collab.Warning") as Texture, + }; + + var noInternetView = new StatusView() + { + message = "No Internet Connection", + icon = EditorGUIUtility.LoadIconRequired("Collab.NoInternet") as Texture, + }; + + var maintenanceView = new StatusView() + { + message = "Maintenance", + }; + + var loginView = new StatusView() + { + message = "Sign in to access Collaborate", + buttonText = "Sign in...", + callback = SignInClick, + }; + + var noSeatView = new StatusView() + { + message = "Ask your project owner for access to Unity Teams", + buttonText = "Learn More", + callback = NoSeatClick, + }; + + var waitingView = new StatusView() + { + message = "Updating...", + }; + + m_HistoryView = new ScrollView() { name = "HistoryContainer", showHorizontal = false}; + m_HistoryView.contentContainer.StretchToParentWidth(); + m_HistoryView.Add(m_Pager); + + m_Views = new Dictionary() + { + {HistoryState.Error, errorView}, + {HistoryState.Offline, noInternetView}, + {HistoryState.Maintenance, maintenanceView}, + {HistoryState.LoggedOut, loginView}, + {HistoryState.NoSeat, noSeatView}, + {HistoryState.Waiting, waitingView}, + {HistoryState.Ready, m_HistoryView} + }; + } + + public void UpdateState(HistoryState state, bool force) + { + if (state == m_State && !force) + return; + + m_State = state; + switch (state) + { + case HistoryState.Ready: + UpdateHistoryView(m_Pager); + break; + case HistoryState.Disabled: + Close(); + return; + } + + m_Container.Clear(); + m_Container.Add(m_Views[m_State]); + } + + public void UpdateRevisions(IEnumerable datas, string tip, int totalRevisions, int currentPage) + { + var elements = new List(); + var isFullDateObtained = false; // Has everything from this date been obtained? + m_HistoryItems.Clear(); + + if (datas != null) + { + DateTime currentDate = DateTime.MinValue; + foreach (var data in datas) + { + if (data.timeStamp.Date != currentDate.Date) + { + elements.Add(new CollabHistoryRevisionLine(data.timeStamp, isFullDateObtained)); + currentDate = data.timeStamp; + } + + var item = new CollabHistoryItem(data); + m_HistoryItems.Add(item); + + var container = new VisualElement(); + container.style.flexDirection = FlexDirection.Row; + if (data.current) + { + isFullDateObtained = true; + container.AddToClassList("currentRevision"); + container.AddToClassList("obtainedRevision"); + } + else if (data.obtained) + { + container.AddToClassList("obtainedRevision"); + } + else + { + container.AddToClassList("absentRevision"); + } + // If we use the index as-is, the latest commit will become #1, but we want it to be last + container.Add(new CollabHistoryRevisionLine(data.index)); + container.Add(item); + elements.Add(container); + } + } + + m_HistoryView.scrollOffset = new Vector2(0, 0); + m_Pager.totalItems = totalRevisions; + m_Pager.curPage = currentPage; + m_Pager.items = elements; + } + + public string inProgressRevision + { + get { return m_InProgressRev; } + set + { + m_InProgressRev = value; + foreach (var historyItem in m_HistoryItems) + { + historyItem.SetInProgressStatus(value); + } + } + } + + public int itemsPerPage + { + set + { + if (m_ItemsPerPage == value) + return; + m_Pager.pageSize = m_ItemsPerPage; + } + } + + public PageChangeAction OnPageChangeAction + { + set { m_Pager.OnPageChanged = value; } + } + + public RevisionAction OnGoBackAction + { + set { CollabHistoryItem.s_OnGoBack = value; } + } + + public RevisionAction OnUpdateAction + { + set { CollabHistoryItem.s_OnUpdate = value; } + } + + public RevisionAction OnRestoreAction + { + set { CollabHistoryItem.s_OnRestore = value; } + } + + public ShowBuildAction OnShowBuildAction + { + set { CollabHistoryItem.s_OnShowBuild = value; } + } + + public Action OnShowServicesAction + { + set { CollabHistoryItem.s_OnShowServices = value; } + } + + void UpdateHistoryView(VisualElement history) + { + } + + void NoSeatClick() + { + var connection = UnityConnect.instance; + var env = connection.GetEnvironment(); + // Map environment to url - prod is special + if (env == "production") + env = ""; + else + env += "-"; + + var url = "https://" + env + kServiceUrl + + "/orgs/" + connection.GetOrganizationId() + + "/projects/" + connection.GetProjectName() + + "/unity-teams/"; + Application.OpenURL(url); + } + + void SignInClick() + { + UnityConnect.instance.ShowLogin(); + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs.meta new file mode 100644 index 0000000..74358d4 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fed9dda667cab45d398d06402bba03f4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs new file mode 100644 index 0000000..eebe4ac --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs @@ -0,0 +1,297 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor.Collaboration; +using UnityEditor.Connect; +using UnityEditor.Web; +using UnityEngine; + +namespace UnityEditor +{ + internal class CollabToolbarButton : SubToolbar, IDisposable + { + // Must match s_CollabIcon array + enum CollabToolbarState + { + NeedToEnableCollab, + UpToDate, + Conflict, + OperationError, + ServerHasChanges, + FilesToPush, + InProgress, + Disabled, + Offline + } + + private class CollabToolbarContent + { + readonly string m_iconName; + readonly string m_toolTip; + readonly CollabToolbarState m_state; + + static Dictionary m_CollabIcons; + + public CollabToolbarState RegisteredForState + { + get { return m_state; } + } + + public GUIContent GuiContent + { + get + { + if (m_CollabIcons == null) + { + m_CollabIcons = new Dictionary(); + } + + if (!m_CollabIcons.ContainsKey(this)) + { + m_CollabIcons.Add(this, EditorGUIUtility.TrTextContentWithIcon("Collab", m_toolTip, m_iconName)); + } + + return m_CollabIcons[this]; + } + } + + public CollabToolbarContent(CollabToolbarState state, string iconName, string toolTip) + { + m_state = state; + m_iconName = iconName; + m_toolTip = toolTip; + } + } + + CollabToolbarContent[] m_toolbarContents; + CollabToolbarState m_CollabToolbarState = CollabToolbarState.UpToDate; + const float kCollabButtonWidth = 78.0f; + ButtonWithAnimatedIconRotation m_CollabButton; + string m_DynamicTooltip; + static bool m_ShowCollabTooltip = false; + + private GUIContent currentCollabContent + { + get + { + CollabToolbarContent toolbarContent = + m_toolbarContents.FirstOrDefault(c => c.RegisteredForState.Equals(m_CollabToolbarState)); + GUIContent content = new GUIContent(toolbarContent == null? m_toolbarContents.First().GuiContent : toolbarContent.GuiContent); + if (!m_ShowCollabTooltip) + { + content.tooltip = null; + } + else if (m_DynamicTooltip != "") + { + content.tooltip = m_DynamicTooltip; + } + + if (Collab.instance.AreTestsRunning()) + { + content.text = "CTF"; + } + + return content; + } + } + + public CollabToolbarButton() + { + m_toolbarContents = new[] + { + new CollabToolbarContent(CollabToolbarState.NeedToEnableCollab, "CollabNew", " You need to enable collab."), + new CollabToolbarContent(CollabToolbarState.UpToDate, "Collab", " You are up to date."), + new CollabToolbarContent(CollabToolbarState.Conflict, "CollabConflict", " Please fix your conflicts prior to publishing."), + new CollabToolbarContent(CollabToolbarState.OperationError, "CollabError", " Last operation failed. Please retry later."), + new CollabToolbarContent(CollabToolbarState.ServerHasChanges, "CollabPull", " Please update, there are server changes."), + new CollabToolbarContent(CollabToolbarState.FilesToPush, "CollabPush", " You have files to publish."), + new CollabToolbarContent(CollabToolbarState.InProgress, "CollabProgress", " Operation in progress."), + new CollabToolbarContent(CollabToolbarState.Disabled, "CollabNew", " Collab is disabled."), + new CollabToolbarContent(CollabToolbarState.Offline, "CollabNew", " Please check your network connection.") + }; + + Collab.instance.StateChanged += OnCollabStateChanged; + UnityConnect.instance.StateChanged += OnUnityConnectStateChanged; + UnityConnect.instance.UserStateChanged += OnUnityConnectUserStateChanged; + } + + void OnUnityConnectUserStateChanged(UserInfo state) + { + UpdateCollabToolbarState(); + } + + void OnUnityConnectStateChanged(ConnectInfo state) + { + UpdateCollabToolbarState(); + } + + public override void OnGUI(Rect rect) + { + DoCollabDropDown(rect); + } + + Rect GUIToScreenRect(Rect guiRect) + { + Vector2 screenPoint = GUIUtility.GUIToScreenPoint(new Vector2(guiRect.x, guiRect.y)); + guiRect.x = screenPoint.x; + guiRect.y = screenPoint.y; + return guiRect; + } + + void ShowPopup(Rect rect) + { + // window should be centered on the button + ReserveRight(kCollabButtonWidth / 2, ref rect); + ReserveBottom(5, ref rect); + // calculate screen rect before saving assets since it might open the AssetSaveDialog window + var screenRect = GUIToScreenRect(rect); + // save all the assets + AssetDatabase.SaveAssets(); + if (Collab.ShowToolbarAtPosition != null && Collab.ShowToolbarAtPosition(screenRect)) + { + GUIUtility.ExitGUI(); + } + } + + void DoCollabDropDown(Rect rect) + { + UpdateCollabToolbarState(); + GUIStyle collabButtonStyle = "OffsetDropDown"; + bool showPopup = Toolbar.requestShowCollabToolbar; + Toolbar.requestShowCollabToolbar = false; + + bool enable = !EditorApplication.isPlaying; + + using (new EditorGUI.DisabledScope(!enable)) + { + bool animate = m_CollabToolbarState == CollabToolbarState.InProgress; + + EditorGUIUtility.SetIconSize(new Vector2(12, 12)); + if (GetCollabButton().OnGUI(rect, currentCollabContent, animate, collabButtonStyle)) + { + showPopup = true; + } + EditorGUIUtility.SetIconSize(Vector2.zero); + } + + if (m_CollabToolbarState == CollabToolbarState.Disabled) + return; + + if (showPopup) + { + ShowPopup(rect); + } + } + + public void OnCollabStateChanged(CollabInfo info) + { + UpdateCollabToolbarState(); + } + + public void UpdateCollabToolbarState() + { + var currentCollabState = CollabToolbarState.UpToDate; + bool networkAvailable = UnityConnect.instance.connectInfo.online && UnityConnect.instance.connectInfo.loggedIn; + m_DynamicTooltip = ""; + + if (UnityConnect.instance.isDisableCollabWindow) + { + currentCollabState = CollabToolbarState.Disabled; + } + else if (networkAvailable) + { + Collab collab = Collab.instance; + CollabInfo currentInfo = collab.collabInfo; + UnityErrorInfo errInfo; + bool error = false; + if (collab.GetError((UnityConnect.UnityErrorFilter.ByContext | UnityConnect.UnityErrorFilter.ByChild), out errInfo)) + { + error = (errInfo.priority <= (int)UnityConnect.UnityErrorPriority.Error); + m_DynamicTooltip = errInfo.shortMsg; + } + + if (!currentInfo.ready) + { + currentCollabState = CollabToolbarState.InProgress; + } + else if (error) + { + currentCollabState = CollabToolbarState.OperationError; + } + else if (currentInfo.inProgress) + { + currentCollabState = CollabToolbarState.InProgress; + } + else + { + bool collabEnable = Collab.instance.IsCollabEnabledForCurrentProject(); + + if (UnityConnect.instance.projectInfo.projectBound == false || !collabEnable) + { + currentCollabState = CollabToolbarState.NeedToEnableCollab; + } + else if (currentInfo.update) + { + currentCollabState = CollabToolbarState.ServerHasChanges; + } + else if (currentInfo.conflict) + { + currentCollabState = CollabToolbarState.Conflict; + } + else if (currentInfo.publish) + { + currentCollabState = CollabToolbarState.FilesToPush; + } + } + } + else + { + currentCollabState = CollabToolbarState.Offline; + } + + if (Collab.IsToolbarVisible != null) + { + if (currentCollabState != m_CollabToolbarState || + Collab.IsToolbarVisible() == m_ShowCollabTooltip) + { + m_CollabToolbarState = currentCollabState; + m_ShowCollabTooltip = !Collab.IsToolbarVisible(); + Toolbar.RepaintToolbar(); + } + } + } + + void ReserveRight(float width, ref Rect pos) + { + pos.x += width; + } + + void ReserveBottom(float height, ref Rect pos) + { + pos.y += height; + } + + ButtonWithAnimatedIconRotation GetCollabButton() + { + if (m_CollabButton == null) + { + const int repaintsPerSecond = 20; + const float animSpeed = 500f; + const bool mouseDownButton = true; + m_CollabButton = new ButtonWithAnimatedIconRotation(() => (float)EditorApplication.timeSinceStartup * animSpeed, Toolbar.RepaintToolbar, repaintsPerSecond, mouseDownButton); + } + + return m_CollabButton; + } + + public void Dispose() + { + Collab.instance.StateChanged -= OnCollabStateChanged; + UnityConnect.instance.StateChanged -= OnUnityConnectStateChanged; + UnityConnect.instance.UserStateChanged -= OnUnityConnectUserStateChanged; + + if (m_CollabButton != null) + m_CollabButton.Clear(); + } + } +} // namespace \ No newline at end of file diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs.meta new file mode 100644 index 0000000..949d8db --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 882f1a4147a284f028899b9c018e63eb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs new file mode 100644 index 0000000..2793875 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs @@ -0,0 +1,137 @@ +using UnityEngine; +using UnityEditor.Collaboration; +using UnityEditor.Web; +using UnityEditor.Connect; + +namespace UnityEditor +{ + [InitializeOnLoad] + internal class WebViewStatic : ScriptableSingleton + { + [SerializeField] + WebView m_WebView; + + static public WebView GetWebView() + { + return instance.m_WebView; + } + + static public void SetWebView(WebView webView) + { + instance.m_WebView = webView; + } + } + + [InitializeOnLoad] + internal class CollabToolbarWindow : WebViewEditorStaticWindow, IHasCustomMenu + { + internal override WebView webView + { + get {return WebViewStatic.GetWebView(); } + set {WebViewStatic.SetWebView(value); } + } + + private const string kWindowName = "Unity Collab Toolbar"; + + private static long s_LastClosedTime; + private static CollabToolbarWindow s_CollabToolbarWindow; + + public static bool s_ToolbarIsVisible = false; + + const int kWindowWidth = 320; + const int kWindowHeight = 350; + + public static void CloseToolbar() + { + foreach (CollabToolbarWindow window in Resources.FindObjectsOfTypeAll()) + window.Close(); + } + + [MenuItem("Window/Asset Management/Collab Toolbar", false /*IsValidateFunction*/, 2, true /* IsInternalMenu */)] + public static CollabToolbarWindow ShowToolbarWindow() + { + //Create a new window if it does not exist + if (s_CollabToolbarWindow == null) + { + s_CollabToolbarWindow = GetWindow(false, kWindowName) as CollabToolbarWindow; + } + + return s_CollabToolbarWindow; + } + + [MenuItem("Window/Asset Management/Collab Toolbar", true /*IsValidateFunction*/)] + public static bool ValidateShowToolbarWindow() + { + return true; + } + + public static bool IsVisible() + { + return s_ToolbarIsVisible; + } + + public static bool ShowCenteredAtPosition(Rect buttonRect) + { + buttonRect.x -= kWindowWidth / 2; + // We could not use realtimeSinceStartUp since it is set to 0 when entering/exitting playmode, we assume an increasing time when comparing time. + long nowMilliSeconds = System.DateTime.Now.Ticks / System.TimeSpan.TicksPerMillisecond; + bool justClosed = nowMilliSeconds < s_LastClosedTime + 50; + if (!justClosed) + { + // Method may have been triggered programmatically, without a user event to consume. + if (Event.current.type != EventType.Layout) + { + Event.current.Use(); + } + if (s_CollabToolbarWindow == null) + s_CollabToolbarWindow = CreateInstance() as CollabToolbarWindow; + var windowSize = new Vector2(kWindowWidth, kWindowHeight); + s_CollabToolbarWindow.initialOpenUrl = "file:///" + EditorApplication.userJavascriptPackagesPath + "unityeditor-collab-toolbar/dist/index.html"; + s_CollabToolbarWindow.Init(); + s_CollabToolbarWindow.ShowAsDropDown(buttonRect, windowSize); + s_CollabToolbarWindow.OnFocus(); + return true; + } + return false; + } + + // Receives HTML title + public void OnReceiveTitle(string title) + { + titleContent.text = title; + } + + public new void OnInitScripting() + { + base.OnInitScripting(); + } + + public override void OnEnable() + { + minSize = new Vector2(kWindowWidth, kWindowHeight); + maxSize = new Vector2(kWindowWidth, kWindowHeight); + initialOpenUrl = "file:///" + EditorApplication.userJavascriptPackagesPath + "unityeditor-collab-toolbar/dist/index.html"; + base.OnEnable(); + s_ToolbarIsVisible = true; + } + + internal new void OnDisable() + { + s_LastClosedTime = System.DateTime.Now.Ticks / System.TimeSpan.TicksPerMillisecond; + if (s_CollabToolbarWindow) + { + s_ToolbarIsVisible = false; + NotifyVisibility(s_ToolbarIsVisible); + } + s_CollabToolbarWindow = null; + + base.OnDisable(); + } + + public new void OnDestroy() + { + OnLostFocus(); + base.OnDestroy(); + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs.meta new file mode 100644 index 0000000..b08bf2a --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f516f1ec21a54a59a92bf99db2d9535 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters.meta new file mode 100644 index 0000000..9133153 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d437fe60bb34f45728664a5d930c1635 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs new file mode 100644 index 0000000..91d500b --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs @@ -0,0 +1,228 @@ +using System.Collections.Generic; +using UnityEditor.Connect; +using UnityEditor.Web; + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryPresenter + { + public const int ItemsPerPage = 5; + ICollabHistoryWindow m_Window; + ICollabHistoryItemFactory m_Factory; + IRevisionsService m_Service; + ConnectInfo m_ConnectState; + CollabInfo m_CollabState; + bool m_IsCollabError; + int m_TotalRevisions; + int m_CurrentPage; + int m_RequestedPage; + bool m_FetchInProgress; + + BuildAccess m_BuildAccess; + string m_ProgressRevision; + public bool BuildServiceEnabled {get; set; } + + public CollabHistoryPresenter(ICollabHistoryWindow window, ICollabHistoryItemFactory factory, IRevisionsService service) + { + m_Window = window; + m_Factory = factory; + m_Service = service; + m_CurrentPage = 0; + m_BuildAccess = new BuildAccess(); + m_Service.FetchRevisionsCallback += OnFetchRevisions; + } + + public void OnWindowEnabled() + { + UnityConnect.instance.StateChanged += OnConnectStateChanged; + Collab.instance.StateChanged += OnCollabStateChanged; + Collab.instance.RevisionUpdated += OnCollabRevisionUpdated; + Collab.instance.JobsCompleted += OnCollabJobsCompleted; + Collab.instance.ErrorOccurred += OnCollabError; + Collab.instance.ErrorCleared += OnCollabErrorCleared; + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + m_ConnectState = UnityConnect.instance.GetConnectInfo(); + m_CollabState = Collab.instance.GetCollabInfo(); + + m_Window.revisionActionsEnabled = !EditorApplication.isPlayingOrWillChangePlaymode; + + // Setup window callbacks + m_Window.OnPageChangeAction = OnUpdatePage; + m_Window.OnUpdateAction = OnUpdate; + m_Window.OnRestoreAction = OnRestore; + m_Window.OnGoBackAction = OnGoBack; + m_Window.OnShowBuildAction = ShowBuildForCommit; + m_Window.OnShowServicesAction = ShowServicePage; + m_Window.itemsPerPage = ItemsPerPage; + + // Initialize data + UpdateBuildServiceStatus(); + var state = RecalculateState(); + // Only try to load the page if we're ready + if (state == HistoryState.Ready) + OnUpdatePage(m_CurrentPage); + m_Window.UpdateState(state, true); + } + + public void OnWindowDisabled() + { + UnityConnect.instance.StateChanged -= OnConnectStateChanged; + Collab.instance.StateChanged -= OnCollabStateChanged; + Collab.instance.RevisionUpdated -= OnCollabRevisionUpdated; + Collab.instance.JobsCompleted -= OnCollabJobsCompleted; + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + } + + private void OnConnectStateChanged(ConnectInfo state) + { + m_ConnectState = state; + + m_Window.UpdateState(RecalculateState(), false); + } + + private void OnCollabStateChanged(CollabInfo state) + { + // Sometimes a collab state change will trigger even though everything is the same + if (m_CollabState.Equals(state)) + return; + + if (m_CollabState.tip != state.tip) + OnUpdatePage(m_CurrentPage); + + m_CollabState = state; + m_Window.UpdateState(RecalculateState(), false); + if (state.inProgress) + { + m_Window.inProgressRevision = m_ProgressRevision; + } + else + { + m_Window.inProgressRevision = null; + } + } + + private void OnCollabRevisionUpdated(CollabInfo state) + { + OnUpdatePage(m_CurrentPage); + } + + private void OnCollabJobsCompleted(CollabInfo state) + { + m_ProgressRevision = null; + } + + private void OnCollabError() + { + m_IsCollabError = true; + m_Window.UpdateState(RecalculateState(), false); + } + + private void OnCollabErrorCleared() + { + m_IsCollabError = false; + m_FetchInProgress = true; + m_Service.GetRevisions(m_CurrentPage * ItemsPerPage, ItemsPerPage); + m_Window.UpdateState(RecalculateState(), false); + } + + private void OnPlayModeStateChanged(PlayModeStateChange stateChange) + { + // If entering play mode, disable + if (stateChange == PlayModeStateChange.ExitingEditMode || + stateChange == PlayModeStateChange.EnteredPlayMode) + { + m_Window.revisionActionsEnabled = false; + } + // If exiting play mode, enable! + else if (stateChange == PlayModeStateChange.EnteredEditMode || + stateChange == PlayModeStateChange.ExitingPlayMode) + { + m_Window.revisionActionsEnabled = true; + } + } + + private HistoryState RecalculateState() + { + if (!m_ConnectState.online) + return HistoryState.Offline; + if (m_ConnectState.maintenance || m_CollabState.maintenance) + return HistoryState.Maintenance; + if (!m_ConnectState.loggedIn) + return HistoryState.LoggedOut; + if (!m_CollabState.seat) + return HistoryState.NoSeat; + if (!Collab.instance.IsCollabEnabledForCurrentProject()) + return HistoryState.Disabled; + if (!Collab.instance.IsConnected() || !m_CollabState.ready || m_FetchInProgress) + return HistoryState.Waiting; + if (m_ConnectState.error || m_IsCollabError) + return HistoryState.Error; + + return HistoryState.Ready; + } + + // TODO: Eventually this can be a listener on the build service status + public void UpdateBuildServiceStatus() + { + foreach (var service in UnityConnectServiceCollection.instance.GetAllServiceInfos()) + { + if (service.name.Equals("Build")) + { + BuildServiceEnabled = service.enabled; + } + } + } + + public void ShowBuildForCommit(string revisionID) + { + m_BuildAccess.ShowBuildForCommit(revisionID); + } + + public void ShowServicePage() + { + m_BuildAccess.ShowServicePage(); + } + + public void OnUpdatePage(int page) + { + m_FetchInProgress = true; + m_Service.GetRevisions(page * ItemsPerPage, ItemsPerPage); + m_Window.UpdateState(RecalculateState(), false); + m_RequestedPage = page; + } + + private void OnFetchRevisions(RevisionsResult data) + { + m_FetchInProgress = false; + IEnumerable items = null; + if (data != null) + { + m_CurrentPage = m_RequestedPage; + m_TotalRevisions = data.RevisionsInRepo; + items = m_Factory.GenerateElements(data.Revisions, m_TotalRevisions, m_CurrentPage * ItemsPerPage, m_Service.tipRevision, m_Window.inProgressRevision, m_Window.revisionActionsEnabled, BuildServiceEnabled, m_Service.currentUser); + } + + // State must be recalculated prior to inserting items + m_Window.UpdateState(RecalculateState(), false); + m_Window.UpdateRevisions(items, m_Service.tipRevision, m_TotalRevisions, m_CurrentPage); + } + + private void OnRestore(string revisionId, bool updatetorevision) + { + m_ProgressRevision = revisionId; + Collab.instance.ResyncToRevision(revisionId); + } + + private void OnGoBack(string revisionId, bool updatetorevision) + { + m_ProgressRevision = revisionId; + Collab.instance.GoBackToRevision(revisionId, false); + } + + private void OnUpdate(string revisionId, bool updatetorevision) + { + m_ProgressRevision = revisionId; + Collab.instance.Update(revisionId, updatetorevision); + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs.meta new file mode 100644 index 0000000..9c37ecd --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a7c91a123806d41a0873fcdcb629b1c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views.meta new file mode 100644 index 0000000..f62ac6b --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fd0a39b4d296d4d509b4f1dbd08d0630 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs new file mode 100644 index 0000000..ac3754d --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs @@ -0,0 +1,53 @@ +using System; +using UnityEditor; +using UnityEditor.Collaboration; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + +namespace UnityEditor.Collaboration +{ + internal class BuildStatusButton : Button + { + private readonly string iconPrefix = "Icons/Collab.Build"; + private readonly string iconSuffix = ".png"; + Label labelElement = new Label(); + Image iconElement = new Image() {name = "BuildIcon"}; + + public BuildStatusButton(Action clickEvent) : base(clickEvent) + { + iconElement.image = EditorGUIUtility.Load(iconPrefix + iconSuffix) as Texture; + labelElement.text = "Build Now"; + Add(iconElement); + Add(labelElement); + } + + public BuildStatusButton(Action clickEvent, BuildState state, int failures) : base(clickEvent) + { + switch (state) + { + case BuildState.InProgress: + iconElement.image = EditorGUIUtility.Load(iconPrefix + iconSuffix) as Texture; + labelElement.text = "In progress"; + break; + + case BuildState.Failed: + iconElement.image = EditorGUIUtility.Load(iconPrefix + "Failed" + iconSuffix) as Texture; + labelElement.text = failures + ((failures == 1) ? " failure" : " failures"); + break; + + case BuildState.Success: + iconElement.image = EditorGUIUtility.Load(iconPrefix + "Succeeded" + iconSuffix) as Texture; + labelElement.text = "success"; + break; + } + + Add(iconElement); + Add(labelElement); + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs.meta new file mode 100644 index 0000000..d74a58a --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0217a80286f79419daa202f69409f19b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs new file mode 100644 index 0000000..e3bb05a --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs @@ -0,0 +1,78 @@ +using UnityEngine; +using System.Collections.Generic; +using UnityEditor.Connect; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryDropDown : VisualElement + { + private readonly VisualElement m_FilesContainer; + private readonly Label m_ToggleLabel; + private int m_ChangesTotal; + private string m_RevisionId; + + public CollabHistoryDropDown(ICollection changes, int changesTotal, bool changesTruncated, string revisionId) + { + m_FilesContainer = new VisualElement(); + m_ChangesTotal = changesTotal; + m_RevisionId = revisionId; + + m_ToggleLabel = new Label(ToggleText(false)); + m_ToggleLabel.AddManipulator(new Clickable(ToggleDropdown)); + Add(m_ToggleLabel); + + foreach (ChangeData change in changes) + { + m_FilesContainer.Add(new CollabHistoryDropDownItem(change.path, change.action)); + } + + if (changesTruncated) + { + m_FilesContainer.Add(new Button(ShowAllClick) + { + text = "Show all on dashboard" + }); + } + } + + private void ToggleDropdown() + { + if (Contains(m_FilesContainer)) + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "CollapseAssets"); + Remove(m_FilesContainer); + m_ToggleLabel.text = ToggleText(false); + } + else + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ExpandAssets"); + Add(m_FilesContainer); + m_ToggleLabel.text = ToggleText(true); + } + } + + private string ToggleText(bool open) + { + var icon = open ? "\u25bc" : "\u25b6"; + var change = m_ChangesTotal == 1 ? "Change" : "Changes"; + return string.Format("{0} {1} Asset {2}", icon, m_ChangesTotal, change); + } + + private void ShowAllClick() + { + var host = UnityConnect.instance.GetConfigurationURL(CloudConfigUrl.CloudServicesDashboard); + var org = UnityConnect.instance.GetOrganizationId(); + var proj = UnityConnect.instance.GetProjectGUID(); + var url = string.Format("{0}/collab/orgs/{1}/projects/{2}/commits?commit={3}", host, org, proj, m_RevisionId); + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ShowAllOnDashboard"); + Application.OpenURL(url); + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs.meta new file mode 100644 index 0000000..513b66b --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a483595b0257945278dc75c5ff7d82ee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs new file mode 100644 index 0000000..3ad43f2 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs @@ -0,0 +1,53 @@ +using System; +using System.IO; +using System.Linq; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryDropDownItem : VisualElement + { + public CollabHistoryDropDownItem(string path, string action) + { + var fileName = Path.GetFileName(path); + var isFolder = Path.GetFileNameWithoutExtension(path).Equals(fileName); + var fileIcon = GetIconElement(action, fileName, isFolder); + var metaContainer = new VisualElement(); + var fileNameLabel = new Label + { + name = "FileName", + text = fileName + }; + var filePathLabel = new Label + { + name = "FilePath", + text = path + }; + metaContainer.Add(fileNameLabel); + metaContainer.Add(filePathLabel); + Add(fileIcon); + Add(metaContainer); + } + + private Image GetIconElement(string action, string fileName, bool isFolder) + { + var prefix = isFolder ? "Folder" : "File"; + var actionName = action.First().ToString().ToUpper() + action.Substring(1); + // Use the same icon for renamed and moved files + actionName = actionName.Equals("Renamed") ? "Moved" : actionName; + var iconElement = new Image + { + name = "FileIcon", + image = EditorGUIUtility.LoadIcon("Icons/Collab." + prefix + actionName + ".png") + }; + return iconElement; + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs.meta new file mode 100644 index 0000000..10bf40e --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d912d4873af534bd4a9d44bf1b52f14e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs new file mode 100644 index 0000000..24e5d1d --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs @@ -0,0 +1,229 @@ +using System; +using System.Linq; +using System.Security.Cryptography; +using UnityEditor.Connect; +using UnityEditor.Web; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +using UnityEngine.Experimental.UIElements.StyleEnums; +#endif + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryItem : VisualElement + { + public static RevisionAction s_OnRestore; + public static RevisionAction s_OnGoBack; + public static RevisionAction s_OnUpdate; + public static ShowBuildAction s_OnShowBuild; + public static Action s_OnShowServices; + + private readonly string m_RevisionId; + private readonly string m_FullDescription; + private readonly DateTime m_TimeStamp; + private readonly Button m_Button; + private readonly HistoryProgressSpinner m_ProgressSpinner; + private VisualElement m_ActionsTray; + private VisualElement m_Details; + private Label m_Description; + private Label m_TimeAgo; + private readonly Button m_ExpandCollapseButton; + private bool m_Expanded; + + private const int kMaxDescriptionChars = 500; + + public bool RevisionActionsEnabled + { + set + { + m_Button.SetEnabled(value); + } + } + + public DateTime timeStamp + { + get { return m_TimeStamp; } + } + + public CollabHistoryItem(RevisionData data) + { + m_RevisionId = data.id; + m_TimeStamp = data.timeStamp; + name = "HistoryItem"; + m_ActionsTray = new VisualElement {name = "HistoryItemActionsTray"}; + m_ProgressSpinner = new HistoryProgressSpinner(); + m_Details = new VisualElement {name = "HistoryDetail"}; + var author = new Label(data.authorName) {name = "Author"}; + m_TimeAgo = new Label(TimeAgo.GetString(m_TimeStamp)); + m_FullDescription = data.comment; + var shouldTruncate = ShouldTruncateDescription(m_FullDescription); + if (shouldTruncate) + { + m_Description = new Label(GetTruncatedDescription(m_FullDescription)); + } + else + { + m_Description = new Label(m_FullDescription); + } + m_Description.name = "RevisionDescription"; + var dropdown = new CollabHistoryDropDown(data.changes, data.changesTotal, data.changesTruncated, data.id); + if (data.current) + { + m_Button = new Button(Restore) {name = "ActionButton", text = "Restore"}; + } + else if (data.obtained) + { + m_Button = new Button(GoBackTo) {name = "ActionButton", text = "Go back to..."}; + } + else + { + m_Button = new Button(UpdateTo) {name = "ActionButton", text = "Update"}; + } + m_Button.SetEnabled(data.enabled); + m_ProgressSpinner.ProgressEnabled = data.inProgress; + + m_ActionsTray.Add(m_ProgressSpinner); + m_ActionsTray.Add(m_Button); + + m_Details.Add(author); + m_Details.Add(m_TimeAgo); + m_Details.Add(m_Description); + + if (shouldTruncate) + { + m_ExpandCollapseButton = new Button(ToggleDescription) { name = "ToggleDescription", text = "Show More" }; + m_Details.Add(m_ExpandCollapseButton); + } + + if (data.buildState != BuildState.None) + { + BuildStatusButton buildButton; + if (data.buildState == BuildState.Configure) + buildButton = new BuildStatusButton(ShowServicePage); + else + buildButton = new BuildStatusButton(ShowBuildForCommit, data.buildState, data.buildFailures); + + m_Details.Add(buildButton); + } + + m_Details.Add(m_ActionsTray); + m_Details.Add(dropdown); + + Add(m_Details); + + this.schedule.Execute(UpdateTimeAgo).Every(1000 * 20); + } + + public static void SetUpCallbacks(RevisionAction Restore, RevisionAction GoBack, RevisionAction Update) + { + s_OnRestore = Restore; + s_OnGoBack = GoBack; + s_OnUpdate = Update; + } + + public void SetInProgressStatus(string revisionIdInProgress) + { + if (String.IsNullOrEmpty(revisionIdInProgress)) + { + m_Button.SetEnabled(true); + m_ProgressSpinner.ProgressEnabled = false; + } + else + { + m_Button.SetEnabled(false); + if (m_RevisionId.Equals(revisionIdInProgress)) + { + m_ProgressSpinner.ProgressEnabled = true; + } + } + } + + void ShowBuildForCommit() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ShowBuild"); + if (s_OnShowBuild != null) + { + s_OnShowBuild(m_RevisionId); + } + } + + void ShowServicePage() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ShowServices"); + if (s_OnShowServices != null) + { + s_OnShowServices(); + } + } + + void Restore() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "Restore"); + if (s_OnRestore != null) + { + s_OnRestore(m_RevisionId, false); + } + } + + void GoBackTo() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "GoBackTo"); + if (s_OnGoBack != null) + { + s_OnGoBack(m_RevisionId, false); + } + } + + void UpdateTo() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "Update"); + if (s_OnUpdate != null) + { + s_OnUpdate(m_RevisionId, true); + } + } + + void UpdateTimeAgo() + { + m_TimeAgo.text = TimeAgo.GetString(m_TimeStamp); + } + + bool ShouldTruncateDescription(string description) + { + return description.Contains(Environment.NewLine) || description.Length > kMaxDescriptionChars; + } + + string GetTruncatedDescription(string description) + { + string result = description.Contains(Environment.NewLine) ? + description.Substring(0, description.IndexOf(Environment.NewLine)) : description; + if (result.Length > kMaxDescriptionChars) + { + result = result.Substring(0, kMaxDescriptionChars) + "..."; + } + return result; + } + + void ToggleDescription() + { + if (m_Expanded) + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "CollapseDescription"); + m_Expanded = false; + m_ExpandCollapseButton.text = "Show More"; + m_Description.text = GetTruncatedDescription(m_FullDescription); + } + else + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ExpandDescription"); + m_Expanded = true; + m_ExpandCollapseButton.text = "Show Less"; + m_Description.text = m_FullDescription; + } + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs.meta new file mode 100644 index 0000000..290bd28 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c4c1445ee948a4124bfa9fb818a17e36 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs new file mode 100644 index 0000000..e7d7aa6 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor.Collaboration; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +using UnityEngine.Experimental.UIElements.StyleEnums; +#endif + + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryItemFactory : ICollabHistoryItemFactory + { + const int k_MaxChangesPerRevision = 10; + + public IEnumerable GenerateElements(IEnumerable revisions, int totalRevisions, int startIndex, string tipRev, string inProgressRevision, bool revisionActionsEnabled, bool buildServiceEnabled, string currentUser) + { + int index = startIndex; + + foreach (var rev in revisions) + { + index++; + var current = rev.revisionID == tipRev; + + // Calculate build status + BuildState buildState = BuildState.None; + int buildFailures = 0; + if (rev.buildStatuses != null && rev.buildStatuses.Length > 0) + { + bool inProgress = false; + foreach (CloudBuildStatus buildStatus in rev.buildStatuses) + { + if (buildStatus.complete) + { + if (!buildStatus.success) + { + buildFailures++; + } + } + else + { + inProgress = true; + break; + } + } + + if (inProgress) + { + buildState = BuildState.InProgress; + } + else if (buildFailures > 0) + { + buildState = BuildState.Failed; + } + else + { + buildState = BuildState.Success; + } + } + else if (current && !buildServiceEnabled) + { + buildState = BuildState.Configure; + } + + // Calculate the number of changes performed on files and folders (not meta files) + var paths = new Dictionary(); + foreach (ChangeAction change in rev.entries) + { + if (change.path.EndsWith(".meta")) + { + var path = change.path.Substring(0, change.path.Length - 5); + // Actions taken on meta files are secondary to any actions taken on the main file + if (!paths.ContainsKey(path)) + paths[path] = new ChangeData() {path = path, action = change.action}; + } + else + { + paths[change.path] = new ChangeData() {path = change.path, action = change.action}; + } + } + + var displayName = (rev.author != currentUser) ? rev.authorName : "You"; + + var item = new RevisionData + { + id = rev.revisionID, + index = totalRevisions - index + 1, + timeStamp = TimeStampToDateTime(rev.timeStamp), + authorName = displayName, + comment = rev.comment, + + obtained = rev.isObtained, + current = current, + inProgress = (rev.revisionID == inProgressRevision), + enabled = revisionActionsEnabled, + + buildState = buildState, + buildFailures = buildFailures, + + changes = paths.Values.Take(k_MaxChangesPerRevision).ToList(), + changesTotal = paths.Values.Count, + changesTruncated = paths.Values.Count > k_MaxChangesPerRevision, + }; + + yield return item; + } + } + + private static DateTime TimeStampToDateTime(double timeStamp) + { + DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + dateTime = dateTime.AddSeconds(timeStamp).ToLocalTime(); + return dateTime; + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs.meta new file mode 100644 index 0000000..3250d96 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fc46f91ea1e8e4ca2ab693fef9156dbe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs new file mode 100644 index 0000000..2b8fe65 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs @@ -0,0 +1,94 @@ +using System; +using UnityEditor; +using UnityEditor.Collaboration; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryRevisionLine : VisualElement + { + public CollabHistoryRevisionLine(int number) + { + AddNumber(number); + AddLine("topLine"); + AddLine("bottomLine"); + AddIndicator(); + } + + public CollabHistoryRevisionLine(DateTime date, bool isFullDateObtained) + { + AddLine(isFullDateObtained ? "obtainedDateLine" : "absentDateLine"); + AddHeader(GetFormattedHeader(date)); + AddToClassList("revisionLineHeader"); + } + + private void AddHeader(string content) + { + Add(new Label + { + text = content + }); + } + + private void AddIndicator() + { + Add(new VisualElement + { + name = "RevisionIndicator" + }); + } + + private void AddLine(string className = null) + { + var line = new VisualElement + { + name = "RevisionLine" + }; + if (!String.IsNullOrEmpty(className)) + { + line.AddToClassList(className); + } + Add(line); + } + + private void AddNumber(int number) + { + Add(new Label + { + text = number.ToString(), + name = "RevisionIndex" + }); + } + + private string GetFormattedHeader(DateTime date) + { + string result = "Commits on " + date.ToString("MMM d"); + switch (date.Day) + { + case 1: + case 21: + case 31: + result += "st"; + break; + case 2: + case 22: + result += "nd"; + break; + case 3: + case 23: + result += "rd"; + break; + default: + result += "th"; + break; + } + return result; + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs.meta new file mode 100644 index 0000000..2659a3c --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c737f7a9d78541d1ab25f28f045dd32 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs new file mode 100644 index 0000000..fad3b82 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs @@ -0,0 +1,69 @@ +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + +namespace UnityEditor.Collaboration +{ + internal class HistoryProgressSpinner : Image + { + private readonly Texture2D[] m_StatusWheelTextures; + private bool m_ProgressEnabled; + private IVisualElementScheduledItem m_Animation; + + public bool ProgressEnabled + { + set + { + if (m_ProgressEnabled == value) + return; + + m_ProgressEnabled = value; + visible = value; + + + if (value) + { + if (m_Animation == null) + { + m_Animation = this.schedule.Execute(AnimateProgress).Every(33); + } + else + { + m_Animation.Resume(); + } + } + else + { + if (m_Animation != null) + { + m_Animation.Pause(); + } + } + } + } + + public HistoryProgressSpinner() + { + m_StatusWheelTextures = new Texture2D[12]; + for (int i = 0; i < 12; i++) + { + m_StatusWheelTextures[i] = EditorGUIUtility.LoadIcon("WaitSpin" + i.ToString("00")); + } + image = m_StatusWheelTextures[0]; + style.width = m_StatusWheelTextures[0].width; + style.height = m_StatusWheelTextures[0].height; + visible = false; + } + + private void AnimateProgress(TimerState obj) + { + int frame = (int)Mathf.Repeat(Time.realtimeSinceStartup * 10, 11.99f); + image = m_StatusWheelTextures[frame]; + MarkDirtyRepaint(); + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs.meta new file mode 100644 index 0000000..0ded4e8 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cf6aca931950a4a6a886e214e9e649c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs new file mode 100644 index 0000000..03239a3 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using UnityEditor.Collaboration; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + +namespace UnityEditor.Collaboration +{ + internal interface ICollabHistoryItemFactory + { + IEnumerable GenerateElements(IEnumerable revsRevisions, int mTotalRevisions, int startIndex, string tipRev, string inProgressRevision, bool revisionActionsEnabled, bool buildServiceEnabled, string currentUser); + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs.meta new file mode 100644 index 0000000..08e9085 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 821f5482c5a3f4389885f4432433f56f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs new file mode 100644 index 0000000..472a70e --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +using UnityEngine.Experimental.UIElements.StyleEnums; +#endif + +namespace UnityEditor.Collaboration +{ + internal interface IPagerData + { + int curPage { get; } + int totalPages { get; } + PageChangeAction OnPageChanged { get; } + } + + internal class PagerElement : VisualElement + { + IPagerData m_Data; + readonly Label m_PageText; + readonly Button m_DownButton; + readonly Button m_UpButton; + + public PagerElement(IPagerData dataSource) + { + m_Data = dataSource; + + this.style.flexDirection = FlexDirection.Row; + this.style.alignSelf = Align.Center; + + Add(m_DownButton = new Button(OnPageDownClicked) {text = "\u25c5 Newer"}); + m_DownButton.AddToClassList("PagerDown"); + + m_PageText = new Label(); + m_PageText.AddToClassList("PagerLabel"); + Add(m_PageText); + + Add(m_UpButton = new Button(OnPageUpClicked) {text = "Older \u25bb"}); + m_UpButton.AddToClassList("PagerUp"); + + UpdateControls(); + } + + void OnPageDownClicked() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "NewerPage"); + m_Data.OnPageChanged(m_Data.curPage - 1); + } + + void OnPageUpClicked() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "OlderPage"); + m_Data.OnPageChanged(m_Data.curPage + 1); + } + + public void Refresh() + { + UpdateControls(); + } + + void UpdateControls() + { + var curPage = m_Data.curPage; + var totalPages = m_Data.totalPages; + + m_PageText.text = (curPage + 1) + " / " + totalPages; + m_DownButton.SetEnabled(curPage > 0); + m_UpButton.SetEnabled(curPage < totalPages - 1); + } + } + + internal enum PagerLocation + { + Top, + Bottom, + } + + internal class PagedListView : VisualElement, IPagerData + { + public const int DefaultItemsPerPage = 10; + + readonly VisualElement m_ItemContainer; + readonly PagerElement m_PagerTop, m_PagerBottom; + int m_PageSize = DefaultItemsPerPage; + IEnumerable m_Items; + int m_TotalItems; + int m_CurPage; + + public int pageSize + { + set { m_PageSize = value; } + } + + public IEnumerable items + { + set + { + m_Items = value; + LayoutItems(); + } + } + + public int totalItems + { + set + { + if (m_TotalItems == value) + return; + + m_TotalItems = value; + UpdatePager(); + } + } + + public PageChangeAction OnPageChanged { get; set; } + + public PagedListView() + { + m_PagerTop = new PagerElement(this); + + m_ItemContainer = new VisualElement() + { + name = "PagerItems", + }; + Add(m_ItemContainer); + m_Items = new List(); + + m_PagerBottom = new PagerElement(this); + } + + void LayoutItems() + { + m_ItemContainer.Clear(); + foreach (var item in m_Items) + { + m_ItemContainer.Add(item); + } + } + + void UpdatePager() + { + if (m_PagerTop.parent != this && totalPages > 1 && curPage > 0) + Insert(0, m_PagerTop); + if (m_PagerTop.parent == this && (totalPages <= 1 || curPage == 0)) + Remove(m_PagerTop); + + if (m_PagerBottom.parent != this && totalPages > 1) + Add(m_PagerBottom); + if (m_PagerBottom.parent == this && totalPages <= 1) + Remove(m_PagerBottom); + + m_PagerTop.Refresh(); + m_PagerBottom.Refresh(); + } + + int pageCount + { + get + { + var pages = m_TotalItems / m_PageSize; + if (m_TotalItems % m_PageSize > 0) + pages++; + + return pages; + } + } + + public int curPage + { + get { return m_CurPage; } + set + { + m_CurPage = value; + UpdatePager(); + } + } + + public int totalPages + { + get + { + var extraPage = 0; + if (m_TotalItems % m_PageSize > 0) + extraPage = 1; + return m_TotalItems / m_PageSize + extraPage; + } + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs.meta new file mode 100644 index 0000000..565f7a2 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 50de529b6a28f4a7093045e08810a5df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs new file mode 100644 index 0000000..9b50e7a --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs @@ -0,0 +1,88 @@ +using System; +using UnityEditor; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +using UnityEngine.Experimental.UIElements.StyleEnums; +#endif + +namespace UnityEditor.Collaboration +{ + internal class StatusView : VisualElement + { + Image m_Image; + Label m_Message; + Button m_Button; + Action m_Callback; + + public Texture icon + { + get { return m_Image.image; } + set + { + m_Image.image = value; + m_Image.visible = value != null; + // Until "display: hidden" is added, this is the only way to hide an element + m_Image.style.height = value != null ? 150 : 0; + } + } + + public string message + { + get { return m_Message.text; } + set + { + m_Message.text = value; + m_Message.visible = value != null; + } + } + + public string buttonText + { + get { return m_Button.text; } + set + { + m_Button.text = value; + UpdateButton(); + } + } + + public Action callback + { + get { return m_Callback; } + set + { + m_Callback = value; + UpdateButton(); + } + } + + public StatusView() + { + name = "StatusView"; + + this.StretchToParentSize(); + + m_Image = new Image() { name = "StatusIcon", visible = false, style = { height = 0f }}; + m_Message = new Label() { name = "StatusMessage", visible = false}; + m_Button = new Button(InternalCallaback) { name = "StatusButton", visible = false}; + + Add(m_Image); + Add(m_Message); + Add(m_Button); + } + + private void UpdateButton() + { + m_Button.visible = m_Button.text != null && m_Callback != null; + } + + private void InternalCallaback() + { + m_Callback(); + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs.meta new file mode 100644 index 0000000..bb634b1 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 08e9894bdf0834710b22d3c0aa245ac0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources.meta new file mode 100644 index 0000000..01229c2 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a6ab6fd2b91214e8a9c8ec2224a528de +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles.meta new file mode 100644 index 0000000..0ff0382 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b1ae1e78552c459d9ce27048ff51c7f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss new file mode 100644 index 0000000..b20f08e --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss @@ -0,0 +1,259 @@ +.unity-button { + min-height:0; + -unity-text-align:middle-center; + margin-left:4px; + margin-top:3px; + margin-right:4px; + margin-bottom:3px; + border-left-width:6px; + border-top-width:4px; + border-right-width:6px; + border-bottom-width:4px; + padding-left:6px; + padding-top:2px; + padding-right:6px; + padding-bottom:3px; +} + +.unity-label { + overflow: hidden; + margin-left:4px; + margin-top:2px; + margin-right:4px; + margin-bottom:2px; + padding-left:2px; + padding-top:1px; + min-height: 0; +} + +#HistoryContainer { + flex: 1 0 0; +} + +#HistoryItem { + flex: 1 0 0; + flex-direction: row; +} + +#HistoryDetail { + margin-top: 10px; + margin-left: 10px; + margin-bottom: 10px; + margin-right: 10px; + padding-top: 4px; + flex: 1 0 0; +} + +#Author { + -unity-font-style: bold; + font-size: 12px; +} + +#HistoryDetail > Button { + align-self: flex-end; +} + +CollabHistoryRevisionLine { + width: 40px; +} + +#RevisionLine { + flex: 1 0 0; + margin-left: 35px; + width: 1.5px; +} + +#RevisionLine.topLine { + height: 20px; + flex: 0 0 auto; +} + +#RevisionLine.absentDateLine { + background-color: #797676; +} + +.absentRevision #RevisionLine { + background-color: #797676; +} + +.currentRevision #RevisionLine.topLine { + background-color: #797676; +} + +#RevisionIndex { + position: absolute; + min-width: 23px; + -unity-text-align: middle-right; + top: 15.8px; + font-size: 9px; +} + +#RevisionIndicator { + position: absolute; + background-color: #000; + border-radius: 3px; + width: 8px; + height: 8px; + border-bottom-width: 2px; + border-left-width: 2px; + border-right-width: 2px; + border-top-width: 2px; + top: 20px; + left: 32px; +} + +.revisionLineHeader { + width: 200px; + height: 20px; +} + +.revisionLineHeader > .unity-label { + position: absolute; + margin-left: 47px; + margin-top: 3px; +} + +#PagerItems { + flex-direction: column; +} + +PagerElement > .unity-label { + margin-top: 8px; +} + +.absentRevision #RevisionIndicator { + border-color: #797676; +} + +.absentRevision #RevisionIndex { + color: #797676; +} + +.currentRevision #HistoryDetail { + border-top-width: 2px; +} + +#HistoryItem #RevisionDescription { + white-space: normal; +} + +#HistoryItem #ToggleDescription { + align-self: flex-start; + padding-top: 0; + padding-left: 0; + padding-right: 0; + padding-bottom: 2px; +} + +#HistoryItem #ActionButton { + position: absolute; + right: 0; +} + +#HistoryItem #BuildIcon { + width: 16px; + height: 13px; +} + +#HistoryItemActionsTray { + flex: 1 0 0; + flex-direction: row; + align-items: center; + height: 38px; + margin-left: 10px; + margin-right: 10px; +} + +CollabHistoryDropDown { + border-top-width: 1px; +} + +CollabHistoryDropDown > .unity-label { + padding-top: 10px; + padding-bottom: 10px; +} + +CollabHistoryDropDownItem { + flex-direction: row; + border-top-width: 1px; + overflow: hidden; +} + +#FileIcon { + align-self: center; + width: 26px; + height: 26px; +} + +#FileName { + -unity-font-style: bold; + padding-bottom: 0; + margin-bottom: 0; +} + +#FileIcon { + padding-top: 0; + margin-top: 0; +} + +#ErrorBar { + height: 24px; + background-color: #ff0000; + color: #000; + font-size: 12px; +} + +#ErrorBar > #CloseButton { + position: absolute; + right: 0; + top: 0; + width: 24px; + height: 24px; + color: #000; + font-size: 18px; + -unity-font-style: bold; +} + +#StatusView { + flex-direction: column; + justify-content: center; + align-self: center; + align-items: center; + flex: 1 0 0; +} + +#StatusView > #StatusIcon { + width: 115px; + height: 150px; +} + +#StatusView > #StatusMessage { + font-size: 22px; + width: 230px; + white-space: normal; + -unity-text-align: middle-center; +} + +#StatusView > #StatusButton { + font-size: 12px; + margin-top: 20px; + background-image: none; + width: 108px; + height: 29px; +} + +BuildStatusButton.unity-button { + flex-direction: row; + align-self: flex-end; + align-items: center; + margin-right: 10px; + padding-left:0; + padding-top:0; + padding-right:0; + padding-bottom:0; +} + +BuildStatusButton.unity-button .unity-label { + padding-left: 2px; +} + diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss.meta new file mode 100644 index 0000000..035b662 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3a2d94c8977984b67984caeff9fa666e +ScriptedImporter: + fileIDToRecycleName: + 11400000: stylesheet + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss new file mode 100644 index 0000000..de436f8 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss @@ -0,0 +1,86 @@ +#HistoryContainer { + background-color: #292929; +} + +.obtainedRevision #HistoryDetail { + background-color: #333; +} + +.absentRevision #HistoryDetail { + background-color: #595959; +} + +#StatusView { + background-color: #292929; +} + +#StatusView > #StatusMessage { + color: #959995; +} + +BuildStatusButton.unity-button { + color: #B4B4B4; + background-image: resource("Builtin Skins/DarkSkin/Images/btn.png"); +} + +BuildStatusButton.unity-button:hover { + color: #FFF; +} + +BuildStatusButton.unity-button:hover:active { + background-image: resource("Builtin Skins/DarkSkin/Images/btn act.png"); +} + +BuildStatusButton.unity-button:checked { + color: #F0F0F0; + background-image: resource("Builtin Skins/DarkSkin/Images/btn on.png"); +} + +BuildStatusButton.unity-button:hover:checked { + color: #FFF; +} + +BuildStatusButton.unity-button:hover:active:checked { + background-image: resource("Builtin Skins/DarkSkin/Images/btn onact.png"); +} + +BuildStatusButton.unity-button:focus:checked { + background-image: resource("Builtin Skins/DarkSkin/Images/btn on focus.png"); +} + +CollabHistoryDropDown { + border-color: #292929; +} + +CollabHistoryDropDownItem { + border-color: #292929; +} + +#RevisionLine.obtainedDateLine { + background-color: #0cb4cc; +} + +.obtainedRevision #RevisionLine { + background-color: #0cb4cc; +} + +#RevisionIndex { + color: #0cb4cc; +} + +#RevisionIndicator { + border-color: #0cb4cc; +} + +.currentRevision #RevisionIndicator { + background-color: #0cb4cc; +} + +.currentRevision #HistoryDetail { + border-color: #0cb4cc; +} + +#StatusView > #StatusButton { + background-color: #0cb4cc; + border-color: #0cb4cc; +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss.meta new file mode 100644 index 0000000..35a7d09 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 70d4d75a2877243758b0750cbc75b6eb +ScriptedImporter: + fileIDToRecycleName: + 11400000: stylesheet + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss new file mode 100644 index 0000000..3f9b85f --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss @@ -0,0 +1,86 @@ +#HistoryContainer { + background-color: #a2a2a2; +} + +.obtainedRevision #HistoryDetail { + background-color: #c2c2c2; +} + +.absentRevision #HistoryDetail { + background-color: #dedede; +} + +#StatusView { + background-color: #a2a2a3; +} + +#StatusView > #StatusMessage { + color: #000; +} + +BuildStatusButton.unity-button { + color: #111; + background-image: resource("Builtin Skins/LightSkin/Images/btn.png"); +} + +BuildStatusButton.unity-button:hover { + color: #000; +} + +BuildStatusButton.unity-button:hover:active { + background-image: resource("Builtin Skins/LightSkin/Images/btn act.png"); +} + +BuildStatusButton.unity-button:checked { + color: #F0F0F0; + background-image: resource("Builtin Skins/LightSkin/Images/btn on.png"); +} + +BuildStatusButton.unity-button:hover:checked { + color: #000; +} + +BuildStatusButton.unity-button:hover:active:checked { + background-image: resource("Builtin Skins/LightSkin/Images/btn onact.png"); +} + +BuildStatusButton.unity-button:focus:checked { + background-image: resource("Builtin Skins/LightSkin/Images/btn on focus.png"); +} + +CollabHistoryDropDown { + border-color: #a2a2a2; +} + +CollabHistoryDropDownItem { + border-color: #a2a2a2; +} + +#RevisionLine.obtainedDateLine { + background-color: #018d98; +} + +.obtainedRevision #RevisionLine { + background-color: #018d98; +} + +#RevisionIndex { + color: #018d98; +} + +#RevisionIndicator { + border-color: #018d98; +} + +.currentRevision #RevisionIndicator { + background-color: #018d98; +} + +.currentRevision #HistoryDetail { + border-color: #018d98; +} + +#StatusView > #StatusButton { + background-color: #018d98; + border-color: #018d98; +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss.meta new file mode 100644 index 0000000..28c860e --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b52bde26a83564960bcb90217f72b910 +ScriptedImporter: + fileIDToRecycleName: + 11400000: stylesheet + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef new file mode 100644 index 0000000..66511e1 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef @@ -0,0 +1,7 @@ +{ + "name": "Unity.CollabProxy.Editor", + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [] +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef.meta new file mode 100644 index 0000000..03ebeca --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 645165c8169474bfbbeb8fb0bcfd26f5 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md b/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md new file mode 100644 index 0000000..31bde4e --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md @@ -0,0 +1,31 @@ +**Unity Companion Package License v1.0 ("_License_")** + +Copyright © 2017 Unity Technologies ApS ("**_Unity_**") + +Unity hereby grants to you a worldwide, non-exclusive, no-charge, and royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute the software that is made available with this License ("**_Software_**"), subject to the following terms and conditions: + +1. *Unity Companion Use Only*. Exercise of the license granted herein is limited to exercise for the creation, use, and/or distribution of applications, software, or other content pursuant to a valid Unity development engine software license ("**_Engine License_**"). That means while use of the Software is not limited to use in the software licensed under the Engine License, the Software may not be used for any purpose other than the creation, use, and/or distribution of Engine License-dependent applications, software, or other content. No other exercise of the license granted herein is permitted. + +1. *No Modification of Engine License*. Neither this License nor any exercise of the license granted herein modifies the Engine License in any way. + +1. *Ownership & Grant Back to You*. + + 3.1. You own your content. In this License, "derivative works" means derivatives of the Software itself--works derived only from the Software by you under this License (for example, modifying the code of the Software itself to improve its efficacy); “derivative works” of the Software do not include, for example, games, apps, or content that you create using the Software. You keep all right, title, and interest to your own content. + + 3.2. Unity owns its content. While you keep all right, title, and interest to your own content per the above, as between Unity and you, Unity will own all right, title, and interest to all intellectual property rights (including patent, trademark, and copyright) in the Software and derivative works of the Software, and you hereby assign and agree to assign all such rights in those derivative works to Unity. + + 3.3. You have a license to those derivative works. Subject to this License, Unity grants to you the same worldwide, non-exclusive, no-charge, and royalty-free copyright license to derivative works of the Software you create as is granted to you for the Software under this License. + +1. *Trademarks*. You are not granted any right or license under this License to use any trademarks, service marks, trade names, products names, or branding of Unity or its affiliates ("**_Trademarks_**"). Descriptive uses of Trademarks are permitted; see, for example, Unity’s Branding Usage Guidelines at [https://unity3d.com/public-relations/brand](https://unity3d.com/public-relations/brand). + +1. *Notices & Third-Party Rights*. This License, including the copyright notice above, must be provided in all substantial portions of the Software and derivative works thereof (or, if that is impracticable, in any other location where such notices are customarily placed). Further, if the Software is accompanied by a Unity "third-party notices" or similar file, you acknowledge and agree that software identified in that file is governed by those separate license terms. + +1. *DISCLAIMER, LIMITATION OF LIABILITY*. THE SOFTWARE AND ANY DERIVATIVE WORKS THEREOF IS PROVIDED ON AN "AS IS" BASIS, AND IS PROVIDED WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND/OR NONINFRINGEMENT. IN NO EVENT SHALL ANY COPYRIGHT HOLDER OR AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES (WHETHER DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL, INCLUDING PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR PROFITS, AND BUSINESS INTERRUPTION), OR OTHER LIABILITY WHATSOEVER, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM OR OUT OF, OR IN CONNECTION WITH, THE SOFTWARE OR ANY DERIVATIVE WORKS THEREOF OR THE USE OF OR OTHER DEALINGS IN SAME, EVEN WHERE ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +1. *USE IS ACCEPTANCE and License Versions*. Your receipt and use of the Software constitutes your acceptance of this License and its terms and conditions. Software released by Unity under this License may be modified or updated and the License with it; upon any such modification or update, you will comply with the terms of the updated License for any use of any of the Software under the updated License. + +1. *Use in Compliance with Law and Termination*. Your exercise of the license granted herein will at all times be in compliance with applicable law and will not infringe any proprietary rights (including intellectual property rights); this License will terminate immediately on any breach by you of this License. + +1. *Severability*. If any provision of this License is held to be unenforceable or invalid, that provision will be enforced to the maximum extent possible and the other provisions will remain in full force and effect. + +1. *Governing Law and Venue*. This License is governed by and construed in accordance with the laws of Denmark, except for its conflict of laws rules; the United Nations Convention on Contracts for the International Sale of Goods will not apply. If you reside (or your principal place of business is) within the United States, you and Unity agree to submit to the personal and exclusive jurisdiction of and venue in the state and federal courts located in San Francisco County, California concerning any dispute arising out of this License ("**_Dispute_**"). If you reside (or your principal place of business is) outside the United States, you and Unity agree to submit to the personal and exclusive jurisdiction of and venue in the courts located in Copenhagen, Denmark concerning any Dispute. diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md.meta new file mode 100644 index 0000000..30f5c3a --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c754112a02f354a6696fa4f2b99e95a5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md b/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md new file mode 100644 index 0000000..5cfbd88 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md @@ -0,0 +1,16 @@ +# Collab Proxy UPM Package +This is the packaged version of Collab, currently limited to containing the History and Toolbar windows, along with supporting classes. + +## Development +Check this repository out in your {$PROJECT}/Packages/ folder, under the name com.unity.collab-proxy. The classes will be built by Unity. + +## Testing +In order to run the tests, you will need to add this project to the testables key in your manifest.json - once you have done this, the tests will be picked up by the Unity Test Runner window. + +## Building +You may build this project using msbuild. The commands to do so can be seen under .gitlab-ci.yml. + +## Deploying +Gitlab will automatically build your project when you deploy. You can download the resulting artifact, which will be a dll, and place it in your Editor/bin/ folder. Open the package in Unity to generate the meta files, and then you will be able to publish. + +We're currently looking into a way to avoid this manual process. diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md.meta new file mode 100644 index 0000000..b3ad993 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ac281230df7b14becb40b3c479f1b429 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests.meta new file mode 100644 index 0000000..f43ddd3 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1369382d2c5e64dc5b2ec0b6b0a94531 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor.meta new file mode 100644 index 0000000..b80cefd --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4506ac79f5b274cb1b249ed7f4abfb9a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs new file mode 100644 index 0000000..ba79a20 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs @@ -0,0 +1,583 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEditor.Collaboration; +using UnityEngine.TestTools; +using NUnit.Framework; + +namespace UnityEditor.Collaboration.Tests +{ + [TestFixture] + internal class HistoryTests + { + private TestHistoryWindow _window; + private TestRevisionsService _service; + private CollabHistoryPresenter _presenter; + + [SetUp] + public void SetUp() + { + _window = new TestHistoryWindow(); + _service = new TestRevisionsService(); + _presenter = new CollabHistoryPresenter(_window, new CollabHistoryItemFactory(), _service); + } + + [TearDown] + public void TearDown() + { + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__PropagatesRevisionResult() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(authorName: "authorName", comment: "comment", revisionID: "revisionID"), + } + }; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual("revisionID", item.id); + Assert.AreEqual("authorName", item.authorName); + Assert.AreEqual("comment", item.comment); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__RevisionNumberingIsInOrder() + { + _service.result = new RevisionsResult() + { + RevisionsInRepo = 4, + Revisions = new List() + { + new Revision(revisionID: "0"), + new Revision(revisionID: "1"), + new Revision(revisionID: "2"), + new Revision(revisionID: "3"), + } + }; + + _presenter.OnUpdatePage(0); + var items = _window.items.ToArray(); + + Assert.AreEqual(4, items[0].index); + Assert.AreEqual(3, items[1].index); + Assert.AreEqual(2, items[2].index); + Assert.AreEqual(1, items[3].index); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__RevisionNumberingChangesForMorePages() + { + _service.result = new RevisionsResult() + { + RevisionsInRepo = 12, + Revisions = new List() + { + new Revision(revisionID: "0"), + new Revision(revisionID: "1"), + new Revision(revisionID: "2"), + new Revision(revisionID: "3"), + new Revision(revisionID: "4"), + } + }; + + _presenter.OnUpdatePage(1); + var items = _window.items.ToArray(); + + Assert.AreEqual(12, items[0].index); + Assert.AreEqual(11, items[1].index); + Assert.AreEqual(10, items[2].index); + Assert.AreEqual(9, items[3].index); + Assert.AreEqual(8, items[4].index); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__ObtainedIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(isObtained: false), + new Revision(isObtained: true), + } + }; + + _presenter.OnUpdatePage(0); + var items = _window.items.ToArray(); + + Assert.IsFalse(items[0].obtained); + Assert.IsTrue(items[1].obtained); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__CurrentIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "1"), + new Revision(revisionID: "2"), + new Revision(revisionID: "3"), + } + }; + _service.tipRevision = "2"; + + _presenter.OnUpdatePage(0); + var items = _window.items.ToArray(); + + Assert.AreEqual(false, items[0].current); + Assert.AreEqual(true, items[1].current); + Assert.AreEqual(false, items[2].current); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__InProgressIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "1"), + new Revision(revisionID: "2"), + new Revision(revisionID: "3"), + } + }; + _window.inProgressRevision = "2"; + + _presenter.OnUpdatePage(0); + var items = _window.items.ToArray(); + + Assert.IsFalse(items[0].inProgress); + Assert.IsTrue(items[1].inProgress); + Assert.IsFalse(items[2].inProgress); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__EnabledIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _window.revisionActionsEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(true, item.enabled); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__DisabledIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _window.revisionActionsEnabled = false; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(false, item.enabled); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasNoneWhenNotTip() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "1"), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = false; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.None, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateTipHasNoneWhenEnabled() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.None, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasConfigureWhenTip() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = false; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.Configure, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasConfigureWhenZeroBuildStatus() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = false; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.Configure, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasNoneWhenZeroBuildStatuses() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.None, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasSuccessWhenCompleteAndSucceeded() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + revisionID: "0", + buildStatuses: new CloudBuildStatus[1] + { + new CloudBuildStatus(complete: true, success: true), + } + ), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.Success, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasInProgress() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + revisionID: "0", + buildStatuses: new CloudBuildStatus[1] + { + new CloudBuildStatus(complete: false), + } + ), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.InProgress, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasFailure() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + revisionID: "0", + buildStatuses: new CloudBuildStatus[1] + { + new CloudBuildStatus(complete: true, success: false), + } + ), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.Failed, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasFailureWhenAnyBuildsFail() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + revisionID: "0", + buildStatuses: new CloudBuildStatus[3] + { + new CloudBuildStatus(complete: true, success: false), + new CloudBuildStatus(complete: true, success: false), + new CloudBuildStatus(complete: true, success: true), + } + ), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.Failed, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__ChangesPropagateThrough() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0", entries: GenerateChangeActions(3)), + } + }; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + var changes = item.changes.ToList(); + + Assert.AreEqual("Path0", changes[0].path); + Assert.AreEqual("Path1", changes[1].path); + Assert.AreEqual("Path2", changes[2].path); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__ChangesTotalIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0", entries: GenerateChangeActions(3)), + } + }; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(3, item.changes.Count); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__ChangesTruncatedIsCalculated() + { + for (var i = 0; i < 20; i++) + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0", entries: GenerateChangeActions(i)), + } + }; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(i > 10, item.changesTruncated); + } + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__OnlyKeeps10ChangeActions() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(authorName: "Test", author: "test", entries: GenerateChangeActions(12)), + } + }; + + _presenter.OnUpdatePage(1); + var item = _window.items.First(); + + Assert.AreEqual(10, item.changes.Count); + Assert.AreEqual(12, item.changesTotal); + Assert.AreEqual(true, item.changesTruncated); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__DeduplicatesMetaFiles() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + authorName: "Test", + author: "test", + revisionID: "", + entries: new ChangeAction[2] + { + new ChangeAction(path: "Path1", action: "Action1"), + new ChangeAction(path: "Path1.meta", action: "Action1"), + } + ), + } + }; + + _presenter.OnUpdatePage(1); + var item = _window.items.First(); + + Assert.AreEqual(1, item.changes.Count); + Assert.AreEqual(1, item.changesTotal); + Assert.AreEqual("Path1", item.changes.First().path); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__FolderMetaFilesAreCounted() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + authorName: "Test", + author: "test", + entries: new ChangeAction[1] + { + new ChangeAction(path: "Folder1.meta", action: "Action1"), + } + ), + } + }; + + _presenter.OnUpdatePage(1); + var item = _window.items.First(); + + Assert.AreEqual(1, item.changes.Count); + Assert.AreEqual(1, item.changesTotal); + Assert.AreEqual("Folder1", item.changes.First().path); + } + + private static ChangeAction[] GenerateChangeActions(int count) + { + var entries = new ChangeAction[count]; + for (var i = 0; i < count; i++) + entries[i] = new ChangeAction(path: "Path" + i, action: "Action" + i); + return entries; + } + } + + internal class TestRevisionsService : IRevisionsService + { + public RevisionsResult result; + public event RevisionsDelegate FetchRevisionsCallback; + + public string tipRevision { get; set; } + public string currentUser { get; set; } + + public void GetRevisions(int offset, int count) + { + if(FetchRevisionsCallback != null) + { + FetchRevisionsCallback(result); + } + } + } + + internal class TestHistoryWindow : ICollabHistoryWindow + { + public IEnumerable items; + + public bool revisionActionsEnabled { get; set; } + public int itemsPerPage { get; set; } + public string errMessage { get; set; } + public string inProgressRevision { get; set; } + public PageChangeAction OnPageChangeAction { get; set; } + public RevisionAction OnGoBackAction { get; set; } + public RevisionAction OnUpdateAction { get; set; } + public RevisionAction OnRestoreAction { get; set; } + public ShowBuildAction OnShowBuildAction { get; set; } + public Action OnShowServicesAction { get; set; } + + public void UpdateState(HistoryState state, bool force) + { + } + + public void UpdateRevisions(IEnumerable items, string tip, int totalRevisions, int currPage) + { + this.items = items; + } + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs.meta new file mode 100644 index 0000000..d648a7f --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 23a56a19774ed42b6b65646af08a003c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef new file mode 100644 index 0000000..3467a9e --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef @@ -0,0 +1,13 @@ +{ + "name": "Unity.CollabProxy.EditorTests", + "references": [ + "Unity.CollabProxy.Editor" + ], + "optionalUnityReferences": [ + "TestAssemblies" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [] +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef.meta new file mode 100644 index 0000000..57db5c7 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 782de34c17796430ba8d0ceddb60944e +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json b/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json new file mode 100644 index 0000000..3402274 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json @@ -0,0 +1,21 @@ +{ + "name": "com.unity.collab-proxy", + "displayName": "Unity Collaborate", + "version": "1.2.16", + "unity": "2018.3", + "description": "Collaborate is a simple way for teams to save, share, and sync their Unity project", + "keywords": [ + "collab", + "collaborate", + "teams", + "team", + "cloud", + "backup" + ], + "dependencies": {}, + "repository": { + "type": "git", + "url": "https://gitlab.cds.internal.unity3d.com/upm-packages/cloud-services/collab-proxy.git", + "revision": "070e173b6a36e1d6097b1d95e09c08840c23f6ca" + } +} diff --git a/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json.meta b/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json.meta new file mode 100644 index 0000000..c52d0c6 --- /dev/null +++ b/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 57b0c806ba25b48aa8a6ecb3345a4a9b +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/.gitlab-ci.yml b/Library/PackageCache/com.unity.ext.nunit@1.0.0/.gitlab-ci.yml new file mode 100644 index 0000000..4c64e22 --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/.gitlab-ci.yml @@ -0,0 +1,15 @@ +image: node:6.10.0 + +stages: + - push_to_packman_staging + +push_to_packman_staging: + stage: push_to_packman_staging + only: + - tags + script: + - sed -i "s/0.0.1-PLACEHOLDERVERSION/$CI_COMMIT_TAG/g" package.json + - sed -i "s/PLACEHOLDERSHA/$CI_COMMIT_SHA/g" package.json + - sed -i "s/0.0.1-PLACEHOLDERVERSION/$CI_COMMIT_TAG/g" CHANGELOG.md + - curl -u $USER_NAME:$API_KEY https://staging-packages.unity.com/auth > .npmrc + - npm publish diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/CHANGELOG.md b/Library/PackageCache/com.unity.ext.nunit@1.0.0/CHANGELOG.md new file mode 100644 index 0000000..225baea --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog +All notable changes to this package will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [1.0.0] - 2019-02-21 + +### This is the first release of *Unity Package com.unity.ext.nunit*. + +- Migrated the custom version of nunit from inside of unity. diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/CHANGELOG.md.meta b/Library/PackageCache/com.unity.ext.nunit@1.0.0/CHANGELOG.md.meta new file mode 100644 index 0000000..d91fbde --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f49bbe06ffa5ae24abe32abdab430c24 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/Documentation~/ext.nunit.md b/Library/PackageCache/com.unity.ext.nunit@1.0.0/Documentation~/ext.nunit.md new file mode 100644 index 0000000..2a38b9d --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/Documentation~/ext.nunit.md @@ -0,0 +1,6 @@ +# Custom Nunit build to work with Unity + +This version of nunit works with all platforms, il2cpp and Mono AOT. + +For Nunit Documentation: +https://github.com/nunit/docs/wiki/NUnit-Documentation diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/LICENSE.md b/Library/PackageCache/com.unity.ext.nunit@1.0.0/LICENSE.md new file mode 100644 index 0000000..ccc1f59 --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/LICENSE.md @@ -0,0 +1,19 @@ +Copyright (c) 2018 Charlie Poole, Rob Prouse + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/LICENSE.md.meta b/Library/PackageCache/com.unity.ext.nunit@1.0.0/LICENSE.md.meta new file mode 100644 index 0000000..90df748 --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f91a00d2dca52b843b2d50ccf750737d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/README.md b/Library/PackageCache/com.unity.ext.nunit@1.0.0/README.md new file mode 100644 index 0000000..2a38b9d --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/README.md @@ -0,0 +1,6 @@ +# Custom Nunit build to work with Unity + +This version of nunit works with all platforms, il2cpp and Mono AOT. + +For Nunit Documentation: +https://github.com/nunit/docs/wiki/NUnit-Documentation diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/README.md.meta b/Library/PackageCache/com.unity.ext.nunit@1.0.0/README.md.meta new file mode 100644 index 0000000..e9a7f9f --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5da62a0c1c5218c4aa16b74546a7822d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35.meta b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35.meta new file mode 100644 index 0000000..278a2fa --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a36d8b72880a8004f96ac54ce4598ff9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom.meta b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom.meta new file mode 100644 index 0000000..750f82c --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2347243c7aa3e224f9282dc94e6fc3b2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/This is a custom build DONT include.txt b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/This is a custom build DONT include.txt new file mode 100644 index 0000000..0839eb9 --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/This is a custom build DONT include.txt @@ -0,0 +1,4 @@ +This is a custom nUnit build meant to be used by Unity editor and players. It shoul not be included or referenced from anywhere (unless you know what you're doing) + +Build from this repo +https://github.com/Unity-Technologies/nunit \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/This is a custom build DONT include.txt.meta b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/This is a custom build DONT include.txt.meta new file mode 100644 index 0000000..5e251ee --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/This is a custom build DONT include.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3d67ccdf81bed8247ad0db2d5f47a7d1 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll new file mode 100644 index 0000000..3af863c Binary files /dev/null and b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll differ diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll.mdb b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll.mdb new file mode 100644 index 0000000..cb688df Binary files /dev/null and b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll.mdb differ diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll.mdb.meta b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll.mdb.meta new file mode 100644 index 0000000..1e81d1e --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll.mdb.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6f768c3714a34a549960ea903fbadcc2 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll.meta b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll.meta new file mode 100644 index 0000000..2870dbc --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll.meta @@ -0,0 +1,37 @@ +fileFormatVersion: 2 +guid: f1605f5534186904fa2c4c42acbfe01e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: ["UNITY_INCLUDE_TESTS"] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 1 + platformData: + - first: + '': Any + second: + enabled: 0 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.pdb b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.pdb new file mode 100644 index 0000000..cae9b39 Binary files /dev/null and b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.pdb differ diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.pdb.meta b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.pdb.meta new file mode 100644 index 0000000..dc02745 --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.pdb.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f136f1f122a53c64c9af51baecaa9c96 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.xml b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.xml new file mode 100644 index 0000000..aea2099 --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.xml @@ -0,0 +1,18101 @@ + + + + nunit.framework + + + + + Basic Asserts on strings. + + + + + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an InvalidOperationException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string is not found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + + + + Combines multiple filters so that a test must pass all + of them in order to pass this filter. + + + + + A base class for multi-part filters + + + + + Interface to be implemented by filters applied to tests. + The filter applies when running the test, after it has been + loaded, since this is the only time an ITest exists. + + + + + Interface to be implemented by filters applied to tests. + The filter applies when running the test, after it has been + loaded, since this is the only time an ITest exists. + + + + + An object implementing IXmlNodeBuilder is able to build + an XML representation of itself and any children. + + + + + Returns a TNode representing the current object. + + If true, children are included where applicable + A TNode representing the result + + + + Returns a TNode representing the current object after + adding it as a child of the supplied parent node. + + The parent node. + If true, children are included, where applicable + + + + + Determine if a particular test passes the filter criteria. Pass + may examine the parents and/or descendants of a test, depending + on the semantics of the particular filter + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Determine if a test matches the filter expicitly. That is, it must + be a direct match of the test itself or one of it's children. + + The test to which the filter is applied + True if the test matches the filter explicityly, otherwise false + + + + Unique Empty filter. + + + + + Determine if a particular test passes the filter criteria. The default + implementation checks the test itself, its parents and any descendants. + + Derived classes may override this method or any of the Match methods + to change the behavior of the filter. + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Determine if a test matches the filter expicitly. That is, it must + be a direct match of the test itself or one of it's children. + + The test to which the filter is applied + True if the test matches the filter explicityly, otherwise false + + + + Determine whether the test itself matches the filter criteria, without + examining either parents or descendants. This is overridden by each + different type of filter to perform the necessary tests. + + The test to which the filter is applied + True if the filter matches the any parent of the test + + + + Determine whether any ancestor of the test matches the filter criteria + + The test to which the filter is applied + True if the filter matches the an ancestor of the test + + + + Determine whether any descendant of the test matches the filter criteria. + + The test to be matched + True if at least one descendant matches the filter criteria + + + + Create a TestFilter instance from an xml representation. + + + + + Create a TestFilter from it's TNode representation + + + + + Adds an XML node + + True if recursive + The added XML node + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Indicates whether this is the EmptyFilter + + + + + Indicates whether this is a top-level filter, + not contained in any other filter. + + + + + Nested class provides an empty filter - one that always + returns true when called. It never matches explicitly. + + + + + Constructs an empty CompositeFilter + + + + + Constructs a CompositeFilter from an array of filters + + + + + + Adds a filter to the list of filters + + The filter to be added + + + + Checks whether the CompositeFilter is matched by a test. + + The test to be matched + + + + Checks whether the CompositeFilter is matched by a test. + + The test to be matched + + + + Checks whether the CompositeFilter is explicit matched by a test. + + The test to be matched + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Return a list of the composing filters. + + + + + Gets the element name + + Element name + + + + Constructs an empty AndFilter + + + + + Constructs an AndFilter from an array of filters + + + + + + Checks whether the AndFilter is matched by a test + + The test to be matched + True if all the component filters pass, otherwise false + + + + Checks whether the AndFilter is matched by a test + + The test to be matched + True if all the component filters match, otherwise false + + + + Checks whether the AndFilter is explicit matched by a test. + + The test to be matched + True if all the component filters explicit match, otherwise false + + + + Gets the element name + + Element name + + + + SubstringConstraint can test whether a string contains + the expected substring. + + + + + StringConstraint is the abstract base for constraints + that operate on strings. It supports the IgnoreCase + modifier for string operations. + + + + + The Constraint class is the base of all built-in constraints + within NUnit. It provides the operator overloads used to combine + constraints. + + + + + Interface for all constraints + + + + + The IResolveConstraint interface is implemented by all + complete and resolvable constraints and expressions. + + + + + Return the top-level constraint for this expression + + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + + A reference to the value to be tested + A ConstraintResult + + + + The display name of this Constraint for use by ToString(). + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Arguments provided to this Constraint, for use in + formatting the description. + + + + + The ConstraintBuilder holding this constraint + + + + + Construct a constraint with optional arguments + + Arguments to be saved + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + + A reference to the value to be tested + A ConstraintResult + + + + Retrieves the value to be tested from an ActualValueDelegate. + The default implementation simply evaluates the delegate but derived + classes may override it to provide for delayed processing. + + An ActualValueDelegate + Delegate evaluation result + + + + Default override of ToString returns the constraint DisplayName + followed by any arguments within angle brackets. + + + + + + Returns the string representation of this constraint + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. + + + + + Returns a DelayedConstraint with the specified delay time. + + The delay in milliseconds. + + + + + Returns a DelayedConstraint with the specified delay time + and polling interval. + + The delay in milliseconds. + The interval at which to test the constraint. + + + + + Resolves any pending operators and returns the resolved constraint. + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Arguments provided to this Constraint, for use in + formatting the description. + + + + + The ConstraintBuilder holding this constraint + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending Or + to the current constraint. + + + + + The expected value + + + + + Indicates whether tests should be case-insensitive + + + + + Description of this constraint + + + + + Constructs a StringConstraint without an expected value + + + + + Constructs a StringConstraint given an expected value + + The expected value + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Test whether the constraint is satisfied by a given string + + The string to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Modify the constraint to ignore case in matching. + + + + + Initializes a new instance of the class. + + The expected. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Abstract base class used for prefixes + + + + + Construct given a base constraint + + + + + + The base constraint + + + + + Prefix used in forming the constraint description + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + AssignableToConstraint is used to test that an object + can be assigned to a given Type. + + + + + TypeConstraint is the abstract base for constraints + that take a Type as their expected value. + + + + + The expected Type used by the constraint + + + + + The type of the actual argument to which the constraint was applied + + + + + Construct a TypeConstraint for a given Type + + The expected type for the constraint + Prefix used in forming the constraint description + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + Construct an AssignableToConstraint for the type provided + + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + Summary description for MaxTimeAttribute. + + + + + PropertyAttribute is used to attach information to a test as a name/value pair.. + + + + + The abstract base class for all custom attributes defined by NUnit. + + + + + Default constructor + + + + + The IApplyToTest interface is implemented by self-applying + attributes that modify the state of a test in some way. + + + + + Modifies a test as defined for the specific attribute. + + The test to modify + + + + Construct a PropertyAttribute with a name and string value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and int value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and double value + + The name of the property + The property value + + + + Constructor for derived classes that set the + property dictionary directly. + + + + + Constructor for use by derived classes that use the + name of the type as the property name. Derived classes + must ensure that the Type of the property value is + a standard type supported by the BCL. Any custom + types will cause a serialization Exception when + in the client. + + + + + Modifies a test by adding properties to it. + + The test to modify + + + + Gets the property dictionary for this attribute + + + + + Objects implementing this interface are used to wrap + the entire test, including SetUp and TearDown. + + + + + ICommandWrapper is implemented by attributes and other + objects able to wrap a TestCommand with another command. + + + Attributes or other objects should implement one of the + derived interfaces, rather than this one, since they + indicate in which part of the command chain the wrapper + should be applied. + + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + Construct a MaxTimeAttribute, given a time in milliseconds. + + The maximum elapsed time in milliseconds + + + + Randomizer returns a set of random _values in a repeatable + way, to allow re-running of tests if necessary. It extends + the .NET Random class, providing random values for a much + wider range of types. + + The class is used internally by the framework to generate + test case data and is also exposed for use by users through + the TestContext.Random property. + + + For consistency with the underlying Random Type, methods + returning a single value use the prefix "Next..." Those + without an argument return a non-negative value up to + the full positive range of the Type. Overloads are provided + for specifying a maximum or a range. Methods that return + arrays or strings use the prefix "Get..." to avoid + confusion with the single-value methods. + + + + + Default characters for random functions. + + Default characters are the English alphabet (uppercase & lowercase), arabic numerals, and underscore + + + + Get a Randomizer for a particular member, returning + one that has already been created if it exists. + This ensures that the same _values are generated + each time the tests are reloaded. + + + + + Get a randomizer for a particular parameter, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Create a new Randomizer using the next seed + available to ensure that each randomizer gives + a unique sequence of values. + + + + + + Default constructor + + + + + Construct based on seed value + + + + + + Returns a random unsigned int. + + + + + Returns a random unsigned int less than the specified maximum. + + + + + Returns a random unsigned int within a specified range. + + + + + Returns a non-negative random short. + + + + + Returns a non-negative random short less than the specified maximum. + + + + + Returns a non-negative random short within a specified range. + + + + + Returns a random unsigned short. + + + + + Returns a random unsigned short less than the specified maximum. + + + + + Returns a random unsigned short within a specified range. + + + + + Returns a random long. + + + + + Returns a random long less than the specified maximum. + + + + + Returns a non-negative random long within a specified range. + + + + + Returns a random ulong. + + + + + Returns a random ulong less than the specified maximum. + + + + + Returns a non-negative random long within a specified range. + + + + + Returns a random Byte + + + + + Returns a random Byte less than the specified maximum. + + + + + Returns a random Byte within a specified range + + + + + Returns a random SByte + + + + + Returns a random sbyte less than the specified maximum. + + + + + Returns a random sbyte within a specified range + + + + + Returns a random bool + + + + + Returns a random bool based on the probablility a true result + + + + + Returns a random double between 0.0 and the specified maximum. + + + + + Returns a random double within a specified range. + + + + + Returns a random float. + + + + + Returns a random float between 0.0 and the specified maximum. + + + + + Returns a random float within a specified range. + + + + + Returns a random enum value of the specified Type as an object. + + + + + Returns a random enum value of the specified Type. + + + + + Generate a random string based on the characters from the input string. + + desired length of output string. + string representing the set of characters from which to construct the resulting string + A random string of arbitrary length + + + + Generate a random string based on the characters from the input string. + + desired length of output string. + A random string of arbitrary length + Uses DefaultStringChars as the input character set + + + + Generate a random string based on the characters from the input string. + + A random string of the default length + Uses DefaultStringChars as the input character set + + + + Returns a random decimal. + + + + + Returns a random decimal between positive zero and the specified maximum. + + + + + Returns a random decimal within a specified range, which is not + permitted to exceed decimal.MaxVal in the current implementation. + + + A limitation of this implementation is that the range from min + to max must not exceed decimal.MaxVal. + + + + + Initial seed used to create randomizers for this run + + + + + The IFixtureBuilder interface is exposed by a class that knows how to + build a TestFixture from one or more Types. In general, it is exposed + by an attribute, but may be implemented in a helper class used by the + attribute in some cases. + + + + + Build one or more TestFixtures from type provided. At least one + non-null TestSuite must always be returned, since the method is + generally called because the user has marked the target class as + a fixture. If something prevents the fixture from being used, it + will be returned nonetheless, labelled as non-runnable. + + The type info of the fixture to be used. + A TestSuite object or one derived from TestSuite. + + + + The ITestBuilder interface is exposed by a class that knows how to + build one or more TestMethods from a MethodInfo. In general, it is exposed + by an attribute, which has additional information available to provide + the necessary test parameters to distinguish the test cases built. + + + + + Build one or more TestMethods from the provided MethodInfo. + + The method to be used as a test + The TestSuite to which the method will be added + A TestMethod object + + + + The IReflectionInfo interface is implemented by NUnit wrapper objects that perform reflection. + + + + + Returns an array of custom attributes of the specified type applied to this object + + + + + Returns a value indicating whether an attribute of the specified type is defined on this object. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents the result of running a test suite + + + + + The TestResult class represents the result of a test. + + + + + The ITestResult interface represents the result of a test. + + + + + Gets the ResultState of the test result, which + indicates the success or failure of the test. + + + + + Gets the name of the test result + + + + + Gets the full name of the test result + + + + + Gets the elapsed time for running the test in seconds + + + + + Gets or sets the time the test started running. + + + + + Gets or sets the time the test finished running. + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stacktrace associated with an + error or failure. Not available in + the Compact Framework 1.0. + + + + + Gets the number of asserts executed + when running the test and all its children. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + Accessing HasChildren should not force creation of the + Children collection in classes implementing this interface. + + + + + Gets the the collection of child results. + + + + + Gets the Test to which this result applies. + + + + + Gets any text output written to this result. + + + + + The minimum duration for tests + + + + + Error message for when child tests have errors + + + + + Error message for when child tests are ignored + + + + + Aggregate assertion count + + + + + Construct a test result given a Test + + The test to be used + + + + Returns the Xml representation of the result. + + If true, descendant results are included + An XmlNode representing the result + + + + Adds the XML representation of the result as a child of the + supplied parent node.. + + The parent node. + If true, descendant results are included + + + + + Set the result of the test + + The ResultState to use in the result + + + + Set the result of the test + + The ResultState to use in the result + A message associated with the result state + + + + Set the result of the test + + The ResultState to use in the result + A message associated with the result state + Stack trace giving the location of the command + + + + Set the test result based on the type of exception thrown + + The exception that was thrown + + + + Set the test result based on the type of exception thrown + + The exception that was thrown + THe FailureSite to use in the result + + + + RecordTearDownException appends the message and stacktrace + from an exception arising during teardown of the test + to any previously recorded information, so that any + earlier failure information is not lost. Note that + calling Assert.Ignore, Assert.Inconclusive, etc. during + teardown is treated as an error. If the current result + represents a suite, it may show a teardown error even + though all contained tests passed. + + The Exception to be recorded + + + + Adds a reason element to a node and returns it. + + The target node. + The new reason element. + + + + Adds a failure element to a node and returns it. + + The target node. + The new failure element. + + + + Gets the test with which this result is associated. + + + + + Gets the ResultState of the test result, which + indicates the success or failure of the test. + + + + + Gets the name of the test result + + + + + Gets the full name of the test result + + + + + Gets or sets the elapsed time for running the test in seconds + + + + + Gets or sets the time the test started running. + + + + + Gets or sets the time the test finished running. + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stacktrace associated with an + error or failure. + + + + + Gets or sets the count of asserts executed + when running the test. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + Gets a TextWriter, which will write output to be included in the result. + + + + + Gets any text output written to this result. + + + + + Construct a TestSuiteResult base on a TestSuite + + The TestSuite to which the result applies + + + + Adds a child result to this result, setting this result's + ResultState to Failure if the child result failed. + + The result to be added + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + TestSuite represents a composite test, which contains other tests. + + + + + The Test abstract class represents a test within the framework. + + + + + Common interface supported by all representations + of a test. Only includes informational fields. + The Run method is specifically excluded to allow + for data-only representations of a test. + + + + + Gets the id of the test + + + + + Gets the name of the test + + + + + Gets the fully qualified name of the test + + + + + Gets the name of the class containing this test. Returns + null if the test is not associated with a class. + + + + + Gets the name of the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Gets the Type of the test fixture, if applicable, or + null if no fixture type is associated with this test. + + + + + Gets an IMethod for the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Gets the RunState of the test, indicating whether it can be run. + + + + + Count of the test cases ( 1 if this is a test case ) + + + + + Gets the properties of the test + + + + + Gets the parent test, if any. + + The parent test or null if none exists. + + + + Returns true if this is a test suite + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets this test's child tests + + A list of child tests + + + + Gets a fixture object for running this test. + + + + + Static value to seed ids. It's started at 1000 so any + uninitialized ids will stand out. + + + + + The SetUp methods. + + + + + The teardown methods + + + + + Used to cache the declaring type for this MethodInfo + + + + + Method property backing field + + + + + Constructs a test given its name + + The name of the test + + + + Constructs a test given the path through the + test hierarchy to its parent and a name. + + The parent tests full name + The name of the test + + + + TODO: Documentation needed for constructor + + + + + + Construct a test from a MethodInfo + + + + + + Creates a TestResult for this test. + + A TestResult suitable for this type of test. + + + + Modify a newly constructed test by applying any of NUnit's common + attributes, based on a supplied ICustomAttributeProvider, which is + usually the reflection element from which the test was constructed, + but may not be in some instances. The attributes retrieved are + saved for use in subsequent operations. + + An object implementing ICustomAttributeProvider + + + + Add standard attributes and members to a test node. + + + + + + + Returns the Xml representation of the test + + If true, include child tests recursively + + + + + Returns an XmlNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Compares this test to another test for sorting purposes + + The other test + Value of -1, 0 or +1 depending on whether the current test is less than, equal to or greater than the other test + + + + Gets or sets the id of the test + + + + + + Gets or sets the name of the test + + + + + Gets or sets the fully qualified name of the test + + + + + + Gets the name of the class where this test was declared. + Returns null if the test is not associated with a class. + + + + + Gets the name of the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Gets the TypeInfo of the fixture used in running this test + or null if no fixture type is associated with it. + + + + + Gets a MethodInfo for the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Whether or not the test should be run + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Gets a string representing the type of test. Used as an attribute + value in the XML representation of a test and has no other + function in the framework. + + + + + Gets a count of test cases represented by + or contained under this test. + + + + + Gets the properties for this test + + + + + Returns true if this is a TestSuite + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets the parent as a Test object. + Used by the core to set the parent. + + + + + Gets this test's child tests + + A list of child tests + + + + Gets or sets a fixture object for running this test. + + + + + Static prefix used for ids in this AppDomain. + Set by FrameworkController. + + + + + Gets or Sets the Int value representing the seed for the RandomGenerator + + + + + + Our collection of child tests + + + + + Initializes a new instance of the class. + + The name of the suite. + + + + Initializes a new instance of the class. + + Name of the parent suite. + The name of the suite. + + + + Initializes a new instance of the class. + + Type of the fixture. + + + + Initializes a new instance of the class. + + Type of the fixture. + + + + Sorts tests under this suite. + + + + + Adds a test to the suite. + + The test. + + + + Overridden to return a TestSuiteResult. + + A TestResult for this test. + + + + Returns an XmlNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Check that setup and teardown methods marked by certain attributes + meet NUnit's requirements and mark the tests not runnable otherwise. + + The attribute type to check for + + + + Gets this test's child tests + + The list of child tests + + + + Gets a count of test cases represented by + or contained under this test. + + + + + + The arguments to use in creating the fixture + + + + + Set to true to suppress sorting this suite's contents + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + A PropertyBag represents a collection of name value pairs + that allows duplicate entries with the same key. Methods + are provided for adding a new pair as well as for setting + a key to a single value. All keys are strings but _values + may be of any type. Null _values are not permitted, since + a null entry represents the absence of the key. + + + + + A PropertyBag represents a collection of name/value pairs + that allows duplicate entries with the same key. Methods + are provided for adding a new pair as well as for setting + a key to a single value. All keys are strings but _values + may be of any type. Null _values are not permitted, since + a null entry represents the absence of the key. + + The entries in a PropertyBag are of two kinds: those that + take a single value and those that take multiple _values. + However, the PropertyBag has no knowledge of which entries + fall into each category and the distinction is entirely + up to the code using the PropertyBag. + + When working with multi-valued properties, client code + should use the Add method to add name/value pairs and + indexing to retrieve a list of all _values for a given + key. For example: + + bag.Add("Tag", "one"); + bag.Add("Tag", "two"); + Assert.That(bag["Tag"], + Is.EqualTo(new string[] { "one", "two" })); + + When working with single-valued propeties, client code + should use the Set method to set the value and Get to + retrieve the value. The GetSetting methods may also be + used to retrieve the value in a type-safe manner while + also providing default. For example: + + bag.Set("Priority", "low"); + bag.Set("Priority", "high"); // replaces value + Assert.That(bag.Get("Priority"), + Is.EqualTo("high")); + Assert.That(bag.GetSetting("Priority", "low"), + Is.EqualTo("high")); + + + + + Adds a key/value pair to the property bag + + The key + The value + + + + Sets the value for a key, removing any other + _values that are already in the property set. + + + + + + + Gets a single value for a key, using the first + one if multiple _values are present and returning + null if the value is not found. + + + + + Gets a flag indicating whether the specified key has + any entries in the property set. + + The key to be checked + True if their are _values present, otherwise false + + + + Gets or sets the list of _values for a particular key + + The key for which the _values are to be retrieved or set + + + + Gets a collection containing all the keys in the property set + + + + + Adds a key/value pair to the property set + + The key + The value + + + + Sets the value for a key, removing any other + _values that are already in the property set. + + + + + + + Gets a single value for a key, using the first + one if multiple _values are present and returning + null if the value is not found. + + + + + + + Gets a flag indicating whether the specified key has + any entries in the property set. + + The key to be checked + + True if their are _values present, otherwise false + + + + + Returns an XmlNode representating the current PropertyBag. + + Not used + An XmlNode representing the PropertyBag + + + + Returns an XmlNode representing the PropertyBag after + adding it as a child of the supplied parent node. + + The parent node. + Not used + + + + + Gets a collection containing all the keys in the property set + + + + + + Gets or sets the list of _values for a particular key + + + + + Thrown when an assertion failed. Here to preserve the inner + exception and hence its stack trace. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The error message that explains + the reason for the exception + + + + Initializes a new instance of the class. + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + FullName filter selects tests based on their FullName + + + + + ValueMatchFilter selects tests based on some value, which + is expected to be contained in the test. + + + + + Construct a ValueMatchFilter for a single value. + + The value to be included. + + + + Match the input provided by the derived class + + The value to be matchedT + True for a match, false otherwise. + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Returns the value matched by the filter - used for testing + + + + + Indicates whether the value is a regular expression + + + + + Gets the element name + + Element name + + + + Construct a FullNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + NotFilter negates the operation of another filter + + + + + Construct a not filter on another filter + + The filter to be negated + + + + Determine if a particular test passes the filter criteria. The default + implementation checks the test itself, its parents and any descendants. + + Derived classes may override this method or any of the Match methods + to change the behavior of the filter. + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Check whether the filter matches a test + + The test to be matched + True if it matches, otherwise false + + + + Determine if a test matches the filter expicitly. That is, it must + be a direct match of the test itself or one of it's children. + + The test to which the filter is applied + True if the test matches the filter explicityly, otherwise false + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the base filter + + + + + SequentialStrategy creates test cases by using all of the + parameter data sources in parallel, substituting null + when any of them run out of data. + + + + + CombiningStrategy is the abstract base for classes that + know how to combine values provided for individual test + parameters to create a set of test cases. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + NUnitTestFixtureBuilder is able to build a fixture given + a class marked with a TestFixtureAttribute or an unmarked + class containing test methods. In the first case, it is + called by the attribute and in the second directly by + NUnitSuiteBuilder. + + + + + Build a TestFixture from type provided. A non-null TestSuite + must always be returned, since the method is generally called + because the user has marked the target class as a fixture. + If something prevents the fixture from being used, it should + be returned nonetheless, labelled as non-runnable. + + An ITypeInfo for the fixture to be used. + A TestSuite object or one derived from TestSuite. + + + + Overload of BuildFrom called by tests that have arguments. + Builds a fixture using the provided type and information + in the ITestFixtureData object. + + The TypeInfo for which to construct a fixture. + An object implementing ITestFixtureData or null. + + + + + Method to add test cases to the newly constructed fixture. + + The fixture to which cases should be added + + + + Method to create a test case from a MethodInfo and add + it to the fixture being built. It first checks to see if + any global TestCaseBuilder addin wants to build the + test case. If not, it uses the internal builder + collection maintained by this fixture builder. + + The default implementation has no test case builders. + Derived classes should add builders to the collection + in their constructor. + + The method for which a test is to be created + The test suite being built. + A newly constructed Test + + + + UniqueItemsConstraint tests whether all the items in a + collection are unique. + + + + + CollectionItemsEqualConstraint is the abstract base class for all + collection constraints that apply some notion of item equality + as a part of their operation. + + + + + CollectionConstraint is the abstract base class for + constraints that operate on collections. + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Determines whether the specified enumerable is empty. + + The enumerable. + + true if the specified enumerable is empty; otherwise, false. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Protected method to be implemented by derived classes + + + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Compares two collection members for equality + + + + + Return a new CollectionTally for use in making tests + + The collection to be included in the tally + + + + Flag the constraint to ignore case and return self. + + + + + Check that all items are unique. + + + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + SamePathOrUnderConstraint tests that one path is under another + + + + + PathConstraint serves as the abstract base of constraints + that operate on paths and provides several helper methods. + + + + + Construct a PathConstraint for a give expected path + + The expected path + + + + Returns the string representation of this constraint + + + + + Canonicalize the provided path + + + The path in standardized form + + + + Test whether one path in canonical form is a subpath of another path + + The first path - supposed to be the parent path + The second path - supposed to be the child path + + + + + Modifies the current instance to be case-sensitive + and returns it. + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + NoItemConstraint applies another constraint to each + item in a collection, failing if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + EndsWithConstraint can test whether a string ends + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + ValuesAttribute is used to provide literal arguments for + an individual parameter of a test. + + + + + The abstract base class for all data-providing attributes + defined by NUnit. Used to select all data sources for a + method, class or parameter. + + + + + Default constructor + + + + + The IParameterDataSource interface is implemented by types + that can provide data for a test method parameter. + + + + + Gets an enumeration of data items for use as arguments + for a test method parameter. + + The parameter for which data is needed + An enumeration containing individual data items + + + + The collection of data to be returned. Must + be set by any derived attribute classes. + We use an object[] so that the individual + elements may have their type changed in GetData + if necessary + + + + + Constructs for use with an Enum parameter. Will pass every enum + value in to the test. + + + + + Construct with one argument + + + + + + Construct with two arguments + + + + + + + Construct with three arguments + + + + + + + + Construct with an array of arguments + + + + + + Get the collection of _values to be used as arguments + + + + + Marks a test to use a pairwise join of any argument + data provided. Arguments will be combined in such a + way that all possible pairs of arguments are used. + + + + + Marks a test to use a particular CombiningStrategy to join + any parameter data provided. Since this is the default, the + attribute is optional. + + + + + Construct a CombiningStrategyAttribute incorporating an + ICombiningStrategy and an IParamterDataProvider. + + Combining strategy to be used in combining data + An IParameterDataProvider to supply data + + + + Construct a CombiningStrategyAttribute incorporating an object + that implements ICombiningStrategy and an IParameterDataProvider. + This constructor is provided for CLS compliance. + + Combining strategy to be used in combining data + An IParameterDataProvider to supply data + + + + Construct one or more TestMethods from a given MethodInfo, + using available parameter data. + + The MethodInfo for which tests are to be constructed. + The suite to which the tests will be added. + One or more TestMethods + + + + Modify the test by adding the name of the combining strategy + to the properties. + + The test to modify + + + + Default constructor + + + + + CultureAttribute is used to mark a test fixture or an + individual method as applying to a particular Culture only. + + + + + Abstract base for Attributes that are used to include tests + in the test run based on environmental settings. + + + + + Constructor with no included items specified, for use + with named property syntax. + + + + + Constructor taking one or more included items + + Comma-delimited list of included items + + + + Name of the item that is needed in order for + a test to run. Multiple items may be given, + separated by a comma. + + + + + Name of the item to be excluded. Multiple items + may be given, separated by a comma. + + + + + The reason for including or excluding the test + + + + + Constructor with no cultures specified, for use + with named property syntax. + + + + + Constructor taking one or more cultures + + Comma-deliminted list of cultures + + + + Causes a test to be skipped if this CultureAttribute is not satisfied. + + The test to modify + + + + Tests to determine if the current culture is supported + based on the properties of this attribute. + + True, if the current culture is supported + + + + Test to determine if the a particular culture or comma- + delimited set of cultures is in use. + + Name of the culture or comma-separated list of culture ids + True if the culture is in use on the system + + + + Test to determine if one of a collection of cultures + is being used currently. + + + + + + + The current state of a work item + + + + + Ready to run or continue + + + + + Work Item is executing + + + + + Complete + + + + + A WorkItem may be an individual test case, a fixture or + a higher level grouping of tests. All WorkItems inherit + from the abstract WorkItem class, which uses the template + pattern to allow derived classes to perform work in + whatever way is needed. + + A WorkItem is created with a particular TestExecutionContext + and is responsible for re-establishing that context in the + current thread before it begins or resumes execution. + + + + + Creates a work item. + + The test for which this WorkItem is being created. + The filter to be used in selecting any child Tests. + + + + + Construct a WorkItem for a particular test. + + The test that the WorkItem will run + + + + Initialize the TestExecutionContext. This must be done + before executing the WorkItem. + + + Originally, the context was provided in the constructor + but delaying initialization of the context until the item + is about to be dispatched allows changes in the parent + context during OneTimeSetUp to be reflected in the child. + + The TestExecutionContext to use + + + + Execute the current work item, including any + child work items. + + + + + Cancel (abort or stop) a WorkItem + + true if the WorkItem should be aborted, false if it should run to completion + + + + Method that performs actually performs the work. It should + set the State to WorkItemState.Complete when done. + + + + + Method called by the derived class when all work is complete + + + + + Event triggered when the item is complete + + + + + Gets the current state of the WorkItem + + + + + The test being executed by the work item + + + + + The execution context + + + + + The unique id of the worker executing this item. + + + + + The test actions to be performed before and after this test + + + + + The test result + + + + + TODO: Documentation needed for class + + + + + TODO: Documentation needed for class + + + + + TestCommand is the abstract base class for all test commands + in the framework. A TestCommand represents a single stage in + the execution of a test, e.g.: SetUp/TearDown, checking for + Timeout, verifying the returned result from a method, etc. + + TestCommands may decorate other test commands so that the + execution of a lower-level command is nested within that + of a higher level command. All nested commands are executed + synchronously, as a single unit. Scheduling test execution + on separate threads is handled at a higher level, using the + task dispatcher. + + + + + Construct a TestCommand for a test. + + The test to be executed + + + + Runs the test in a specified context, returning a TestResult. + + The TestExecutionContext to be used for running the test. + A TestResult + + + + Gets the test associated with this command. + + + + TODO: Documentation needed for field + + + TODO: Documentation needed for method + + + + TODO: Documentation needed for constructor + + + + + + Initializes a new instance of the class. + + The inner command. + The max time allowed in milliseconds + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext + + The context in which the test should run. + A TestResult + + + + The ITestListener interface is used internally to receive + notifications of significant events while a test is being + run. The events are propagated to clients by means of an + AsyncCallback. NUnit extensions may also monitor these events. + + + + + Called when a test has just started + + The test that is starting + + + + Called when a test has finished + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + The ITestAssemblyBuilder interface is implemented by a class + that is able to build a suite of tests given an assembly or + an assembly filename. + + + + + Build a suite of tests from a provided assembly + + The assembly from which tests are to be built + A dictionary of options to use in building the suite + A TestSuite containing the tests found in the assembly + + + + Build a suite of tests given the filename of an assembly + + The filename of the assembly from which tests are to be built + A dictionary of options to use in building the suite + A TestSuite containing the tests found in the assembly + + + + InternalTrace provides facilities for tracing the execution + of the NUnit framework. Tests and classes under test may make use + of Console writes, System.Diagnostics.Trace or various loggers and + NUnit itself traps and processes each of them. For that reason, a + separate internal trace is needed. + + Note: + InternalTrace uses a global lock to allow multiple threads to write + trace messages. This can easily make it a bottleneck so it must be + used sparingly. Keep the trace Level as low as possible and only + insert InternalTrace writes where they are needed. + TODO: add some buffering and a separate writer thread as an option. + TODO: figure out a way to turn on trace in specific classes only. + + + + + Initialize the internal trace facility using the name of the log + to be written to and the trace level. + + The log name + The trace level + + + + Initialize the internal trace using a provided TextWriter and level + + A TextWriter + The InternalTraceLevel + + + + Get a named Logger + + + + + + Get a logger named for a particular Type. + + + + + Gets a flag indicating whether the InternalTrace is initialized + + + + + The ITypeInfo interface is an abstraction of a .NET Type + + + + + Returns true if the Type wrapped is equal to the argument + + + + + Get the display name for this typeInfo. + + + + + Get the display name for an oject of this type, constructed with specific arguments + + + + + Returns a Type representing a generic type definition from which this Type can be constructed. + + + + + Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments + + + + + Returns a value indicating whether this type has a method with a specified public attribute + + + + + Returns an array of IMethodInfos for methods of this Type + that match the specified flags. + + + + + Gets the public constructor taking the specified argument Types + + + + + Returns a value indicating whether this Type has a public constructor taking the specified argument Types. + + + + + Construct an object of this Type, using the specified arguments. + + + + + Gets the underlying Type on which this ITypeInfo is based + + + + + Gets the base type of this type as an ITypeInfo + + + + + Gets the Name of the Type + + + + + Gets the FullName of the Type + + + + + Gets the assembly in which the type is declared + + + + + Gets the Namespace of the Type + + + + + Gets a value indicating whether the type is abstract. + + + + + Gets a value indicating whether the Type is a generic Type + + + + + Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. + + + + + Gets a value indicating whether the Type is a generic Type definition + + + + + Gets a value indicating whether the type is sealed. + + + + + Gets a value indicating whether this type is a static class. + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Defines methods to manipulate thread-safe collections intended for producer/consumer usage. + + Specifies the type of elements in the collection. + + All implementations of this interface must enable all members of this interface + to be used concurrently from multiple threads. + + + + + Attempts to add an object to the . + + The object to add to the . + true if the object was added successfully; otherwise, false. + The was invalid for this collection. + + + + Attempts to remove and return an object from the . + + + When this method returns, if the object was removed and returned successfully, contains the removed object. If no object was available to be removed, the value is + unspecified. + + true if an object was removed and returned successfully; otherwise, false. + + + + Copies the elements contained in the to a new array. + + A new array containing the elements copied from the . + + + + Copies the elements of the to + an + , starting at a specified index. + + The one-dimensional that is the destination of + the elements copied from the . + The array must have zero-based indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + is equal to or greater than the + length of the + -or- The number of elements in the source is greater than the + available space from to the end of the destination . + + + + + Provide the context information of the current test. + This is an adapter for the internal ExecutionContext + class, hiding the internals from the user test. + + + + + + + + + + Construct a TestContext for an ExecutionContext + + The ExecutionContext to adapt + + + + Gets a TextWriter that will send output directly to Console.Error + + + + + Gets a TextWriter for use in displaying immediate progress messages + + + + + TestParameters object holds parameters for the test run, if any are specified + + + + Write the string representation of a boolean value to the current result + + + Write a char to the current result + + + Write a char array to the current result + + + Write the string representation of a double to the current result + + + Write the string representation of an Int32 value to the current result + + + Write the string representation of an Int64 value to the current result + + + Write the string representation of a decimal value to the current result + + + Write the string representation of an object to the current result + + + Write the string representation of a Single value to the current result + + + Write a string to the current result + + + Write the string representation of a UInt32 value to the current result + + + Write the string representation of a UInt64 value to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a line terminator to the current result + + + Write the string representation of a boolean value to the current result followed by a line terminator + + + Write a char to the current result followed by a line terminator + + + Write a char array to the current result followed by a line terminator + + + Write the string representation of a double to the current result followed by a line terminator + + + Write the string representation of an Int32 value to the current result followed by a line terminator + + + Write the string representation of an Int64 value to the current result followed by a line terminator + + + Write the string representation of a decimal value to the current result followed by a line terminator + + + Write the string representation of an object to the current result followed by a line terminator + + + Write the string representation of a Single value to the current result followed by a line terminator + + + Write a string to the current result followed by a line terminator + + + Write the string representation of a UInt32 value to the current result followed by a line terminator + + + Write the string representation of a UInt64 value to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + + This method adds the a new ValueFormatterFactory to the + chain of responsibility used for fomatting values in messages. + The scope of the change is the current TestContext. + + The factory delegate + + + + This method provides a simplified way to add a ValueFormatter + delegate to the chain of responsibility, creating the factory + delegate internally. It is useful when the Type of the object + is the only criterion for selection of the formatter, since + it can be used without getting involved with a compould function. + + The type supported by this formatter + The ValueFormatter delegate + + + + Get the current test context. This is created + as needed. The user may save the context for + use within a test, but it should not be used + outside the test for which it is created. + + + + + Gets a TextWriter that will send output to the current test result. + + + + + Get a representation of the current test. + + + + + Gets a Representation of the TestResult for the current test. + + + + + Gets the unique name of the Worker that is executing this test. + + + + + Gets the directory containing the current test assembly. + + + + + Gets the directory to be used for outputting files created + by this test run. + + + + + Gets the random generator. + + + The random generator. + + + + + TestAdapter adapts a Test for consumption by + the user test code. + + + + + Construct a TestAdapter for a Test + + The Test to be adapted + + + + Gets the unique Id of a test + + + + + The name of the test, which may or may not be + the same as the method name. + + + + + The name of the method representing the test. + + + + + The FullName of the test + + + + + The ClassName of the test + + + + + The properties of the test. + + + + + ResultAdapter adapts a TestResult for consumption by + the user test code. + + + + + Construct a ResultAdapter for a TestResult + + The TestResult to be adapted + + + + Gets a ResultState representing the outcome of the test. + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stacktrace associated with an + error or failure. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + ExceptionHelper provides static methods for working with exceptions + + + + + Rethrows an exception, preserving its stack trace + + The exception to rethrow + + + + Builds up a message, using the Message field of the specified exception + as well as any InnerExceptions. + + The exception. + A combined message string. + + + + Builds up a message, using the Message field of the specified exception + as well as any InnerExceptions. + + The exception. + A combined stack trace. + + + + Gets the stack trace of the exception. + + The exception. + A string representation of the stack trace. + + + + CultureDetector is a helper class used by NUnit to determine + whether a test should be run based on the current culture. + + + + + Default constructor uses the current culture. + + + + + Construct a CultureDetector for a particular culture for testing. + + The culture to be used + + + + Test to determine if one of a collection of cultures + is being used currently. + + + + + + + Tests to determine if the current culture is supported + based on a culture attribute. + + The attribute to examine + + + + + Test to determine if the a particular culture or comma- + delimited set of cultures is in use. + + Name of the culture or comma-separated list of culture ids + True if the culture is in use on the system + + + + Return the last failure reason. Results are not + defined if called before IsSupported( Attribute ) + is called. + + + + + PairwiseStrategy creates test cases by combining the parameter + data so that all possible pairs of data items are used. + + + + The number of test cases that cover all possible pairs of test function + parameters values is significantly less than the number of test cases + that cover all possible combination of test function parameters values. + And because different studies show that most of software failures are + caused by combination of no more than two parameters, pairwise testing + can be an effective ways to test the system when it's impossible to test + all combinations of parameters. + + + The PairwiseStrategy code is based on "jenny" tool by Bob Jenkins: + http://burtleburtle.net/bob/math/jenny.html + + + + + + Gets the test cases generated by this strategy instance. + + A set of test cases. + + + + FleaRand is a pseudo-random number generator developed by Bob Jenkins: + http://burtleburtle.net/bob/rand/talksmall.html#flea + + + + + Initializes a new instance of the FleaRand class. + + The seed. + + + + FeatureInfo represents coverage of a single value of test function + parameter, represented as a pair of indices, Dimension and Feature. In + terms of unit testing, Dimension is the index of the test parameter and + Feature is the index of the supplied value in that parameter's list of + sources. + + + + + Initializes a new instance of FeatureInfo class. + + Index of a dimension. + Index of a feature. + + + + A FeatureTuple represents a combination of features, one per test + parameter, which should be covered by a test case. In the + PairwiseStrategy, we are only trying to cover pairs of features, so the + tuples actually may contain only single feature or pair of features, but + the algorithm itself works with triplets, quadruples and so on. + + + + + Initializes a new instance of FeatureTuple class for a single feature. + + Single feature. + + + + Initializes a new instance of FeatureTuple class for a pair of features. + + First feature. + Second feature. + + + + TestCase represents a single test case covering a list of features. + + + + + Initializes a new instance of TestCaseInfo class. + + A number of features in the test case. + + + + PairwiseTestCaseGenerator class implements an algorithm which generates + a set of test cases which covers all pairs of possible values of test + function. + + + + The algorithm starts with creating a set of all feature tuples which we + will try to cover (see method). This set + includes every single feature and all possible pairs of features. We + store feature tuples in the 3-D collection (where axes are "dimension", + "feature", and "all combinations which includes this feature"), and for + every two feature (e.g. "A" and "B") we generate both ("A", "B") and + ("B", "A") pairs. This data structure extremely reduces the amount of + time needed to calculate coverage for a single test case (this + calculation is the most time-consuming part of the algorithm). + + + Then the algorithm picks one tuple from the uncovered tuple, creates a + test case that covers this tuple, and then removes this tuple and all + other tuples covered by this test case from the collection of uncovered + tuples. + + + Picking a tuple to cover + + + There are no any special rules defined for picking tuples to cover. We + just pick them one by one, in the order they were generated. + + + Test generation + + + Test generation starts from creating a completely random test case which + covers, nevertheless, previously selected tuple. Then the algorithm + tries to maximize number of tuples which this test covers. + + + Test generation and maximization process repeats seven times for every + selected tuple and then the algorithm picks the best test case ("seven" + is a magic number which provides good results in acceptable time). + + Maximizing test coverage + + To maximize tests coverage, the algorithm walks thru the list of mutable + dimensions (mutable dimension is a dimension that are not included in + the previously selected tuple). Then for every dimension, the algorithm + walks thru the list of features and checks if this feature provides + better coverage than randomly selected feature, and if yes keeps this + feature. + + + This process repeats while it shows progress. If the last iteration + doesn't improve coverage, the process ends. + + + In addition, for better results, before start every iteration, the + algorithm "scrambles" dimensions - so for every iteration dimension + probes in a different order. + + + + + + Creates a set of test cases for specified dimensions. + + + An array which contains information about dimensions. Each element of + this array represents a number of features in the specific dimension. + + + A set of test cases. + + + + + Provides data from fields marked with the DatapointAttribute or the + DatapointsAttribute. + + + + + The IDataPointProvider interface is used by extensions + that provide data for a single test parameter. + + + + + Determine whether any data is available for a parameter. + + An IParameterInfo representing one + argument to a parameterized test + True if any data is available, otherwise false. + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + An IParameterInfo representing one + argument to a parameterized test + An IEnumerable providing the required data + + + + Determine whether any data is available for a parameter. + + A ParameterInfo representing one + argument to a parameterized test + + True if any data is available, otherwise false. + + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + A ParameterInfo representing one + argument to a parameterized test + + An IEnumerable providing the required data + + + + + CombinatorialStrategy creates test cases by using all possible + combinations of the parameter data. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + ThrowsNothingConstraint tests that a delegate does not + throw an exception. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True if no exception is thrown, otherwise false + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + Gets text describing a constraint + + + + + Operator that requires at least one of it's arguments to succeed + + + + + Abstract base class for all binary operators + + + + + The ConstraintOperator class is used internally by a + ConstraintBuilder to represent an operator that + modifies or combines constraints. + + Constraint operators use left and right precedence + _values to determine whether the top operator on the + stack should be reduced before pushing a new operator. + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + The syntax element preceding this operator + + + + + The syntax element following this operator + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Abstract method that produces a constraint by applying + the operator to its left and right constraint arguments. + + + + + Gets the left precedence of the operator + + + + + Gets the right precedence of the operator + + + + + Construct an OrOperator + + + + + Apply the operator to produce an OrConstraint + + + + + The Numerics class contains common operations on numeric _values. + + + + + Checks the type of the object, returning true if + the object is a numeric type. + + The object to check + true if the object is a numeric type + + + + Checks the type of the object, returning true if + the object is a floating point numeric type. + + The object to check + true if the object is a floating point numeric type + + + + Checks the type of the object, returning true if + the object is a fixed point numeric type. + + The object to check + true if the object is a fixed point numeric type + + + + Test two numeric _values for equality, performing the usual numeric + conversions and using a provided or default tolerance. If the tolerance + provided is Empty, this method may set it to a default tolerance. + + The expected value + The actual value + A reference to the tolerance in effect + True if the _values are equal + + + + Compare two numeric _values, performing the usual numeric conversions. + + The expected value + The actual value + The relationship of the _values to each other + + + + FalseConstraint tests that the actual value is false + + + + + Initializes a new instance of the class. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + TestFixtureAttribute is used to mark a class that represents a TestFixture. + + + + + The ITestCaseData interface is implemented by a class + that is able to return the data required to create an + instance of a parameterized test fixture. + + + + + The ITestData interface is implemented by a class that + represents a single instance of a parameterized test. + + + + + Gets the name to be used for the test + + + + + Gets the RunState for this test case. + + + + + Gets the argument list to be provided to the test + + + + + Gets the property dictionary for the test case + + + + + Get the TypeArgs if separately set + + + + + Default constructor + + + + + Construct with a object[] representing a set of arguments. + In .NET 2.0, the arguments may later be separated into + type arguments and constructor arguments. + + + + + + Build a fixture from type provided. Normally called for a Type + on which the attribute has been placed. + + The type info of the fixture to be used. + A an IEnumerable holding one TestFixture object. + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the RunState of this test fixture. + + + + + The arguments originally provided to the attribute + + + + + Properties pertaining to this fixture + + + + + Get or set the type arguments. If not set + explicitly, any leading arguments that are + Types are taken as type arguments. + + + + + Descriptive text for this fixture + + + + + The author of this fixture + + + + + The type that this fixture is testing + + + + + Gets or sets the ignore reason. May set RunState as a side effect. + + The ignore reason. + + + + Gets or sets the reason for not running the fixture. + + The reason. + + + + Gets or sets the ignore reason. When set to a non-null + non-empty value, the test is marked as ignored. + + The ignore reason. + + + + Gets or sets a value indicating whether this is explicit. + + + true if explicit; otherwise, false. + + + + + Gets and sets the category for this fixture. + May be a comma-separated list of categories. + + + + + TestCaseAttribute is used to mark parameterized test cases + and provide them with their arguments. + + + + + The ITestCaseData interface is implemented by a class + that is able to return complete testcases for use by + a parameterized test method. + + + + + Gets the expected result of the test case + + + + + Returns true if an expected result has been set + + + + + IImplyFixture is an empty marker interface used by attributes like + TestAttribute that cause the class where they are used to be treated + as a TestFixture even without a TestFixtureAttribute. + + Marker interfaces are not usually considered a good practice, but + we use it here to avoid cluttering the attribute hierarchy with + classes that don't contain any extra implementation. + + + + + Construct a TestCaseAttribute with a list of arguments. + This constructor is not CLS-Compliant + + + + + + Construct a TestCaseAttribute with a single argument + + + + + + Construct a TestCaseAttribute with a two arguments + + + + + + + Construct a TestCaseAttribute with a three arguments + + + + + + + + Performs several special conversions allowed by NUnit in order to + permit arguments with types that cannot be used in the constructor + of an Attribute such as TestCaseAttribute or to simplify their use. + + The arguments to be converted + The ParameterInfo array for the method + + + + Construct one or more TestMethods from a given MethodInfo, + using available parameter data. + + The MethodInfo for which tests are to be constructed. + The suite to which the tests will be added. + One or more TestMethods + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the RunState of this test case. + + + + + Gets the list of arguments to a test case + + + + + Gets the properties of the test case + + + + + Gets or sets the expected result. + + The result. + + + + Returns true if the expected result has been set + + + + + Gets or sets the description. + + The description. + + + + The author of this test + + + + + The type that this test is testing + + + + + Gets or sets the reason for ignoring the test + + + + + Gets or sets a value indicating whether this is explicit. + + + true if explicit; otherwise, false. + + + + + Gets or sets the reason for not running the test. + + The reason. + + + + Gets or sets the ignore reason. When set to a non-null + non-empty value, the test is marked as ignored. + + The ignore reason. + + + + Comma-delimited list of platforms to run the test for + + + + + Comma-delimited list of platforms to not run the test for + + + + + Gets and sets the category for this test case. + May be a comma-separated list of categories. + + + + + GenericMethodHelper is able to deduce the Type arguments for + a generic method from the actual arguments provided. + + + + + Construct a GenericMethodHelper for a method + + MethodInfo for the method to examine + + + + Return the type argments for the method, deducing them + from the arguments actually provided. + + The arguments to the method + An array of type arguments. + + + + TestActionCommand runs the BeforeTest actions for a test, + then runs the test and finally runs the AfterTestActions. + + + + + Initializes a new instance of the class. + + The inner command. + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Provides internal logging to the NUnit framework + + + + + Interface for logging within the engine + + + + + Logs the specified message at the error level. + + The message. + + + + Logs the specified message at the error level. + + The message. + The arguments. + + + + Logs the specified message at the warning level. + + The message. + + + + Logs the specified message at the warning level. + + The message. + The arguments. + + + + Logs the specified message at the info level. + + The message. + + + + Logs the specified message at the info level. + + The message. + The arguments. + + + + Logs the specified message at the debug level. + + The message. + + + + Logs the specified message at the debug level. + + The message. + The arguments. + + + + Initializes a new instance of the class. + + The name. + The log level. + The writer where logs are sent. + + + + Logs the message at error level. + + The message. + + + + Logs the message at error level. + + The message. + The message arguments. + + + + Logs the message at warm level. + + The message. + + + + Logs the message at warning level. + + The message. + The message arguments. + + + + Logs the message at info level. + + The message. + + + + Logs the message at info level. + + The message. + The message arguments. + + + + Logs the message at debug level. + + The message. + + + + Logs the message at debug level. + + The message. + The message arguments. + + + + ClassName filter selects tests based on the class FullName + + + + + Construct a FullNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + PropertyFilter is able to select or exclude tests + based on their properties. + + + + + + Construct a PropertyFilter using a property name and expected value + + A property name + The expected value of the property + + + + Check whether the filter matches a test + + The test to be matched + + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + Env is a static class that provides some of the features of + System.Environment that are not available under all runtimes + + + + + The newline sequence in the current environment. + + + + + Path to the 'My Documents' folder + + + + + Directory used for file output if not specified on commandline. + + + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + + + + Asserts that an int is zero. + + The number to be examined + + + + Asserts that an int is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is zero. + + The number to be examined + + + + Asserts that an unsigned int is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is zero. + + The number to be examined + + + + Asserts that a Long is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is zero. + + The number to be examined + + + + Asserts that an unsigned Long is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is zero. + + The number to be examined + + + + Asserts that a decimal is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is zero. + + The number to be examined + + + + Asserts that a double is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is zero. + + The number to be examined + + + + Asserts that a float is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is not zero. + + The number to be examined + + + + Asserts that an int is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is not zero. + + The number to be examined + + + + Asserts that an unsigned int is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is not zero. + + The number to be examined + + + + Asserts that a Long is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is not zero. + + The number to be examined + + + + Asserts that an unsigned Long is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is zero. + + The number to be examined + + + + Asserts that a decimal is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is zero. + + The number to be examined + + + + Asserts that a double is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is zero. + + The number to be examined + + + + Asserts that a float is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is negative. + + The number to be examined + + + + Asserts that an int is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is negative. + + The number to be examined + + + + Asserts that an unsigned int is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is negative. + + The number to be examined + + + + Asserts that a Long is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is negative. + + The number to be examined + + + + Asserts that an unsigned Long is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is negative. + + The number to be examined + + + + Asserts that a decimal is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is negative. + + The number to be examined + + + + Asserts that a double is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is negative. + + The number to be examined + + + + Asserts that a float is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is negative. + + The number to be examined + + + + Asserts that an int is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is negative. + + The number to be examined + + + + Asserts that an unsigned int is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is negative. + + The number to be examined + + + + Asserts that a Long is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is negative. + + The number to be examined + + + + Asserts that an unsigned Long is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is negative. + + The number to be examined + + + + Asserts that a decimal is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is negative. + + The number to be examined + + + + Asserts that a double is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is negative. + + The number to be examined + + + + Asserts that a float is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestDelegate + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestDelegate + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + A TestDelegate + + + + Verifies that a delegate does not throw an exception + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate does not throw an exception. + + A TestDelegate + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + + + This method is provided for use by VB developers needing to test + the value of properties with private setters. + + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. + + + + + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an InvalidOperationException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + + + + Throws an with the message and arguments + that are passed in. This is used by the other Assert functions. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This is used by the other Assert functions. + + The message to initialize the with. + + + + Throws an . + This is used by the other Assert functions. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as ignored. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as Inconclusive. + + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + + + + Verifies that the first int is greater than the second + int. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first int is greater than the second + int. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + + + + Helper for Assert.AreEqual(double expected, double actual, ...) + allowing code generation to work consistently. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Represents a constraint that succeeds if all the + members of a collection match a base constraint. + + + + + Abstract base for operators that indicate how to + apply a constraint to items in a collection. + + + + + PrefixOperator takes a single constraint and modifies + it's action in some way. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Returns the constraint created by applying this + prefix to another constraint. + + + + + + + Constructs a CollectionOperator + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + they all succeed. + + + + + FileExistsConstraint is used to determine if a file exists + + + + + FileOrDirectoryExistsConstraint is used to determine if a file or directory exists + + + + + Initializes a new instance of the class that + will check files and directories. + + + + + Initializes a new instance of the class that + will only check files if ignoreDirectories is true. + + if set to true [ignore directories]. + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + If true, the constraint will only check if files exist, not directories + + + + + If true, the constraint will only check if directories exist, not files + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Initializes a new instance of the class. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + TestAssemblyDirectoryResolveAttribute is used to mark a test assembly as needing a + special assembly resolution hook that will explicitly search the test assembly's + directory for dependent assemblies. This works around a conflict between mixed-mode + assembly initialization and tests running in their own AppDomain in some cases. + + + + + Helper methods for inspecting a type by reflection. + + Many of these methods take ICustomAttributeProvider as an + argument to avoid duplication, even though certain attributes can + only appear on specific types of members, like MethodInfo or Type. + + In the case where a type is being examined for the presence of + an attribute, interface or named member, the Reflect methods + operate with the full name of the member being sought. This + removes the necessity of the caller having a reference to the + assembly that defines the item being sought and allows the + NUnit core to inspect assemblies that reference an older + version of the NUnit framework. + + + + + Examine a fixture type and return an array of methods having a + particular attribute. The array is order with base methods first. + + The type to examine + The attribute Type to look for + Specifies whether to search the fixture type inheritance chain + The array of methods found + + + + Examine a fixture type and return true if it has a method with + a particular attribute. + + The type to examine + The attribute Type to look for + True if found, otherwise false + + + + Invoke the default constructor on a Type + + The Type to be constructed + An instance of the Type + + + + Invoke a constructor on a Type with arguments + + The Type to be constructed + Arguments to the constructor + An instance of the Type + + + + Returns an array of types from an array of objects. + Used because the compact framework doesn't support + Type.GetTypeArray() + + An array of objects + An array of Types + + + + Invoke a parameterless method returning void on an object. + + A MethodInfo for the method to be invoked + The object on which to invoke the method + + + + Invoke a method, converting any TargetInvocationException to an NUnitException. + + A MethodInfo for the method to be invoked + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + + + + + + Constructor delegate, makes it possible to use a factory to create objects + + + + + InvalidTestFixtureException is thrown when an appropriate test + fixture constructor using the provided arguments cannot be found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + Class to build ether a parameterized or a normal NUnitTestMethod. + There are four cases that the builder must deal with: + 1. The method needs no params and none are provided + 2. The method needs params and they are provided + 3. The method needs no params but they are provided in error + 4. The method needs params but they are not provided + This could have been done using two different builders, but it + turned out to be simpler to have just one. The BuildFrom method + takes a different branch depending on whether any parameters are + provided, but all four cases are dealt with in lower-level methods + + + + + The ITestCaseBuilder interface is exposed by a class that knows how to + build a test case from certain methods. + + + This interface is not the same as the ITestCaseBuilder interface in NUnit 2.x. + We have reused the name because the two products don't interoperate at all. + + + + + Examine the method and determine if it is suitable for + this builder to use in building a TestCase to be + included in the suite being populated. + + Note that returning false will cause the method to be ignored + in loading the tests. If it is desired to load the method + but label it as non-runnable, ignored, etc., then this + method must return true. + + The test method to examine + The suite being populated + True is the builder can use this method + + + + Build a TestCase from the provided MethodInfo for + inclusion in the suite being constructed. + + The method to be used as a test case + The test suite being populated, or null + A TestCase or null + + + + Determines if the method can be used to build an NUnit test + test method of some kind. The method must normally be marked + with an identifying attribute for this to be true. + + Note that this method does not check that the signature + of the method for validity. If we did that here, any + test methods with invalid signatures would be passed + over in silence in the test run. Since we want such + methods to be reported, the check for validity is made + in BuildFrom rather than here. + + An IMethodInfo for the method being used as a test method + True if the builder can create a test case from this method + + + + Build a Test from the provided MethodInfo. Depending on + whether the method takes arguments and on the availability + of test case data, this method may return a single test + or a group of tests contained in a ParameterizedMethodSuite. + + The method for which a test is to be built + A Test representing one or more method invocations + + + + Determines if the method can be used to build an NUnit test + test method of some kind. The method must normally be marked + with an identifying attribute for this to be true. + + Note that this method does not check that the signature + of the method for validity. If we did that here, any + test methods with invalid signatures would be passed + over in silence in the test run. Since we want such + methods to be reported, the check for validity is made + in BuildFrom rather than here. + + An IMethodInfo for the method being used as a test method + The test suite being built, to which the new test would be added + True if the builder can create a test case from this method + + + + Build a Test from the provided MethodInfo. Depending on + whether the method takes arguments and on the availability + of test case data, this method may return a single test + or a group of tests contained in a ParameterizedMethodSuite. + + The method for which a test is to be built + The test fixture being populated, or null + A Test representing one or more method invocations + + + + Builds a ParameterizedMethodSuite containing individual test cases. + + The method for which a test is to be built. + The list of test cases to include. + A ParameterizedMethodSuite populated with test cases + + + + Build a simple, non-parameterized TestMethod for this method. + + The MethodInfo for which a test is to be built + The test suite for which the method is being built + A TestMethod. + + + + Abstract base class for operators that are able to reduce to a + constraint whether or not another syntactic element follows. + + + + + NUnitEqualityComparer encapsulates NUnit's handling of + equality tests between objects. + + + + + If true, all string comparisons will ignore case + + + + + If true, arrays will be treated as collections, allowing + those of different dimensions to be compared + + + + + Comparison objects used in comparisons for some constraints. + + + + + List of points at which a failure occurred. + + + + + Compares two objects for equality within a tolerance. + + + + + Helper method to compare two arrays + + + + + Method to compare two DirectoryInfo objects + + first directory to compare + second directory to compare + true if equivalent, false if not + + + + Returns the default NUnitEqualityComparer + + + + + Gets and sets a flag indicating whether case should + be ignored in determining equality. + + + + + Gets and sets a flag indicating that arrays should be + compared as collections, without regard to their shape. + + + + + Gets the list of external comparers to be used to + test for equality. They are applied to members of + collections, in place of NUnit's own logic. + + + + + Gets the list of failure points for the last Match performed. + The list consists of objects to be interpreted by the caller. + This generally means that the caller may only make use of + objects it has placed on the list at a particular depthy. + + + + + Flags the comparer to include + property in comparison of two values. + + + Using this modifier does not allow to use the + modifier. + + + + + FailurePoint class represents one point of failure + in an equality test. + + + + + The location of the failure + + + + + The expected value + + + + + The actual value + + + + + Indicates whether the expected value is valid + + + + + Indicates whether the actual value is valid + + + + + NullConstraint tests that the actual value is null + + + + + Initializes a new instance of the class. + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + CollectionSubsetConstraint is used to determine whether + one collection is a subset of another + + + + + Construct a CollectionSubsetConstraint + + The collection that the actual value is expected to be a subset of + + + + Test whether the actual collection is a subset of + the expected collection provided. + + + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + AndConstraint succeeds only if both members succeed. + + + + + BinaryConstraint is the abstract base of all constraints + that combine two other constraints in some fashion. + + + + + The first constraint being combined + + + + + The second constraint being combined + + + + + Construct a BinaryConstraint from two other constraints + + The first constraint + The second constraint + + + + Create an AndConstraint from two other constraints + + The first constraint + The second constraint + + + + Apply both member constraints to an actual value, succeeding + succeeding only if both of them succeed. + + The actual value + True if the constraints both succeeded + + + + Gets text describing a constraint + + + + + Contain the result of matching a against an actual value. + + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + The status of the new ConstraintResult. + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + If true, applies a status of Success to the result, otherwise Failure. + + + + Write the failure message to the MessageWriter provided + as an argument. The default implementation simply passes + the result and the actual value to the writer, which + then displays the constraint description and the value. + + Constraints that need to provide additional details, + such as where the error occured can override this. + + The MessageWriter on which to display the message + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + The actual value that was passed to the method. + + + + + Gets and sets the ResultStatus for this result. + + + + + True if actual value meets the Constraint criteria otherwise false. + + + + + Display friendly name of the constraint. + + + + + Description of the constraint may be affected by the state the constraint had + when was performed against the actual value. + + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Attribute used to identify a method that is called after + all the tests in a fixture have run. The method is + guaranteed to be called, even if an exception is thrown. + + + + + Attribute used to identify a method that is called once + after all the child tests have run. The method is + guaranteed to be called, even if an exception is thrown. + + + + + PlatformAttribute is used to mark a test fixture or an + individual method as applying to a particular platform only. + + + + + Constructor with no platforms specified, for use + with named property syntax. + + + + + Constructor taking one or more platforms + + Comma-delimited list of platforms + + + + Causes a test to be skipped if this PlatformAttribute is not satisfied. + + The test to modify + + + + Attribute used to mark a test that is to be ignored. + Ignored tests result in a warning message when the + tests are run. + + + + + Constructs the attribute giving a reason for ignoring the test + GetActionsFromAttributeProvider + The reason for ignoring the test + + + + Modifies a test by marking it as Ignored. + + The test to modify + + + + + + + + + The date in the future to stop ignoring the test as a string in UTC time. + For example for a date and time, "2014-12-25 08:10:00Z" or for just a date, + "2014-12-25". If just a date is given, the Ignore will expire at midnight UTC. + + + Once the ignore until date has passed, the test will be marked + as runnable. Tests with an ignore until date will have an IgnoreUntilDate + property set which will appear in the test results. + + The string does not contain a valid string representation of a date and time. + + + + The IApplyToContext interface is implemented by attributes + that want to make changes to the execution context before + a test is run. + + + + + Apply changes to the execution context + + The execution context + + + + A SimpleWorkItem represents a single test case and is + marked as completed immediately upon execution. This + class is also used for skipped or ignored test suites. + + + + + Construct a simple work item for a test. + + The test to be executed + The filter used to select this test + + + + Method that performs actually performs the work. + + + + + ContextSettingsCommand applies specified changes to the + TestExecutionContext prior to running a test. No special + action is needed after the test runs, since the prior + context will be restored automatically. + + + + + Initializes a new instance of the class. + + + + + + + + + + + + + + + + + + + + The RunState enum indicates whether a test can be executed. + + + + + The test is not runnable. + + + + + The test is runnable. + + + + + The test can only be run explicitly + + + + + The test has been skipped. This value may + appear on a Test when certain attributes + are used to skip the test. + + + + + The test has been ignored. May appear on + a Test, when the IgnoreAttribute is used. + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a constraint that succeeds if the value + is a file or directory and it exists. + + + + + AssemblyHelper provides static methods for working + with assemblies. + + + + + Gets the path from which an assembly was loaded. + For builds where this is not possible, returns + the name of the assembly. + + The assembly. + The path. + + + + Gets the path to the directory from which an assembly was loaded. + + The assembly. + The path. + + + + Gets the AssemblyName of an assembly. + + The assembly + An AssemblyName + + + + Loads an assembly given a string, which may be the + path to the assembly or the AssemblyName + + + + + + + Gets the assembly path from code base. + + Public for testing purposes + The code base. + + + + + FrameworkController provides a facade for use in loading, browsing + and running tests without requiring a reference to the NUnit + framework. All calls are encapsulated in constructors for + this class and its nested classes, which only require the + types of the Common Type System as arguments. + + The controller supports four actions: Load, Explore, Count and Run. + They are intended to be called by a driver, which should allow for + proper sequencing of calls. Load must be called before any of the + other actions. The driver may support other actions, such as + reload on run, by combining these calls. + + + + + A MarshalByRefObject that lives forever + + + + + Obtains a lifetime service object to control the lifetime policy for this instance. + + + + + Construct a FrameworkController using the default builder and runner. + + The AssemblyName or path to the test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + + + + Construct a FrameworkController using the default builder and runner. + + The test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + + + + Construct a FrameworkController, specifying the types to be used + for the runner and builder. This constructor is provided for + purposes of development. + + The full AssemblyName or the path to the test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + The Type of the test runner + The Type of the test builder + + + + Construct a FrameworkController, specifying the types to be used + for the runner and builder. This constructor is provided for + purposes of development. + + The test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + The Type of the test runner + The Type of the test builder + + + + Loads the tests in the assembly + + + + + + Returns info about the tests in an assembly + + A string containing the XML representation of the filter to use + The XML result of exploring the tests + + + + Runs the tests in an assembly + + A string containing the XML representation of the filter to use + The XML result of the test run + + + + Runs the tests in an assembly syncronously reporting back the test results through the callback + or through the return value + + The callback that receives the test results + A string containing the XML representation of the filter to use + The XML result of the test run + + + + Runs the tests in an assembly asyncronously reporting back the test results through the callback + + The callback that receives the test results + A string containing the XML representation of the filter to use + + + + Stops the test run + + True to force the stop, false for a cooperative stop + + + + Counts the number of test cases in the loaded TestSuite + + A string containing the XML representation of the filter to use + The number of tests + + + + Inserts environment element + + Target node + The new node + + + + Inserts settings element + + Target node + Settings dictionary + The new node + + + + Gets the ITestAssemblyBuilder used by this controller instance. + + The builder. + + + + Gets the ITestAssemblyRunner used by this controller instance. + + The runner. + + + + Gets the AssemblyName or the path for which this FrameworkController was created + + + + + Gets the Assembly for which this + + + + + Gets a dictionary of settings for the FrameworkController + + + + + A shim of the .NET interface for platforms that do not support it. + Used to indicate that a control can be the target of a callback event on the server. + + + + + Processes a callback event that targets a control. + + + + + + Returns the results of a callback event that targets a control. + + + + + + FrameworkControllerAction is the base class for all actions + performed against a FrameworkController. + + + + + LoadTestsAction loads a test into the FrameworkController + + + + + LoadTestsAction loads the tests in an assembly. + + The controller. + The callback handler. + + + + ExploreTestsAction returns info about the tests in an assembly + + + + + Initializes a new instance of the class. + + The controller for which this action is being performed. + Filter used to control which tests are included (NYI) + The callback handler. + + + + CountTestsAction counts the number of test cases in the loaded TestSuite + held by the FrameworkController. + + + + + Construct a CountsTestAction and perform the count of test cases. + + A FrameworkController holding the TestSuite whose cases are to be counted + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + RunTestsAction runs the loaded TestSuite held by the FrameworkController. + + + + + Construct a RunTestsAction and run all tests in the loaded TestSuite. + + A FrameworkController holding the TestSuite to run + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + RunAsyncAction initiates an asynchronous test run, returning immediately + + + + + Construct a RunAsyncAction and run all tests in the loaded TestSuite. + + A FrameworkController holding the TestSuite to run + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + StopRunAction stops an ongoing run. + + + + + Construct a StopRunAction and stop any ongoing run. If no + run is in process, no error is raised. + + The FrameworkController for which a run is to be stopped. + True the stop should be forced, false for a cooperative stop. + >A callback handler used to report results + A forced stop will cause threads and processes to be killed as needed. + + + + ExceptionTypeConstraint is a special version of ExactTypeConstraint + used to provided detailed info about the exception thrown in + an error message. + + + + + ExactTypeConstraint is used to test that an object + is of the exact type provided in the constructor + + + + + Construct an ExactTypeConstraint for a given Type + + The expected Type. + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Constructs an ExceptionTypeConstraint + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + TestProgressReporter translates ITestListener events into + the async callbacks that are used to inform the client + software about the progress of a test run. + + + + + Initializes a new instance of the class. + + The callback handler to be used for reporting progress. + + + + Called when a test has just started + + The test that is starting + + + + Called when a test has finished. Sends a result summary to the callback. + to + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Returns the parent test item for the targer test item if it exists + + + parent test item + + + + Makes a string safe for use as an attribute, replacing + characters characters that can't be used with their + corresponding xml representations. + + The string to be used + A new string with the _values replaced + + + + Operator used to test for the presence of a named Property + on an object and optionally apply further tests to the + value of that property. + + + + + Constructs a PropOperator for a particular named property + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Gets the name of the property to which the operator applies + + + + + NaNConstraint tests that the actual value is a double or float NaN + + + + + Test that the actual value is an NaN + + + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + CollectionContainsConstraint is used to test whether a collection + contains an expected object as a member. + + + + + Construct a CollectionContainsConstraint + + + + + + Test whether the expected item is contained in the collection + + + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Gets the expected object + + + + + Attribute used to mark a class that contains one-time SetUp + and/or TearDown methods that apply to all the tests in a + namespace or an assembly. + + + + + Attribute used to mark a class that contains one-time SetUp + and/or TearDown methods that apply to all the tests in a + namespace or an assembly. + + + + + Attribute used to mark a class that contains one-time SetUp + and/or TearDown methods that apply to all the tests in a + namespace or an assembly. + + + + + RepeatAttribute may be applied to test case in order + to run it multiple times. + + + + + Construct a RepeatAttribute + + The number of times to run the test + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + The test command for the RepeatAttribute + + + + + Initializes a new instance of the class. + + The inner command. + The number of repetitions + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + A simplified implementation of .NET 4 CountdownEvent + for use in earlier versions of .NET. Only the methods + used by NUnit are implemented. + + + + + Construct a CountdownEvent + + The initial count + + + + Decrement the count by one + + + + + Block the thread until the count reaches zero + + + + + Gets the initial count established for the CountdownEvent + + + + + Gets the current count remaining for the CountdownEvent + + + + + TheoryResultCommand adjusts the result of a Theory so that + it fails if all the results were inconclusive. + + + + + Constructs a TheoryResultCommand + + The command to be wrapped by this one + + + + Overridden to call the inner command and adjust the result + in case all chlid results were inconclusive. + + + + + + + NUnitTestCaseBuilder is a utility class used by attributes + that build test cases. + + + + + Constructs an + + + + + Builds a single NUnitTestMethod, either as a child of the fixture + or as one of a set of test cases under a ParameterizedTestMethodSuite. + + The MethodInfo from which to construct the TestMethod + The suite or fixture to which the new test will be added + The ParameterSet to be used, or null + + + + + Helper method that checks the signature of a TestMethod and + any supplied parameters to determine if the test is valid. + + Currently, NUnitTestMethods are required to be public, + non-abstract methods, either static or instance, + returning void. They may take arguments but the _values must + be provided or the TestMethod is not considered runnable. + + Methods not meeting these criteria will be marked as + non-runnable and the method will return false in that case. + + The TestMethod to be checked. If it + is found to be non-runnable, it will be modified. + Parameters to be used for this test, or null + True if the method signature is valid, false if not + + The return value is no longer used internally, but is retained + for testing purposes. + + + + + The TestStatus enum indicates the result of running a test + + + + + The test was inconclusive + + + + + The test has skipped + + + + + The test succeeded + + + + + The test failed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TestNameGenerator is able to create test names according to + a coded pattern. + + + + + Default pattern used to generate names + + + + + Construct a TestNameGenerator + + + + + Construct a TestNameGenerator + + The pattern used by this generator. + + + + Get the display name for a TestMethod and it's arguments + + A TestMethod + The display name + + + + Get the display name for a TestMethod and it's arguments + + A TestMethod + Arguments to be used + The display name + + + + The EqualConstraintResult class is tailored for formatting + and displaying the result of an EqualConstraint. + + + + + Construct an EqualConstraintResult + + + + + Write a failure message. Overridden to provide custom + failure messages for EqualConstraint. + + The MessageWriter to write to + + + + Display the failure information for two collections that did not match. + + The MessageWriter on which to display + The expected collection. + The actual collection + The depth of this failure in a set of nested collections + + + + Displays a single line showing the types and sizes of the expected + and actual collections or arrays. If both are identical, the value is + only shown once. + + The MessageWriter on which to display + The expected collection or array + The actual collection or array + The indentation level for the message line + + + + Displays a single line showing the point in the expected and actual + arrays at which the comparison failed. If the arrays have different + structures or dimensions, both _values are shown. + + The MessageWriter on which to display + The expected array + The actual array + Index of the failure point in the underlying collections + The indentation level for the message line + + + + Display the failure information for two IEnumerables that did not match. + + The MessageWriter on which to display + The expected enumeration. + The actual enumeration + The depth of this failure in a set of nested collections + + + + Provides NUnit specific extensions to aid in Reflection + across multiple frameworks + + + This version of the class supplies GetTypeInfo() on platforms + that don't support it. + + + + + GetTypeInfo gives access to most of the Type information we take for granted + on .NET Core and Windows Runtime. Rather than #ifdef different code for different + platforms, it is easiest to just code all platforms as if they worked this way, + thus the simple passthrough. + + + + + + + Extensions for Assembly that are not available in pre-4.5 .NET releases + + + + + An easy way to get a single custom attribute from an assembly + + The attribute Type + The assembly + An attribute of Type T + + + + Type extensions that apply to all target frameworks + + + + + Determines if the given array is castable/matches the array. + + + + + + + + Determines if one type can be implicitly converted from another + + + + + + + + This class is used as a flag when we get a parameter list for a method/constructor, but + we do not know one of the types because null was passed in. + + + + + The TestCaseData class represents a set of arguments + and other parameter info to be used for a parameterized + test case. It is derived from TestCaseParameters and adds a + fluent syntax for use in initializing the test case. + + + + + The TestCaseParameters class encapsulates method arguments and + other selected parameters needed for constructing + a parameterized test case. + + + + + TestParameters is the abstract base class for all classes + that know how to provide data for constructing a test. + + + + + Default Constructor creates an empty parameter set + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a ParameterSet from an object implementing ITestData + + + + + + Applies ParameterSet _values to the test itself. + + A test. + + + + The RunState for this set of parameters. + + + + + The arguments to be used in running the test, + which must match the method signature. + + + + + A name to be used for this test case in lieu + of the standard generated name containing + the argument list. + + + + + Gets the property dictionary for this test + + + + + The original arguments provided by the user, + used for display purposes. + + + + + The expected result to be returned + + + + + Default Constructor creates an empty parameter set + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a ParameterSet from an object implementing ITestCaseData + + + + + + The expected result of the test, which + must match the method return type. + + + + + Gets a value indicating whether an expected result was specified. + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Sets the expected result for the test + + The expected result + A modified TestCaseData + + + + Sets the name of the test case + + The modified TestCaseData instance + + + + Sets the description for the test case + being constructed. + + The description. + The modified TestCaseData instance. + + + + Applies a category to the test + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Marks the test case as explicit. + + + + + Marks the test case as explicit, specifying the reason. + + + + + Ignores this TestCase, specifying the reason. + + The reason. + + + + + + + + + + + + + + + + + + + + + Gets or sets the current test + + + + + The time the current test started execution + + + + + The time the current test started in Ticks + + + + + Gets or sets the current test result + + + + + Gets a TextWriter that will send output to the current test result. + + + + + The current test object - that is the user fixture + object on which tests are being executed. + + + + + Get or set the working directory + + + + + Get or set indicator that run should stop on the first error + + + + + Gets an enum indicating whether a stop has been requested. + + + + + The current WorkItemDispatcher. Made public for + use by nunitlite.tests + + + + + The ParallelScope to be used by tests running in this context. + For builds with out the parallel feature, it has no effect. + + + + + The unique name of the worker that spawned the context. + For builds with out the parallel feature, it is null. + + + + + Gets the RandomGenerator specific to this Test + + + + + Gets or sets the test case timeout value + + + + + Gets a list of ITestActions set by upstream tests + + + + + Saves or restores the CurrentCulture + + + + + Saves or restores the CurrentUICulture + + + + + The current head of the ValueFormatter chain, copied from MsgUtils.ValueFormatter + + + + + If true, all tests must run on the same thread. No new thread may be spawned. + + + + + Helper class used to save and restore certain static or + singleton settings in the environment that affect tests + or which might be changed by the user tests. + + An internal class is used to hold settings and a stack + of these objects is pushed and popped as Save and Restore + are called. + + + + + Link to a prior saved context + + + + + Indicates that a stop has been requested + + + + + The event listener currently receiving notifications + + + + + The number of assertions for the current test + + + + + The current culture + + + + + The current UI culture + + + + + The current test result + + + + + The current Principal. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + An existing instance of TestExecutionContext. + + + + Get the current context or return null if none is found. + + + + + + Clear the current context. This is provided to + prevent "leakage" of the CallContext containing + the current context back to any runners. + + + + + Record any changes in the environment made by + the test code in the execution context so it + will be passed on to lower level tests. + + + + + Set up the execution environment to match a context. + Note that we may be running on the same thread where the + context was initially created or on a different thread. + + + + + Increments the assert count by one. + + + + + Increments the assert count by a specified amount. + + + + + Adds a new ValueFormatterFactory to the chain of formatters + + The new factory + + + + Obtain lifetime service object + + + + + + Gets and sets the current context. + + + + + Gets or sets the current test + + + + + The time the current test started execution + + + + + The time the current test started in Ticks + + + + + Gets or sets the current test result + + + + + Gets a TextWriter that will send output to the current test result. + + + + + The current test object - that is the user fixture + object on which tests are being executed. + + + + + Get or set the working directory + + + + + Get or set indicator that run should stop on the first error + + + + + Gets an enum indicating whether a stop has been requested. + + + + + The current test event listener + + + + + The current WorkItemDispatcher. Made public for + use by nunitlite.tests + + + + + The ParallelScope to be used by tests running in this context. + For builds with out the parallel feature, it has no effect. + + + + + The unique name of the worker that spawned the context. + For builds with out the parallel feature, it is null. + + + + + Gets the RandomGenerator specific to this Test + + + + + Gets the assert count. + + The assert count. + + + + Gets or sets the test case timeout value + + + + + Gets a list of ITestActions set by upstream tests + + + + + Saves or restores the CurrentCulture + + + + + Saves or restores the CurrentUICulture + + + + + Gets or sets the current for the Thread. + + + + + The current head of the ValueFormatter chain, copied from MsgUtils.ValueFormatter + + + + + If true, all tests must run on the same thread. No new thread may be spawned. + + + + + Thrown when a test executes inconclusively. + + + + + Abstract base for Exceptions that terminate a test and provide a ResultState. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the dictionary. + + + + + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the dictionary. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + EqualConstraint is able to compare an actual value with the + expected value provided in its constructor. Two objects are + considered equal if both are null, or if both have the same + value. NUnit has special semantics for some object types. + + + + + NUnitEqualityComparer used to test equality. + + + + + Initializes a new instance of the class. + + The expected value. + + + + Flag the constraint to use a tolerance when determining equality. + + Tolerance value to be used + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Gets the tolerance for this comparison. + + + The tolerance. + + + + + Gets a value indicating whether to compare case insensitive. + + + true if comparing case insensitive; otherwise, false. + + + + + Gets a value indicating whether or not to clip strings. + + + true if set to clip strings otherwise, false. + + + + + Gets the failure points. + + + The failure points. + + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to suppress string clipping + and return self. + + + + + Flag the constraint to compare arrays as collections + and return self. + + + + + Flags the constraint to include + property in comparison of two values. + + + Using this modifier does not allow to use the + constraint modifier. + + + + + Switches the .Within() modifier to interpret its tolerance as + a distance in representable _values (see remarks). + + Self. + + Ulp stands for "unit in the last place" and describes the minimum + amount a given value can change. For any integers, an ulp is 1 whole + digit. For floating point _values, the accuracy of which is better + for smaller numbers and worse for larger numbers, an ulp depends + on the size of the number. Using ulps for comparison of floating + point results instead of fixed tolerances is safer because it will + automatically compensate for the added inaccuracy of larger numbers. + + + + + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual _values is allowed to deviate from + the expected value. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in days. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in hours. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in minutes. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in seconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in milliseconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in clock ticks. + + Self + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Applies a delay to the match so that a match can be evaluated in the future. + + + + + Creates a new DelayedConstraint + + The inner constraint to decorate + The time interval after which the match is performed + If the value of is less than 0 + + + + Creates a new DelayedConstraint + + The inner constraint to decorate + The time interval after which the match is performed, in milliseconds + The time interval used for polling, in milliseconds + If the value of is less than 0 + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + Test whether the constraint is satisfied by a delegate + + The delegate whose value is to be tested + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + Overridden to wait for the specified delay period before + calling the base constraint with the dereferenced value. + + A reference to the value to be tested + True for success, false for failure + + + + Returns the string representation of the constraint. + + + + + Adjusts a Timestamp by a given TimeSpan + + + + + + + + Returns the difference between two Timestamps as a TimeSpan + + + + + + + + Gets text describing a constraint + + + + + CollectionOrderedConstraint is used to test whether a collection is ordered. + + + + + Construct a CollectionOrderedConstraint + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use a and returns self. + + + + + Modifies the constraint to test ordering by the value of + a specified property and returns self. + + + + + Test whether the collection is ordered + + + + + + + Returns the string representation of the constraint. + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + If used performs a default ascending comparison + + + + + If used performs a reverse comparison + + + + + Then signals a break between two ordering steps + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + An OrderingStep represents one stage of the sort + + + + + Attribute used to provide descriptive text about a + test case or fixture. + + + + + Construct a description Attribute + + The text of the description + + + + InvalidTestFixtureException is thrown when an appropriate test + fixture constructor using the provided arguments cannot be found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + A CompositeWorkItem represents a test suite and + encapsulates the execution of the suite as well + as all its child tests. + + + + + A count of how many tests in the work item have a value for the Order Property + + + + + Construct a CompositeWorkItem for executing a test suite + using a filter to select child tests. + + The TestSuite to be executed + A filter used to select child tests + + + + Method that actually performs the work. Overridden + in CompositeWorkItem to do setup, run all child + items and then do teardown. + + + + + Sorts tests under this suite. + + + + + Cancel (abort or stop) a CompositeWorkItem and all of its children + + true if the CompositeWorkItem and all of its children should be aborted, false if it should allow all currently running tests to complete + + + + List of Child WorkItems + + + + + Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other. + + + A signed integer that indicates the relative values of and , as shown in the following table.Value Meaning Less than zero is less than .Zero equals .Greater than zero is greater than . + + The first object to compare.The second object to compare. + + + + The ISimpleTestBuilder interface is exposed by a class that knows how to + build a single TestMethod from a suitable MethodInfo Types. In general, + it is exposed by an attribute, but may be implemented in a helper class + used by the attribute in some cases. + + + + + Build a TestMethod from the provided MethodInfo. + + The method to be used as a test + The TestSuite to which the method will be added + A TestMethod object + + + + The TypeWrapper class wraps a Type so it may be used in + a platform-independent manner. + + + + + Construct a TypeWrapper for a specified Type. + + + + + Returns true if the Type wrapped is T + + + + + Get the display name for this type + + + + + Get the display name for an object of this type, constructed with the specified args. + + + + + Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments + + + + + Returns a Type representing a generic type definition from which this Type can be constructed. + + + + + Returns an array of custom attributes of the specified type applied to this type + + + + + Returns a value indicating whether the type has an attribute of the specified type. + + + + + + + + Returns a flag indicating whether this type has a method with an attribute of the specified type. + + + + + + + Returns an array of IMethodInfos for methods of this Type + that match the specified flags. + + + + + Gets the public constructor taking the specified argument Types + + + + + Returns a value indicating whether this Type has a public constructor taking the specified argument Types. + + + + + Construct an object of this Type, using the specified arguments. + + + + + Override ToString() so that error messages in NUnit's own tests make sense + + + + + Gets the underlying Type on which this TypeWrapper is based. + + + + + Gets the base type of this type as an ITypeInfo + + + + + Gets the Name of the Type + + + + + Gets the FullName of the Type + + + + + Gets the assembly in which the type is declared + + + + + Gets the namespace of the Type + + + + + Gets a value indicating whether the type is abstract. + + + + + Gets a value indicating whether the Type is a generic Type + + + + + Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. + + + + + Gets a value indicating whether the Type is a generic Type definition + + + + + Gets a value indicating whether the type is sealed. + + + + + Gets a value indicating whether this type represents a static class. + + + + + DictionaryContainsValueConstraint is used to test whether a dictionary + contains an expected object as a value. + + + + + Construct a DictionaryContainsValueConstraint + + + + + + Test whether the expected value is contained in the dictionary + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + TestCaseSourceAttribute indicates the source to be used to + provide test fixture instances for a test class. + + + + + Error message string is public so the tests can use it + + + + + Construct with the name of the method, property or field that will provide data + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + Construct with a Type + + The type that will provide data + + + + Construct one or more TestFixtures from a given Type, + using available parameter data. + + The TypeInfo for which fixures are to be constructed. + One or more TestFixtures as TestSuite + + + + Returns a set of ITestFixtureData items for use as arguments + to a parameterized test fixture. + + The type for which data is needed. + + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + Gets or sets the category associated with every fixture created from + this attribute. May be a single category or a comma-separated list. + + + + + Attribute used to identify a method that is called once + to perform setup before any child tests are run. + + + + + Provides the Author of a test or test fixture. + + + + + Initializes a new instance of the class. + + The name of the author. + + + + Initializes a new instance of the class. + + The name of the author. + The email address of the author. + + + + The different targets a test action attribute can be applied to + + + + + Default target, which is determined by where the action attribute is attached + + + + + Target a individual test case + + + + + Target a suite of test cases + + + + + TestListener provides an implementation of ITestListener that + does nothing. It is used only through its NULL property. + + + + + Called when a test has just started + + The test that is starting + + + + Called when a test case has finished + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Construct a new TestListener - private so it may not be used. + + + + + Get a listener that does nothing + + + + + PlatformHelper class is used by the PlatformAttribute class to + determine whether a platform is supported. + + + + + Comma-delimited list of all supported OS platform constants + + + + + Comma-delimited list of all supported Runtime platform constants + + + + + Default constructor uses the operating system and + common language runtime of the system. + + + + + Construct a PlatformHelper for a particular operating + system and common language runtime. Used in testing. + + OperatingSystem to be used + RuntimeFramework to be used + + + + Test to determine if one of a collection of platforms + is being used currently. + + + + + + + Tests to determine if the current platform is supported + based on a platform attribute. + + The attribute to examine + + + + + Tests to determine if the current platform is supported + based on a platform attribute. + + The attribute to examine + + + + + Test to determine if the a particular platform or comma- + delimited set of platforms is in use. + + Name of the platform or comma-separated list of platform ids + True if the platform is in use on the system + + + + Return the last failure reason. Results are not + defined if called before IsSupported( Attribute ) + is called. + + + + + DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite + containing test fixtures present in the assembly. + + + + + The default suite builder used by the test assembly builder. + + + + + Initializes a new instance of the class. + + + + + Build a suite of tests from a provided assembly + + The assembly from which tests are to be built + A dictionary of options to use in building the suite + + A TestSuite containing the tests found in the assembly + + + + + Build a suite of tests given the filename of an assembly + + The filename of the assembly from which tests are to be built + A dictionary of options to use in building the suite + + A TestSuite containing the tests found in the assembly + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + EmptyConstraint tests a whether a string or collection is empty, + postponing the decision about which test is applied until the + type of the actual argument is known. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + ComparisonAdapter class centralizes all comparisons of + _values in NUnit, adapting to the use of any provided + , + or . + + + + + Returns a ComparisonAdapter that wraps an + + + + + Returns a ComparisonAdapter that wraps an + + + + + Returns a ComparisonAdapter that wraps a + + + + + Compares two objects + + + + + Gets the default ComparisonAdapter, which wraps an + NUnitComparer object. + + + + + Construct a ComparisonAdapter for an + + + + + Compares two objects + + + + + + + + Construct a default ComparisonAdapter + + + + + ComparerAdapter extends and + allows use of an or + to actually perform the comparison. + + + + + Construct a ComparisonAdapter for an + + + + + Compare a Type T to an object + + + + + Construct a ComparisonAdapter for a + + + + + Compare a Type T to an object + + + + + AssignableFromConstraint is used to test that an object + can be assigned from a given Type. + + + + + Construct an AssignableFromConstraint for the type provided + + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + Marks a test to use a Sequential join of any argument + data provided. Arguments will be combined into test cases, + taking the next value of each argument until all are used. + + + + + Default constructor + + + + + RangeAttribute is used to supply a range of _values to an + individual parameter of a parameterized test. + + + + + Construct a range of ints using default step of 1 + + + + + + + Construct a range of ints specifying the step size + + + + + + + + Construct a range of unsigned ints using default step of 1 + + + + + + + Construct a range of unsigned ints specifying the step size + + + + + + + + Construct a range of longs using a default step of 1 + + + + + + + Construct a range of longs + + + + + + + + Construct a range of unsigned longs using default step of 1 + + + + + + + Construct a range of unsigned longs specifying the step size + + + + + + + + Construct a range of doubles + + + + + + + + Construct a range of floats + + + + + + + + Used to mark a field, property or method providing a set of datapoints to + be used in executing any theories within the same fixture that require an + argument of the Type provided. The data source may provide an array of + the required Type or an . + Synonymous with DatapointsAttribute. + + + + + StackFilter class is used to remove internal NUnit + entries from a stack trace so that the resulting + trace provides better information about the test. + + + + + Filters a raw stack trace and returns the result. + + The original stack trace + A filtered stack trace + + + + A utility class to create TestCommands + + + + + Gets the command to be executed before any of + the child tests are run. + + A TestCommand + + + + Gets the command to be executed after all of the + child tests are run. + + A TestCommand + + + + Creates a test command for use in running this test. + + + + + + Creates a command for skipping a test. The result returned will + depend on the test RunState. + + + + + Builds the set up tear down list. + + Type of the fixture. + Type of the set up attribute. + Type of the tear down attribute. + A list of SetUpTearDownItems + + + + The ParameterWrapper class wraps a ParameterInfo so that it may + be used in a platform-independent manner. + + + + + The IParameterInfo interface is an abstraction of a .NET parameter. + + + + + Gets a value indicating whether the parameter is optional + + + + + Gets an IMethodInfo representing the method for which this is a parameter + + + + + Gets the underlying .NET ParameterInfo + + + + + Gets the Type of the parameter + + + + + Construct a ParameterWrapper for a given method and parameter + + + + + + + Returns an array of custom attributes of the specified type applied to this method + + + + + Gets a value indicating whether one or more attributes of the specified type are defined on the parameter. + + + + + Gets a value indicating whether the parameter is optional + + + + + Gets an IMethodInfo representing the method for which this is a parameter. + + + + + Gets the underlying ParameterInfo + + + + + Gets the Type of the parameter + + + + + A trace listener that writes to a separate file per domain + and process using it. + + + + + Construct an InternalTraceWriter that writes to a file. + + Path to the file to use + + + + Construct an InternalTraceWriter that writes to a + TextWriter provided by the caller. + + + + + + Writes a character to the text string or stream. + + The character to write to the text stream. + + + + Writes a string to the text string or stream. + + The string to write. + + + + Writes a string followed by a line terminator to the text string or stream. + + The string to write. If is null, only the line terminator is written. + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Clears all buffers for the current writer and causes any buffered data to be written to the underlying device. + + + + + Returns the character encoding in which the output is written. + + The character encoding in which the output is written. + + + + FullName filter selects tests based on their FullName + + + + + Construct a MethodNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provides a platform-independent methods for getting attributes + for use by AttributeConstraint and AttributeExistsConstraint. + + + + + Gets the custom attributes from the given object. + + Portable libraries do not have an ICustomAttributeProvider, so we need to cast to each of + it's direct subtypes and try to get attributes off those instead. + The actual. + Type of the attribute. + if set to true [inherit]. + A list of the given attribute on the given object. + + + + The SpecialValue enum is used to represent TestCase arguments + that cannot be used as arguments to an Attribute. + + + + + Null represents a null value, which cannot be used as an + argument to an attriute under .NET 1.x + + + + + TypeHelper provides static methods that operate on Types. + + + + + A special value, which is used to indicate that BestCommonType() method + was unable to find a common type for the specified arguments. + + + + + Gets the display name for a Type as used by NUnit. + + The Type for which a display name is needed. + The display name for the Type + + + + Gets the display name for a Type as used by NUnit. + + The Type for which a display name is needed. + The arglist provided. + The display name for the Type + + + + Returns the best fit for a common type to be used in + matching actual arguments to a methods Type parameters. + + The first type. + The second type. + Either type1 or type2, depending on which is more general. + + + + Determines whether the specified type is numeric. + + The type to be examined. + + true if the specified type is numeric; otherwise, false. + + + + + Convert an argument list to the required parameter types. + Currently, only widening numeric conversions are performed. + + An array of args to be converted + A ParameterInfo[] whose types will be used as targets + + + + Determines whether this instance can deduce type args for a generic type from the supplied arguments. + + The type to be examined. + The arglist. + The type args to be used. + + true if this the provided args give sufficient information to determine the type args to be used; otherwise, false. + + + + + Gets the _values for an enumeration, using Enum.GetTypes + where available, otherwise through reflection. + + + + + + + Gets the ids of the _values for an enumeration, + using Enum.GetNames where available, otherwise + through reflection. + + + + + + + ThreadUtility provides a set of static methods convenient + for working with threads. + + + + + Do our best to Kill a thread + + The thread to kill + + + + Do our best to kill a thread, passing state info + + The thread to kill + Info for the ThreadAbortException handler + + + + TestFixture is a surrogate for a user test fixture class, + containing one or more tests. + + + + + Any ITest that implements this interface is at a level that the implementing + class should be disposed at the end of the test run + + + + + Initializes a new instance of the class. + + Type of the fixture. + + + + Predicate constraint wraps a Predicate in a constraint, + returning success if the predicate is true. + + + + + Construct a PredicateConstraint from a predicate + + + + + Determines whether the predicate succeeds when applied + to the actual value. + + + + + Gets text describing a constraint + + + + + NotConstraint negates the effect of some other constraint + + + + + Initializes a new instance of the class. + + The base constraint to be negated. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + Custom value formatter function + + The value + + + + + Custom value formatter factory function + + The next formatter function + ValueFormatter + If the given formatter is unable to handle a certain format, it must call the next formatter in the chain + + + + Static methods used in creating messages + + + + + Static string used when strings are clipped + + + + + Formatting strings used for expected and actual _values + + + + + Add a formatter to the chain of responsibility. + + + + + + Formats text to represent a generalized value. + + The value + The formatted text + + + + Formats text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Returns the representation of a type as used in NUnitLite. + This is the same as Type.ToString() except for arrays, + which are displayed with their declared sizes. + + + + + + + Converts any control characters in a string + to their escaped representation. + + The string to be converted + The converted string + + + + Converts any null characters in a string + to their escaped representation. + + The string to be converted + The converted string + + + + Return the a string representation for a set of indices into an array + + Array of indices for which a string is needed + + + + Get an array of indices representing the point in a collection or + array corresponding to a single int index into the collection. + + The collection to which the indices apply + Index in the collection + Array of indices + + + + Clip a string to a given length, starting at a particular offset, returning the clipped + string with ellipses representing the removed parts + + The string to be clipped + The maximum permitted length of the result string + The point at which to start clipping + The clipped string + + + + Clip the expected and actual strings in a coordinated fashion, + so that they may be displayed together. + + + + + + + + + Shows the position two strings start to differ. Comparison + starts at the start index. + + The expected string + The actual string + The index in the strings at which comparison should start + Boolean indicating whether case should be ignored + -1 if no mismatch found, or the index where mismatch found + + + + Current head of chain of value formatters. Public for testing. + + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + public void TestDescriptionMethod() + {} + } + + + + + + Construct the attribute, specifying a combining strategy and source of parameter data. + + + + + Enumeration indicating whether the tests are + running normally or being cancelled. + + + + + Running normally with no stop requested + + + + + A graceful stop has been requested + + + + + A forced stop has been requested + + + + + The TestCaseParameters class encapsulates method arguments and + other selected parameters needed for constructing + a parameterized test case. + + + + + Default Constructor creates an empty parameter set + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a ParameterSet from an object implementing ITestCaseData + + + + + + Type arguments used to create a generic fixture instance + + + + + Provides methods to support legacy string comparison methods. + + + + + Compares two strings for equality, ignoring case if requested. + + The first string. + The second string.. + if set to true, the case of the letters in the strings is ignored. + Zero if the strings are equivalent, a negative number if strA is sorted first, a positive number if + strB is sorted first + + + + Compares two strings for equality, ignoring case if requested. + + The first string. + The second string.. + if set to true, the case of the letters in the strings is ignored. + True if the strings are equivalent, false if not. + + + + OneTimeSetUpCommand runs any one-time setup methods for a suite, + constructing the user test object if necessary. + + + + + Constructs a OneTimeSetUpCommand for a suite + + The suite to which the command applies + A SetUpTearDownList for use by the command + A List of TestActionItems to be run after Setup + + + + Overridden to run the one-time setup for a suite. + + The TestExecutionContext to be used. + A TestResult + + + + The TestOutput class holds a unit of output from + a test to a specific output stream + + + + + Construct with text, ouput destination type and + the name of the test that produced the output. + + Text to be output + Name of the stream or channel to which the text should be written + FullName of test that produced the output + + + + Return string representation of the object for debugging + + + + + + Convert the TestOutput object to an XML string + + + + + Get the text + + + + + Get the output type + + + + + Get the name of the test that created the output + + + + + The IMethodInfo class is used to encapsulate information + about a method in a platform-independent manner. + + + + + Gets the parameters of the method. + + + + + + Returns the Type arguments of a generic method or the Type parameters of a generic method definition. + + + + + Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. + + The type arguments to be used + A new IMethodInfo with the type arguments replaced + + + + Invokes the method, converting any TargetInvocationException to an NUnitException. + + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + Gets the Type from which this method was reflected. + + + + + Gets the MethodInfo for this method. + + + + + Gets the name of the method. + + + + + Gets a value indicating whether the method is abstract. + + + + + Gets a value indicating whether the method is public. + + + + + Gets a value indicating whether the method contains unassigned generic type parameters. + + + + + Gets a value indicating whether the method is a generic method. + + + + + Gets a value indicating whether the MethodInfo represents the definition of a generic method. + + + + + Gets the return Type of the method. + + + + + ThrowsExceptionConstraint tests that an exception has + been thrown, without any further tests. + + + + + Executes the code and returns success if an exception is thrown. + + A delegate representing the code to be tested + True if an exception is thrown, otherwise false + + + + Returns the ActualValueDelegate itself as the value to be tested. + + A delegate representing the code to be tested + The delegate itself + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + LevelOfParallelismAttribute is used to set the number of worker threads + that may be allocated by the framework for running tests. + + + + + Construct a LevelOfParallelismAttribute. + + The number of worker threads to be created by the framework. + + + + RepeatAttribute may be applied to test case in order + to run it multiple times. + + + + + Construct a RepeatAttribute + + The number of times to run the test + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + The test command for the RetryAttribute + + + + + Initializes a new instance of the class. + + The inner command. + The number of repetitions + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Represents the result of running a single test case. + + + + + Construct a TestCaseResult based on a TestMethod + + A TestMethod to which the result applies. + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + TestParameters class holds any named parameters supplied to the test run + + + + + Gets a flag indicating whether a parameter with the specified name exists.N + + Name of the parameter + True if it exists, otherwise false + + + + Get method is a simple alternative to the indexer + + Name of the paramter + Value of the parameter or null if not present + + + + Get the value of a parameter or a default string + + Name of the parameter + Default value of the parameter + Value of the parameter or default value if not present + + + + Get the value of a parameter or return a default + + The return Type + Name of the parameter + Default value of the parameter + Value of the parameter or default value if not present + + + + Adds a parameter to the list + + Name of the parameter + Value of the parameter + + + + Gets the number of test parameters + + + + + Gets a collection of the test parameter names + + + + + Indexer provides access to the internal dictionary + + Name of the parameter + Value of the parameter or null if not present + + + + ParameterDataSourceProvider supplies individual argument _values for + single parameters using attributes implementing IParameterDataSource. + + + + + Determine whether any data is available for a parameter. + + A ParameterInfo representing one + argument to a parameterized test + + True if any data is available, otherwise false. + + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + An IParameterInfo representing one + argument to a parameterized test + + An IEnumerable providing the required data + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + OrConstraint succeeds if either member succeeds + + + + + Create an OrConstraint from two other constraints + + The first constraint + The second constraint + + + + Apply the member constraints to an actual value, succeeding + succeeding as soon as one of them succeeds. + + The actual value + True if either constraint succeeded + + + + Gets text describing a constraint + + + + + Operator that tests for the presence of a particular attribute + on a type and optionally applies further tests to the attribute. + + + + + Construct an AttributeOperator for a particular Type + + The Type of attribute tested + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + MessageWriter is the abstract base for classes that write + constraint descriptions and messages in some form. The + class has separate methods for writing various components + of a message, allowing implementations to tailor the + presentation as needed. + + + + + Construct a MessageWriter given a culture + + + + + Method to write single line message with optional args, usually + written to precede the general failure message. + + The message to be written + Any arguments used in formatting the message + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a givel + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The failing constraint result + + + + Display Expected and Actual lines for given _values. This + method may be called by constraints that need more control over + the display of actual and expected _values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given _values, including + a tolerance value on the Expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string _values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in locating the point where the strings differ + If true, the strings should be clipped to fit the line + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Abstract method to get the max line length + + + + + Tests whether a value is less than the value supplied to its constructor + + + + + Abstract base class for constraints that compare _values to + determine if one is greater than, equal to or less than + the other. + + + + + The value against which a comparison is to be made + + + + + If true, less than returns success + + + + + if true, equal returns success + + + + + if true, greater than returns success + + + + + ComparisonAdapter to be used in making the comparison + + + + + Initializes a new instance of the class. + + The value against which to make a comparison. + if set to true less succeeds. + if set to true equal succeeds. + if set to true greater succeeds. + String used in describing the constraint. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Modifies the constraint to use an and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Modifies the constraint to use an and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Modifies the constraint to use a and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Initializes a new instance of the class. + + The expected value. + + + + EmptyStringConstraint tests whether a string is empty. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + EmptyDirectoryConstraint is used to test that a directory is empty + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + ConstraintBuilder maintains the stacks that are used in + processing a ConstraintExpression. An OperatorStack + is used to hold operators that are waiting for their + operands to be reorganized. a ConstraintStack holds + input constraints as well as the results of each + operator applied. + + + + + Initializes a new instance of the class. + + + + + Appends the specified operator to the expression by first + reducing the operator stack and then pushing the new + operator on the stack. + + The operator to push. + + + + Appends the specified constraint to the expression by pushing + it on the constraint stack. + + The constraint to push. + + + + Sets the top operator right context. + + The right context. + + + + Reduces the operator stack until the topmost item + precedence is greater than or equal to the target precedence. + + The target precedence. + + + + Resolves this instance, returning a Constraint. If the Builder + is not currently in a resolvable state, an exception is thrown. + + The resolved constraint + + + + Gets a value indicating whether this instance is resolvable. + + + true if this instance is resolvable; otherwise, false. + + + + + OperatorStack is a type-safe stack for holding ConstraintOperators + + + + + Initializes a new instance of the class. + + The ConstraintBuilder using this stack. + + + + Pushes the specified operator onto the stack. + + The operator to put onto the stack. + + + + Pops the topmost operator from the stack. + + The topmost operator on the stack + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + Gets the topmost operator without modifying the stack. + + + + + ConstraintStack is a type-safe stack for holding Constraints + + + + + Initializes a new instance of the class. + + The ConstraintBuilder using this stack. + + + + Pushes the specified constraint. As a side effect, + the constraint's Builder field is set to the + ConstraintBuilder owning this stack. + + The constraint to put onto the stack + + + + Pops this topmost constraint from the stack. + As a side effect, the constraint's Builder + field is set to null. + + The topmost contraint on the stack + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + CollectionEquivalentConstraint is used to determine whether two + collections are equivalent. + + + + + Construct a CollectionEquivalentConstraint + + + + + + Test whether two collections are equivalent + + + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + AttributeExistsConstraint tests for the presence of a + specified attribute on a Type. + + + + + Constructs an AttributeExistsConstraint for a specific attribute Type + + + + + + Tests whether the object provides the expected attribute. + + A Type, MethodInfo, or other ICustomAttributeProvider + True if the expected attribute is present, otherwise false + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Marks a test that must run on a separate thread. + + + + + Construct a RequiresThreadAttribute + + + + + Construct a RequiresThreadAttribute, specifying the apartment + + + + + ExplicitAttribute marks a test or test fixture so that it will + only be run if explicitly executed from the gui or command line + or if it is included by use of a filter. The test will not be + run simply because an enclosing suite is run. + + + + + Default constructor + + + + + Constructor with a reason + + The reason test is marked explicit + + + + Modifies a test by marking it as explicit. + + The test to modify + + + + OneTimeTearDownCommand performs any teardown actions + specified for a suite and calls Dispose on the user + test object, if any. + + + + + Construct a OneTimeTearDownCommand + + The test suite to which the command applies + A SetUpTearDownList for use by the command + A List of TestActionItems to be run before teardown. + + + + Overridden to run the teardown methods specified on the test. + + The TestExecutionContext to be used. + A TestResult + + + + Class that can build a tree of automatic namespace + suites from a group of fixtures. + + + + + NamespaceDictionary of all test suites we have created to represent + namespaces. Used to locate namespace parent suites for fixtures. + + + + + The root of the test suite being created by this builder. + + + + + Initializes a new instance of the class. + + The root suite. + + + + Adds the specified fixtures to the tree. + + The fixtures to be added. + + + + Adds the specified fixture to the tree. + + The fixture to be added. + + + + Gets the root entry in the tree created by the NamespaceTreeBuilder. + + The root suite. + + + + Built-in SuiteBuilder for all types of test classes. + + + + + The ISuiteBuilder interface is exposed by a class that knows how to + build a suite from one or more Types. + + + + + Examine the type and determine if it is suitable for + this builder to use in building a TestSuite. + + Note that returning false will cause the type to be ignored + in loading the tests. If it is desired to load the suite + but label it as non-runnable, ignored, etc., then this + method must return true. + + The type of the fixture to be used + True if the type can be used to build a TestSuite + + + + Build a TestSuite from type provided. + + The type of the fixture to be used + A TestSuite + + + + Checks to see if the provided Type is a fixture. + To be considered a fixture, it must be a non-abstract + class with one or more attributes implementing the + IFixtureBuilder interface or one or more methods + marked as tests. + + The fixture type to check + True if the fixture can be built, false if not + + + + Build a TestSuite from TypeInfo provided. + + The fixture type to build + A TestSuite built from that type + + + + We look for attributes implementing IFixtureBuilder at one level + of inheritance at a time. Attributes on base classes are not used + unless there are no fixture builder attributes at all on the derived + class. This is by design. + + The type being examined for attributes + A list of the attributes found. + + + + + + + + + + + + + + + + + + + + + + + + Provide actions to execute before and after tests. + + + + + When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. + + + + + Executed before each test is run + + The test that is going to be run. + + + + Executed after each test is run + + The test that has just been run. + + + + Provides the target for the action attribute + + The target for the action attribute + + + + Executed before each test is run + + The test that is going to be run. + + + + Executed after each test is run + + The test that has just been run. + + + + Provides the target for the action attribute + + + + + Marks a test that must run in a particular threading apartment state, causing it + to run in a separate thread if necessary. + + + + + Construct an ApartmentAttribute + + The apartment state that this test must be run under. You must pass in a valid apartment state. + + + + The Iz class is a synonym for Is intended for use in VB, + which regards Is as a keyword. + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable to the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable to the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is a subpath of the expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + inclusively within a specified range. + + from must be less than or equal to true + Inclusive beginning of the range. Must be less than or equal to to. + Inclusive end of the range. Must be greater than or equal to from. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for equality with zero + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Objects implementing this interface are used to wrap + the TestMethodCommand itself. They apply after SetUp + has been run and before TearDown. + + + + + The CommandStage enumeration represents the defined stages + of execution for a series of TestCommands. The int _values + of the enum are used to apply decorators in the proper + order. Lower _values are applied first and are therefore + "closer" to the actual test execution. + + + No CommandStage is defined for actual invocation of the test or + for creation of the context. Execution may be imagined as + proceeding from the bottom of the list upwards, with cleanup + after the test running in the opposite order. + + + + + Use an application-defined default value. + + + + + Make adjustments needed before and after running + the raw test - that is, after any SetUp has run + and before TearDown. + + + + + Run SetUp and TearDown for the test. This stage is used + internally by NUnit and should not normally appear + in user-defined decorators. + + + + + Make adjustments needed before and after running + the entire test - including SetUp and TearDown. + + + + + ThrowsConstraint is used to test the exception thrown by + a delegate by applying a constraint to it. + + + + + Initializes a new instance of the class, + using a constraint to be applied to the exception. + + A constraint to apply to the caught exception. + + + + Executes the code of the delegate and captures any exception. + If a non-null base constraint was provided, it applies that + constraint to the exception. + + A delegate representing the code to be tested + True if an exception is thrown and the constraint succeeds, otherwise false + + + + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. + + + + + + + Get the actual exception thrown - used by Assert.Throws. + + + + + Gets text describing a constraint + + + + + Write the actual value for a failing constraint test to a + MessageWriter. This override only handles the special message + used when an exception is expected but none is thrown. + + The writer on which the actual value is displayed + + + + Summary description for SamePathConstraint. + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Operator that requires both it's arguments to succeed + + + + + Construct an AndOperator + + + + + Apply the operator to produce an AndConstraint + + + + + Provides static methods to express the assumptions + that must be met for a test to give a meaningful + result. If an assumption is not met, the test + should produce an inconclusive result. + + + + + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + Not applicable + + + + override the default ReferenceEquals to throw an InvalidOperationException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + The left object. + The right object. + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the + method throws an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint to be applied + A function to build the message included with the Exception + + + + TODO: Documentation needed for class + + + + + Initializes a new instance of the class. + + The test being skipped. + + + + Overridden to simply set the CurrentResult to the + appropriate Skipped state. + + The execution context for the test + A TestResult + + + + The TextCapture class intercepts console output and writes it + to the current execution context, if one is present on the thread. + If no execution context is found, the output is written to a + default destination, normally the original destination of the + intercepted output. + + + + + Construct a TextCapture object + + The default destination for non-intercepted output + + + + Writes a single character + + The char to write + + + + Writes a string + + The string to write + + + + Writes a string followed by a line terminator + + The string to write + + + + Gets the Encoding in use by this TextWriter + + + + + SimpleWorkItemDispatcher handles execution of WorkItems by + directly executing them. It is provided so that a dispatcher + is always available in the context, thereby simplifying the + code needed to run child tests. + + + + + An IWorkItemDispatcher handles execution of work items. + + + + + Dispatch a single work item for execution. The first + work item dispatched is saved as the top-level + work item and used when stopping the run. + + The item to dispatch + + + + Cancel the ongoing run completely. + If no run is in process, the call has no effect. + + true if the IWorkItemDispatcher should abort all currently running WorkItems, false if it should allow all currently running WorkItems to complete + + + + Dispatch a single work item for execution. The first + work item dispatched is saved as the top-level + work item and a thread is created on which to + run it. Subsequent calls come from the top level + item or its descendants on the proper thread. + + The item to dispatch + + + + Cancel (abort or stop) the ongoing run. + If no run is in process, the call has no effect. + + true if the run should be aborted, false if it should allow its currently running test to complete + + + + Asserts on Directories + + + + + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an InvalidOperationException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both point to the same directory. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if the directories are not equal + Arguments to be used in formatting the message + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both point to the same directory. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + A directory containing the actual value + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + The path to a directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + The path to a directory containing the actual value + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + A directory containing the actual value + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + The path to a directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + The path to a directory containing the actual value + + + + TestName filter selects tests based on their Name + + + + + Construct a TestNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + The ParameterDataProvider class implements IParameterDataProvider + and hosts one or more individual providers. + + + + + Construct with a collection of individual providers + + + + + Determine whether any data is available for a parameter. + + An IParameterInfo representing one + argument to a parameterized test + True if any data is available, otherwise false. + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + An IParameterInfo representing one + argument to a parameterized test + An IEnumerable providing the required data + + + + ExactCountConstraint applies another constraint to each + item in a collection, succeeding only if a specified + number of items succeed. + + + + + Construct an ExactCountConstraint on top of an existing constraint + + + + + + + Apply the item constraint to each item in the collection, + succeeding only if the expected number of items pass. + + + + + + + Thrown when an assertion failed. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + XmlSerializableConstraint tests whether + an object is serializable in xml format. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns the string representation of this constraint + + + + + Gets text describing a constraint + + + + Helper routines for working with floating point numbers + + + The floating point comparison code is based on this excellent article: + http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm + + + "ULP" means Unit in the Last Place and in the context of this library refers to + the distance between two adjacent floating point numbers. IEEE floating point + numbers can only represent a finite subset of natural numbers, with greater + accuracy for smaller numbers and lower accuracy for very large numbers. + + + If a comparison is allowed "2 ulps" of deviation, that means the _values are + allowed to deviate by up to 2 adjacent floating point _values, which might be + as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. + + + + + Compares two floating point _values for equality + First floating point value to be compared + Second floating point value t be compared + + Maximum number of representable floating point _values that are allowed to + be between the left and the right floating point _values + + True if both numbers are equal or close to being equal + + + Floating point _values can only represent a finite subset of natural numbers. + For example, the _values 2.00000000 and 2.00000024 can be stored in a float, + but nothing inbetween them. + + + This comparison will count how many possible floating point _values are between + the left and the right number. If the number of possible _values between both + numbers is less than or equal to maxUlps, then the numbers are considered as + being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + Compares two double precision floating point _values for equality + First double precision floating point value to be compared + Second double precision floating point value t be compared + + Maximum number of representable double precision floating point _values that are + allowed to be between the left and the right double precision floating point _values + + True if both numbers are equal or close to being equal + + + Double precision floating point _values can only represent a limited series of + natural numbers. For example, the _values 2.0000000000000000 and 2.0000000000000004 + can be stored in a double, but nothing inbetween them. + + + This comparison will count how many possible double precision floating point + _values are between the left and the right number. If the number of possible + _values between both numbers is less than or equal to maxUlps, then the numbers + are considered as being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + + Reinterprets the memory contents of a floating point value as an integer value + + + Floating point value whose memory contents to reinterpret + + + The memory contents of the floating point value interpreted as an integer + + + + + Reinterprets the memory contents of a double precision floating point + value as an integer value + + + Double precision floating point value whose memory contents to reinterpret + + + The memory contents of the double precision floating point value + interpreted as an integer + + + + + Reinterprets the memory contents of an integer as a floating point value + + Integer value whose memory contents to reinterpret + + The memory contents of the integer value interpreted as a floating point value + + + + + Reinterprets the memory contents of an integer value as a double precision + floating point value + + Integer whose memory contents to reinterpret + + The memory contents of the integer interpreted as a double precision + floating point value + + + + Union of a floating point variable and an integer + + + The union's value as a floating point variable + + + The union's value as an integer + + + The union's value as an unsigned integer + + + Union of a double precision floating point variable and a long + + + The union's value as a double precision floating point variable + + + The union's value as a long + + + The union's value as an unsigned long + + + + EqualityAdapter class handles all equality comparisons + that use an , + or a . + + + + + Compares two objects, returning true if they are equal + + + + + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. + + + + + Returns an that wraps an . + + + + + Returns an that wraps an . + + + + + Returns an EqualityAdapter that uses a predicate function for items comparison. + + + + + + + + + Returns an that wraps an . + + + + + Returns an that wraps an . + + + + + Returns an that wraps a . + + + + + that wraps an . + + + + + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. + + + + + Compares two objects, returning true if they are equal + + + + + Returns true if the two objects can be compared by this adapter. + Generic adapter requires objects of the specified type. + + + + + that wraps an . + + + + + EmptyCollectionConstraint tests whether a collection is empty. + + + + + Check that the collection is empty + + + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is a subpath of the expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for equality with zero + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + BinarySerializableConstraint tests whether + an object is serializable in binary format. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns the string representation + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Used on a method, marks the test with a timeout value in milliseconds. + The test will be run in a separate thread and is cancelled if the timeout + is exceeded. Used on a class or assembly, sets the default timeout + for all contained test methods. + + + + + Construct a TimeoutAttribute given a time in milliseconds + + The timeout value in milliseconds + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + public void TestDescriptionMethod() + {} + } + + + + + + Modifies a test by adding a description, if not already set. + + The test to modify + + + + Construct a TestMethod from a given method. + + The method for which a test is to be constructed. + The suite to which the test will be added. + A TestMethod + + + + Descriptive text for this test + + + + + The author of this test + + + + + The type that this test is testing + + + + + Gets or sets the expected result. + + The result. + + + + Returns true if an expected result has been set + + + + + Summary description for SetUICultureAttribute. + + + + + Construct given the name of a culture + + + + + + Marks a test that must run in the STA, causing it + to run in a separate thread if necessary. + + + + + Construct a RequiresSTAAttribute + + + + + Used to mark a field, property or method providing a set of datapoints to + be used in executing any theories within the same fixture that require an + argument of the Type provided. The data source may provide an array of + the required Type or an . + Synonymous with DatapointSourceAttribute. + + + + + TestActionItem represents a single execution of an + ITestAction. It is used to track whether the BeforeTest + method has been called and suppress calling the + AfterTest method if it has not. + + + + + Construct a TestActionItem + + The ITestAction to be included + + + + Run the BeforeTest method of the action and remember that it has been run. + + The test to which the action applies + + + + Run the AfterTest action, but only if the BeforeTest + action was actually run. + + The test to which the action applies + + + + InternalTraceLevel is an enumeration controlling the + level of detailed presented in the internal log. + + + + + Use the default settings as specified by the user. + + + + + Do not display any trace messages + + + + + Display Error messages only + + + + + Display Warning level and higher messages + + + + + Display informational and higher messages + + + + + Display debug messages and higher - i.e. all messages + + + + + Display debug messages and higher - i.e. all messages + + + + + The ParallelScope enumeration permits specifying the degree to + which a test and its descendants may be run in parallel. + + + + + No Parallelism is permitted + + + + + The test itself may be run in parallel with others at the same level + + + + + Descendants of the test may be run in parallel with one another + + + + + Descendants of the test down to the level of TestFixtures may be run in parallel + + + + + ListMapper is used to transform a collection used as an actual argument + producing another collection to be used in the assertion. + + + + + Construct a ListMapper based on a collection + + The collection to be transformed + + + + Produces a collection containing all the _values of a property + + The collection of property _values + + + + + The List class is a helper class with properties and methods + that supply a number of constraints used with lists and collections. + + + + + List.Map returns a ListMapper, which can be used to map + the original collection to another collection. + + + + + + + TestAssembly is a TestSuite that represents the execution + of tests in a managed assembly. + + + + + Initializes a new instance of the class + specifying the Assembly and the path from which it was loaded. + + The assembly this test represents. + The path used to load the assembly. + + + + Initializes a new instance of the class + for a path which could not be loaded. + + The path used to load the assembly. + + + + Gets the Assembly represented by this instance. + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + SetUpFixture extends TestSuite and supports + Setup and TearDown methods. + + + + + Initializes a new instance of the class. + + The type. + + + + TrueConstraint tests that the actual value is true + + + + + Initializes a new instance of the class. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Tolerance class generalizes the notion of a tolerance + within which an equality test succeeds. Normally, it is + used with numeric types, but it can be used with any + type that supports taking a difference between two + objects and comparing that difference to a value. + + + + + Constructs a linear tolerance of a specified amount + + + + + Constructs a tolerance given an amount and + + + + + Tests that the current Tolerance is linear with a + numeric value, throwing an exception if it is not. + + + + + Returns a default Tolerance object, equivalent to + specifying an exact match unless + is set, in which case, the + will be used. + + + + + Returns an empty Tolerance object, equivalent to + specifying an exact match even if + is set. + + + + + Gets the for the current Tolerance + + + + + Gets the value of the current Tolerance instance. + + + + + Returns a new tolerance, using the current amount as a percentage. + + + + + Returns a new tolerance, using the current amount in Ulps + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of days. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of hours. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of minutes. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of seconds. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of milliseconds. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of clock ticks. + + + + + Returns true if the current tolerance has not been set or is using the . + + + + + StartsWithConstraint can test whether a string starts + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + Operator that tests that an exception is thrown and + optionally applies further tests to the exception. + + + + + Construct a ThrowsOperator + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + ConstraintExpression represents a compound constraint in the + process of being constructed from a series of syntactic elements. + + Individual elements are appended to the expression as they are + reorganized. When a constraint is appended, it is returned as the + value of the operation so that modifiers may be applied. However, + any partially built expression is attached to the constraint for + later resolution. When an operator is appended, the partial + expression is returned. If it's a self-resolving operator, then + a ResolvableConstraintExpression is returned. + + + + + The ConstraintBuilder holding the elements recognized so far + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. + + The builder. + + + + Returns a string representation of the expression as it + currently stands. This should only be used for testing, + since it has the side-effect of resolving the expression. + + + + + + Appends an operator to the expression and returns the + resulting expression itself. + + + + + Appends a self-resolving operator to the expression and + returns a new ResolvableConstraintExpression. + + + + + Appends a constraint to the expression and returns that + constraint, which is associated with the current state + of the expression being built. Note that the constraint + is not reduced at this time. For example, if there + is a NotOperator on the stack we don't reduce and + return a NotConstraint. The original constraint must + be returned because it may support modifiers that + are yet to be applied. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the a subpath of the expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + With is currently a NOP - reserved for future use. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests if item is equal to zero + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Returns a constraint that succeeds if the value + is a file or directory and it exists. + + + + + Attribute used to apply a category to a test + + + + + The name of the category + + + + + Construct attribute for a given category based on + a name. The name may not contain the characters ',', + '+', '-' or '!'. However, this is not checked in the + constructor since it would cause an error to arise at + as the test was loaded without giving a clear indication + of where the problem is located. The error is handled + in NUnitFramework.cs by marking the test as not + runnable. + + The name of the category + + + + Protected constructor uses the Type name as the name + of the category. + + + + + Modifies a test by adding a category to it. + + The test to modify + + + + The name of the category + + + + + IdFilter selects tests based on their id + + + + + Construct an IdFilter for a single value + + The id the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + Represents a constraint that succeeds if none of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. + + + + + Indicates which class the test or test fixture is testing + + + + + Initializes a new instance of the class. + + The type that is being tested. + + + + Initializes a new instance of the class. + + The type that is being tested. + + + + Defines the order that the test will run in + + + + + Defines the order that the test will run in + + + + + Defines the order that the test will run in + + + + + + Modifies a test as defined for the specific attribute. + + The test to modify + + + + SingleThreadedAttribute applies to a test fixture and indicates + that all the child tests must be run on the same thread as the + OneTimeSetUp and OneTimeTearDown. It sets a flag in the + TestExecutionContext and forces all tests to be run sequentially + on the current thread. Any ParallelScope setting is ignored. + + + + + Apply changes to the TestExecutionContext + + The TestExecutionContext + + + + FrameworkPackageSettings is a static class containing constant values that + are used as keys in setting up a TestPackage. These values are used in + the framework, and set in the runner. Setting values may be a string, int or bool. + + + + + Flag (bool) indicating whether tests are being debugged. + + + + + Flag (bool) indicating whether to pause execution of tests to allow + the user to attache a debugger. + + + + + The InternalTraceLevel for this run. Values are: "Default", + "Off", "Error", "Warning", "Info", "Debug", "Verbose". + Default is "Off". "Debug" and "Verbose" are synonyms. + + + + + Full path of the directory to be used for work and result files. + This path is provided to tests by the frameowrk TestContext. + + + + + Integer value in milliseconds for the default timeout value + for test cases. If not specified, there is no timeout except + as specified by attributes on the tests themselves. + + + + + A TextWriter to which the internal trace will be sent. + + + + + A list of tests to be loaded. + + + + + The number of test threads to run for the assembly. If set to + 1, a single queue is used. If set to 0, tests are executed + directly, without queuing. + + + + + The random seed to be used for this assembly. If specified + as the value reported from a prior run, the framework should + generate identical random values for tests as were used for + that run, provided that no change has been made to the test + assembly. Default is a random value itself. + + + + + If true, execution stops after the first error or failure. + + + + + If true, use of the event queue is suppressed and test events are synchronous. + + + + + The default naming pattern used in generating test names + + + + + Parameters to be passed on to the test + + + + + Represents a constraint that succeeds if the specified + count of members of a collection match a base constraint. + + + + + Construct an ExactCountOperator for a specified count + + The expected count + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. + + + + + ParameterizedFixtureSuite serves as a container for the set of test + fixtures created from a given Type using various parameters. + + + + + Initializes a new instance of the class. + + The ITypeInfo for the type that represents the suite. + + + + Gets a string representing the type of test + + + + + + ReusableConstraint wraps a constraint expression after + resolving it so that it can be reused consistently. + + + + + Construct a ReusableConstraint from a constraint expression + + The expression to be resolved and reused + + + + Converts a constraint to a ReusableConstraint + + The constraint to be converted + A ReusableConstraint + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Return the top-level constraint for this expression + + + + + + PropertyExistsConstraint tests that a named property + exists on the object provided through Match. + + Originally, PropertyConstraint provided this feature + in addition to making optional tests on the value + of the property. The two constraints are now separate. + + + + + Initializes a new instance of the class. + + The name of the property. + + + + Test whether the property exists for a given object + + The object to be tested + True for success, false for failure + + + + Returns the string representation of the constraint. + + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + PropertyConstraint extracts a named property and uses + its value as the actual value for a chained constraint. + + + + + Initializes a new instance of the class. + + The name. + The constraint to apply to the property. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns the string representation of the constraint. + + + + + + Represents a constraint that simply wraps the + constraint provided as an argument, without any + further functionality, but which modifies the + order of evaluation because of its precedence. + + + + + Constructor for the WithOperator + + + + + Returns a constraint that wraps its argument + + + + + NUnitComparer encapsulates NUnit's default behavior + in comparing two objects. + + + + + Compares two objects + + + + + + + + Returns the default NUnitComparer. + + + + + Tests whether a value is less than or equal to the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Attribute used to identify a method that is + called before any tests in a fixture are run. + + + + + Used to mark a field for use as a datapoint when executing a theory + within the same fixture that requires an argument of the field's Type. + + + + + AssertionHelper is an optional base class for user tests, + allowing the use of shorter ids for constraints and + asserts and avoiding conflict with the definition of + , from which it inherits much of its + behavior, in certain mock object frameworks. + + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to + . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to . + + The evaluated condition + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Returns a ListMapper based on a collection. + + The original collection + + + + + TextMessageWriter writes constraint descriptions and messages + in displayable form as a text stream. It tailors the display + of individual message components to form the standard message + format of NUnit assertion failure messages. + + + + + Prefix used for the expected value line of a message + + + + + Prefix used for the actual value line of a message + + + + + Length of a message prefix + + + + + Construct a TextMessageWriter + + + + + Construct a TextMessageWriter, specifying a user message + and optional formatting arguments. + + + + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a given + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The result of the constraint that failed + + + + Display Expected and Actual lines for given _values. This + method may be called by constraints that need more control over + the display of actual and expected _values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given _values, including + a tolerance value on the expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string _values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in string comparisons + If true, clip the strings to fit the max line length + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Write the generic 'Expected' line for a constraint + + The constraint that failed + + + + Write the generic 'Expected' line for a given value + + The expected value + + + + Write the generic 'Expected' line for a given value + and tolerance. + + The expected value + The tolerance within which the test was made + + + + Write the generic 'Actual' line for a constraint + + The ConstraintResult for which the actual value is to be written + + + + Write the generic 'Actual' line for a given value + + The actual value causing a failure + + + + Gets or sets the maximum line length for this writer + + + + + EventListenerTextWriter sends text output to the currently active + ITestEventListener in the form of a TestOutput object. If no event + listener is active in the contet, or if there is no context, + the output is forwarded to the supplied default writer. + + + + + Construct an EventListenerTextWriter + + The name of the stream to use for events + The default writer to use if no listener is available + + + + Write a single char + + + + + Write a string + + + + + Write a string followed by a newline + + + + + Get the Encoding for this TextWriter + + + + + CollectionSupersetConstraint is used to determine whether + one collection is a superset of another + + + + + Construct a CollectionSupersetConstraint + + The collection that the actual value is expected to be a superset of + + + + Test whether the actual collection is a superset of + the expected collection provided. + + + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + ParameterizedMethodSuite holds a collection of individual + TestMethods with their arguments applied. + + + + + Construct from a MethodInfo + + + + + + Gets a string representing the type of test + + + + + + OSPlatform represents a particular operating system platform + + + + + Platform ID for Unix as defined by Microsoft .NET 2.0 and greater + + + + + Platform ID for Unix as defined by Mono + + + + + Platform ID for XBox as defined by .NET and Mono, but not CF + + + + + Platform ID for MacOSX as defined by .NET and Mono, but not CF + + + + + Gets the actual OS Version, not the incorrect value that might be + returned for Win 8.1 and Win 10 + + + If an application is not manifested as Windows 8.1 or Windows 10, + the version returned from Environment.OSVersion will not be 6.3 and 10.0 + respectively, but will be 6.2 and 6.3. The correct value can be found in + the registry. + + The original version + The correct OS version + + + + Construct from a platform ID and version + + + + + Construct from a platform ID, version and product type + + + + + Get the OSPlatform under which we are currently running + + + + + Get the platform ID of this instance + + + + + Get the Version of this instance + + + + + Get the Product Type of this instance + + + + + Return true if this is a windows platform + + + + + Return true if this is a Unix or Linux platform + + + + + Return true if the platform is Win32S + + + + + Return true if the platform is Win32Windows + + + + + Return true if the platform is Win32NT + + + + + Return true if the platform is Windows CE + + + + + Return true if the platform is Xbox + + + + + Return true if the platform is MacOSX + + + + + Return true if the platform is Windows 95 + + + + + Return true if the platform is Windows 98 + + + + + Return true if the platform is Windows ME + + + + + Return true if the platform is NT 3 + + + + + Return true if the platform is NT 4 + + + + + Return true if the platform is NT 5 + + + + + Return true if the platform is Windows 2000 + + + + + Return true if the platform is Windows XP + + + + + Return true if the platform is Windows 2003 Server + + + + + Return true if the platform is NT 6 + + + + + Return true if the platform is NT 6.0 + + + + + Return true if the platform is NT 6.1 + + + + + Return true if the platform is NT 6.2 + + + + + Return true if the platform is NT 6.3 + + + + + Return true if the platform is Vista + + + + + Return true if the platform is Windows 2008 Server (original or R2) + + + + + Return true if the platform is Windows 2008 Server (original) + + + + + Return true if the platform is Windows 2008 Server R2 + + + + + Return true if the platform is Windows 2012 Server (original or R2) + + + + + Return true if the platform is Windows 2012 Server (original) + + + + + Return true if the platform is Windows 2012 Server R2 + + + + + Return true if the platform is Windows 7 + + + + + Return true if the platform is Windows 8 + + + + + Return true if the platform is Windows 8.1 + + + + + Return true if the platform is Windows 10 + + + + + Return true if the platform is Windows Server. This is named Windows + Server 10 to distinguish it from previous versions of Windows Server. + + + + + Product Type Enumeration used for Windows + + + + + Product type is unknown or unspecified + + + + + Product type is Workstation + + + + + Product type is Domain Controller + + + + + Product type is Server + + + + + Combines multiple filters so that a test must pass one + of them in order to pass this filter. + + + + + Constructs an empty OrFilter + + + + + Constructs an AndFilter from an array of filters + + + + + + Checks whether the OrFilter is matched by a test + + The test to be matched + True if any of the component filters pass, otherwise false + + + + Checks whether the OrFilter is matched by a test + + The test to be matched + True if any of the component filters match, otherwise false + + + + Checks whether the OrFilter is explicit matched by a test + + The test to be matched + True if any of the component filters explicit match, otherwise false + + + + Gets the element name + + Element name + + + + InstanceOfTypeConstraint is used to test that an object + is of the same type provided or derived from it. + + + + + Construct an InstanceOfTypeConstraint for the type provided + + The expected Type + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Tests whether a value is greater than the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + DictionaryContainsKeyConstraint is used to test whether a dictionary + contains an expected object as a key. + + + + + Construct a DictionaryContainsKeyConstraint + + + + + + Test whether the expected key is contained in the dictionary + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + ContainsConstraint tests a whether a string contains a substring + or a collection contains an object. It postpones the decision of + which test to use until the type of the actual argument is known. + This allows testing whether a string is contained in a collection + or as a substring of another string using the same syntax. + + + + + Initializes a new instance of the class. + + The _expected. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Flag the constraint to ignore case and return self. + + + + + CollectionTally counts (tallies) the number of + occurrences of each object in one or more enumerations. + + + + + Construct a CollectionTally object from a comparer and a collection + + + + + Try to remove an object from the tally + + The object to remove + True if successful, false if the object was not found + + + + Try to remove a set of objects from the tally + + The objects to remove + True if successful, false if any object was not found + + + + The number of objects remaining in the tally + + + + + AllItemsConstraint applies another constraint to each + item in a collection, succeeding if they all succeed. + + + + + Construct an AllItemsConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + A set of Assert methods operating on one or more collections + + + + + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an InvalidOperationException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable containing objects to be considered + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the superset does not contain the subset + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + + + + Asserts that the superset does not contain the subset + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the superset contains the subset. + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + + + + Asserts that the superset contains the subset. + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the subset does not contain the superset + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that the subset does not contain the superset + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the subset contains the superset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that the subset contains the superset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + + + + TestCaseSourceAttribute indicates the source to be used to + provide test cases for a test method. + + + + + Construct with the name of the method, property or field that will provide data + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + Construct with a Type + + The type that will provide data + + + + Construct one or more TestMethods from a given MethodInfo, + using available parameter data. + + The IMethod for which tests are to be constructed. + The suite to which the tests will be added. + One or more TestMethods + + + + Returns a set of ITestCaseDataItems for use as arguments + to a parameterized test method. + + The method for which data is needed. + + + + + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. + + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + Gets or sets the category associated with every fixture created from + this attribute. May be a single category or a comma-separated list. + + + + + TestMethodCommand is the lowest level concrete command + used to run actual test cases. + + + + + Initializes a new instance of the class. + + The test. + + + + Runs the test, saving a TestResult in the execution context, as + well as returning it. If the test has an expected result, it + is asserts on that value. Since failed tests and errors throw + an exception, this command must be wrapped in an outer command, + will handle that exception and records the failure. This role + is usually played by the SetUpTearDown command. + + The execution context + + + + SetUpTearDownCommand runs any SetUp methods for a suite, + runs the test and then runs any TearDown methods. + + + + + Initializes a new instance of the class. + + The inner command. + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + SetUpTearDownItem holds the setup and teardown methods + for a single level of the inheritance hierarchy. + + + + + Construct a SetUpTearDownNode + + A list of setup methods for this level + A list teardown methods for this level + + + + Run SetUp on this level. + + The execution context to use for running. + + + + Run TearDown for this level. + + + + + + Returns true if this level has any methods at all. + This flag is used to discard levels that do nothing. + + + + + Class used to guard against unexpected argument values + or operations by throwing an appropriate exception. + + + + + Throws an exception if an argument is null + + The value to be tested + The name of the argument + + + + Throws an exception if a string argument is null or empty + + The value to be tested + The name of the argument + + + + Throws an ArgumentOutOfRangeException if the specified condition is not met. + + The condition that must be met + The exception message to be used + The name of the argument + + + + Throws an ArgumentException if the specified condition is not met. + + The condition that must be met + The exception message to be used + The name of the argument + + + + Throws an InvalidOperationException if the specified condition is not met. + + The condition that must be met + The exception message to be used + + + + SubPathConstraint tests that the actual path is under the expected path + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + ParallelizableAttribute is used to mark tests that may be run in parallel. + + + + + Construct a ParallelizableAttribute using default ParallelScope.Self. + + + + + Construct a ParallelizableAttribute with a specified scope. + + The ParallelScope associated with this attribute. + + + + Modify the context to be used for child tests + + The current TestExecutionContext + + + + Helper class with properties and methods that supply + constraints that operate on exceptions. + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Creates a constraint specifying an expected exception + + + + + Creates a constraint specifying an exception with a given InnerException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying an expected ArgumentException + + + + + Creates a constraint specifying an expected ArgumentNUllException + + + + + Creates a constraint specifying an expected InvalidOperationException + + + + + Creates a constraint specifying that no exception is thrown + + + + + Enumeration identifying a common language + runtime implementation. + + + + Any supported runtime framework + + + Microsoft .NET Framework + + + Microsoft .NET Compact Framework + + + Microsoft Shared Source CLI + + + Mono + + + Silverlight + + + MonoTouch + + + + RuntimeFramework represents a particular version + of a common language runtime implementation. + + + + + DefaultVersion is an empty Version, used to indicate that + NUnit should select the CLR version to use for the test. + + + + + Construct from a runtime type and version. If the version has + two parts, it is taken as a framework version. If it has three + or more, it is taken as a CLR version. In either case, the other + version is deduced based on the runtime type and provided version. + + The runtime type of the framework + The version of the framework + + + + Parses a string representing a RuntimeFramework. + The string may be just a RuntimeType name or just + a Version or a hyphenated RuntimeType-Version or + a Version prefixed by 'versionString'. + + + + + + + Overridden to return the short name of the framework + + + + + + Returns true if the current framework matches the + one supplied as an argument. Two frameworks match + if their runtime types are the same or either one + is RuntimeType.Any and all specified version components + are equal. Negative (i.e. unspecified) version + components are ignored. + + The RuntimeFramework to be matched. + True on match, otherwise false + + + + Static method to return a RuntimeFramework object + for the framework that is currently in use. + + + + + The type of this runtime framework + + + + + The framework version for this runtime framework + + + + + The CLR version for this runtime framework + + + + + Return true if any CLR version may be used in + matching this RuntimeFramework object. + + + + + Returns the Display name for this framework + + + + + CategoryFilter is able to select or exclude tests + based on their categories. + + + + + + Construct a CategoryFilter using a single category name + + A category name + + + + Check whether the filter matches a test + + The test to be matched + + + + + Gets the element name + + Element name + + + + GlobalSettings is a place for setting default values used + by the framework in performing asserts. Anything set through + this class applies to the entire test run. It should not normally + be used from within a test, since it is not thread-safe. + + + + + Default tolerance for floating point equality + + + + + Asserts on Files + + + + + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an InvalidOperationException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + The message to be displayed when the two Stream are the same. + Arguments to be used in formatting the message + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + Asserts that the file exists. If it does not exist + an is thrown. + + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file exists. If it does not exist + an is thrown. + + A file containing the actual value + + + + Asserts that the file exists. If it does not exist + an is thrown. + + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file exists. If it does not exist + an is thrown. + + The path to a file containing the actual value + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + A file containing the actual value + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + The path to a file containing the actual value + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + SomeItemsConstraint applies another constraint to each + item in a collection, succeeding if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + succeeding if any item succeeds. + + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + SameAsConstraint tests whether an object is identical to + the object passed to its constructor + + + + + Initializes a new instance of the class. + + The expected object. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + RegexConstraint can test whether a string matches + the pattern provided. + + + + + Initializes a new instance of the class. + + The pattern. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + ConstraintStatus represents the status of a ConstraintResult + returned by a Constraint being applied to an actual value. + + + + + The status has not yet been set + + + + + The constraint succeeded + + + + + The constraint failed + + + + + An error occured in applying the constraint (reserved for future use) + + + + + Attribute used to identify a method that is called + immediately after each test is run. The method is + guaranteed to be called, even if an exception is thrown. + + + + + Marks a test to use a combinatorial join of any argument + data provided. Since this is the default, the attribute is + optional. + + + + + Default constructor + + + + + The PropertyNames class provides static constants for the + standard property ids that NUnit uses on tests. + + + + + The FriendlyName of the AppDomain in which the assembly is running + + + + + The selected strategy for joining parameter data into test cases + + + + + The process ID of the executing assembly + + + + + The stack trace from any data provider that threw + an exception. + + + + + The reason a test was not run + + + + + The author of the tests + + + + + The ApartmentState required for running the test + + + + + The categories applying to a test + + + + + The Description of a test + + + + + The number of threads to be used in running tests + + + + + The maximum time in ms, above which the test is considered to have failed + + + + + The ParallelScope associated with a test + + + + + The number of times the test should be repeated + + + + + Indicates that the test should be run on a separate thread + + + + + The culture to be set for a test + + + + + The UI culture to be set for a test + + + + + The type that is under test + + + + + The timeout value for the test + + + + + The test will be ignored until the given date + + + + + The optional Order the test will run in + + + + + The MethodWrapper class wraps a MethodInfo so that it may + be used in a platform-independent manner. + + + + + Construct a MethodWrapper for a Type and a MethodInfo. + + + + + Construct a MethodInfo for a given Type and method name. + + + + + Gets the parameters of the method. + + + + + + Returns the Type arguments of a generic method or the Type parameters of a generic method definition. + + + + + Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. + + The type arguments to be used + A new IMethodInfo with the type arguments replaced + + + + Returns an array of custom attributes of the specified type applied to this method + + + + + Gets a value indicating whether one or more attributes of the spcified type are defined on the method. + + + + + Invokes the method, converting any TargetInvocationException to an NUnitException. + + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + Override ToString() so that error messages in NUnit's own tests make sense + + + + + Gets the Type from which this method was reflected. + + + + + Gets the MethodInfo for this method. + + + + + Gets the name of the method. + + + + + Gets a value indicating whether the method is abstract. + + + + + Gets a value indicating whether the method is public. + + + + + Gets a value indicating whether the method contains unassigned generic type parameters. + + + + + Gets a value indicating whether the method is a generic method. + + + + + Gets a value indicating whether the MethodInfo represents the definition of a generic method. + + + + + Gets the return Type of the method. + + + + + Represents a constraint that succeeds if any of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + any of them succeed. + + + + + The TestMethod class represents a Test implemented as a method. + + + + + The ParameterSet used to create this test method + + + + + Initializes a new instance of the class. + + The method to be used as a test. + + + + Initializes a new instance of the class. + + The method to be used as a test. + The suite or fixture to which the new test will be added + + + + Overridden to return a TestCaseResult. + + A TestResult for this test. + + + + Returns a TNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets this test's child tests + + A list of child tests + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Returns the name of the method + + + + + RangeConstraint tests whether two _values are within a + specified range. + + + + + Initializes a new instance of the class. + + from must be less than or equal to true + Inclusive beginning of the range. Must be less than or equal to to. + Inclusive end of the range. Must be greater than or equal to from. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use a and returns self. + + + + + Gets text describing a constraint + + + + + Tests whether a value is greater than or equal to the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Delegate used to delay evaluation of the actual value + to be used in evaluating a constraint + + + + + AttributeConstraint tests that a specified attribute is present + on a Type or other provider and that the value of the attribute + satisfies some other constraint. + + + + + Constructs an AttributeConstraint for a specified attribute + Type and base constraint. + + + + + + + Determines whether the Type or other provider has the + expected attribute and if its value matches the + additional constraint specified. + + + + + Returns a string representation of the constraint. + + + + + ValueSourceAttribute indicates the source to be used to + provide data for one parameter of a test method. + + + + + Construct with the name of the factory - for use with languages + that don't support params arrays. + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name - for use with languages + that don't support params arrays. + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + Gets an enumeration of data items for use as arguments + for a test method parameter. + + The parameter for which data is needed + + An enumeration containing individual data items + + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + Summary description for SetCultureAttribute. + + + + + Construct given the name of a culture + + + + + + RandomAttribute is used to supply a set of random _values + to a single parameter of a parameterized test. + + + + + Construct a random set of values appropriate for the Type of the + parameter on which the attribute appears, specifying only the count. + + + + + + Construct a set of ints within a specified range + + + + + Construct a set of unsigned ints within a specified range + + + + + Construct a set of longs within a specified range + + + + + Construct a set of unsigned longs within a specified range + + + + + Construct a set of shorts within a specified range + + + + + Construct a set of unsigned shorts within a specified range + + + + + Construct a set of doubles within a specified range + + + + + Construct a set of floats within a specified range + + + + + Construct a set of bytes within a specified range + + + + + Construct a set of sbytes within a specified range + + + + + Get the collection of _values to be used as arguments. + + + + + Delegate used by tests that execute code and + capture any thrown exception. + + + + + TNode represents a single node in the XML representation + of a Test or TestResult. It replaces System.Xml.XmlNode and + System.Xml.Linq.XElement, providing a minimal set of methods + for operating on the XML in a platform-independent manner. + + + + + Constructs a new instance of TNode + + The name of the node + + + + Constructs a new instance of TNode with a value + + The name of the node + The text content of the node + + + + Constructs a new instance of TNode with a value + + The name of the node + The text content of the node + Flag indicating whether to use CDATA when writing the text + + + + Create a TNode from it's XML text representation + + The XML text to be parsed + A TNode + + + + Adds a new element as a child of the current node and returns it. + + The element name. + The newly created child element + + + + Adds a new element with a value as a child of the current node and returns it. + + The element name + The text content of the new element + The newly created child element + + + + Adds a new element with a value as a child of the current node and returns it. + The value will be output using a CDATA section. + + The element name + The text content of the new element + The newly created child element + + + + Adds an attribute with a specified name and value to the XmlNode. + + The name of the attribute. + The value of the attribute. + + + + Finds a single descendant of this node matching an xpath + specification. The format of the specification is + limited to what is needed by NUnit and its tests. + + + + + + + Finds all descendants of this node matching an xpath + specification. The format of the specification is + limited to what is needed by NUnit and its tests. + + + + + Writes the XML representation of the node to an XmlWriter + + + + + + Gets the name of the node + + + + + Gets the value of the node + + + + + Gets a flag indicating whether the value should be output using CDATA. + + + + + Gets the dictionary of attributes + + + + + Gets a list of child nodes + + + + + Gets the first ChildNode + + + + + Gets the XML representation of this node. + + + + + Class used to represent a list of XmlResults + + + + + Class used to represent the attributes of a node + + + + + Gets or sets the value associated with the specified key. + Overridden to return null if attribute is not found. + + The key. + Value of the attribute or null + + + + The ITestAssemblyRunner interface is implemented by classes + that are able to execute a suite of tests loaded + from an assembly. + + + + + Loads the tests found in an Assembly, returning an + indication of whether or not the load succeeded. + + File name of the assembly to load + Dictionary of options to use in loading the test + An ITest representing the loaded tests + + + + Loads the tests found in an Assembly, returning an + indication of whether or not the load succeeded. + + The assembly to load + Dictionary of options to use in loading the test + An ITest representing the loaded tests + + + + Count Test Cases using a filter + + The filter to apply + The number of test cases found + + + + Run selected tests and return a test result. The test is run synchronously, + and the listener interface is notified as it progresses. + + Interface to receive ITestListener notifications. + A test filter used to select tests to be run + + + + Run selected tests asynchronously, notifying the listener interface as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + + + + Wait for the ongoing run to complete. + + Time to wait in milliseconds + True if the run completed, otherwise false + + + + Signal any test run that is in process to stop. Return without error if no test is running. + + If true, kill any test-running threads + + + + Gets the tree of loaded tests, or null if + no tests have been loaded. + + + + + Gets the tree of test results, if the test + run is completed, otherwise null. + + + + + Indicates whether a test has been loaded + + + + + Indicates whether a test is currently running + + + + + Indicates whether a test run is complete + + + + + Modes in which the tolerance value for a comparison can be interpreted. + + + + + The tolerance was created with a value, without specifying + how the value would be used. This is used to prevent setting + the mode more than once and is generally changed to Linear + upon execution of the test. + + + + + The tolerance is used as a numeric range within which + two compared _values are considered to be equal. + + + + + Interprets the tolerance as the percentage by which + the two compared _values my deviate from each other. + + + + + Compares two _values based in their distance in + representable numbers. + + + + + ResolvableConstraintExpression is used to represent a compound + constraint being constructed at a point where the last operator + may either terminate the expression or may have additional + qualifying constraints added to it. + + It is used, for example, for a Property element or for + an Exception element, either of which may be optionally + followed by constraints that apply to the property or + exception. + + + + + Create a new instance of ResolvableConstraintExpression + + + + + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. + + + + + Resolve the current expression to a Constraint + + + + + Appends an And Operator to the expression + + + + + Appends an Or operator to the expression. + + + + + Negates the test of the constraint it wraps. + + + + + Constructs a new NotOperator + + + + + Returns a NotConstraint applied to its argument. + + + + + SetUpFixtureAttribute is used to identify a SetUpFixture + + + + + Build a SetUpFixture from type provided. Normally called for a Type + on which the attribute has been placed. + + The type info of the fixture to be used. + A SetUpFixture object as a TestSuite. + + + + Marks a test that must run in the MTA, causing it + to run in a separate thread if necessary. + + On methods, you may also use MTAThreadAttribute + to serve the same purpose. + + + + + Construct a RequiresMTAAttribute + + + + + The ResultState class represents the outcome of running a test. + It contains two pieces of information. The Status of the test + is an enum indicating whether the test passed, failed, was + skipped or was inconclusive. The Label provides a more + detailed breakdown for use by client runners. + + + + + Initializes a new instance of the class. + + The TestStatus. + + + + Initializes a new instance of the class. + + The TestStatus. + The label. + + + + Initializes a new instance of the class. + + The TestStatus. + The stage at which the result was produced + + + + Initializes a new instance of the class. + + The TestStatus. + The label. + The stage at which the result was produced + + + + The result is inconclusive + + + + + The test has been skipped. + + + + + The test has been ignored. + + + + + The test was skipped because it is explicit + + + + + The test succeeded + + + + + The test failed + + + + + The test encountered an unexpected exception + + + + + The test was cancelled by the user + + + + + The test was not runnable. + + + + + A suite failed because one or more child tests failed or had errors + + + + + A suite failed in its OneTimeSetUp + + + + + A suite had an unexpected exception in its OneTimeSetUp + + + + + A suite had an unexpected exception in its OneTimeDown + + + + + Get a new ResultState, which is the same as the current + one but with the FailureSite set to the specified value. + + The FailureSite to use + A new ResultState + + + + Determines whether the specified , is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets the TestStatus for the test. + + The status. + + + + Gets the label under which this test result is + categorized, if any. + + + + + Gets the stage of test execution in which + the failure or other result took place. + + + + + The FailureSite enum indicates the stage of a test + in which an error or failure occurred. + + + + + Failure in the test itself + + + + + Failure in the SetUp method + + + + + Failure in the TearDown method + + + + + Failure of a parent test + + + + + Failure of a child test + + + + + The TestFixtureData class represents a set of arguments + and other parameter info to be used for a parameterized + fixture. It is derived from TestFixtureParameters and adds a + fluent syntax for use in initializing the fixture. + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Marks the test fixture as explicit. + + + + + Marks the test fixture as explicit, specifying the reason. + + + + + Ignores this TestFixture, specifying the reason. + + The reason. + + + + + Represents a thread-safe first-in, first-out collection of objects. + + Specifies the type of elements in the queue. + + All public and protected members of are thread-safe and may be used + concurrently from multiple threads. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class that contains elements copied from the specified collection + + The collection whose elements are copied to the new . + The argument is + null. + + + + Adds an object to the end of the . + + The object to add to the end of the . The value can be a null reference + (Nothing in Visual Basic) for reference types. + + + + + Attempts to add an object to the . + + The object to add to the . The value can be a null + reference (Nothing in Visual Basic) for reference types. + + true if the object was added successfully; otherwise, false. + For , this operation will always add the object to the + end of the + and return true. + + + + Attempts to remove and return the object at the beginning of the . + + + When this method returns, if the operation was successful, contains the + object removed. If no object was available to be removed, the value is unspecified. + + true if an element was removed and returned from the beginning of the + successfully; otherwise, false. + + + + Attempts to return an object from the beginning of the + without removing it. + + When this method returns, contains an object from + the beginning of the or an + unspecified value if the operation failed. + true if and object was returned successfully; otherwise, false. + + + + Returns an enumerator that iterates through a collection. + + An that can be used to iterate through the collection. + + + + Returns an enumerator that iterates through the . + + An enumerator for the contents of the . + + The enumeration represents a moment-in-time snapshot of the contents + of the queue. It does not reflect any updates to the collection after + was called. The enumerator is safe to use + concurrently with reads from and writes to the queue. + + + + + Copies the elements of the to an , starting at a particular + index. + + The one-dimensional Array that is the + destination of the elements copied from the + . The Array must have zero-based indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + + is multidimensional. -or- + does not have zero-based indexing. -or- + is equal to or greater than the length of the + -or- The number of elements in the source is + greater than the available space from to the end of the destination + . -or- The type of the source cannot be cast automatically to the type of the + destination . + + + + + Copies the elements to an existing one-dimensional Array, starting at the specified array index. + + The one-dimensional Array that is the + destination of the elements copied from the + . The Array must have zero-based + indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + is equal to or greater than the + length of the + -or- The number of elements in the source is greater than the + available space from to the end of the destination . + + + + + Copies the elements stored in the to a new array. + + A new array containing a snapshot of elements copied from the . + + + + Attempts to remove and return an object from the . + + + When this method returns, if the operation was successful, contains the + object removed. If no object was available to be removed, the value is unspecified. + + true if an element was removed and returned successfully; otherwise, false. + For , this operation will attempt to remove the object + from the beginning of the . + + + + + Gets a value indicating whether access to the is + synchronized with the SyncRoot. + + true if access to the is synchronized + with the SyncRoot; otherwise, false. For , this property always + returns false. + + + + Gets an object that can be used to synchronize access to the . This property is not supported. + + The SyncRoot property is not supported. + + + + Gets the number of elements contained in the . + + The number of elements contained in the . + + For determining whether the collection contains any items, use of the + property is recommended rather than retrieving the number of items from the + property and comparing it to 0. + + + + + Gets a value that indicates whether the is empty. + + true if the is empty; otherwise, false. + + For determining whether the collection contains any items, use of this property is recommended + rather than retrieving the number of items from the property and comparing it + to 0. However, as this collection is intended to be accessed concurrently, it may be the case + that another thread will modify the collection after returns, thus invalidating + the result. + + + + + Implementation of ITestAssemblyRunner + + + + + Initializes a new instance of the class. + + The builder. + + + + Loads the tests found in an Assembly + + File name of the assembly to load + Dictionary of option settings for loading the assembly + True if the load was successful + + + + Loads the tests found in an Assembly + + The assembly to load + Dictionary of option settings for loading the assembly + True if the load was successful + + + + Count Test Cases using a filter + + The filter to apply + The number of test cases found + + + + Run selected tests and return a test result. The test is run synchronously, + and the listener interface is notified as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + + + + + Run selected tests asynchronously, notifying the listener interface as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + + RunAsync is a template method, calling various abstract and + virtual methods to be overridden by derived classes. + + + + + Wait for the ongoing run to complete. + + Time to wait in milliseconds + True if the run completed, otherwise false + + + + Signal any test run that is in process to stop. Return without error if no test is running. + + If true, kill any tests that are currently running + + + + Initiate the test run. + + + + + Create the initial TestExecutionContext used to run tests + + The ITestListener specified in the RunAsync call + + + + Handle the the Completed event for the top level work item + + + + + The tree of tests that was loaded by the builder + + + + + The test result, if a run has completed + + + + + Indicates whether a test is loaded + + + + + Indicates whether a test is running + + + + + Indicates whether a test run is complete + + + + + Our settings, specified when loading the assembly + + + + + The top level WorkItem created for the assembly as a whole + + + + + The TestExecutionContext for the top level WorkItem + + + + diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.xml.meta b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.xml.meta new file mode 100644 index 0000000..bed4a72 --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9c7ad350fb20c854a9112cf4156d1b6e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/package.json b/Library/PackageCache/com.unity.ext.nunit@1.0.0/package.json new file mode 100644 index 0000000..c0bc305 --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/package.json @@ -0,0 +1,16 @@ +{ + "displayName": "Custom NUnit", + "name": "com.unity.ext.nunit", + "version": "1.0.0", + "unity": "2019.1", + "description": "Custom version of the nunit package build to work with Unity. Used by the Unity Test Framework.", + "keywords": ["nunit", "unittest", "test"], + "category": "Libraries", + "repository": { + "type": "git", + "url": "git@gitlab.cds.internal.unity3d.com/upm-packages/core/com.unity.ext.nunit.git", + "revision": "c8f5044ffe6adb909f9836160b0bdaa30f2d1ec9" + }, + "dependencies": { + } +} diff --git a/Library/PackageCache/com.unity.ext.nunit@1.0.0/package.json.meta b/Library/PackageCache/com.unity.ext.nunit@1.0.0/package.json.meta new file mode 100644 index 0000000..ad88492 --- /dev/null +++ b/Library/PackageCache/com.unity.ext.nunit@1.0.0/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8143d3a8390f2c64685e3bc272bd9e90 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig b/Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig new file mode 100644 index 0000000..aca1979 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig @@ -0,0 +1,6 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md b/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md new file mode 100644 index 0000000..c93c873 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md @@ -0,0 +1,74 @@ +# Code Editor Package for Rider + +## [1.1.4] - 2019-11-21 + +fix warning - unreachable code + + +## [1.1.3] - 2019-10-17 + + - Update External Editor, when new toolbox build was installed + - Add xaml to default list of extensions to include in csproj + - Avoid initializing Rider package in secondary Unity process, which does Asset processing + - Reflect multiple csc.rsp arguments to generated csproj files: https://github.com/JetBrains/resharper-unity/issues/1337 + - Setting, which allowed to override LangVersion removed in favor of langversion in csc.rsp + - Environment.NewLine is used in generated project files instead of Windows line separator. + +## [1.1.2] - 2019-09-18 + +performance optimizations: + - avoid multiple evaluations + - avoid reflection in DisableSyncSolutionOnceCallBack + - project generation optimization +fixes: + - avoid compilation error with incompatible `Test Framework` package + +## [1.1.1] - 2019-08-26 + +parse nowarn in csc.rsp +warning, when Unity was started from Rider, but external editor was different +improved unit test support +workaround to avoid Unity internal project-generation (fix #28) + + +## [1.1.0] - 2019-07-02 + +new setting to manage list of extensions to be opened with Rider +avoid breaking everything on any unhandled exception in RiderScriptEditor cctor +hide Rider settings, when different Editor is selected +dynamically load only newer rider plugins +path detection (work on unix symlinks) +speed up for project generation +lots of bug fixing + +## [1.0.8] - 2019-05-20 + +Fix NullReferenceException when External editor was pointing to non-existing Rider everything was broken by null-ref. + +## [1.0.7] - 2019-05-16 + +Initial migration steps from rider plugin to package. +Fix OSX check and opening of files. + +## [1.0.6] - 2019-04-30 + +Ensure asset database is refreshed when generating csproj and solution files. + +## [1.0.5] - 2019-04-27 + +Add support for generating all csproj files. + +## [1.0.4] - 2019-04-18 + +Fix relative package paths. +Fix opening editor on mac. + +## [1.0.3] - 2019-04-12 + +Fixing null reference issue for callbacks to Asset pipeline. + +## [1.0.2] - 2019-01-01 + +### This is the first release of *Unity Package rider_editor*. + +Using the newly created api to integrate Rider with Unity. diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta new file mode 100644 index 0000000..344cac5 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8645aa9c3c74fb34ba9499e14fb332b5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md b/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md new file mode 100644 index 0000000..576d096 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md @@ -0,0 +1,6 @@ +# Contributing + +## All contributions are subject to the [Unity Contribution Agreement(UCA)](https://unity3d.com/legal/licenses/Unity_Contribution_Agreement) +By making a pull request, you are confirming agreement to the terms and conditions of the UCA, including that your Contributions are your original creation and that you have complete right and authority to make your Contributions. + +## Once you have a change ready following these ground rules. Simply make a pull request \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta new file mode 100644 index 0000000..81c20c6 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5e83f8baac96eaa47bdd9ca781cd2002 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md b/Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md new file mode 100644 index 0000000..9ddd634 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md @@ -0,0 +1,4 @@ +# Code Editor Package for Rider + +This package is not intended to be modified by users. +Nor does it provide any api intended to be included in user projects. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md b/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md new file mode 100644 index 0000000..eb18dfb --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Unity Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta new file mode 100644 index 0000000..be2f8e6 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5598b14661b5f4c43bed757f34b6d172 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta new file mode 100644 index 0000000..cf6222d --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9129183a42052cd43b9c284d6dbd541e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta new file mode 100644 index 0000000..49130a6 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1b393f6b29a9ee84c803af1ab4944b71 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs new file mode 100644 index 0000000..6c04ea3 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs @@ -0,0 +1,457 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using JetBrains.Annotations; +using Microsoft.Win32; +using Unity.CodeEditor; +using UnityEngine; + +namespace Packages.Rider.Editor +{ + public interface IDiscovery + { + CodeEditor.Installation[] PathCallback(); + } + + public class Discovery : IDiscovery + { + public CodeEditor.Installation[] PathCallback() + { + return RiderPathLocator.GetAllRiderPaths() + .Select(riderInfo => new CodeEditor.Installation + { + Path = riderInfo.Path, + Name = riderInfo.Presentation + }) + .OrderBy(a=>a.Name) + .ToArray(); + } + } + + /// + /// This code is a modified version of the JetBrains resharper-unity plugin listed here: + /// https://github.com/JetBrains/resharper-unity/blob/master/unity/JetBrains.Rider.Unity.Editor/EditorPlugin/RiderPathLocator.cs + /// + public static class RiderPathLocator + { +#if !(UNITY_4_7 || UNITY_5_5) + [UsedImplicitly] // Used in com.unity.ide.rider + public static RiderInfo[] GetAllRiderPaths() + { + try + { + switch (SystemInfo.operatingSystemFamily) + { + case OperatingSystemFamily.Windows: + { + return CollectRiderInfosWindows(); + } + + case OperatingSystemFamily.MacOSX: + { + return CollectRiderInfosMac(); + } + + case OperatingSystemFamily.Linux: + { + return CollectAllRiderPathsLinux(); + } + } + } + catch (Exception e) + { + Debug.LogException(e); + } + + return new RiderInfo[0]; + } +#endif + +#if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider + internal static RiderInfo[] GetAllFoundInfos(OperatingSystemFamilyRider operatingSystemFamily) + { + try + { + switch (operatingSystemFamily) + { + case OperatingSystemFamilyRider.Windows: + { + return CollectRiderInfosWindows(); + } + case OperatingSystemFamilyRider.MacOSX: + { + return CollectRiderInfosMac(); + } + case OperatingSystemFamilyRider.Linux: + { + return CollectAllRiderPathsLinux(); + } + } + } + catch (Exception e) + { + Debug.LogException(e); + } + + return new RiderInfo[0]; + } + + internal static string[] GetAllFoundPaths(OperatingSystemFamilyRider operatingSystemFamily) + { + return GetAllFoundInfos(operatingSystemFamily).Select(a=>a.Path).ToArray(); + } +#endif + + private static RiderInfo[] CollectAllRiderPathsLinux() + { + var installInfos = new List(); + var home = Environment.GetEnvironmentVariable("HOME"); + if (!string.IsNullOrEmpty(home)) + { + var toolboxRiderRootPath = GetToolboxBaseDir(); + installInfos.AddRange(CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider.sh", false) + .Select(a => new RiderInfo(a, true)).ToList()); + + //$Home/.local/share/applications/jetbrains-rider.desktop + var shortcut = new FileInfo(Path.Combine(home, @".local/share/applications/jetbrains-rider.desktop")); + + if (shortcut.Exists) + { + var lines = File.ReadAllLines(shortcut.FullName); + foreach (var line in lines) + { + if (!line.StartsWith("Exec=\"")) + continue; + var path = line.Split('"').Where((item, index) => index == 1).SingleOrDefault(); + if (string.IsNullOrEmpty(path)) + continue; + + if (installInfos.Any(a => a.Path == path)) // avoid adding similar build as from toolbox + continue; + installInfos.Add(new RiderInfo(path, false)); + } + } + } + + // snap install + var snapInstallPath = "/snap/rider/current/bin/rider.sh"; + if (new FileInfo(snapInstallPath).Exists) + installInfos.Add(new RiderInfo(snapInstallPath, false)); + + return installInfos.ToArray(); + } + + private static RiderInfo[] CollectRiderInfosMac() + { + var installInfos = new List(); + // "/Applications/*Rider*.app" + var folder = new DirectoryInfo("/Applications"); + if (folder.Exists) + { + installInfos.AddRange(folder.GetDirectories("*Rider*.app") + .Select(a => new RiderInfo(a.FullName, false)) + .ToList()); + } + + // /Users/user/Library/Application Support/JetBrains/Toolbox/apps/Rider/ch-1/181.3870.267/Rider EAP.app + var toolboxRiderRootPath = GetToolboxBaseDir(); + var paths = CollectPathsFromToolbox(toolboxRiderRootPath, "", "Rider*.app", true) + .Select(a => new RiderInfo(a, true)); + installInfos.AddRange(paths); + + return installInfos.ToArray(); + } + + private static RiderInfo[] CollectRiderInfosWindows() + { + var installInfos = new List(); + var toolboxRiderRootPath = GetToolboxBaseDir(); + var installPathsToolbox = CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider64.exe", false).ToList(); + installInfos.AddRange(installPathsToolbox.Select(a => new RiderInfo(a, true)).ToList()); + + var installPaths = new List(); + const string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; + CollectPathsFromRegistry(registryKey, installPaths); + const string wowRegistryKey = @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"; + CollectPathsFromRegistry(wowRegistryKey, installPaths); + + installInfos.AddRange(installPaths.Select(a => new RiderInfo(a, false)).ToList()); + + return installInfos.ToArray(); + } + + private static string GetToolboxBaseDir() + { + switch (SystemInfo.operatingSystemFamily) + { + case OperatingSystemFamily.Windows: + { + var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + return Path.Combine(localAppData, @"JetBrains\Toolbox\apps\Rider"); + } + + case OperatingSystemFamily.MacOSX: + { + var home = Environment.GetEnvironmentVariable("HOME"); + if (!string.IsNullOrEmpty(home)) + { + return Path.Combine(home, @"Library/Application Support/JetBrains/Toolbox/apps/Rider"); + } + break; + } + + case OperatingSystemFamily.Linux: + { + var home = Environment.GetEnvironmentVariable("HOME"); + if (!string.IsNullOrEmpty(home)) + { + return Path.Combine(home, @".local/share/JetBrains/Toolbox/apps/Rider"); + } + break; + } + } + return string.Empty; + } + + internal static string GetBuildNumber(string path) + { + var file = new FileInfo(Path.Combine(path, GetRelativePathToBuildTxt())); + if (!file.Exists) + return string.Empty; + var text = File.ReadAllText(file.FullName); + if (text.Length > 3) + return text.Substring(3); + return string.Empty; + } + + internal static bool IsToolbox(string path) + { + return path.StartsWith(GetToolboxBaseDir()); + } + + private static string GetRelativePathToBuildTxt() + { + switch (SystemInfo.operatingSystemFamily) + { + case OperatingSystemFamily.Windows: + case OperatingSystemFamily.Linux: + return "../../build.txt"; + case OperatingSystemFamily.MacOSX: + return "Contents/Resources/build.txt"; + } + throw new Exception("Unknown OS"); + } + + private static void CollectPathsFromRegistry(string registryKey, List installPaths) + { + using (var key = Registry.LocalMachine.OpenSubKey(registryKey)) + { + if (key == null) return; + foreach (var subkeyName in key.GetSubKeyNames().Where(a => a.Contains("Rider"))) + { + using (var subkey = key.OpenSubKey(subkeyName)) + { + var folderObject = subkey?.GetValue("InstallLocation"); + if (folderObject == null) continue; + var folder = folderObject.ToString(); + var possiblePath = Path.Combine(folder, @"bin\rider64.exe"); + if (File.Exists(possiblePath)) + installPaths.Add(possiblePath); + } + } + } + } + + private static string[] CollectPathsFromToolbox(string toolboxRiderRootPath, string dirName, string searchPattern, + bool isMac) + { + if (!Directory.Exists(toolboxRiderRootPath)) + return new string[0]; + + var channelDirs = Directory.GetDirectories(toolboxRiderRootPath); + var paths = channelDirs.SelectMany(channelDir => + { + try + { + // use history.json - last entry stands for the active build https://jetbrains.slack.com/archives/C07KNP99D/p1547807024066500?thread_ts=1547731708.057700&cid=C07KNP99D + var historyFile = Path.Combine(channelDir, ".history.json"); + if (File.Exists(historyFile)) + { + var json = File.ReadAllText(historyFile); + var build = ToolboxHistory.GetLatestBuildFromJson(json); + if (build != null) + { + var buildDir = Path.Combine(channelDir, build); + var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir); + if (executablePaths.Any()) + return executablePaths; + } + } + + var channelFile = Path.Combine(channelDir, ".channel.settings.json"); + if (File.Exists(channelFile)) + { + var json = File.ReadAllText(channelFile).Replace("active-application", "active_application"); + var build = ToolboxInstallData.GetLatestBuildFromJson(json); + if (build != null) + { + var buildDir = Path.Combine(channelDir, build); + var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir); + if (executablePaths.Any()) + return executablePaths; + } + } + + // changes in toolbox json files format may brake the logic above, so return all found Rider installations + return Directory.GetDirectories(channelDir) + .SelectMany(buildDir => GetExecutablePaths(dirName, searchPattern, isMac, buildDir)); + } + catch (Exception e) + { + // do not write to Debug.Log, just log it. + Logger.Warn($"Failed to get RiderPath from {channelDir}", e); + } + + return new string[0]; + }) + .Where(c => !string.IsNullOrEmpty(c)) + .ToArray(); + return paths; + } + + private static string[] GetExecutablePaths(string dirName, string searchPattern, bool isMac, string buildDir) + { + var folder = new DirectoryInfo(Path.Combine(buildDir, dirName)); + if (!folder.Exists) + return new string[0]; + + if (!isMac) + return new[] {Path.Combine(folder.FullName, searchPattern)}.Where(File.Exists).ToArray(); + return folder.GetDirectories(searchPattern).Select(f => f.FullName) + .Where(Directory.Exists).ToArray(); + } + + // Disable the "field is never assigned" compiler warning. We never assign it, but Unity does. + // Note that Unity disable this warning in the generated C# projects +#pragma warning disable 0649 + + [Serializable] + class ToolboxHistory + { + public List history; + + [CanBeNull] + public static string GetLatestBuildFromJson(string json) + { + try + { +#if UNITY_4_7 || UNITY_5_5 + return JsonConvert.DeserializeObject(json).history.LastOrDefault()?.item.build; +#else + return JsonUtility.FromJson(json).history.LastOrDefault()?.item.build; +#endif + } + catch (Exception) + { + Logger.Warn($"Failed to get latest build from json {json}"); + } + + return null; + } + } + + [Serializable] + class ItemNode + { + public BuildNode item; + } + + [Serializable] + class BuildNode + { + public string build; + } + + // ReSharper disable once ClassNeverInstantiated.Global + [Serializable] + class ToolboxInstallData + { + // ReSharper disable once InconsistentNaming + public ActiveApplication active_application; + + [CanBeNull] + public static string GetLatestBuildFromJson(string json) + { + try + { +#if UNITY_4_7 || UNITY_5_5 + var toolbox = JsonConvert.DeserializeObject(json); +#else + var toolbox = JsonUtility.FromJson(json); +#endif + var builds = toolbox.active_application.builds; + if (builds != null && builds.Any()) + return builds.First(); + } + catch (Exception) + { + Logger.Warn($"Failed to get latest build from json {json}"); + } + + return null; + } + } + + [Serializable] + class ActiveApplication + { + // ReSharper disable once InconsistentNaming + public List builds; + } + +#pragma warning restore 0649 + + public struct RiderInfo + { + public bool IsToolbox; + public string Presentation; + public string BuildVersion; + public string Path; + + public RiderInfo(string path, bool isToolbox) + { + if (path == RiderScriptEditor.CurrentEditor) + { + RiderScriptEditorData.instance.Init(); + BuildVersion = RiderScriptEditorData.instance.currentEditorVersion; + } + else + BuildVersion = GetBuildNumber(path); + Path = new FileInfo(path).FullName; // normalize separators + var presentation = "Rider " + BuildVersion; + if (isToolbox) + presentation += " (JetBrains Toolbox)"; + + Presentation = presentation; + IsToolbox = isToolbox; + } + } + + private static class Logger + { + internal static void Warn(string message, Exception e = null) + { +#if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider + Log.GetLog(typeof(RiderPathLocator).Name).Warn(message); + if (e != null) + Log.GetLog(typeof(RiderPathLocator).Name).Warn(e); +#else + Debug.LogError(message); + if (e != null) + Debug.LogException(e); +#endif + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta new file mode 100644 index 0000000..ea4ef85 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dab656c79e1985c40b31faebcda44442 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs new file mode 100644 index 0000000..91e9624 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs @@ -0,0 +1,136 @@ +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using Debug = UnityEngine.Debug; + +namespace Packages.Rider.Editor +{ + public static class EditorPluginInterop + { + private static string ourEntryPointTypeName = "JetBrains.Rider.Unity.Editor.PluginEntryPoint"; + + private static Assembly ourEditorPluginAssembly; + + public static Assembly EditorPluginAssembly + { + get + { + if (ourEditorPluginAssembly != null) + return ourEditorPluginAssembly; + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + ourEditorPluginAssembly = assemblies.FirstOrDefault(a => a.GetName().Name.Equals("JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked")); + return ourEditorPluginAssembly; + } + } + + + private static void DisableSyncSolutionOnceCallBack() + { + // RiderScriptableSingleton.Instance.CsprojProcessedOnce = true; + // Otherwise EditorPlugin regenerates all on every AppDomain reload + var assembly = EditorPluginAssembly; + if (assembly == null) return; + var type = assembly.GetType("JetBrains.Rider.Unity.Editor.Utils.RiderScriptableSingleton"); + if (type == null) return; + var baseType = type.BaseType; + if (baseType == null) return; + var instance = baseType.GetProperty("Instance"); + if (instance == null) return; + var instanceVal = instance.GetValue(null); + var member = type.GetProperty("CsprojProcessedOnce"); + if (member==null) return; + member.SetValue(instanceVal, true); + } + + public static string LogPath + { + get + { + try + { + var assembly = EditorPluginAssembly; + if (assembly == null) return null; + var type = assembly.GetType(ourEntryPointTypeName); + if (type == null) return null; + var field = type.GetField("LogPath", BindingFlags.NonPublic | BindingFlags.Static); + if (field == null) return null; + return field.GetValue(null) as string; + } + catch (Exception) + { + Debug.Log("Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation."); + } + + return null; + } + } + + public static bool OpenFileDllImplementation(string path, int line, int column) + { + var openResult = false; + // reflection for fast OpenFileLineCol, when Rider is started and protocol connection is established + try + { + var assembly = EditorPluginAssembly; + if (assembly == null) return false; + var type = assembly.GetType(ourEntryPointTypeName); + if (type == null) return false; + var field = type.GetField("OpenAssetHandler", BindingFlags.NonPublic | BindingFlags.Static); + if (field == null) return false; + var handlerInstance = field.GetValue(null); + var method = handlerInstance.GetType() + .GetMethod("OnOpenedAsset", new[] {typeof(string), typeof(int), typeof(int)}); + if (method == null) return false; + var assetFilePath = path; + if (!string.IsNullOrEmpty(path)) + assetFilePath = Path.GetFullPath(path); + + openResult = (bool) method.Invoke(handlerInstance, new object[] {assetFilePath, line, column}); + } + catch (Exception e) + { + Debug.Log("Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation."); + Debug.LogException(e); + } + + return openResult; + } + + public static bool EditorPluginIsLoadedFromAssets(Assembly assembly) + { + if (assembly == null) + return false; + var location = assembly.Location; + var currentDir = Directory.GetCurrentDirectory(); + return location.StartsWith(currentDir, StringComparison.InvariantCultureIgnoreCase); + } + + + internal static void InitEntryPoint(Assembly assembly) + { + try + { + if (Version.TryParse(RiderScriptEditorData.instance.currentEditorVersion, out var version)) + { + if (version.Major < 192) + DisableSyncSolutionOnceCallBack(); // is require for Rider prior to 2019.2 + } + else + DisableSyncSolutionOnceCallBack(); + + var type = assembly.GetType("JetBrains.Rider.Unity.Editor.AfterUnity56.EntryPoint"); + if (type == null) + type = assembly.GetType("JetBrains.Rider.Unity.Editor.UnitTesting.EntryPoint"); // oldRider + RuntimeHelpers.RunClassConstructor(type.TypeHandle); + } + catch (TypeInitializationException ex) + { + Debug.LogException(ex); + if (ex.InnerException != null) + Debug.LogException(ex.InnerException); + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta new file mode 100644 index 0000000..fda18d3 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f9bd02a3a916be64c9b47b1305149423 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs new file mode 100644 index 0000000..19ef8ab --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs @@ -0,0 +1,22 @@ +namespace Packages.Rider.Editor +{ + public enum LoggingLevel + { + /// + /// Do not use it in logging. Only in config to disable logging. + /// + OFF, + /// For errors that lead to application failure + FATAL, + /// For errors that must be shown in Exception Browser + ERROR, + /// Suspicious situations but not errors + WARN, + /// Regular level for important events + INFO, + /// Additional info for debbuging + VERBOSE, + /// Methods & callstacks tracing, more than verbose + TRACE, + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta new file mode 100644 index 0000000..c0494f3 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 71bb46b59a9a7a346bbab1e185c723df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs new file mode 100644 index 0000000..bda3fcb --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs @@ -0,0 +1,128 @@ +using Unity.CodeEditor; +using UnityEditor; +using UnityEngine; + +namespace Packages.Rider.Editor +{ + public class PluginSettings + { + public static LoggingLevel SelectedLoggingLevel + { + get => (LoggingLevel) EditorPrefs.GetInt("Rider_SelectedLoggingLevel", 0); + set + { + EditorPrefs.SetInt("Rider_SelectedLoggingLevel", (int) value); + } + } + + public static bool LogEventsCollectorEnabled + { + get { return EditorPrefs.GetBool("Rider_LogEventsCollectorEnabled", true); } + private set { EditorPrefs.SetBool("Rider_LogEventsCollectorEnabled", value); } + } + + + private static GUIStyle ourVersionInfoStyle = new GUIStyle() + { + normal = new GUIStyleState() + { + textColor = new Color(0, 0, 0, .6f), + }, + margin = new RectOffset(4, 4, 4, 4), + }; + + /// + /// Preferences menu layout + /// + /// + /// Contains all 3 toggles: Enable/Disable; Debug On/Off; Writing Launch File On/Off + /// + [SettingsProvider] + private static SettingsProvider RiderPreferencesItem() + { + if (!RiderScriptEditor.IsRiderInstallation(RiderScriptEditor.CurrentEditor)) + return null; + if (!RiderScriptEditorData.instance.shouldLoadEditorPlugin) + return null; + var provider = new SettingsProvider("Preferences/Rider", SettingsScope.User) + { + label = "Rider", + keywords = new[] { "Rider" }, + guiHandler = (searchContext) => + { + EditorGUIUtility.labelWidth = 200f; + EditorGUILayout.BeginVertical(); + + GUILayout.BeginVertical(); + LogEventsCollectorEnabled = + EditorGUILayout.Toggle(new GUIContent("Pass Console to Rider:"), LogEventsCollectorEnabled); + + GUILayout.EndVertical(); + GUILayout.Label(""); + + if (!string.IsNullOrEmpty(EditorPluginInterop.LogPath)) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel("Log file:"); + var previous = GUI.enabled; + GUI.enabled = previous && SelectedLoggingLevel != LoggingLevel.OFF; + var button = GUILayout.Button(new GUIContent("Open log")); + if (button) + { + //UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(PluginEntryPoint.LogPath, 0); + // works much faster than the commented code, when Rider is already started + CodeEditor.CurrentEditor.OpenProject(EditorPluginInterop.LogPath, 0, 0); + } + + GUI.enabled = previous; + GUILayout.EndHorizontal(); + } + + var loggingMsg = + @"Sets the amount of Rider Debug output. If you are about to report an issue, please select Verbose logging level and attach Unity console output to the issue."; + SelectedLoggingLevel = + (LoggingLevel) EditorGUILayout.EnumPopup(new GUIContent("Logging Level:", loggingMsg), + SelectedLoggingLevel); + + + EditorGUILayout.HelpBox(loggingMsg, MessageType.None); + + var githubRepo = "https://github.com/JetBrains/resharper-unity"; + var caption = $"{githubRepo}"; + LinkButton(caption: caption, url: githubRepo); + + GUILayout.FlexibleSpace(); + GUILayout.BeginHorizontal(); + + GUILayout.FlexibleSpace(); + var assembly = EditorPluginInterop.EditorPluginAssembly; + if (assembly != null) + { + var version = assembly.GetName().Version; + GUILayout.Label("Plugin version: " + version, ourVersionInfoStyle); + } + + GUILayout.EndHorizontal(); + + EditorGUILayout.EndVertical(); + } + }; + return provider; + } + + private static void LinkButton(string caption, string url) + { + var style = GUI.skin.label; + style.richText = true; + + var bClicked = GUILayout.Button(caption, style); + + var rect = GUILayoutUtility.GetLastRect(); + rect.width = style.CalcSize(new GUIContent(caption)).x; + EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link); + + if (bClicked) + Application.OpenURL(url); + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta new file mode 100644 index 0000000..279a4cc --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1bfe12aa306c0c74db4f4f1a1a0ae5ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta new file mode 100644 index 0000000..40cdc60 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aa290bd9a165a0543a4bf85ac73914bc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs new file mode 100644 index 0000000..230633f --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs @@ -0,0 +1,16 @@ +using Unity.CodeEditor; +using UnityEditor; + +namespace Packages.Rider.Editor.PostProcessors +{ + public class RiderAssetPostprocessor: AssetPostprocessor + { + public static bool OnPreGeneratingCSProjectFiles() + { + var path = RiderScriptEditor.GetEditorRealPath(CodeEditor.CurrentEditorInstallation); + if (RiderScriptEditor.IsRiderInstallation(path)) + return !ProjectGeneration.isRiderProjectGeneration; + return false; + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta new file mode 100644 index 0000000..68658cc --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 45471ad7b8c1f964da5e3c07d57fbf4f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta new file mode 100644 index 0000000..37615b9 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 313cbe17019f1934397f91069831062c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs new file mode 100644 index 0000000..6ea51dc --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using System.Text; + +namespace Packages.Rider.Editor { + class FileIOProvider : IFileIO + { + public bool Exists(string fileName) + { + return File.Exists(fileName); + } + + public string ReadAllText(string fileName) + { + return File.ReadAllText(fileName); + } + + public void WriteAllText(string fileName, string content) + { + File.WriteAllText(fileName, content, Encoding.UTF8); + } + } +} diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta new file mode 100644 index 0000000..2763839 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a6ba838b1348d5e46a7eaacd1646c1d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs new file mode 100644 index 0000000..476766e --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs @@ -0,0 +1,16 @@ +using System; + +namespace Packages.Rider.Editor { + class GUIDProvider : IGUIDGenerator + { + public string ProjectGuid(string projectName, string assemblyName) + { + return SolutionGuidGenerator.GuidForProject(projectName + assemblyName); + } + + public string SolutionGuid(string projectName, string extension) + { + return SolutionGuidGenerator.GuidForSolution(projectName, extension); // GetExtensionOfSourceFiles(assembly.sourceFiles) + } + } +} diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta new file mode 100644 index 0000000..7b331f2 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8cfde1a59fb35574189691a9de1df93b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs new file mode 100644 index 0000000..d0a2664 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs @@ -0,0 +1,1090 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security; +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; +using Packages.Rider.Editor.Util; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEditor.PackageManager; +using UnityEditorInternal; +using UnityEngine; + +namespace Packages.Rider.Editor +{ + public interface IGenerator + { + bool SyncIfNeeded(IEnumerable affectedFiles, IEnumerable reimportedFiles); + void Sync(); + bool HasSolutionBeenGenerated(); + string SolutionFile(); + string ProjectDirectory { get; } + void GenerateAll(bool generateAll); + } + + public interface IFileIO + { + bool Exists(string fileName); + + string ReadAllText(string fileName); + void WriteAllText(string fileName, string content); + } + + public interface IGUIDGenerator + { + string ProjectGuid(string projectName, string assemblyName); + string SolutionGuid(string projectName, string extension); + } + + public interface IAssemblyNameProvider + { + string GetAssemblyNameFromScriptPath(string path); + IEnumerable GetAssemblies(Func shouldFileBePartOfSolution); + IEnumerable GetAllAssetPaths(); + UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath); + ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories); + } + + class AssemblyNameProvider : IAssemblyNameProvider + { + public string GetAssemblyNameFromScriptPath(string path) + { + return CompilationPipeline.GetAssemblyNameFromScriptPath(path); + } + + public IEnumerable GetAssemblies(Func shouldFileBePartOfSolution) + { + return CompilationPipeline.GetAssemblies() + .Where(i => 0 < i.sourceFiles.Length && i.sourceFiles.Any(shouldFileBePartOfSolution)); + } + + public IEnumerable GetAllAssetPaths() + { + return AssetDatabase.GetAllAssetPaths(); + } + + public UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath) + { + return UnityEditor.PackageManager.PackageInfo.FindForAssetPath(assetPath); + } + + public ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories) + { + return CompilationPipeline.ParseResponseFile( + responseFilePath, + projectDirectory, + systemReferenceDirectories + ); + } + } + + public class ProjectGeneration : IGenerator + { + enum ScriptingLanguage + { + None, + CSharp + } + + public static readonly string MSBuildNamespaceUri = "http://schemas.microsoft.com/developer/msbuild/2003"; + + /// + /// Map source extensions to ScriptingLanguages + /// + static readonly Dictionary k_BuiltinSupportedExtensions = + new Dictionary + { + {"cs", ScriptingLanguage.CSharp}, + {"uxml", ScriptingLanguage.None}, + {"uss", ScriptingLanguage.None}, + {"shader", ScriptingLanguage.None}, + {"compute", ScriptingLanguage.None}, + {"cginc", ScriptingLanguage.None}, + {"hlsl", ScriptingLanguage.None}, + {"glslinc", ScriptingLanguage.None}, + {"template", ScriptingLanguage.None}, + {"raytrace", ScriptingLanguage.None} + }; + + string m_SolutionProjectEntryTemplate = string.Join(Environment.NewLine, + @"Project(""{{{0}}}"") = ""{1}"", ""{2}"", ""{{{3}}}""", + @"EndProject").Replace(" ", "\t"); + + string m_SolutionProjectConfigurationTemplate = string.Join(Environment.NewLine, + @" {{{0}}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU", + @" {{{0}}}.Debug|Any CPU.Build.0 = Debug|Any CPU", + @" {{{0}}}.Release|Any CPU.ActiveCfg = Release|Any CPU", + @" {{{0}}}.Release|Any CPU.Build.0 = Release|Any CPU").Replace(" ", "\t"); + + static readonly string[] k_ReimportSyncExtensions = {".dll", ".asmdef"}; + + /// + /// Map ScriptingLanguages to project extensions + /// + /*static readonly Dictionary k_ProjectExtensions = new Dictionary + { + { ScriptingLanguage.CSharp, ".csproj" }, + { ScriptingLanguage.None, ".csproj" }, + };*/ + static readonly Regex k_ScriptReferenceExpression = new Regex( + @"^Library.ScriptAssemblies.(?(?.*)\.dll$)", + RegexOptions.Compiled | RegexOptions.IgnoreCase); + + string[] m_ProjectSupportedExtensions = new string[0]; + bool m_ShouldGenerateAll; + + public string ProjectDirectory { get; } + + public void GenerateAll(bool generateAll) + { + m_ShouldGenerateAll = generateAll; + } + + readonly string m_ProjectName; + readonly IAssemblyNameProvider m_AssemblyNameProvider; + readonly IFileIO m_FileIOProvider; + readonly IGUIDGenerator m_GUIDGenerator; + internal static bool isRiderProjectGeneration; // workaround to https://github.cds.internal.unity3d.com/unity/com.unity.ide.rider/issues/28 + + const string k_ToolsVersion = "4.0"; + const string k_ProductVersion = "10.0.20506"; + const string k_BaseDirectory = "."; + const string k_TargetFrameworkVersion = "v4.7.1"; + const string k_TargetLanguageVersion = "latest"; + + static readonly Regex scriptReferenceExpression = new Regex( + @"^Library.ScriptAssemblies.(?(?.*)\.dll$)", + RegexOptions.Compiled | RegexOptions.IgnoreCase); + + public ProjectGeneration() : this(Directory.GetParent(Application.dataPath).FullName) + { + } + + public ProjectGeneration(string tempDirectory) : this(tempDirectory, new AssemblyNameProvider(), new FileIOProvider(), new GUIDProvider()) + { + } + + public ProjectGeneration(string tempDirectory, IAssemblyNameProvider assemblyNameProvider, IFileIO fileIoProvider, IGUIDGenerator guidGenerator) + { + ProjectDirectory = tempDirectory.Replace('\\', '/'); + m_ProjectName = Path.GetFileName(ProjectDirectory); + m_AssemblyNameProvider = assemblyNameProvider; + m_FileIOProvider = fileIoProvider; + m_GUIDGenerator = guidGenerator; + } + + /// + /// Syncs the scripting solution if any affected files are relevant. + /// + /// + /// Whether the solution was synced. + /// + /// + /// A set of files whose status has changed + /// + /// + /// A set of files that got reimported + /// + public bool SyncIfNeeded(IEnumerable affectedFiles, IEnumerable reimportedFiles) + { + SetupProjectSupportedExtensions(); + + if (HasFilesBeenModified(affectedFiles, reimportedFiles)) + { + Sync(); + return true; + } + + return false; + } + + bool HasFilesBeenModified(IEnumerable affectedFiles, IEnumerable reimportedFiles) + { + return affectedFiles.Any(ShouldFileBePartOfSolution) || reimportedFiles.Any(ShouldSyncOnReimportedAsset); + } + + static bool ShouldSyncOnReimportedAsset(string asset) + { + return k_ReimportSyncExtensions.Contains(new FileInfo(asset).Extension); + } + + public void Sync() + { + SetupProjectSupportedExtensions(); + var types = GetAssetPostprocessorTypes(); + isRiderProjectGeneration = true; + bool externalCodeAlreadyGeneratedProjects = OnPreGeneratingCSProjectFiles(types); + isRiderProjectGeneration = false; + if (!externalCodeAlreadyGeneratedProjects) + { + GenerateAndWriteSolutionAndProjects(types); + } + + OnGeneratedCSProjectFiles(types); + } + + public bool HasSolutionBeenGenerated() + { + return m_FileIOProvider.Exists(SolutionFile()); + } + + void SetupProjectSupportedExtensions() + { + m_ProjectSupportedExtensions = EditorSettings.projectGenerationUserExtensions; + } + + bool ShouldFileBePartOfSolution(string file) + { + string extension = Path.GetExtension(file); + + // Exclude files coming from packages except if they are internalized. + if (!m_ShouldGenerateAll && IsInternalizedPackagePath(file)) + { + return false; + } + + // Dll's are not scripts but still need to be included.. + if (extension == ".dll") + return true; + + if (file.ToLower().EndsWith(".asmdef")) + return true; + + return IsSupportedExtension(extension); + } + + bool IsSupportedExtension(string extension) + { + extension = extension.TrimStart('.'); + if (k_BuiltinSupportedExtensions.ContainsKey(extension)) + return true; + if (m_ProjectSupportedExtensions.Contains(extension)) + return true; + return false; + } + + static ScriptingLanguage ScriptingLanguageFor(Assembly island) + { + return ScriptingLanguageFor(GetExtensionOfSourceFiles(island.sourceFiles)); + } + + static string GetExtensionOfSourceFiles(string[] files) + { + return files.Length > 0 ? GetExtensionOfSourceFile(files[0]) : "NA"; + } + + static string GetExtensionOfSourceFile(string file) + { + var ext = Path.GetExtension(file).ToLower(); + ext = ext.Substring(1); //strip dot + return ext; + } + + static ScriptingLanguage ScriptingLanguageFor(string extension) + { + return k_BuiltinSupportedExtensions.TryGetValue(extension.TrimStart('.'), out var result) + ? result + : ScriptingLanguage.None; + } + + public void GenerateAndWriteSolutionAndProjects(Type[] types) + { + // Only synchronize islands that have associated source files and ones that we actually want in the project. + // This also filters out DLLs coming from .asmdef files in packages. + var assemblies = m_AssemblyNameProvider.GetAssemblies(ShouldFileBePartOfSolution); + + var allAssetProjectParts = GenerateAllAssetProjectParts(); + + var monoIslands = assemblies.ToList(); + + SyncSolution(monoIslands, types); + var allProjectIslands = RelevantIslandsForMode(monoIslands).ToList(); + foreach (Assembly assembly in allProjectIslands) + { + var responseFileData = ParseResponseFileData(assembly); + SyncProject(assembly, allAssetProjectParts, responseFileData, allProjectIslands, types); + } + } + + IEnumerable ParseResponseFileData(Assembly assembly) + { + var systemReferenceDirectories = + CompilationPipeline.GetSystemAssemblyDirectories(assembly.compilerOptions.ApiCompatibilityLevel); + + Dictionary responseFilesData = assembly.compilerOptions.ResponseFiles.ToDictionary( + x => x, x => m_AssemblyNameProvider.ParseResponseFile( + x, + ProjectDirectory, + systemReferenceDirectories + )); + + Dictionary responseFilesWithErrors = responseFilesData.Where(x => x.Value.Errors.Any()) + .ToDictionary(x => x.Key, x => x.Value); + + if (responseFilesWithErrors.Any()) + { + foreach (var error in responseFilesWithErrors) + foreach (var valueError in error.Value.Errors) + { + Debug.LogError($"{error.Key} Parse Error : {valueError}"); + } + } + + return responseFilesData.Select(x => x.Value); + } + + Dictionary GenerateAllAssetProjectParts() + { + Dictionary stringBuilders = new Dictionary(); + + foreach (string asset in m_AssemblyNameProvider.GetAllAssetPaths()) + { + // Exclude files coming from packages except if they are internalized. + if (!m_ShouldGenerateAll && IsInternalizedPackagePath(asset)) + { + continue; + } + + string extension = Path.GetExtension(asset); + if (IsSupportedExtension(extension) && ScriptingLanguage.None == ScriptingLanguageFor(extension)) + { + // Find assembly the asset belongs to by adding script extension and using compilation pipeline. + var assemblyName = m_AssemblyNameProvider.GetAssemblyNameFromScriptPath(asset + ".cs"); + + if (string.IsNullOrEmpty(assemblyName)) + { + continue; + } + + assemblyName = FileSystemUtil.FileNameWithoutExtension(assemblyName); + + if (!stringBuilders.TryGetValue(assemblyName, out var projectBuilder)) + { + projectBuilder = new StringBuilder(); + stringBuilders[assemblyName] = projectBuilder; + } + + projectBuilder.Append(" ") + .Append(Environment.NewLine); + } + } + + var result = new Dictionary(); + + foreach (var entry in stringBuilders) + result[entry.Key] = entry.Value.ToString(); + + return result; + } + + bool IsInternalizedPackagePath(string file) + { + if (string.IsNullOrWhiteSpace(file)) + { + return false; + } + + var packageInfo = m_AssemblyNameProvider.FindForAssetPath(file); + if (packageInfo == null) + { + return false; + } + + var packageSource = packageInfo.source; + return packageSource != PackageSource.Embedded && packageSource != PackageSource.Local; + } + + void SyncProject( + Assembly island, + Dictionary allAssetsProjectParts, + IEnumerable responseFilesData, + List allProjectIslands, + Type[] types) + { + SyncProjectFileIfNotChanged(ProjectFile(island), + ProjectText(island, allAssetsProjectParts, responseFilesData.ToList(), allProjectIslands), types); + } + + void SyncProjectFileIfNotChanged(string path, string newContents, Type[] types) + { + if (Path.GetExtension(path) == ".csproj") + { + newContents = OnGeneratedCSProject(path, newContents, types); + } + + SyncFileIfNotChanged(path, newContents); + } + + void SyncSolutionFileIfNotChanged(string path, string newContents, Type[] types) + { + newContents = OnGeneratedSlnSolution(path, newContents, types); + + SyncFileIfNotChanged(path, newContents); + } + + static List SafeGetTypes(System.Reflection.Assembly a) + { + List ret; + + try + { + ret = a.GetTypes().ToList(); + } + catch (System.Reflection.ReflectionTypeLoadException rtl) + { + ret = rtl.Types.ToList(); + } + catch (Exception) + { + return new List(); + } + + return ret.Where(r => r != null).ToList(); + } + + static void OnGeneratedCSProjectFiles(Type[] types) + { + var args = new object[0]; + foreach (var type in types) + { + var method = type.GetMethod("OnGeneratedCSProjectFiles", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Static); + if (method == null) + { + continue; + } + + method.Invoke(null, args); + } + } + + public static Type[] GetAssetPostprocessorTypes() + { + return TypeCache.GetTypesDerivedFrom().ToArray(); // doesn't find types from EditorPlugin, which is fine + } + + static bool OnPreGeneratingCSProjectFiles(Type[] types) + { + bool result = false; + foreach (var type in types) + { + var args = new object[0]; + var method = type.GetMethod("OnPreGeneratingCSProjectFiles", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Static); + if (method == null) + { + continue; + } + + var returnValue = method.Invoke(null, args); + if (method.ReturnType == typeof(bool)) + { + result |= (bool) returnValue; + } + } + + return result; + } + + static string OnGeneratedCSProject(string path, string content, Type[] types) + { + foreach (var type in types) + { + var args = new[] {path, content}; + var method = type.GetMethod("OnGeneratedCSProject", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Static); + if (method == null) + { + continue; + } + + var returnValue = method.Invoke(null, args); + if (method.ReturnType == typeof(string)) + { + content = (string) returnValue; + } + } + + return content; + } + + static string OnGeneratedSlnSolution(string path, string content, Type[] types) + { + foreach (var type in types) + { + var args = new[] {path, content}; + var method = type.GetMethod("OnGeneratedSlnSolution", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Static); + if (method == null) + { + continue; + } + + var returnValue = method.Invoke(null, args); + if (method.ReturnType == typeof(string)) + { + content = (string) returnValue; + } + } + + return content; + } + + void SyncFileIfNotChanged(string filename, string newContents) + { + try + { + if (m_FileIOProvider.Exists(filename) && newContents == m_FileIOProvider.ReadAllText(filename)) + { + return; + } + } + catch (Exception exception) + { + Debug.LogException(exception); + } + + m_FileIOProvider.WriteAllText(filename, newContents); + } + + string ProjectText(Assembly assembly, + Dictionary allAssetsProjectParts, + List responseFilesData, + List allProjectIslands) + { + var projectBuilder = new StringBuilder(ProjectHeader(assembly, responseFilesData)); + var references = new List(); + var projectReferences = new List(); + + foreach (string file in assembly.sourceFiles) + { + if (!ShouldFileBePartOfSolution(file)) + continue; + + var extension = Path.GetExtension(file).ToLower(); + var fullFile = EscapedRelativePathFor(file); + if (".dll" != extension) + { + projectBuilder.Append(" ").Append(Environment.NewLine); + } + else + { + references.Add(fullFile); + } + } + + // Append additional non-script files that should be included in project generation. + if (allAssetsProjectParts.TryGetValue(assembly.name, out var additionalAssetsForProject)) + projectBuilder.Append(additionalAssetsForProject); + + var islandRefs = references.Union(assembly.allReferences); + foreach (string reference in islandRefs) + { + if (reference.EndsWith("/UnityEditor.dll", StringComparison.Ordinal) + || reference.EndsWith("/UnityEngine.dll", StringComparison.Ordinal) + || reference.EndsWith("\\UnityEditor.dll", StringComparison.Ordinal) + || reference.EndsWith("\\UnityEngine.dll", StringComparison.Ordinal)) + continue; + + var match = k_ScriptReferenceExpression.Match(reference); + if (match.Success) + { + // assume csharp language + // Add a reference to a project except if it's a reference to a script assembly + // that we are not generating a project for. This will be the case for assemblies + // coming from .assembly.json files in non-internalized packages. + var dllName = match.Groups["dllname"].Value; + if (allProjectIslands.Any(i => Path.GetFileName(i.outputPath) == dllName)) + { + projectReferences.Add(match); + continue; + } + } + + string fullReference = Path.IsPathRooted(reference) ? reference : Path.Combine(ProjectDirectory, reference); + + AppendReference(fullReference, projectBuilder); + } + + var responseRefs = responseFilesData.SelectMany(x => x.FullPathReferences.Select(r => r)); + foreach (var reference in responseRefs) + { + AppendReference(reference, projectBuilder); + } + + if (0 < projectReferences.Count) + { + projectBuilder.AppendLine(" "); + projectBuilder.AppendLine(" "); + foreach (Match reference in projectReferences) + { + var referencedProject = reference.Groups["project"].Value; + + projectBuilder.Append(" ").Append(Environment.NewLine); + projectBuilder + .Append(" {") + .Append(m_GUIDGenerator.ProjectGuid(m_ProjectName, reference.Groups["project"].Value)) + .Append("}") + .Append(Environment.NewLine); + projectBuilder.Append(" ").Append(referencedProject).Append("").Append(Environment.NewLine); + projectBuilder.AppendLine(" "); + } + } + + projectBuilder.Append(ProjectFooter()); + return projectBuilder.ToString(); + } + + static void AppendReference(string fullReference, StringBuilder projectBuilder) + { + //replace \ with / and \\ with / + var escapedFullPath = SecurityElement.Escape(fullReference); + escapedFullPath = escapedFullPath.Replace("\\\\", "/").Replace("\\", "/"); + projectBuilder.Append(" ").Append(Environment.NewLine); + projectBuilder.Append(" ").Append(escapedFullPath).Append("").Append(Environment.NewLine); + projectBuilder.Append(" ").Append(Environment.NewLine); + } + + public string ProjectFile(Assembly assembly) + { + return Path.Combine(ProjectDirectory, $"{assembly.name}.csproj"); + } + + public string SolutionFile() + { + return Path.Combine(ProjectDirectory, $"{m_ProjectName}.sln"); + } + + string ProjectHeader( + Assembly assembly, + List responseFilesData + ) + { + var otherResponseFilesData = GetOtherArgumentsFromResponseFilesData(responseFilesData); + var arguments = new object[] + { + k_ToolsVersion, k_ProductVersion, m_GUIDGenerator.ProjectGuid(m_ProjectName, assembly.name), + InternalEditorUtility.GetEngineAssemblyPath(), + InternalEditorUtility.GetEditorAssemblyPath(), + string.Join(";", + new[] {"DEBUG", "TRACE"}.Concat(EditorUserBuildSettings.activeScriptCompilationDefines).Concat(assembly.defines) + .Concat(responseFilesData.SelectMany(x => x.Defines)).Distinct().ToArray()), + MSBuildNamespaceUri, + assembly.name, + EditorSettings.projectGenerationRootNamespace, + k_TargetFrameworkVersion, + GenerateLangVersion(otherResponseFilesData["langversion"]), + k_BaseDirectory, + assembly.compilerOptions.AllowUnsafeCode | responseFilesData.Any(x => x.Unsafe), + GenerateNoWarn(otherResponseFilesData["nowarn"].Distinct().ToArray()), + GenerateAnalyserItemGroup(otherResponseFilesData["analyzer"].Concat(otherResponseFilesData["a"]).SelectMany(x=>x.Split(';')).Distinct().ToArray()), + GenerateAnalyserAdditionalFiles(otherResponseFilesData["additionalfile"].SelectMany(x=>x.Split(';')).Distinct().ToArray()), + GenerateAnalyserRuleSet(otherResponseFilesData["ruleset"].Distinct().ToArray()), + GenerateWarningLevel(otherResponseFilesData["warn"].Concat(otherResponseFilesData["w"]).Distinct()), + GenerateWarningAsError(otherResponseFilesData["warnaserror"]), + GenerateDocumentationFile(otherResponseFilesData["doc"]) + }; + + try + { + return string.Format(GetProjectHeaderTemplate(), arguments); + } + catch (Exception) + { + throw new NotSupportedException( + "Failed creating c# project because the c# project header did not have the correct amount of arguments, which is " + + arguments.Length); + } + } + + private string GenerateDocumentationFile(IEnumerable paths) + { + if (!paths.Any()) + return String.Empty; + + + return $"{Environment.NewLine}{string.Join(Environment.NewLine, paths.Select(a => $" {a}"))}"; + } + + private string GenerateWarningAsError(IEnumerable enumerable) + { + string returnValue = String.Empty; + bool allWarningsAsErrors = false; + List warningIds = new List(); + + foreach (string s in enumerable) + { + if (s == "+") allWarningsAsErrors = true; + else if (s == "-") allWarningsAsErrors = false; + else + { + warningIds.Add(s); + } + } + + returnValue += $@" {allWarningsAsErrors}"; + if (warningIds.Any()) + { + returnValue += $"{Environment.NewLine} {string.Join(";", warningIds)}"; + } + + return $"{Environment.NewLine}{returnValue}"; + } + + private string GenerateWarningLevel(IEnumerable warningLevel) + { + var level = warningLevel.FirstOrDefault(); + if (!string.IsNullOrWhiteSpace(level)) + return level; + + return 4.ToString(); + } + + static string GetSolutionText() + { + return string.Join(Environment.NewLine, + @"", + @"Microsoft Visual Studio Solution File, Format Version {0}", + @"# Visual Studio {1}", + @"{2}", + @"Global", + @" GlobalSection(SolutionConfigurationPlatforms) = preSolution", + @" Debug|Any CPU = Debug|Any CPU", + @" Release|Any CPU = Release|Any CPU", + @" EndGlobalSection", + @" GlobalSection(ProjectConfigurationPlatforms) = postSolution", + @"{3}", + @" EndGlobalSection", + @" GlobalSection(SolutionProperties) = preSolution", + @" HideSolutionNode = FALSE", + @" EndGlobalSection", + @"EndGlobal", + @"").Replace(" ", "\t"); + } + + static string GetProjectFooterTemplate() + { + return string.Join(Environment.NewLine, + @" ", + @" ", + @" ", + @"", + @""); + } + + static string GetProjectHeaderTemplate() + { + var header = new[] + { + @"", + @"", + @" ", + @" {10}", + @" <_TargetFrameworkDirectories>non_empty_path_generated_by_unity.rider.package", + @" <_FullFrameworkReferenceAssemblyPaths>non_empty_path_generated_by_unity.rider.package", + @" true{16}", + @" ", + @" ", + @" Debug", + @" AnyCPU", + @" {1}", + @" 2.0", + @" {8}", + @" {{{2}}}", + @" Library", + @" Properties", + @" {7}", + @" {9}", + @" 512", + @" {11}", + @" ", + @" ", + @" true", + @" full", + @" false", + @" Temp\bin\Debug\", + @" {5}", + @" prompt", + @" {17}", + @" 0169{13}", + @" {12}{18}{19}", + @" ", + @" ", + @" pdbonly", + @" true", + @" Temp\bin\Release\", + @" prompt", + @" {17}", + @" 0169{13}", + @" {12}{18}{19}", + @" " + }; + + var forceExplicitReferences = new[] + { + @" ", + @" true", + @" true", + @" false", + @" false", + @" false", + @" " + }; + + var itemGroupStart = new[] + { + @" " + }; + + var footer = new[] + { + @" ", + @" {3}", + @" ", + @" ", + @" {4}", + @" ", + @" {14}{15}", + @" ", + @"" + }; + + var pieces = header.Concat(forceExplicitReferences).Concat(itemGroupStart).Concat(footer).ToArray(); + return string.Join(Environment.NewLine, pieces); + } + + void SyncSolution(IEnumerable islands, Type[] types) + { + SyncSolutionFileIfNotChanged(SolutionFile(), SolutionText(islands), types); + } + + string SolutionText(IEnumerable islands) + { + var fileversion = "11.00"; + var vsversion = "2010"; + + var relevantIslands = RelevantIslandsForMode(islands); + string projectEntries = GetProjectEntries(relevantIslands); + string projectConfigurations = string.Join(Environment.NewLine, + relevantIslands.Select(i => GetProjectActiveConfigurations(m_GUIDGenerator.ProjectGuid(m_ProjectName, i.name))).ToArray()); + return string.Format(GetSolutionText(), fileversion, vsversion, projectEntries, projectConfigurations); + } + + private static string GenerateAnalyserItemGroup(string[] paths) + { + // + // + // + // + if (!paths.Any()) + return string.Empty; + + var analyserBuilder = new StringBuilder(); + analyserBuilder.AppendLine(" "); + foreach (var path in paths) + { + analyserBuilder.AppendLine($" "); + } + analyserBuilder.AppendLine(" "); + return analyserBuilder.ToString(); + } + + private static ILookup GetOtherArgumentsFromResponseFilesData(List responseFilesData) + { + var paths = responseFilesData.SelectMany(x => + { + return x.OtherArguments + .Where(a => a.StartsWith("/") || a.StartsWith("-")) + .Select(b => + { + var index = b.IndexOf(":", StringComparison.Ordinal); + if (index > 0 && b.Length > index) + { + var key = b.Substring(1, index - 1); + return new KeyValuePair(key, b.Substring(index + 1)); + } + + const string warnaserror = "warnaserror"; + if (b.Substring(1).StartsWith(warnaserror)) + { + return new KeyValuePair(warnaserror, b.Substring(warnaserror.Length+ 1) ); + } + + return default; + }); + }) + .Distinct() + .ToLookup(o => o.Key, pair => pair.Value); + return paths; + } + + private string GenerateLangVersion(IEnumerable langVersionList) + { + var langVersion = langVersionList.FirstOrDefault(); + if (!string.IsNullOrWhiteSpace(langVersion)) + return langVersion; + return k_TargetLanguageVersion; + } + + private static string GenerateAnalyserRuleSet(string[] paths) + { + //..\path\to\myrules.ruleset + if (!paths.Any()) + return string.Empty; + + return $"{Environment.NewLine}{string.Join(Environment.NewLine, paths.Select(a => $" {a}"))}"; + } + + private static string GenerateAnalyserAdditionalFiles(string[] paths) + { + if (!paths.Any()) + return string.Empty; + + + var analyserBuilder = new StringBuilder(); + analyserBuilder.AppendLine(" "); + foreach (var path in paths) + { + analyserBuilder.AppendLine($" "); + } + analyserBuilder.AppendLine(" "); + return analyserBuilder.ToString(); + } + + private static string GenerateNoWarn(string[] codes) + { + if (!codes.Any()) + return string.Empty; + + return $",{string.Join(",", codes)}"; + } + + static IEnumerable RelevantIslandsForMode(IEnumerable islands) + { + IEnumerable relevantIslands = islands.Where(i => ScriptingLanguage.CSharp == ScriptingLanguageFor(i)); + return relevantIslands; + } + + /// + /// Get a Project("{guid}") = "MyProject", "MyProject.unityproj", "{projectguid}" + /// entry for each relevant language + /// + string GetProjectEntries(IEnumerable islands) + { + var projectEntries = islands.Select(i => string.Format( + m_SolutionProjectEntryTemplate, + m_GUIDGenerator.SolutionGuid(m_ProjectName, GetExtensionOfSourceFiles(i.sourceFiles)), + i.name, + Path.GetFileName(ProjectFile(i)), + m_GUIDGenerator.ProjectGuid(m_ProjectName, i.name) + )); + + return string.Join(Environment.NewLine, projectEntries.ToArray()); + } + + /// + /// Generate the active configuration string for a given project guid + /// + string GetProjectActiveConfigurations(string projectGuid) + { + return string.Format( + m_SolutionProjectConfigurationTemplate, + projectGuid); + } + + string EscapedRelativePathFor(string file) + { + var projectDir = ProjectDirectory.Replace('/', '\\'); + file = file.Replace('/', '\\'); + var path = SkipPathPrefix(file, projectDir); + + var packageInfo = m_AssemblyNameProvider.FindForAssetPath(path.Replace('\\', '/')); + if (packageInfo != null) + { + // We have to normalize the path, because the PackageManagerRemapper assumes + // dir seperators will be os specific. + var absolutePath = Path.GetFullPath(NormalizePath(path)).Replace('/', '\\'); + path = SkipPathPrefix(absolutePath, projectDir); + } + + return SecurityElement.Escape(path); + } + + static string SkipPathPrefix(string path, string prefix) + { + if (path.Replace("\\", "/").StartsWith($"{prefix}/")) + return path.Substring(prefix.Length + 1); + return path; + } + + static string NormalizePath(string path) + { + if (Path.DirectorySeparatorChar == '\\') + return path.Replace('/', Path.DirectorySeparatorChar); + return path.Replace('\\', Path.DirectorySeparatorChar); + } + + static string ProjectFooter() + { + return GetProjectFooterTemplate(); + } + + static string GetProjectExtension() + { + return ".csproj"; + } + } + + public static class SolutionGuidGenerator + { + public static string GuidForProject(string projectName) + { + return ComputeGuidHashFor(projectName + "salt"); + } + + public static string GuidForSolution(string projectName, string sourceFileExtension) + { + if (sourceFileExtension.ToLower() == "cs") + // GUID for a C# class library: http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs + return "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC"; + + return ComputeGuidHashFor(projectName); + } + + static string ComputeGuidHashFor(string input) + { + var hash = MD5.Create().ComputeHash(Encoding.Default.GetBytes(input)); + return HashAsGuid(HashToString(hash)); + } + + static string HashAsGuid(string hash) + { + var guid = hash.Substring(0, 8) + "-" + hash.Substring(8, 4) + "-" + hash.Substring(12, 4) + "-" + + hash.Substring(16, 4) + "-" + hash.Substring(20, 12); + return guid.ToUpper(); + } + + static string HashToString(byte[] bs) + { + var sb = new StringBuilder(); + foreach (byte b in bs) + sb.Append(b.ToString("x2")); + return sb.ToString(); + } + } +} diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta new file mode 100644 index 0000000..4a0705c --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7078f19173ceac84fb9e29b9f6175201 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs new file mode 100644 index 0000000..d481133 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs @@ -0,0 +1,38 @@ +using System; +using System.IO; +using UnityEngine; +using Debug = UnityEngine.Debug; + +namespace Packages.Rider.Editor +{ + internal class RiderInitializer + { + public void Initialize(string editorPath) + { + var assembly = EditorPluginInterop.EditorPluginAssembly; + if (EditorPluginInterop.EditorPluginIsLoadedFromAssets(assembly)) + { + Debug.LogError($"Please delete {assembly.Location}. Unity 2019.2+ loads it directly from Rider installation. To disable this, open Rider's settings, search and uncheck 'Automatically install and update Rider's Unity editor plugin'."); + return; + } + + var dllName = "JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked.dll"; + var relPath = "../../plugins/rider-unity/EditorPlugin"; + if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX) + relPath = "Contents/plugins/rider-unity/EditorPlugin"; + var dllFile = new FileInfo(Path.Combine(Path.Combine(editorPath, relPath), dllName)); + + if (dllFile.Exists) + { + var bytes = File.ReadAllBytes(dllFile.FullName); + assembly = AppDomain.CurrentDomain.Load(bytes); // doesn't lock assembly on disk + // assembly = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(dllFile.FullName)); // use this for external source debug + EditorPluginInterop.InitEntryPoint(assembly); + } + else + { + Debug.Log($"Unable to find Rider EditorPlugin {dllFile.FullName} for Unity "); + } + } + } +} diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta new file mode 100644 index 0000000..11d46bc --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f5a0cc9645f0e2d4fb816156dcf3f4dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs new file mode 100644 index 0000000..debee95 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs @@ -0,0 +1,404 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using Packages.Rider.Editor.Util; +using Unity.CodeEditor; +using UnityEditor; +using UnityEngine; +using Debug = UnityEngine.Debug; + +namespace Packages.Rider.Editor +{ + [InitializeOnLoad] + public class RiderScriptEditor : IExternalCodeEditor + { + IDiscovery m_Discoverability; + IGenerator m_ProjectGeneration; + RiderInitializer m_Initiliazer = new RiderInitializer(); + + static RiderScriptEditor() + { + try + { + var projectGeneration = new ProjectGeneration(); + var editor = new RiderScriptEditor(new Discovery(), projectGeneration); + CodeEditor.Register(editor); + var path = GetEditorRealPath(CodeEditor.CurrentEditorInstallation); + + if (IsRiderInstallation(path)) + { + if (!RiderScriptEditorData.instance.InitializedOnce) + { + var installations = editor.Installations; + // is toolbox and outdated - update + if (installations.Any() && RiderPathLocator.IsToolbox(path) && installations.All(a => a.Path != path)) + { + var toolboxInstallations = installations.Where(a => a.Name.Contains("(JetBrains Toolbox)")).ToArray(); + if (toolboxInstallations.Any()) + { + var newEditor = toolboxInstallations.Last().Path; + CodeEditor.SetExternalScriptEditor(newEditor); + path = newEditor; + } + else + { + var newEditor = installations.Last().Path; + CodeEditor.SetExternalScriptEditor(newEditor); + path = newEditor; + } + } + + // exists, is non toolbox and outdated - notify + if (installations.Any() && FileSystemUtil.EditorPathExists(path) && installations.All(a => a.Path != path)) + { + var newEditorName = installations.Last().Name; + Debug.LogWarning($"Consider updating External Editor in Unity to Rider {newEditorName}."); + } + + ShowWarningOnUnexpectedScriptEditor(path); + RiderScriptEditorData.instance.InitializedOnce = true; + } + + if (!FileSystemUtil.EditorPathExists(path)) // previously used rider was removed + { + var installations = editor.Installations; + if (installations.Any()) + { + var newEditor = installations.Last().Path; + CodeEditor.SetExternalScriptEditor(newEditor); + path = newEditor; + } + } + RiderScriptEditorData.instance.Init(); + + editor.CreateSolutionIfDoesntExist(); + if (RiderScriptEditorData.instance.shouldLoadEditorPlugin) + { + editor.m_Initiliazer.Initialize(path); + } + + InitProjectFilesWatcher(); + } + } + catch (Exception e) + { + Debug.LogException(e); + } + } + + private static void ShowWarningOnUnexpectedScriptEditor(string path) + { + // Show warning, when Unity was started from Rider, but external editor is different https://github.com/JetBrains/resharper-unity/issues/1127 + var args = Environment.GetCommandLineArgs(); + var commandlineParser = new CommandLineParser(args); + if (commandlineParser.Options.ContainsKey("-riderPath")) + { + var originRiderPath = commandlineParser.Options["-riderPath"]; + var originRealPath = GetEditorRealPath(originRiderPath); + var originVersion = RiderPathLocator.GetBuildNumber(originRealPath); + var version = RiderPathLocator.GetBuildNumber(path); + if (originVersion != string.Empty && originVersion != version) + { + Debug.LogWarning("Unity was started by a version of Rider that is not the current default external editor. Advanced integration features cannot be enabled."); + Debug.Log($"Unity was started by Rider {originVersion}, but external editor is set to: {path}"); + } + } + } + + private static void InitProjectFilesWatcher() + { + var watcher = new FileSystemWatcher(); + watcher.Path = Directory.GetCurrentDirectory(); + watcher.NotifyFilter = NotifyFilters.LastWrite; //Watch for changes in LastWrite times + watcher.Filter = "*.*"; + + // Add event handlers. + watcher.Changed += OnChanged; + watcher.Created += OnChanged; + + watcher.EnableRaisingEvents = true; // Begin watching. + + AppDomain.CurrentDomain.DomainUnload += (EventHandler) ((_, __) => + { + watcher.Dispose(); + }); + } + + private static void OnChanged(object sender, FileSystemEventArgs e) + { + var extension = Path.GetExtension(e.FullPath); + if (extension == ".sln" || extension == ".csproj") + RiderScriptEditorData.instance.HasChanges = true; + } + + internal static string GetEditorRealPath(string path) + { + if (string.IsNullOrEmpty(path)) + { + return path; + } + + if (!FileSystemUtil.EditorPathExists(path)) + return path; + + if (SystemInfo.operatingSystemFamily != OperatingSystemFamily.Windows) + { + var realPath = FileSystemUtil.GetFinalPathName(path); + + // case of snap installation + if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.Linux) + { + if (new FileInfo(path).Name.ToLowerInvariant() == "rider" && + new FileInfo(realPath).Name.ToLowerInvariant() == "snap") + { + var snapInstallPath = "/snap/rider/current/bin/rider.sh"; + if (new FileInfo(snapInstallPath).Exists) + return snapInstallPath; + } + } + + // in case of symlink + return realPath; + } + + return path; + } + + const string unity_generate_all = "unity_generate_all_csproj"; + + public RiderScriptEditor(IDiscovery discovery, IGenerator projectGeneration) + { + m_Discoverability = discovery; + m_ProjectGeneration = projectGeneration; + } + + private static string[] defaultExtensions + { + get + { + var customExtensions = new[] {"json", "asmdef", "log", "xaml"}; + return EditorSettings.projectGenerationBuiltinExtensions.Concat(EditorSettings.projectGenerationUserExtensions) + .Concat(customExtensions).Distinct().ToArray(); + } + } + + private static string[] HandledExtensions + { + get + { + return HandledExtensionsString.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries).Select(s => s.TrimStart('.', '*')) + .ToArray(); + } + } + + private static string HandledExtensionsString + { + get { return EditorPrefs.GetString("Rider_UserExtensions", string.Join(";", defaultExtensions));} + set { EditorPrefs.SetString("Rider_UserExtensions", value); } + } + + private static bool SupportsExtension(string path) + { + var extension = Path.GetExtension(path); + if (string.IsNullOrEmpty(extension)) + return false; + return HandledExtensions.Contains(extension.TrimStart('.')); + } + + public void OnGUI() + { + var prevGenerate = EditorPrefs.GetBool(unity_generate_all, false); + var generateAll = EditorGUILayout.Toggle("Generate all .csproj files.", prevGenerate); + if (generateAll != prevGenerate) + { + EditorPrefs.SetBool(unity_generate_all, generateAll); + } + + m_ProjectGeneration.GenerateAll(generateAll); + + if (RiderScriptEditorData.instance.shouldLoadEditorPlugin) + { + HandledExtensionsString = EditorGUILayout.TextField(new GUIContent("Extensions handled: "), HandledExtensionsString); + } + } + + public void SyncIfNeeded(string[] addedFiles, string[] deletedFiles, string[] movedFiles, string[] movedFromFiles, + string[] importedFiles) + { + m_ProjectGeneration.SyncIfNeeded(addedFiles.Union(deletedFiles).Union(movedFiles).Union(movedFromFiles), + importedFiles); + } + + public void SyncAll() + { + AssetDatabase.Refresh(); + if (RiderScriptEditorData.instance.HasChanges) + { + m_ProjectGeneration.Sync(); + RiderScriptEditorData.instance.HasChanges = false; + } + } + + public void Initialize(string editorInstallationPath) // is called each time ExternalEditor is changed + { + RiderScriptEditorData.instance.Invalidate(editorInstallationPath); + m_ProjectGeneration.Sync(); // regenerate csproj and sln for new editor + } + + public bool OpenProject(string path, int line, int column) + { + if (path != "" && !SupportsExtension(path)) // Assets - Open C# Project passes empty path here + { + return false; + } + + if (path == "" && SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX) + { + // there is a bug in DllImplementation - use package implementation here instead https://github.cds.internal.unity3d.com/unity/com.unity.ide.rider/issues/21 + return OpenOSXApp(path, line, column); + } + + if (!IsUnityScript(path)) + { + var fastOpenResult = EditorPluginInterop.OpenFileDllImplementation(path, line, column); + if (fastOpenResult) + return true; + } + + if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX) + { + return OpenOSXApp(path, line, column); + } + + var solution = GetSolutionFile(path); // TODO: If solution file doesn't exist resync. + solution = solution == "" ? "" : $"\"{solution}\""; + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = CodeEditor.CurrentEditorInstallation, + Arguments = $"{solution} -l {line} \"{path}\"", + UseShellExecute = true, + } + }; + + process.Start(); + + return true; + } + + private bool OpenOSXApp(string path, int line, int column) + { + var solution = GetSolutionFile(path); // TODO: If solution file doesn't exist resync. + solution = solution == "" ? "" : $"\"{solution}\""; + var pathArguments = path == "" ? "" : $"-l {line} \"{path}\""; + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "open", + Arguments = $"-n \"{CodeEditor.CurrentEditorInstallation}\" --args {solution} {pathArguments}", + CreateNoWindow = true, + UseShellExecute = true, + } + }; + + process.Start(); + + return true; + } + + private string GetSolutionFile(string path) + { + if (IsUnityScript(path)) + { + return Path.Combine(GetBaseUnityDeveloperFolder(), "Projects/CSharp/Unity.CSharpProjects.gen.sln"); + } + + var solutionFile = m_ProjectGeneration.SolutionFile(); + if (File.Exists(solutionFile)) + { + return solutionFile; + } + + return ""; + } + + static bool IsUnityScript(string path) + { + if (UnityEditor.Unsupported.IsDeveloperBuild()) + { + var baseFolder = GetBaseUnityDeveloperFolder().Replace("\\", "/"); + var lowerPath = path.ToLowerInvariant().Replace("\\", "/"); + + if (lowerPath.Contains((baseFolder + "/Runtime").ToLowerInvariant()) + || lowerPath.Contains((baseFolder + "/Editor").ToLowerInvariant())) + { + return true; + } + } + + return false; + } + + static string GetBaseUnityDeveloperFolder() + { + return Directory.GetParent(EditorApplication.applicationPath).Parent.Parent.FullName; + } + + public bool TryGetInstallationForPath(string editorPath, out CodeEditor.Installation installation) + { + if (FileSystemUtil.EditorPathExists(editorPath) && IsRiderInstallation(editorPath)) + { + var info = new RiderPathLocator.RiderInfo(editorPath, false); + installation = new CodeEditor.Installation + { + Name = info.Presentation, + Path = info.Path + }; + return true; + } + + installation = default; + return false; + } + + public static bool IsRiderInstallation(string path) + { + if (IsAssetImportWorkerProcess()) + return false; + + if (string.IsNullOrEmpty(path)) + { + return false; + } + + var fileInfo = new FileInfo(path); + var filename = fileInfo.Name.ToLowerInvariant(); + return filename.StartsWith("rider", StringComparison.Ordinal); + } + + private static bool IsAssetImportWorkerProcess() + { +#if UNITY_2019_3_OR_NEWER + return UnityEditor.Experimental.AssetDatabaseExperimental.IsAssetImportWorkerProcess(); +#else + return false; +#endif + } + + public static string CurrentEditor // works fast, doesn't validate if executable really exists + => EditorPrefs.GetString("kScriptsDefaultApp"); + + public CodeEditor.Installation[] Installations => m_Discoverability.PathCallback(); + + public void CreateSolutionIfDoesntExist() + { + if (!m_ProjectGeneration.HasSolutionBeenGenerated()) + { + m_ProjectGeneration.Sync(); + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta new file mode 100644 index 0000000..1676483 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c4095d72f77fbb64ea39b8b3ca246622 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs new file mode 100644 index 0000000..f75ed0d --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs @@ -0,0 +1,29 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace Packages.Rider.Editor +{ + public class RiderScriptEditorData : ScriptableSingleton + { + [SerializeField] internal bool HasChanges = true; // sln/csproj files were changed + [SerializeField] internal bool shouldLoadEditorPlugin; + [SerializeField] internal bool InitializedOnce; + [SerializeField] internal string currentEditorVersion; + + public void Init() + { + if (string.IsNullOrEmpty(currentEditorVersion)) + Invalidate(RiderScriptEditor.CurrentEditor); + } + + public void Invalidate(string editorInstallationPath) + { + currentEditorVersion = RiderPathLocator.GetBuildNumber(editorInstallationPath); + if (!Version.TryParse(currentEditorVersion, out var version)) + shouldLoadEditorPlugin = false; + + shouldLoadEditorPlugin = version >= new Version("191.7141.156"); + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta new file mode 100644 index 0000000..21a5abc --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f079e3afd077fb94fa2bda74d6409499 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta new file mode 100644 index 0000000..f6e86c9 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a52391bc44c477f40a547ed4ef3b9560 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs new file mode 100644 index 0000000..01573fa --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using JetBrains.Annotations; +using UnityEditor; + +namespace Packages.Rider.Editor.UnitTesting +{ + public class CallbackData : ScriptableSingleton + { + public bool isRider; + + [UsedImplicitly] public static event EventHandler Changed = (sender, args) => { }; + + internal void RaiseChangedEvent() + { + Changed(null, EventArgs.Empty); + } + + public List events = new List(); + + [UsedImplicitly] + public void Clear() + { + events.Clear(); + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta new file mode 100644 index 0000000..ce32722 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 010246a07de7cb34185a2a7b1c1fad59 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs new file mode 100644 index 0000000..10d528b --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs @@ -0,0 +1,18 @@ +#if TEST_FRAMEWORK +using UnityEditor; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace Packages.Rider.Editor.UnitTesting +{ + [InitializeOnLoad] + internal static class CallbackInitializer + { + static CallbackInitializer() + { + if (CallbackData.instance.isRider) + ScriptableObject.CreateInstance().RegisterCallbacks(ScriptableObject.CreateInstance(), 0); + } + } +} +#endif \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta new file mode 100644 index 0000000..d47c38c --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aa1c6b1a353ab464782fc1e7c051eb02 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs new file mode 100644 index 0000000..e08c346 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using UnityEngine; +#if TEST_FRAMEWORK +using UnityEditor; +using UnityEditor.TestTools.TestRunner.Api; +#endif + +namespace Packages.Rider.Editor.UnitTesting +{ + public static class RiderTestRunner + { +#if TEST_FRAMEWORK + private static readonly TestsCallback Callback = ScriptableObject.CreateInstance(); +#endif + [UsedImplicitly] + public static void RunTests(int testMode, string[] assemblyNames, string[] testNames, string[] categoryNames, string[] groupNames, int? buildTarget) + { +#if !TEST_FRAMEWORK + Debug.LogError("Update Test Framework package to v.1.1.1+ to run tests from Rider."); +#else + CallbackData.instance.isRider = true; + + var api = ScriptableObject.CreateInstance(); + var settings = new ExecutionSettings(); + var filter = new Filter + { + assemblyNames = assemblyNames, + testNames = testNames, + categoryNames = categoryNames, + groupNames = groupNames, + targetPlatform = (BuildTarget?) buildTarget + }; + + if (testMode > 0) // for future use - test-framework would allow running both Edit and Play test at once + filter.testMode = (TestMode) testMode; + + settings.filters = new []{ + filter + }; + api.Execute(settings); + + api.UnregisterCallbacks(Callback); // avoid multiple registrations + api.RegisterCallbacks(Callback); // This can be used to receive information about when the test suite and individual tests starts and stops. Provide this with a scriptable object implementing ICallbacks +#endif + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta new file mode 100644 index 0000000..6ef5313 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c3b27069cb3ddf42ba1260eeefcdd1c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs new file mode 100644 index 0000000..ce2e1b7 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs @@ -0,0 +1,31 @@ +using System; +using NUnit.Framework.Interfaces; + +namespace Packages.Rider.Editor.UnitTesting +{ + [Serializable] + public enum EventType { TestStarted, TestFinished, RunFinished } + + [Serializable] + public class TestEvent + { + public EventType type; + public string id; + public string assemblyName; + public string output; + public TestStatus testStatus; + public double duration; + public string parentId; + + public TestEvent(EventType type, string id, string assemblyName, string output, double duration, TestStatus testStatus, string parentID) + { + this.type = type; + this.id = id; + this.assemblyName = assemblyName; + this.output = output; + this.testStatus = testStatus; + this.duration = duration; + parentId = parentID; + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta new file mode 100644 index 0000000..7ec7c71 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f9413c47b3a14a64e8810ce76d1a6032 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs new file mode 100644 index 0000000..9995050 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs @@ -0,0 +1,83 @@ +#if TEST_FRAMEWORK +using System; +using System.Text; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace Packages.Rider.Editor.UnitTesting +{ + public class TestsCallback : ScriptableObject, ICallbacks + { + public void RunFinished(ITestResultAdaptor result) + { + CallbackData.instance.isRider = false; + + CallbackData.instance.events.Add( + new TestEvent(EventType.RunFinished, "", "","", 0, ParseTestStatus(result.TestStatus), "")); + CallbackData.instance.RaiseChangedEvent(); + } + + public void TestStarted(ITestAdaptor result) + { + if (result.Method == null) return; + + CallbackData.instance.events.Add( + new TestEvent(EventType.TestStarted, GetUniqueName(result), result.Method.TypeInfo.Assembly.GetName().Name, "", 0, ParseTestStatus(TestStatus.Passed), result.ParentFullName)); + CallbackData.instance.RaiseChangedEvent(); + } + + public void TestFinished(ITestResultAdaptor result) + { + if (result.Test.Method == null) return; + + CallbackData.instance.events.Add( + new TestEvent(EventType.TestFinished, GetUniqueName(result.Test), result.Test.Method.TypeInfo.Assembly.GetName().Name, ExtractOutput(result), result.Duration, ParseTestStatus(result.TestStatus), result.Test.ParentFullName)); + CallbackData.instance.RaiseChangedEvent(); + } + + // todo: reimplement JetBrains.Rider.Unity.Editor.AfterUnity56.UnitTesting.TestEventsSender.GetUniqueName + private static string GetUniqueName(ITestAdaptor test) + { + string str = test.FullName; + return str; + } + + public void RunStarted(ITestAdaptor testsToRun) + { + } + + private static NUnit.Framework.Interfaces.TestStatus ParseTestStatus(TestStatus testStatus) + { + return (NUnit.Framework.Interfaces.TestStatus)Enum.Parse(typeof(NUnit.Framework.Interfaces.TestStatus), testStatus.ToString()); + } + + private static string ExtractOutput(ITestResultAdaptor testResult) + { + var stringBuilder = new StringBuilder(); + if (testResult.Message != null) + { + stringBuilder.AppendLine("Message: "); + stringBuilder.AppendLine(testResult.Message); + } + + if (!string.IsNullOrEmpty(testResult.Output)) + { + stringBuilder.AppendLine("Output: "); + stringBuilder.AppendLine(testResult.Output); + } + + if (!string.IsNullOrEmpty(testResult.StackTrace)) + { + stringBuilder.AppendLine("Stacktrace: "); + stringBuilder.AppendLine(testResult.StackTrace); + } + + var result = stringBuilder.ToString(); + if (result.Length > 0) + return result; + + return testResult.Output ?? string.Empty; + } + } +} +#endif \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta new file mode 100644 index 0000000..068cba1 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 58aa570dbe0761f43b25ff6c2265bbe2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta new file mode 100644 index 0000000..d7ba88e --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e726086cd652f82087d59d67d2c24cd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs new file mode 100644 index 0000000..c41490a --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; + +namespace Packages.Rider.Editor.Util +{ + public class CommandLineParser + { + public Dictionary Options = new Dictionary(); + + public CommandLineParser(string[] args) + { + var i = 0; + while (i < args.Length) + { + var arg = args[i]; + if (!arg.StartsWith("-")) + { + i++; + continue; + } + + string value = null; + if (i + 1 < args.Length && !args[i + 1].StartsWith("-")) + { + value = args[i + 1]; + i++; + } + + if (!(Options.ContainsKey(arg))) + { + Options.Add(arg, value); + } + i++; + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta new file mode 100644 index 0000000..536d707 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 154ace4bd16de9f4e84052ac257786d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs new file mode 100644 index 0000000..f558aca --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs @@ -0,0 +1,66 @@ +using System; +using System.ComponentModel; +using System.IO; +using System.Text; +using JetBrains.Annotations; +using UnityEngine; + +namespace Packages.Rider.Editor.Util +{ + public static class FileSystemUtil + { + [NotNull] + public static string GetFinalPathName([NotNull] string path) + { + if (path == null) throw new ArgumentNullException("path"); + + // up to MAX_PATH. MAX_PATH on Linux currently 4096, on Mac OS X 1024 + // doc: http://man7.org/linux/man-pages/man3/realpath.3.html + var sb = new StringBuilder(8192); + var result = LibcNativeInterop.realpath(path, sb); + if (result == IntPtr.Zero) + { + throw new Win32Exception($"{path} was not resolved."); + } + + return new FileInfo(sb.ToString()).FullName; + } + + public static string FileNameWithoutExtension(string path) + { + if (string.IsNullOrEmpty(path)) + { + return ""; + } + + var indexOfDot = -1; + var indexOfSlash = 0; + for (var i = path.Length - 1; i >= 0; i--) + { + if (indexOfDot == -1 && path[i] == '.') + { + indexOfDot = i; + } + + if (indexOfSlash == 0 && path[i] == '/' || path[i] == '\\') + { + indexOfSlash = i + 1; + break; + } + } + + if (indexOfDot == -1) + { + indexOfDot = path.Length; + } + + return path.Substring(indexOfSlash, indexOfDot - indexOfSlash); + } + + public static bool EditorPathExists(string editorPath) + { + return SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX && new DirectoryInfo(editorPath).Exists + || SystemInfo.operatingSystemFamily != OperatingSystemFamily.MacOSX && new FileInfo(editorPath).Exists; + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta new file mode 100644 index 0000000..ebc001b --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bdbd564a9fdad0b738e76d030cad1204 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs new file mode 100644 index 0000000..a4070f2 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs @@ -0,0 +1,12 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace Packages.Rider.Editor.Util +{ + internal static class LibcNativeInterop + { + [DllImport("libc", SetLastError = true)] + public static extern IntPtr realpath(string path, StringBuilder resolved_path); + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta new file mode 100644 index 0000000..fe70ee0 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 071c17858dc6c47ada7b2a1f1ded5402 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs new file mode 100644 index 0000000..63acff6 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Packages.Rider.Editor; +using Unity.CodeEditor; + +// Is called via commandline from Rider Notification after checking out from source control. + +// ReSharper disable once CheckNamespace +namespace JetBrains.Rider.Unity.Editor +{ + public static class RiderMenu + { + [UsedImplicitly] + public static void MenuOpenProject() + { + if (RiderScriptEditor.IsRiderInstallation(RiderScriptEditor.CurrentEditor)) + { + // Force the project files to be sync + CodeEditor.CurrentEditor.SyncAll(); + + // Load Project + CodeEditor.CurrentEditor.OpenProject(); + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta new file mode 100644 index 0000000..b78dfae --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8860c53ca4073d4f92c403e709c12ba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs new file mode 100644 index 0000000..03c9922 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs @@ -0,0 +1,20 @@ +using System; +using System.Linq; +using UnityEngine; + +namespace Packages.Rider.Editor.Util +{ + public static class UnityUtils + { + internal static readonly string UnityApplicationVersion = Application.unityVersion; + + public static Version UnityVersion + { + get + { + var ver = UnityApplicationVersion.Split(".".ToCharArray()).Take(2).Aggregate((a, b) => a + "." + b); + return new Version(ver); + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta new file mode 100644 index 0000000..9a4e6fe --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ec9edad2de6c4df3a146b543a0fbc4c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef new file mode 100644 index 0000000..4caebc4 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef @@ -0,0 +1,22 @@ +{ + "name": "Unity.Rider.Editor", + "references": [ + "GUID:0acc523941302664db1f4e527237feb3" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.test-framework", + "expression": "1.1.1", + "define": "TEST_FRAMEWORK" + } + ] +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta new file mode 100644 index 0000000..7a89700 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d528c8c98d269ca44a06cd9624a03945 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json b/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json new file mode 100644 index 0000000..7159e5f --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json @@ -0,0 +1,19 @@ +{ + "name": "com.unity.ide.rider", + "displayName": "Rider Editor", + "description": "Code editor integration for supporting Rider as code editor for unity. Adds support for generating csproj files for code completion, auto discovery of installations, etc.", + "version": "1.1.4", + "unity": "2019.2", + "unityRelease": "0a12", + "dependencies": { + "com.unity.test-framework": "1.1.3" + }, + "relatedPackages": { + "com.unity.ide.rider.tests": "1.1.4" + }, + "repository": { + "type": "git", + "url": "git@github.cds.internal.unity3d.com:unity/com.unity.ide.rider.git", + "revision": "d2ef95989104a4ce866cdcb7f94cf3c67476fcc9" + } +} diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta new file mode 100644 index 0000000..11bcd7b --- /dev/null +++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 66c95bb3c74257f41bae2622511dc02d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/CHANGELOG.md b/Library/PackageCache/com.unity.ide.vscode@1.1.3/CHANGELOG.md new file mode 100644 index 0000000..72ec62d --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/CHANGELOG.md @@ -0,0 +1,50 @@ +# Code Editor Package for Visual Studio Code + +## [1.1.3] - 2019-10-22 + +Exe version of vscode will use Normal ProcessWindowStyle while cmd will use Hidden + + +## [1.1.2] - 2019-08-30 + +Fixing OSX open command arguments + + +## [1.1.1] - 2019-08-19 + +Support for Player Project. Generates specific csproj files containing files, reference, defines, +etc. that will show how the assembly will be compiled for a target platform. + + +## [1.1.0] - 2019-08-07 + +Adds support for choosing extensions to be opened with VSCode. This can be done through the GUI in Preferences. +Avoids opening all extensions after the change in core unity. + + +## [1.0.7] - 2019-05-15 + +Fix various OSX specific issues. +Generate project on load if they are not generated. +Fix path recognition. + + +## [1.0.6] - 2019-04-30 + +Ensure asset database is refreshed when generating csproj and solution files. + +## [1.0.5] - 2019-04-27 + +Add support for generating all csproj files. + +## [1.0.4] - 2019-04-18 + +Fix relative package paths. +Fix opening editor on mac. +Add %LOCALAPPDATA%/Programs to the path of install paths. + +## [1.0.3] - 2019-01-01 + +### This is the first release of *Unity Package vscode_editor*. + +Using the newly created api to integrate Visual Studio Code with Unity. diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/CHANGELOG.md.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/CHANGELOG.md.meta new file mode 100644 index 0000000..65aea0b --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4ddcdc3816429494a8bea67e973875f7 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/CONTRIBUTING.md b/Library/PackageCache/com.unity.ide.vscode@1.1.3/CONTRIBUTING.md new file mode 100644 index 0000000..576d096 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/CONTRIBUTING.md @@ -0,0 +1,6 @@ +# Contributing + +## All contributions are subject to the [Unity Contribution Agreement(UCA)](https://unity3d.com/legal/licenses/Unity_Contribution_Agreement) +By making a pull request, you are confirming agreement to the terms and conditions of the UCA, including that your Contributions are your original creation and that you have complete right and authority to make your Contributions. + +## Once you have a change ready following these ground rules. Simply make a pull request \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/CONTRIBUTING.md.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/CONTRIBUTING.md.meta new file mode 100644 index 0000000..31e836f --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/CONTRIBUTING.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fcb9be00baf924c4183fc0313e6185c5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Documentation~/README.md b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Documentation~/README.md new file mode 100644 index 0000000..d0a565f --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Documentation~/README.md @@ -0,0 +1,4 @@ +# Code Editor Package for Visual Studio Code + +This package is not intended to be modified by users. +Nor does it provide any api intended to be included in user projects. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor.meta new file mode 100644 index 0000000..568fa03 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 58628227479c34542ac8c5193ccced84 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration.meta new file mode 100644 index 0000000..48ed36c --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c779d3735d950f341ba35154e8b3234b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/AssemblyNameProvider.cs b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/AssemblyNameProvider.cs new file mode 100644 index 0000000..43e0972 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/AssemblyNameProvider.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEditor.Compilation; + +namespace VSCodeEditor +{ + public interface IAssemblyNameProvider + { + string GetAssemblyNameFromScriptPath(string path); + IEnumerable GetAssemblies(Func shouldFileBePartOfSolution); + IEnumerable GetAllAssetPaths(); + UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath); + ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories); + } + + internal class AssemblyNameProvider : IAssemblyNameProvider + { + public string GetAssemblyNameFromScriptPath(string path) + { + return CompilationPipeline.GetAssemblyNameFromScriptPath(path); + } + + public IEnumerable GetAssemblies(Func shouldFileBePartOfSolution) + { + return CompilationPipeline.GetAssemblies() + .Where(i => 0 < i.sourceFiles.Length && i.sourceFiles.Any(shouldFileBePartOfSolution)); + } + + public IEnumerable GetAllAssetPaths() + { + return AssetDatabase.GetAllAssetPaths(); + } + + public UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath) + { + return UnityEditor.PackageManager.PackageInfo.FindForAssetPath(assetPath); + } + + public ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories) + { + return CompilationPipeline.ParseResponseFile( + responseFilePath, + projectDirectory, + systemReferenceDirectories + ); + } + } +} diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/AssemblyNameProvider.cs.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/AssemblyNameProvider.cs.meta new file mode 100644 index 0000000..a8ae38b --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/AssemblyNameProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1d93ffb668978f7488211a331977b73b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/FileIO.cs b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/FileIO.cs new file mode 100644 index 0000000..aeff22e --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/FileIO.cs @@ -0,0 +1,38 @@ +using System.IO; +using System.Text; + +namespace VSCodeEditor +{ + public interface IFileIO + { + bool Exists(string fileName); + + string ReadAllText(string fileName); + void WriteAllText(string fileName, string content); + + void CreateDirectory(string pathName); + } + + class FileIOProvider : IFileIO + { + public bool Exists(string fileName) + { + return File.Exists(fileName); + } + + public string ReadAllText(string fileName) + { + return File.ReadAllText(fileName); + } + + public void WriteAllText(string fileName, string content) + { + File.WriteAllText(fileName, content, Encoding.UTF8); + } + + public void CreateDirectory(string pathName) + { + Directory.CreateDirectory(pathName); + } + } +} diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/FileIO.cs.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/FileIO.cs.meta new file mode 100644 index 0000000..91d8212 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/FileIO.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb221cf55b3544646b0c3b6bc790080f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/GUIDGenerator.cs b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/GUIDGenerator.cs new file mode 100644 index 0000000..0654966 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/GUIDGenerator.cs @@ -0,0 +1,21 @@ +namespace VSCodeEditor +{ + public interface IGUIDGenerator + { + string ProjectGuid(string projectName, string assemblyName); + string SolutionGuid(string projectName, string extension); + } + + class GUIDProvider : IGUIDGenerator + { + public string ProjectGuid(string projectName, string assemblyName) + { + return SolutionGuidGenerator.GuidForProject(projectName + assemblyName); + } + + public string SolutionGuid(string projectName, string extension) + { + return SolutionGuidGenerator.GuidForSolution(projectName, extension); // GetExtensionOfSourceFiles(assembly.sourceFiles) + } + } +} diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/GUIDGenerator.cs.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/GUIDGenerator.cs.meta new file mode 100644 index 0000000..9ce342e --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/GUIDGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e58bd3cca6475e54b93632bb6837aeea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/ProjectGeneration.cs b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/ProjectGeneration.cs new file mode 100644 index 0000000..2ddb40b --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/ProjectGeneration.cs @@ -0,0 +1,779 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security; +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEditor.PackageManager; +using UnityEngine; +using UnityEngine.Profiling; + +namespace VSCodeEditor +{ + public interface IGenerator + { + bool SyncIfNeeded(IEnumerable affectedFiles, IEnumerable reimportedFiles); + void Sync(); + string SolutionFile(); + string ProjectDirectory { get; } + void GenerateAll(bool generateAll); + bool SolutionExists(); + } + + public class ProjectGeneration : IGenerator + { + enum ScriptingLanguage + { + None, + CSharp + } + + public static readonly string MSBuildNamespaceUri = "http://schemas.microsoft.com/developer/msbuild/2003"; + + const string k_WindowsNewline = "\r\n"; + + const string k_SettingsJson = @"{ + ""files.exclude"": + { + ""**/.DS_Store"":true, + ""**/.git"":true, + ""**/.gitignore"":true, + ""**/.gitmodules"":true, + ""**/*.booproj"":true, + ""**/*.pidb"":true, + ""**/*.suo"":true, + ""**/*.user"":true, + ""**/*.userprefs"":true, + ""**/*.unityproj"":true, + ""**/*.dll"":true, + ""**/*.exe"":true, + ""**/*.pdf"":true, + ""**/*.mid"":true, + ""**/*.midi"":true, + ""**/*.wav"":true, + ""**/*.gif"":true, + ""**/*.ico"":true, + ""**/*.jpg"":true, + ""**/*.jpeg"":true, + ""**/*.png"":true, + ""**/*.psd"":true, + ""**/*.tga"":true, + ""**/*.tif"":true, + ""**/*.tiff"":true, + ""**/*.3ds"":true, + ""**/*.3DS"":true, + ""**/*.fbx"":true, + ""**/*.FBX"":true, + ""**/*.lxo"":true, + ""**/*.LXO"":true, + ""**/*.ma"":true, + ""**/*.MA"":true, + ""**/*.obj"":true, + ""**/*.OBJ"":true, + ""**/*.asset"":true, + ""**/*.cubemap"":true, + ""**/*.flare"":true, + ""**/*.mat"":true, + ""**/*.meta"":true, + ""**/*.prefab"":true, + ""**/*.unity"":true, + ""build/"":true, + ""Build/"":true, + ""Library/"":true, + ""library/"":true, + ""obj/"":true, + ""Obj/"":true, + ""ProjectSettings/"":true, + ""temp/"":true, + ""Temp/"":true + } +}"; + + /// + /// Map source extensions to ScriptingLanguages + /// + static readonly Dictionary k_BuiltinSupportedExtensions = new Dictionary + { + { "cs", ScriptingLanguage.CSharp }, + { "uxml", ScriptingLanguage.None }, + { "uss", ScriptingLanguage.None }, + { "shader", ScriptingLanguage.None }, + { "compute", ScriptingLanguage.None }, + { "cginc", ScriptingLanguage.None }, + { "hlsl", ScriptingLanguage.None }, + { "glslinc", ScriptingLanguage.None }, + { "template", ScriptingLanguage.None }, + { "raytrace", ScriptingLanguage.None } + }; + + string m_SolutionProjectEntryTemplate = string.Join("\r\n", @"Project(""{{{0}}}"") = ""{1}"", ""{2}"", ""{{{3}}}""", @"EndProject").Replace(" ", "\t"); + + string m_SolutionProjectConfigurationTemplate = string.Join("\r\n", @" {{{0}}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU", @" {{{0}}}.Debug|Any CPU.Build.0 = Debug|Any CPU", @" {{{0}}}.Release|Any CPU.ActiveCfg = Release|Any CPU", @" {{{0}}}.Release|Any CPU.Build.0 = Release|Any CPU").Replace(" ", "\t"); + + static readonly string[] k_ReimportSyncExtensions = { ".dll", ".asmdef" }; + + /// + /// Map ScriptingLanguages to project extensions + /// + /*static readonly Dictionary k_ProjectExtensions = new Dictionary + { + { ScriptingLanguage.CSharp, ".csproj" }, + { ScriptingLanguage.None, ".csproj" }, + };*/ + static readonly Regex k_ScriptReferenceExpression = new Regex( + @"^Library.ScriptAssemblies.(?(?.*)\.dll$)", + RegexOptions.Compiled | RegexOptions.IgnoreCase); + + string[] m_ProjectSupportedExtensions = new string[0]; + public string ProjectDirectory { get; } + bool m_ShouldGenerateAll; + + public void GenerateAll(bool generateAll) + { + m_ShouldGenerateAll = generateAll; + } + + readonly string m_ProjectName; + readonly IAssemblyNameProvider m_AssemblyNameProvider; + readonly IFileIO m_FileIOProvider; + readonly IGUIDGenerator m_GUIDProvider; + + const string k_ToolsVersion = "4.0"; + const string k_ProductVersion = "10.0.20506"; + const string k_BaseDirectory = "."; + const string k_TargetFrameworkVersion = "v4.7.1"; + const string k_TargetLanguageVersion = "latest"; + + public ProjectGeneration(string tempDirectory) + : this(tempDirectory, new AssemblyNameProvider(), new FileIOProvider(), new GUIDProvider()) { } + + public ProjectGeneration(string tempDirectory, IAssemblyNameProvider assemblyNameProvider, IFileIO fileIO, IGUIDGenerator guidGenerator) + { + ProjectDirectory = tempDirectory.Replace('\\', '/'); + m_ProjectName = Path.GetFileName(ProjectDirectory); + m_AssemblyNameProvider = assemblyNameProvider; + m_FileIOProvider = fileIO; + m_GUIDProvider = guidGenerator; + } + + /// + /// Syncs the scripting solution if any affected files are relevant. + /// + /// + /// Whether the solution was synced. + /// + /// + /// A set of files whose status has changed + /// + /// + /// A set of files that got reimported + /// + public bool SyncIfNeeded(IEnumerable affectedFiles, IEnumerable reimportedFiles) + { + Profiler.BeginSample("SolutionSynchronizerSync"); + SetupProjectSupportedExtensions(); + + // Don't sync if we haven't synced before + if (SolutionExists() && HasFilesBeenModified(affectedFiles, reimportedFiles)) + { + Sync(); + + Profiler.EndSample(); + return true; + } + + Profiler.EndSample(); + return false; + } + + bool HasFilesBeenModified(IEnumerable affectedFiles, IEnumerable reimportedFiles) + { + return affectedFiles.Any(ShouldFileBePartOfSolution) || reimportedFiles.Any(ShouldSyncOnReimportedAsset); + } + + static bool ShouldSyncOnReimportedAsset(string asset) + { + return k_ReimportSyncExtensions.Contains(new FileInfo(asset).Extension); + } + + public void Sync() + { + SetupProjectSupportedExtensions(); + GenerateAndWriteSolutionAndProjects(); + } + + public bool SolutionExists() + { + return m_FileIOProvider.Exists(SolutionFile()); + } + + void SetupProjectSupportedExtensions() + { + m_ProjectSupportedExtensions = EditorSettings.projectGenerationUserExtensions; + } + + bool ShouldFileBePartOfSolution(string file) + { + string extension = Path.GetExtension(file); + + // Exclude files coming from packages except if they are internalized. + if (!m_ShouldGenerateAll && IsInternalizedPackagePath(file)) + { + return false; + } + + // Dll's are not scripts but still need to be included.. + if (extension == ".dll") + return true; + + if (file.ToLower().EndsWith(".asmdef")) + return true; + + return IsSupportedExtension(extension); + } + + bool IsSupportedExtension(string extension) + { + extension = extension.TrimStart('.'); + if (k_BuiltinSupportedExtensions.ContainsKey(extension)) + return true; + if (m_ProjectSupportedExtensions.Contains(extension)) + return true; + return false; + } + + static ScriptingLanguage ScriptingLanguageFor(Assembly island) + { + return ScriptingLanguageFor(GetExtensionOfSourceFiles(island.sourceFiles)); + } + + static string GetExtensionOfSourceFiles(string[] files) + { + return files.Length > 0 ? GetExtensionOfSourceFile(files[0]) : "NA"; + } + + static string GetExtensionOfSourceFile(string file) + { + var ext = Path.GetExtension(file).ToLower(); + ext = ext.Substring(1); //strip dot + return ext; + } + + static ScriptingLanguage ScriptingLanguageFor(string extension) + { + return k_BuiltinSupportedExtensions.TryGetValue(extension.TrimStart('.'), out var result) + ? result + : ScriptingLanguage.None; + } + + public void GenerateAndWriteSolutionAndProjects() + { + // Only synchronize islands that have associated source files and ones that we actually want in the project. + // This also filters out DLLs coming from .asmdef files in packages. + var assemblies = m_AssemblyNameProvider.GetAssemblies(ShouldFileBePartOfSolution); + + var allAssetProjectParts = GenerateAllAssetProjectParts(); + + SyncSolution(assemblies); + var allProjectIslands = RelevantIslandsForMode(assemblies).ToList(); + foreach (Assembly assembly in allProjectIslands) + { + var responseFileData = ParseResponseFileData(assembly); + SyncProject(assembly, allAssetProjectParts, responseFileData, allProjectIslands); + } + + WriteVSCodeSettingsFiles(); + } + + IEnumerable ParseResponseFileData(Assembly assembly) + { + var systemReferenceDirectories = CompilationPipeline.GetSystemAssemblyDirectories(assembly.compilerOptions.ApiCompatibilityLevel); + + Dictionary responseFilesData = assembly.compilerOptions.ResponseFiles.ToDictionary(x => x, x => m_AssemblyNameProvider.ParseResponseFile( + x, + ProjectDirectory, + systemReferenceDirectories + )); + + Dictionary responseFilesWithErrors = responseFilesData.Where(x => x.Value.Errors.Any()) + .ToDictionary(x => x.Key, x => x.Value); + + if (responseFilesWithErrors.Any()) + { + foreach (var error in responseFilesWithErrors) + foreach (var valueError in error.Value.Errors) + { + Debug.LogError($"{error.Key} Parse Error : {valueError}"); + } + } + + return responseFilesData.Select(x => x.Value); + } + + Dictionary GenerateAllAssetProjectParts() + { + Dictionary stringBuilders = new Dictionary(); + + foreach (string asset in m_AssemblyNameProvider.GetAllAssetPaths()) + { + // Exclude files coming from packages except if they are internalized. + // TODO: We need assets from the assembly API + if (!m_ShouldGenerateAll && IsInternalizedPackagePath(asset)) + { + continue; + } + + string extension = Path.GetExtension(asset); + if (IsSupportedExtension(extension) && ScriptingLanguage.None == ScriptingLanguageFor(extension)) + { + // Find assembly the asset belongs to by adding script extension and using compilation pipeline. + var assemblyName = m_AssemblyNameProvider.GetAssemblyNameFromScriptPath(asset + ".cs"); + + if (string.IsNullOrEmpty(assemblyName)) + { + continue; + } + + assemblyName = Utility.FileNameWithoutExtension(assemblyName); + + if (!stringBuilders.TryGetValue(assemblyName, out var projectBuilder)) + { + projectBuilder = new StringBuilder(); + stringBuilders[assemblyName] = projectBuilder; + } + + projectBuilder.Append(" ").Append(k_WindowsNewline); + } + } + + var result = new Dictionary(); + + foreach (var entry in stringBuilders) + result[entry.Key] = entry.Value.ToString(); + + return result; + } + + bool IsInternalizedPackagePath(string file) + { + if (string.IsNullOrWhiteSpace(file)) + { + return false; + } + + var packageInfo = m_AssemblyNameProvider.FindForAssetPath(file); + if (packageInfo == null) + { + return false; + } + + var packageSource = packageInfo.source; + return packageSource != PackageSource.Embedded && packageSource != PackageSource.Local; + } + + void SyncProject( + Assembly island, + Dictionary allAssetsProjectParts, + IEnumerable responseFilesData, + List allProjectIslands) + { + SyncProjectFileIfNotChanged(ProjectFile(island), ProjectText(island, allAssetsProjectParts, responseFilesData, allProjectIslands)); + } + + void SyncProjectFileIfNotChanged(string path, string newContents) + { + SyncFileIfNotChanged(path, newContents); + } + + void SyncSolutionFileIfNotChanged(string path, string newContents) + { + SyncFileIfNotChanged(path, newContents); + } + + void SyncFileIfNotChanged(string filename, string newContents) + { + if (m_FileIOProvider.Exists(filename)) + { + var currentContents = m_FileIOProvider.ReadAllText(filename); + + if (currentContents == newContents) + { + return; + } + } + + m_FileIOProvider.WriteAllText(filename, newContents); + } + + string ProjectText( + Assembly assembly, + Dictionary allAssetsProjectParts, + IEnumerable responseFilesData, + List allProjectIslands) + { + var projectBuilder = new StringBuilder(ProjectHeader(assembly, responseFilesData)); + var references = new List(); + var projectReferences = new List(); + + foreach (string file in assembly.sourceFiles) + { + if (!ShouldFileBePartOfSolution(file)) + continue; + + var extension = Path.GetExtension(file).ToLower(); + var fullFile = EscapedRelativePathFor(file); + if (".dll" != extension) + { + projectBuilder.Append(" ").Append(k_WindowsNewline); + } + else + { + references.Add(fullFile); + } + } + + // Append additional non-script files that should be included in project generation. + if (allAssetsProjectParts.TryGetValue(assembly.name, out var additionalAssetsForProject)) + projectBuilder.Append(additionalAssetsForProject); + + var islandRefs = references.Union(assembly.allReferences); + + foreach (string reference in islandRefs) + { + var match = k_ScriptReferenceExpression.Match(reference); + if (match.Success) + { + // assume csharp language + // Add a reference to a project except if it's a reference to a script assembly + // that we are not generating a project for. This will be the case for assemblies + // coming from .assembly.json files in non-internalized packages. + var dllName = match.Groups["dllname"].Value; + if (allProjectIslands.Any(i => Path.GetFileName(i.outputPath) == dllName)) + { + projectReferences.Add(match); + continue; + } + } + + string fullReference = Path.IsPathRooted(reference) ? reference : Path.Combine(ProjectDirectory, reference); + + AppendReference(fullReference, projectBuilder); + } + + var responseRefs = responseFilesData.SelectMany(x => x.FullPathReferences.Select(r => r)); + foreach (var reference in responseRefs) + { + AppendReference(reference, projectBuilder); + } + + if (0 < projectReferences.Count) + { + projectBuilder.AppendLine(" "); + projectBuilder.AppendLine(" "); + foreach (Match reference in projectReferences) + { + var referencedProject = reference.Groups["project"].Value; + + projectBuilder.Append(" ").Append(k_WindowsNewline); + projectBuilder.Append(" {").Append(ProjectGuid(Path.Combine("Temp", reference.Groups["project"].Value + ".dll"))).Append("}").Append(k_WindowsNewline); + projectBuilder.Append(" ").Append(referencedProject).Append("").Append(k_WindowsNewline); + projectBuilder.AppendLine(" "); + } + } + + projectBuilder.Append(ProjectFooter()); + return projectBuilder.ToString(); + } + + static void AppendReference(string fullReference, StringBuilder projectBuilder) + { + //replace \ with / and \\ with / + var escapedFullPath = SecurityElement.Escape(fullReference); + escapedFullPath = escapedFullPath.Replace("\\", "/"); + escapedFullPath = escapedFullPath.Replace("\\\\", "/"); + projectBuilder.Append(" ").Append(k_WindowsNewline); + projectBuilder.Append(" ").Append(escapedFullPath).Append("").Append(k_WindowsNewline); + projectBuilder.Append(" ").Append(k_WindowsNewline); + } + + public string ProjectFile(Assembly assembly) + { + var fileBuilder = new StringBuilder(assembly.name); + + // if (!assembly.flags.HasFlag(AssemblyFlags.EditorAssembly) && m_PlayerAssemblies.Contains(assembly)) + // { + // fileBuilder.Append("-player"); + // } + fileBuilder.Append(".csproj"); + return Path.Combine(ProjectDirectory, fileBuilder.ToString()); + } + + public string SolutionFile() + { + return Path.Combine(ProjectDirectory, $"{m_ProjectName}.sln"); + } + + string ProjectHeader( + Assembly assembly, + IEnumerable responseFilesData + ) + { + // TODO: .Concat(EditorUserBuildSettings.activeScriptCompilationDefines) + var arguments = new object[] + { + k_ToolsVersion, + k_ProductVersion, + ProjectGuid(assembly.name), + string.Join(";", new[] { "DEBUG", "TRACE" }.Concat(assembly.defines).Concat(responseFilesData.SelectMany(x => x.Defines)).Distinct().ToArray()), + MSBuildNamespaceUri, + assembly.name, + EditorSettings.projectGenerationRootNamespace, + k_TargetFrameworkVersion, + k_TargetLanguageVersion, + k_BaseDirectory, + assembly.compilerOptions.AllowUnsafeCode | responseFilesData.Any(x => x.Unsafe) + }; + + try + { + return string.Format(GetProjectHeaderTemplate(), arguments); + } + catch (Exception) + { + throw new NotSupportedException("Failed creating c# project because the c# project header did not have the correct amount of arguments, which is " + arguments.Length); + } + } + + static string GetSolutionText() + { + return string.Join("\r\n", @"", @"Microsoft Visual Studio Solution File, Format Version {0}", @"# Visual Studio {1}", @"{2}", @"Global", @" GlobalSection(SolutionConfigurationPlatforms) = preSolution", @" Debug|Any CPU = Debug|Any CPU", @" Release|Any CPU = Release|Any CPU", @" EndGlobalSection", @" GlobalSection(ProjectConfigurationPlatforms) = postSolution", @"{3}", @" EndGlobalSection", @" GlobalSection(SolutionProperties) = preSolution", @" HideSolutionNode = FALSE", @" EndGlobalSection", @"EndGlobal", @"").Replace(" ", "\t"); + } + + static string GetProjectFooterTemplate() + { + return string.Join("\r\n", @" ", @" ", @" ", @"", @""); + } + + static string GetProjectHeaderTemplate() + { + var header = new[] + { + @"", + @"", + @" ", + @" {8}", + @" ", + @" ", + @" Debug", + @" AnyCPU", + @" {1}", + @" 2.0", + @" {6}", + @" {{{2}}}", + @" Library", + @" Properties", + @" {5}", + @" {7}", + @" 512", + @" {9}", + @" ", + @" ", + @" true", + @" full", + @" false", + @" Temp\bin\Debug\", + @" {3}", + @" prompt", + @" 4", + @" 0169", + @" {10}", + @" ", + @" ", + @" pdbonly", + @" true", + @" Temp\bin\Release\", + @" prompt", + @" 4", + @" 0169", + @" {10}", + @" " + }; + + var forceExplicitReferences = new[] + { + @" ", + @" true", + @" true", + @" false", + @" false", + @" false", + @" " + }; + + var itemGroupStart = new[] + { + @" ", + @"" + }; + + var text = header.Concat(forceExplicitReferences).Concat(itemGroupStart).ToArray(); + return string.Join("\r\n", text); + } + + void SyncSolution(IEnumerable islands) + { + SyncSolutionFileIfNotChanged(SolutionFile(), SolutionText(islands)); + } + + string SolutionText(IEnumerable islands) + { + var fileversion = "11.00"; + var vsversion = "2010"; + + var relevantIslands = RelevantIslandsForMode(islands); + string projectEntries = GetProjectEntries(relevantIslands); + string projectConfigurations = string.Join(k_WindowsNewline, relevantIslands.Select(i => GetProjectActiveConfigurations(ProjectGuid(i.name))).ToArray()); + return string.Format(GetSolutionText(), fileversion, vsversion, projectEntries, projectConfigurations); + } + + static IEnumerable RelevantIslandsForMode(IEnumerable islands) + { + IEnumerable relevantIslands = islands.Where(i => ScriptingLanguage.CSharp == ScriptingLanguageFor(i)); + return relevantIslands; + } + + /// + /// Get a Project("{guid}") = "MyProject", "MyProject.csproj", "{projectguid}" + /// entry for each relevant language + /// + string GetProjectEntries(IEnumerable islands) + { + var projectEntries = islands.Select(i => string.Format( + m_SolutionProjectEntryTemplate, + SolutionGuid(i), + i.name, + Path.GetFileName(ProjectFile(i)), + ProjectGuid(i.name) + )); + + return string.Join(k_WindowsNewline, projectEntries.ToArray()); + } + + /// + /// Generate the active configuration string for a given project guid + /// + string GetProjectActiveConfigurations(string projectGuid) + { + return string.Format( + m_SolutionProjectConfigurationTemplate, + projectGuid); + } + + string EscapedRelativePathFor(string file) + { + var projectDir = ProjectDirectory.Replace('/', '\\'); + file = file.Replace('/', '\\'); + var path = SkipPathPrefix(file, projectDir); + + var packageInfo = m_AssemblyNameProvider.FindForAssetPath(path.Replace('\\', '/')); + if (packageInfo != null) + { + // We have to normalize the path, because the PackageManagerRemapper assumes + // dir seperators will be os specific. + var absolutePath = Path.GetFullPath(NormalizePath(path)).Replace('/', '\\'); + path = SkipPathPrefix(absolutePath, projectDir); + } + + return SecurityElement.Escape(path); + } + + static string SkipPathPrefix(string path, string prefix) + { + if (path.StartsWith($@"{prefix}\")) + return path.Substring(prefix.Length + 1); + return path; + } + + static string NormalizePath(string path) + { + if (Path.DirectorySeparatorChar == '\\') + return path.Replace('/', Path.DirectorySeparatorChar); + return path.Replace('\\', Path.DirectorySeparatorChar); + } + + string ProjectGuid(string assembly) + { + return m_GUIDProvider.ProjectGuid(m_ProjectName, assembly); + } + + string SolutionGuid(Assembly island) + { + return m_GUIDProvider.SolutionGuid(m_ProjectName, GetExtensionOfSourceFiles(island.sourceFiles)); + } + + static string ProjectFooter() + { + return GetProjectFooterTemplate(); + } + + static string GetProjectExtension() + { + return ".csproj"; + } + + void WriteVSCodeSettingsFiles() + { + var vsCodeDirectory = Path.Combine(ProjectDirectory, ".vscode"); + + if (!m_FileIOProvider.Exists(vsCodeDirectory)) + m_FileIOProvider.CreateDirectory(vsCodeDirectory); + + var vsCodeSettingsJson = Path.Combine(vsCodeDirectory, "settings.json"); + + if (!m_FileIOProvider.Exists(vsCodeSettingsJson)) + m_FileIOProvider.WriteAllText(vsCodeSettingsJson, k_SettingsJson); + } + } + + public static class SolutionGuidGenerator + { + public static string GuidForProject(string projectName) + { + return ComputeGuidHashFor(projectName + "salt"); + } + + public static string GuidForSolution(string projectName, string sourceFileExtension) + { + if (sourceFileExtension.ToLower() == "cs") + + // GUID for a C# class library: http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs + return "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC"; + + return ComputeGuidHashFor(projectName); + } + + static string ComputeGuidHashFor(string input) + { + var hash = MD5.Create().ComputeHash(Encoding.Default.GetBytes(input)); + return HashAsGuid(HashToString(hash)); + } + + static string HashAsGuid(string hash) + { + var guid = hash.Substring(0, 8) + "-" + hash.Substring(8, 4) + "-" + hash.Substring(12, 4) + "-" + hash.Substring(16, 4) + "-" + hash.Substring(20, 12); + return guid.ToUpper(); + } + + static string HashToString(byte[] bs) + { + var sb = new StringBuilder(); + foreach (byte b in bs) + sb.Append(b.ToString("x2")); + return sb.ToString(); + } + } +} diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/ProjectGeneration.cs.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/ProjectGeneration.cs.meta new file mode 100644 index 0000000..5039705 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/ProjectGeneration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 97d6c87381e3e51488b49f5891490b70 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Unity.com.unity.vscode.Editor.asmdef b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Unity.com.unity.vscode.Editor.asmdef new file mode 100644 index 0000000..032da7c --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Unity.com.unity.vscode.Editor.asmdef @@ -0,0 +1,9 @@ +{ + "name": "Unity.VSCode.Editor", + "references": [], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [] +} diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Unity.com.unity.vscode.Editor.asmdef.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Unity.com.unity.vscode.Editor.asmdef.meta new file mode 100644 index 0000000..4c94f56 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Unity.com.unity.vscode.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8b845b123ab418448a8be2935fa804e0 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Utility.cs b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Utility.cs new file mode 100644 index 0000000..06d93e1 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Utility.cs @@ -0,0 +1,36 @@ +namespace VSCodeEditor +{ + public static class Utility + { + public static string FileNameWithoutExtension(string path) + { + if (string.IsNullOrEmpty(path)) + { + return ""; + } + + var indexOfDot = -1; + var indexOfSlash = 0; + for (var i = path.Length - 1; i >= 0; i--) + { + if (indexOfDot == -1 && path[i] == '.') + { + indexOfDot = i; + } + + if (indexOfSlash == 0 && path[i] == '/' || path[i] == '\\') + { + indexOfSlash = i + 1; + break; + } + } + + if (indexOfDot == -1) + { + indexOfDot = path.Length; + } + + return path.Substring(indexOfSlash, indexOfDot - indexOfSlash); + } + } +} diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Utility.cs.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Utility.cs.meta new file mode 100644 index 0000000..3c27829 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Utility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ac677c5ece15b443b2aaf7fae5842f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeDiscovery.cs b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeDiscovery.cs new file mode 100644 index 0000000..609d2cd --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeDiscovery.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Unity.CodeEditor; + +namespace VSCodeEditor +{ + public interface IDiscovery + { + CodeEditor.Installation[] PathCallback(); + } + + public class VSCodeDiscovery : IDiscovery + { + List m_Installations; + + public CodeEditor.Installation[] PathCallback() + { + if (m_Installations == null) + { + m_Installations = new List(); + FindInstallationPaths(); + } + + return m_Installations.ToArray(); + } + + void FindInstallationPaths() + { + string[] possiblePaths = +#if UNITY_EDITOR_OSX + { + "/Applications/Visual Studio Code.app", + "/Applications/Visual Studio Code - Insiders.app" + }; +#elif UNITY_EDITOR_WIN + { + GetProgramFiles() + @"/Microsoft VS Code/bin/code.cmd", + GetProgramFiles() + @"/Microsoft VS Code/Code.exe", + GetProgramFiles() + @"/Microsoft VS Code Insiders/bin/code-insiders.cmd", + GetProgramFiles() + @"/Microsoft VS Code Insiders/Code.exe", + GetLocalAppData() + @"/Programs/Microsoft VS Code/bin/code.cmd", + GetLocalAppData() + @"/Programs/Microsoft VS Code/Code.exe", + GetLocalAppData() + @"/Programs/Microsoft VS Code Insiders/bin/code-insiders.cmd", + GetLocalAppData() + @"/Programs/Microsoft VS Code Insiders/Code.exe", + }; +#else + { + "/usr/bin/code", + "/bin/code", + "/usr/local/bin/code", + "/var/lib/flatpak/exports/bin/com.visualstudio.code", + "/snap/current/bin/code" + }; +#endif + var existingPaths = possiblePaths.Where(VSCodeExists).ToList(); + if (!existingPaths.Any()) + { + return; + } + + var lcp = GetLongestCommonPrefix(existingPaths); + switch (existingPaths.Count) + { + case 1: + { + var path = existingPaths.First(); + m_Installations = new List + { + new CodeEditor.Installation + { + Path = path, + Name = path.Contains("Insiders") + ? "Visual Studio Code Insiders" + : "Visual Studio Code" + } + }; + break; + } + case 2 when existingPaths.Any(path => !(path.Substring(lcp.Length).Contains("/") || path.Substring(lcp.Length).Contains("\\"))): + { + goto case 1; + } + default: + { + m_Installations = existingPaths.Select(path => new CodeEditor.Installation + { + Name = $"Visual Studio Code Insiders ({path.Substring(lcp.Length)})", + Path = path + }).ToList(); + + break; + } + } + } + +#if UNITY_EDITOR_WIN + static string GetProgramFiles() + { + return Environment.GetEnvironmentVariable("ProgramFiles")?.Replace("\\", "/"); + } + + static string GetLocalAppData() + { + return Environment.GetEnvironmentVariable("LOCALAPPDATA")?.Replace("\\", "/"); + } +#endif + + static string GetLongestCommonPrefix(List paths) + { + var baseLength = paths.First().Length; + for (var pathIndex = 1; pathIndex < paths.Count; pathIndex++) + { + baseLength = Math.Min(baseLength, paths[pathIndex].Length); + for (var i = 0; i < baseLength; i++) + { + if (paths[pathIndex][i] == paths[0][i]) continue; + + baseLength = i; + break; + } + } + + return paths[0].Substring(0, baseLength); + } + + static bool VSCodeExists(string path) + { +#if UNITY_EDITOR_OSX + return System.IO.Directory.Exists(path); +#else + return new FileInfo(path).Exists; +#endif + } + } +} diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeDiscovery.cs.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeDiscovery.cs.meta new file mode 100644 index 0000000..cbeca1b --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeDiscovery.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 380f7372e785c7d408552e2c760d269d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeScriptEditor.cs b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeScriptEditor.cs new file mode 100644 index 0000000..5332623 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeScriptEditor.cs @@ -0,0 +1,257 @@ +using System; +using System.IO; +using System.Linq; +using System.Diagnostics; +using UnityEditor; +using UnityEngine; +using Unity.CodeEditor; + +namespace VSCodeEditor +{ + [InitializeOnLoad] + public class VSCodeScriptEditor : IExternalCodeEditor + { + const string vscode_argument = "vscode_arguments"; + const string vscode_generate_all = "unity_generate_all_csproj"; + const string vscode_extension = "vscode_userExtensions"; + static readonly GUIContent k_ResetArguments = EditorGUIUtility.TrTextContent("Reset argument"); + string m_Arguments; + + IDiscovery m_Discoverability; + IGenerator m_ProjectGeneration; + + static readonly string[] k_SupportedFileNames = { "code.exe", "visualstudiocode.app", "visualstudiocode-insiders.app", "vscode.app", "code.app", "code.cmd", "code-insiders.cmd", "code", "com.visualstudio.code" }; + + static bool IsOSX => Application.platform == RuntimePlatform.OSXEditor; + + static string DefaultApp => EditorPrefs.GetString("kScriptsDefaultApp"); + + static string DefaultArgument { get; } = "\"$(ProjectPath)\" -g \"$(File)\":$(Line):$(Column)"; + + string Arguments + { + get => m_Arguments ?? (m_Arguments = EditorPrefs.GetString(vscode_argument, DefaultArgument)); + set + { + m_Arguments = value; + EditorPrefs.SetString(vscode_argument, value); + } + } + + static string[] defaultExtensions + { + get + { + var customExtensions = new[] { "json", "asmdef", "log" }; + return EditorSettings.projectGenerationBuiltinExtensions + .Concat(EditorSettings.projectGenerationUserExtensions) + .Concat(customExtensions) + .Distinct().ToArray(); + } + } + + static string[] HandledExtensions + { + get + { + return HandledExtensionsString + .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) + .Select(s => s.TrimStart('.', '*')) + .ToArray(); + } + } + + static string HandledExtensionsString + { + get => EditorPrefs.GetString(vscode_extension, string.Join(";", defaultExtensions)); + set => EditorPrefs.SetString(vscode_extension, value); + } + + public bool TryGetInstallationForPath(string editorPath, out CodeEditor.Installation installation) + { + var lowerCasePath = editorPath.ToLower(); + var filename = Path.GetFileName(lowerCasePath).Replace(" ", ""); + var installations = Installations; + if (!k_SupportedFileNames.Contains(filename)) + { + installation = default; + return false; + } + + if (!installations.Any()) + { + installation = new CodeEditor.Installation + { + Name = "Visual Studio Code", + Path = editorPath + }; + } + else + { + try + { + installation = installations.First(inst => inst.Path == editorPath); + } + catch (InvalidOperationException) + { + installation = new CodeEditor.Installation + { + Name = "Visual Studio Code", + Path = editorPath + }; + } + } + + return true; + } + + public void OnGUI() + { + Arguments = EditorGUILayout.TextField("External Script Editor Args", Arguments); + if (GUILayout.Button(k_ResetArguments, GUILayout.Width(120))) + { + Arguments = DefaultArgument; + } + + var prevGenerate = EditorPrefs.GetBool(vscode_generate_all, false); + + var generateAll = EditorGUILayout.Toggle("Generate all .csproj files.", prevGenerate); + if (generateAll != prevGenerate) + { + EditorPrefs.SetBool(vscode_generate_all, generateAll); + } + + m_ProjectGeneration.GenerateAll(generateAll); + + HandledExtensionsString = EditorGUILayout.TextField(new GUIContent("Extensions handled: "), HandledExtensionsString); + } + + public void CreateIfDoesntExist() + { + if (!m_ProjectGeneration.SolutionExists()) + { + m_ProjectGeneration.Sync(); + } + } + + public void SyncIfNeeded(string[] addedFiles, string[] deletedFiles, string[] movedFiles, string[] movedFromFiles, string[] importedFiles) + { + m_ProjectGeneration.SyncIfNeeded(addedFiles.Union(deletedFiles).Union(movedFiles).Union(movedFromFiles), importedFiles); + } + + public void SyncAll() + { + AssetDatabase.Refresh(); + m_ProjectGeneration.Sync(); + } + + public bool OpenProject(string path, int line, int column) + { + if (path != "" && !SupportsExtension(path)) // Assets - Open C# Project passes empty path here + { + return false; + } + + if (line == -1) + line = 1; + if (column == -1) + column = 0; + + string arguments; + if (Arguments != DefaultArgument) + { + arguments = m_ProjectGeneration.ProjectDirectory != path + ? CodeEditor.ParseArgument(Arguments, path, line, column) + : m_ProjectGeneration.ProjectDirectory; + } + else + { + arguments = $@"""{m_ProjectGeneration.ProjectDirectory}"""; + if (m_ProjectGeneration.ProjectDirectory != path && path.Length != 0) + { + arguments += $@" -g ""{path}"":{line}:{column}"; + } + } + + if (IsOSX) + { + return OpenOSX(arguments); + } + + var app = DefaultApp; + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = app, + Arguments = arguments, + WindowStyle = app.EndsWith(".cmd", StringComparison.OrdinalIgnoreCase) ? ProcessWindowStyle.Hidden : ProcessWindowStyle.Normal, + CreateNoWindow = true, + UseShellExecute = true, + } + }; + + process.Start(); + return true; + } + + static bool OpenOSX(string arguments) + { + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "open", + Arguments = $"-n \"{DefaultApp}\" --args {arguments}", + UseShellExecute = true, + } + }; + + process.Start(); + return true; + } + + static bool SupportsExtension(string path) + { + var extension = Path.GetExtension(path); + if (string.IsNullOrEmpty(extension)) + return false; + return HandledExtensions.Contains(extension.TrimStart('.')); + } + + public CodeEditor.Installation[] Installations => m_Discoverability.PathCallback(); + + public VSCodeScriptEditor(IDiscovery discovery, IGenerator projectGeneration) + { + m_Discoverability = discovery; + m_ProjectGeneration = projectGeneration; + } + + static VSCodeScriptEditor() + { + var editor = new VSCodeScriptEditor(new VSCodeDiscovery(), new ProjectGeneration(Directory.GetParent(Application.dataPath).FullName)); + CodeEditor.Register(editor); + + if (IsVSCodeInstallation(CodeEditor.CurrentEditorInstallation)) + { + editor.CreateIfDoesntExist(); + } + } + + static bool IsVSCodeInstallation(string path) + { + if (string.IsNullOrEmpty(path)) + { + return false; + } + + var lowerCasePath = path.ToLower(); + var filename = Path + .GetFileName(lowerCasePath.Replace('\\', Path.DirectorySeparatorChar).Replace('/', Path.DirectorySeparatorChar)) + .Replace(" ", ""); + return k_SupportedFileNames.Contains(filename); + } + + public void Initialize(string editorInstallationPath) { } + } +} diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeScriptEditor.cs.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeScriptEditor.cs.meta new file mode 100644 index 0000000..a0aa5a4 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeScriptEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac3f13489022aa34d861a0320a6917b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/LICENSE.md b/Library/PackageCache/com.unity.ide.vscode@1.1.3/LICENSE.md new file mode 100644 index 0000000..eb18dfb --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Unity Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/LICENSE.md.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/LICENSE.md.meta new file mode 100644 index 0000000..1c1e96e --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c9aabac5924106d4790d7b3a924ca34d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/package.json b/Library/PackageCache/com.unity.ide.vscode@1.1.3/package.json new file mode 100644 index 0000000..6f1d502 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/package.json @@ -0,0 +1,17 @@ +{ + "name": "com.unity.ide.vscode", + "displayName": "Visual Studio Code Editor", + "description": "Code editor integration for supporting Visual Studio Code as code editor for unity. Adds support for generating csproj files for intellisense purposes, auto discovery of installations, etc.", + "version": "1.1.3", + "unity": "2019.2", + "unityRelease": "0a12", + "dependencies": {}, + "relatedPackages": { + "com.unity.ide.vscode.tests": "1.1.3" + }, + "repository": { + "type": "git", + "url": "git@github.cds.internal.unity3d.com:unity/com.unity.ide.vscode.git", + "revision": "7509767be271ef8ccdfaf82ea0fb71162a971d43" + } +} diff --git a/Library/PackageCache/com.unity.ide.vscode@1.1.3/package.json.meta b/Library/PackageCache/com.unity.ide.vscode@1.1.3/package.json.meta new file mode 100644 index 0000000..8e83539 --- /dev/null +++ b/Library/PackageCache/com.unity.ide.vscode@1.1.3/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ffc6271f08270b64ca0aae9c49235d81 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/CHANGELOG.md b/Library/PackageCache/com.unity.test-framework@1.1.3/CHANGELOG.md new file mode 100644 index 0000000..3d6c75f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/CHANGELOG.md @@ -0,0 +1,80 @@ +# Changelog +## [1.1.3] - 2019-09-23 +- Fixed a regression where tests in a player would report a timeout after a test run is finished. +- Made it possible for the ui to change its test items when the test tree changes without script compilation. +- Added syncronious runs as an option to the TestRunnerApi. + +## [1.1.2] - 2019-09-11 +- Fixed an issue where Run Selected would run all tests in the category, if a category filter was selected, regardless of what tests were selected. +- Unsupported attributes used in UnityTests now give an explicit error. +- Added support for the Repeat and Retry attributes in UnityTests (case 1131940). +- Tests with a explicit timeout higher than 10 minutes, no longer times out after running longer than 10 minutes when running from command line (case 1125991). +- Fixed a performance regression in the test runner api result reporting, introduced in 2018.3 (case 1109865). +- Fixed an issue where parameterized test fixtures would not run if selected in the test tree (case 1092244). +- Pressing Clear Results now also correctly clears the counters on the test list (case 1181763). +- Prebuild setup now handles errors logged with Debug.LogError and stops the run if any is logged (case 1115240). It now also supports LogAssert.Expect. + +## [1.1.1] - 2019-08-07 +- Tests retrieved as a test list with the test runner api incorrectly showed both mode as their TestMode. +- Fixed a compatibility issue with running tests from rider. + +## [1.1.0] - 2019-07-30 +- Introduced the TestRunnerApi for running tests programmatically from elsewhere inside the Editor. +- Introduced yield instructions for recompiling scripts and awaiting a domain reload in Edit Mode tests. +- Added a button to the Test Runner UI for clearing the results. + +## [1.0.18] - 2019-07-15 +- Included new full documentation of the test framework. + +## [1.0.17] - 2019-07-11 +- Fixed an issue where the Test Runner window wouldn’t frame selected items after search filter is cleared. +- Fixed a regression where playmode test application on the IOS platform would not quit after the tests are done. + +## [1.0.16] - 2019-06-20 +- Fixed an issue where the Test Runner window popped out if it was docked, or if something else was docked next to it, when re-opened (case 1158961) +- Fixed a regression where the running standalone playmode tests from the ui would result in an error. + +## [1.0.15] - 2019-06-18 +- Added new `[TestMustExpectAllLogs]` attribute, which automatically does `LogAssert.NoUnexpectedReceived()` at the end of affected tests. See docs for this attribute for more info on usage. +- Fixed a regression where no tests would be run if multiple filters are specified. E.g. selecting both a whole assembly and an individual test in the ui. +- Fixed an issue where performing `Run Selected` on a selected assembly would run all assemblies. +- Introduced the capability to do a split build and run, when running playmode tests on standalone devices. +- Fixed an error in ConditionalIgnore, if the condition were not set. + +## [1.0.14] - 2019-05-27 +- Fixed issue preventing scene creation in IPrebuildSetup.Setup callback when running standalone playmode tests. +- Fixed an issue where test assemblies would sometimes not be ordered alphabetically. +- Added module references to the package for the required modules: imgui and jsonserialize. +- Added a ConditionalIgnore attribute to help ignoring tests only under specific conditions. +- Fixed a typo in the player test window (case 1148671). + +## [1.0.13] - 2019-05-07 +- Fixed a regression where results from the player would no longer update correctly in the UI (case 1151147). + +## [1.0.12] - 2019-04-16 +- Added specific unity release to the package information. + +## [1.0.11] - 2019-04-10 +- Fixed a regression from 1.0.10 where test-started events were triggered multiple times after a domain reload. + +## [1.0.10] - 2019-04-08 +- Fixed an issue where test-started events would not be fired correctly after a test performing a domain reload (case 1141530). +- The UI should correctly run tests inside a nested class, when that class is selected. +- All actions should now correctly display a prefix when reporting test result. E.g. "TearDown :". +- Errors logged with Debug.LogError in TearDowns now append the error, rather than overwriting the existing result (case 1114306). +- Incorrect implementations of IWrapTestMethod and IWrapSetUpTearDown now gives a meaningful error. +- Fixed a regression where the Test Framework would run TearDown in a base class before the inheriting class (case 1142553). +- Fixed a regression introduced in 1.0.9 where tests with the Explicit attribute could no longer be executed. + +## [1.0.9] - 2019-03-27 +- Fixed an issue where a corrupt instance of the test runner window would block for a new being opened. +- Added the required modules to the list of package requirements. +- Fixed an issue where errors would happen if the test filter ui was clicked before the ui is done loading. +- Fix selecting items with duplicate names in test hierarchy of Test Runner window (case 987587). +- Fixed RecompileScripts instruction which we use in tests (case 1128994). +- Fixed an issue where using multiple filters on tests would sometimes give an incorrect result. + +## [1.0.7] - 2019-03-12 +### This is the first release of *Unity Package com.unity.test-framework*. + +- Migrated the test-framework from the current extension in unity. diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/CHANGELOG.md.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/CHANGELOG.md.meta new file mode 100644 index 0000000..4fca79e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d691174143fd3774ba63d7c493633b99 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/CONTRIBUTING.md b/Library/PackageCache/com.unity.test-framework@1.1.3/CONTRIBUTING.md new file mode 100644 index 0000000..9f299b1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/CONTRIBUTING.md @@ -0,0 +1,9 @@ +# Contributing + +## If you are interested in contributing, here are some ground rules: +* ... Define guidelines & rules for what contributors need to know to successfully make Pull requests against your repo ... + +## All contributions are subject to the [Unity Contribution Agreement(UCA)](https://unity3d.com/legal/licenses/Unity_Contribution_Agreement) +By making a pull request, you are confirming agreement to the terms and conditions of the UCA, including that your Contributions are your original creation and that you have complete right and authority to make your Contributions. + +## Once you have a change ready following these ground rules. Simply make a pull request diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/CONTRIBUTING.md.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/CONTRIBUTING.md.meta new file mode 100644 index 0000000..39e850a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/CONTRIBUTING.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 57d2ac5c7d5786e499d4794973fe0d4e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/TableOfContents.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/TableOfContents.md new file mode 100644 index 0000000..3155c1f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/TableOfContents.md @@ -0,0 +1,66 @@ +* [Unity Test Framework overview](./index.md) +* [Edit Mode vs. Play Mode tests](./edit-mode-vs-play-mode-tests.md) +* [Getting started with UTF](./getting-started.md) + * [How to create a new test assembly](./workflow-create-test-assembly.md) + * [How to create a test](./workflow-create-test.md) + * [How to run a test](./workflow-run-test.md) + * [How to create a Play Mode test](./workflow-create-playmode-test.md) + * [How to run a Play Mode test as standalone](./workflow-run-playmode-test-standalone.md) +* [Resources](./resources.md) +* [Extending UTF](./extending.md) + * [How to split the build and run process for standalone Play Mode tests](./reference-attribute-testplayerbuildmodifier.md#split-build-and-run-for-player-mode-tests) + * [How to run tests programmatically](./extension-run-tests.md) + * [How to get test results](./extension-get-test-results.md) + * [How to retrieve the list of tests](./extension-retrieve-test-list.md) +* [Reference](./manual.md#reference) + * [Running tests from the command-line](./reference-command-line.md) + * [UnityTest attribute](./reference-attribute-unitytest.md) + * [Setup and cleanup at build time](./reference-setup-and-cleanup.md) + * [IPrebuildSetup](./reference-setup-and-cleanup.md#iprebuildsetup) + * [IPostBuildCleanup](./reference-setup-and-cleanup.md#ipostbuildcleanup) + * [Actions outside of tests](./reference-actions-outside-tests.md) + * [Action execution order](./reference-actions-outside-tests.md#action-execution-order) + * [UnitySetUp and UnityTearDown](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [OuterUnityTestAction](./reference-actions-outside-tests.md#outerunitytestaction) + * [Domain Reloads](./reference-actions-outside-tests.md#domain-reloads) + * [Custom attributes](./reference-custom-attributes.md) + * [ConditionalIgnore attribute](./reference-attribute-conditionalignore.md) + * [PostBuildCleanup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) + * [PrebuildSetup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) + * [TestMustExpectAllLogs attribute](./reference-attribute-testmustexpectalllogs.md) + * [TestPlayerBuildModifier attribute](./reference-attribute-testplayerbuildmodifier.md) + * [TestRunCallback attribute](./reference-attribute-testruncallback.md) + * [UnityPlatform attribute](./reference-attribute-unityplatform.md) + * [UnitySetUp attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [UnityTearDown attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [UnityTest attribute](./reference-attribute-unitytest.md) + * [Custom equality comparers](./reference-custom-equality-comparers.md) + * [ColorEqualityComparer](./reference-comparer-color.md) + * [FloatEqualityComparer](./reference-comparer-float.md) + * [QuaternionEqualityComparer](./reference-comparer-quaternion.md) + * [Vector2EqualityComparer](./reference-comparer-vector2.md) + * [Vector3EqualityComparer](./reference-comparer-vector3.md) + * [Vector4EqualityComparer](./reference-comparer-vector4.md) + * [Custom equality comparers with equals operator](./reference-comparer-equals.md) + * [Test Utils](./reference-test-utils.md) + * [Custom yield instructions](./reference-custom-yield-instructions.md) + * [IEditModeTestYieldInstruction](./reference-custom-yield-instructions.md#IEditModeTestYieldInstruction) + * [EnterPlayMode](./reference-custom-yield-instructions.md#enterplaymode) + * [ExitPlayMode](./reference-custom-yield-instructions.md#exitplaymode) + * [RecompileScripts](./reference-recompile-scripts.md) + * [WaitForDomainReload](./reference-wait-for-domain-reload.md) + * [Custom assertion](./reference-custom-assertion.md) + * [LogAssert](./reference-custom-assertion.md#logassert) + * [Custom constraints](./reference-custom-constraints.md) + * [Is](./reference-custom-constraints.md#is) + * [Parameterized tests](./reference-tests-parameterized.md) + * [MonoBehaviour tests](./reference-tests-monobehaviour.md) + * [MonoBehaviourTest<T>](./reference-tests-monobehaviour.md#monobehaviourtestt) + * [IMonoBehaviourTest](./reference-tests-monobehaviour.md#imonobehaviourtest) + * [TestRunnerApi](./reference-test-runner-api.md) + * [ExecutionSettings](./reference-execution-settings.md) + * [Filter](./reference-filter.md) + * [ITestRunSettings](./reference-itest-run-settings.md) + * [ICallbacks](./reference-icallbacks.md) + * [IErrorCallbacks](./reference-ierror-callbacks.md) + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/edit-mode-vs-play-mode-tests.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/edit-mode-vs-play-mode-tests.md new file mode 100644 index 0000000..5459639 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/edit-mode-vs-play-mode-tests.md @@ -0,0 +1,53 @@ +# Edit Mode vs. Play Mode tests + +Let’s clarify a bit what Play Mode and Edit Mode test means from the Unity Test Framework perspective: + +## Edit Mode tests + +**Edit Mode** tests (also known as Editor tests) are only run in the Unity Editor and have access to the Editor code in addition to the game code. + +With Edit Mode tests it is possible to test any of your [Editor extensions](https://docs.unity3d.com/Manual/ExtendingTheEditor.html) using the [UnityTest](./reference-attribute-unitytest.md) attribute. For Edit Mode tests, your test code runs in the [EditorApplication.update](https://docs.unity3d.com/ScriptReference/EditorApplication-update.html) callback loop. + +> **Note**: You can also control entering and exiting Play Mode from your Edit Mode test. This allow your test to make changes before entering Play Mode. + +Edit Mode tests should meet one of the following conditions: + +* They should have an [assembly definition](./workflow-create-test-assembly.md) with reference to *nunit.framework.dll* and has only the Editor as a target platform: + +```assembly + "includePlatforms": [ + "Editor" + ], +``` + +* Legacy condition: put tests in the project’s [Editor](https://docs.unity3d.com/Manual/SpecialFolders.html) folder. + +## Play Mode tests + +You can run **Play Mode** tests as a [standalone in a Player](./workflow-run-playmode-test-standalone.md) or inside the Editor. Play Mode tests allow you to exercise your game code, as the tests run as [coroutines](https://docs.unity3d.com/ScriptReference/Coroutine.html) if marked with the `UnityTest` attribute. + +Play Mode tests should correspond to the following conditions: + +* Have an [assembly definition](./workflow-create-test-assembly.md) with reference to *nunit.framework.dll*. +* Have the test scripts located in a folder with the .asmdef file. +* The test assembly should reference an assembly within the code that you need to test. + +```assembly + "references": [ + "NewAssembly" + ], + "optionalUnityReferences": [ + "TestAssemblies" + ], + "includePlatforms": [], +``` + +## Recommendations + +### Attributes + +Use the [NUnit](http://www.nunit.org/) `Test` attribute instead of the `UnityTest` attribute, unless you need to [yield special instructions](./reference-custom-yield-instructions.md), in Edit Mode, or if you need to skip a frame or wait for a certain amount of time in Play Mode. + +### References + +It is possible for your Test Assemblies to reference the test tools in `UnityEngine.TestRunner` and `UnityEditor.TestRunner`. The latter is only available in Edit Mode. You can specify these references in the `Assembly Definition References` on the Assembly Definition. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extending.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extending.md new file mode 100644 index 0000000..045c94a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extending.md @@ -0,0 +1,10 @@ +# Extending Unity Test Framework +It is possible to extend the Unity Test Framework (UTF) in many ways, for custom workflows for your projects and for other packages to build on top of UTF. + +These extensions are a supplement to the ones already offered by [NUnit](https://github.com/nunit/docs/wiki/Framework-Extensibility). + +Some workflows for extending UTF include: +* [How to split the build and run process for standalone Play Mode tests](./reference-attribute-testplayerbuildmodifier.md#split-build-and-run-for-player-mode-tests) +* [How to run tests programmatically](./extension-run-tests.md) +* [How to get test results](./extension-get-test-results.md) +* [How to retrieve the list of tests](./extension-retrieve-test-list.md)  \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extension-get-test-results.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extension-get-test-results.md new file mode 100644 index 0000000..8b71d7e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extension-get-test-results.md @@ -0,0 +1,45 @@ +# How to get test results +You can receive callbacks when the active test run, or individual tests, starts and finishes. You can register callbacks by invoking `RegisterCallbacks` on the [TestRunnerApi](./reference-test-runner-api.md) with an instance of a class that implements [ICallbacks](./reference-icallbacks.md). There are four `ICallbacks` methods for the start and finish of both the whole run and each level of the test tree. + +## Example +An example of how listeners can be set up: + +> **Note**: Listeners receive callbacks from all test runs, regardless of the registered `TestRunnerApi` for that instance. + +``` C# +public void SetupListeners() +{ + var api = ScriptableObject.CreateInstance(); + api.RegisterCallbacks(new MyCallbacks()); +} + +private class MyCallbacks : ICallbacks +{ + public void RunStarted(ITestAdaptor testsToRun) + { + + } + + public void RunFinished(ITestResultAdaptor result) + { + + } + + public void TestStarted(ITestAdaptor test) + { + + } + + public void TestFinished(ITestResultAdaptor result) + { + if (!result.HasChildren && result.ResultState != "Success") + { + Debug.Log(string.Format("Test {0} {1}", result.Test.Name, result.ResultState)); + } + } +} +``` + +> **Note**: The registered callbacks are not persisted on domain reloads. So it is necessary to re-register the callback after a domain reloads, usually with [InitializeOnLoad](https://docs.unity3d.com/Manual/RunningEditorCodeOnLaunch.html). + +It is possible to provide a `priority` as an integer as the second argument when registering a callback. This influences the invocation order of different callbacks. The default value is zero. It is also possible to provide `RegisterCallbacks` with a class instance that implements [IErrorCallbacks](./reference-ierror-callbacks.md) that is an extended version of `ICallbacks`. `IErrorCallbacks` also has a callback method for `OnError` that invokes if the run fails to start, for example, due to compilation errors or if an [IPrebuildSetup](./reference-setup-and-cleanup.md) throws an exception. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extension-retrieve-test-list.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extension-retrieve-test-list.md new file mode 100644 index 0000000..dedc7fa --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extension-retrieve-test-list.md @@ -0,0 +1,13 @@ +# How to retrieve the list of tests +It is possible to use the [TestRunnerApi](./reference-test-runner-api.md) to retrieve the test tree for a given test mode (**Edit Mode** or **Play Mode**). You can retrieve the test tree by invoking `RetrieveTestList` with the desired `TestMode` and a callback action, with an [ITestAdaptor](./reference-itest-adaptor.md) representing the test tree. + +## Example +The following example retrieves the test tree for Edit Mode tests and prints the number of total test cases: +``` C# +var api = ScriptableObject.CreateInstance(); +api.RetrieveTestList(TestMode.EditMode, (testRoot) => +{ + Debug.Log(string.Format("Tree contains {0} tests.", testRoot.TestCaseCount)); +}); +``` + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extension-run-tests.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extension-run-tests.md new file mode 100644 index 0000000..60ff3dc --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/extension-run-tests.md @@ -0,0 +1,72 @@ +# How to run tests programmatically +## Filters + +Run tests by calling `Execute` on the [TestRunnerApi](./reference-test-runner-api.md), and provide some execution settings that consists of a [Filter](./reference-filter.md). The `Filter` specifies what tests to run. + +### Example + +The following is an example of how to run all **Play Mode** tests in a project: + +``` C# +var testRunnerApi = ScriptableObject.CreateInstance(); +var filter = new Filter() +{ + testMode = TestMode.PlayMode +}; +testRunnerApi.Execute(new ExecutionSettings(filter)); +``` +## Multiple filter values + +It is possible to specify a more specific filter by filling out the fields on the `Filter` class in more detail. + +Many of the fields allow for multiple values. The runner tries to match tests against at least one of the values provided and then runs any tests that match. + +### Example + +In this example, the API runs tests with full names that fit either of the two names provided: + +``` C# +var api = ScriptableObject.CreateInstance(); +api.Execute(new ExecutionSettings(new Filter() +{ + testNames = new[] {"MyTestClass.NameOfMyTest", "SpecificTestFixture.NameOfAnotherTest"} +})); +``` +## Multiple filter fields + +If using multiple different fields on the filter, then it matches against tests that fulfill all the different fields. + +### Example + +In this example, it runs any test that fits either of the two test names, and that also belongs to a test assembly that fits the given name. + +``` C# +var api = ScriptableObject.CreateInstance(); +api.Execute(new ExecutionSettings(new Filter() +{ + assemblyNames = new [] {"MyTestAssembly"}, + testNames = new [] {"MyTestClass.NameOfMyTest", "MyTestClass.AnotherNameOfATest"} +})); +``` +## Multiple constructor filters + +The execution settings take one or more filters in its constructor. If there is no filter provided, then it runs all **Edit Mode** tests by default. If there are multiple filters provided, then a test runs if it matches any of the filters. + +### Example + +In this example, it runs any tests that are either in the assembly named `MyTestAssembly` or if the full name of the test matches either of the two provided test names: + +``` C# +var api = ScriptableObject.CreateInstance(); +api.Execute(new ExecutionSettings( + new Filter() + { + assemblyNames = new[] {"MyTestAssembly"}, + }, + new Filter() + { + testNames = new[] {"MyTestClass.NameOfMyTest", "MyTestClass.AnotherNameOfATest"} + } +)); +``` +> **Note**: Specifying different test modes or platforms in each `Filter` is not currently supported. The test mode and platform is from the first `Filter` only and defaults to Edit Mode, if not supplied. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/getting-started.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/getting-started.md new file mode 100644 index 0000000..a8051f2 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/getting-started.md @@ -0,0 +1,18 @@ +# Getting started with Unity Test Framework + +To access the Unity Test Framework (UTF) in the Unity Editor, open the **Test Runner** window; go to **Window** > **General** > **Test Runner**. + +![Unity Test Runner window](./images/test-runner-window.png) + +To get started with UTF, follow the workflows below: + +* [How to create a new test assembly](./workflow-create-test-assembly.md) +* [How to create a test](./workflow-create-test.md) +* [How to run a test](./workflow-run-test.md) +* [How to create a Play Mode test](./workflow-create-playmode-test.md) +* [How to run a Play Mode test as standalone](./workflow-run-playmode-test-standalone.md) + + + +For further information, see the [resources](./resources.md) and [reference](./manual.md#reference) sections. + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-create-test-script.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-create-test-script.png new file mode 100644 index 0000000..fc9af55 Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-create-test-script.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-run-test.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-run-test.png new file mode 100644 index 0000000..df1b53c Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-run-test.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-run-tests.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-run-tests.png new file mode 100644 index 0000000..c890d81 Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-run-tests.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-tab.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-tab.png new file mode 100644 index 0000000..e1b00d7 Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/editmode-tab.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/import-settings.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/import-settings.png new file mode 100644 index 0000000..6a34e92 Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/import-settings.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/new-test-script.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/new-test-script.png new file mode 100644 index 0000000..21de081 Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/new-test-script.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-enable-all.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-enable-all.png new file mode 100644 index 0000000..961991a Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-enable-all.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-results-standalone.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-results-standalone.png new file mode 100644 index 0000000..de40c03 Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-results-standalone.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-run-standalone.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-run-standalone.png new file mode 100644 index 0000000..ded5792 Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-run-standalone.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-tab.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-tab.png new file mode 100644 index 0000000..9d315cb Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/playmode-tab.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/test-runner-window.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/test-runner-window.png new file mode 100644 index 0000000..f3023fb Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/test-runner-window.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/test-templates.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/test-templates.png new file mode 100644 index 0000000..753a155 Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/test-templates.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/tests-folder-assembly.png b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/tests-folder-assembly.png new file mode 100644 index 0000000..4e63751 Binary files /dev/null and b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/images/tests-folder-assembly.png differ diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/index.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/index.md new file mode 100644 index 0000000..604a916 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/index.md @@ -0,0 +1,54 @@ +# About Unity Test Framework + +The Unity Test Framework (UTF) enables Unity users to test their code in both **Edit Mode** and **Play Mode**, and also on target platforms such as [Standalone](https://docs.unity3d.com/Manual/Standalone.html), Android, iOS, etc. + +This package provides a standard test framework for users of Unity and developers at Unity so that both benefit from the same features and can write tests the same way. + +UTF uses a Unity integration of NUnit library, which is an open-source unit testing library for .Net languages. For more information about NUnit, see the [official NUnit website](http://www.nunit.org/) and the [NUnit documentation on GitHub](https://github.com/nunit/docs/wiki/NUnit-Documentation). + +> **Note**: UTF is not a new concept or toolset; it is an adjusted and more descriptive naming for the toolset otherwise known as Unity Test Runner, which is now available as this package. + +# Installing Unity Test Framework + +To install this package, follow the instructions in the [Package Manager documentation](https://docs.unity3d.com/Packages/com.unity.package-manager-ui@latest/index.html). + +> **Note**: Search for the Test Framework package. In Unity 2019.2 and higher, you may need to enable the package before use. + +# Using Unity Test Framework + +To learn how to use the Unity Test Framework package in your project, read the [manual](./manual.md). + +# Technical details + +## Requirements + +This version of the Unity Test Framework is compatible with the following versions of the Unity Editor: + +* 2019.2 and later. + +## Known limitations + +Unity Test Framework version 1.0.18 includes the following known limitations: + +* The `UnityTest` attribute does not support WebGL and WSA platforms. +* The `UnityTest` attribute does not support [Parameterized tests](https://github.com/nunit/docs/wiki/Parameterized-Tests) (except for `ValueSource`). +* The `UnityTest` attribute does not support the `NUnit` [Repeat](https://github.com/nunit/docs/wiki/Repeat-Attribute) attribute. +* Nested test fixture cannot run from the Editor UI. +* When using the `NUnit` [Retry](https://github.com/nunit/docs/wiki/Retry-Attribute) attribute in PlayMode tests, it throws `InvalidCastException`. + +## Package contents + +The following table indicates the root folders in the package where you can find useful resources: + +| Location | Description | +| :----------------------------------------- | :------------------------------------------ | +| _/com.unity.test-framework/Documentation~_ | Contains the documentation for the package. | + +## Document revision history + +| Date | Reason | +| :----------- | :---------------------------------------------------- | +| August 23, 2019 | Applied feedback to the documentation | +| July 25, 2019 | Documentation updated to include features in version 1.1.0 | +| July 11, 2019 | Documentation updated. Matches package version 1.0.18 | +| May 27, 2019 | Documentation created. Matches package version 1.0.14 | diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/manual.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/manual.md new file mode 100644 index 0000000..7c64f86 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/manual.md @@ -0,0 +1,80 @@ +# Unity Test Framework manual + +This is the manual for the Unity Test Framework (UTF): + +## **Introduction** + +* [Unity Test Framework overview](./index.md) +* [Edit Mode vs. Play Mode tests](edit-mode-vs-play-mode-tests.md) + +## **Getting started** + +* [Getting started with UTF](./getting-started.md) + * Workflows: + * [How to create a new test assembly](./workflow-create-test-assembly.md) + * [How to create a test](./workflow-create-test.md) + * [How to run a test](workflow-run-test.md) + * [How to create a Play Mode test](./workflow-create-playmode-test.md) + * [How to run a Play Mode test as standalone](./workflow-run-playmode-test-standalone.md) +* [Resources](./resources.md) + +## Extending UTF + +* [Extending UTF](./extending.md) + * Workflows: + * [How to split the build and run process for standalone Play Mode tests](./reference-attribute-testplayerbuildmodifier.md#split-build-and-run-for-player-mode-tests) + * [How to run tests programmatically](./extension-run-tests.md) + * [How to get test results](./extension-get-test-results.md) + * [How to retrieve the list of tests](./extension-retrieve-test-list.md) + +## Reference + +* [Running tests from the command-line](./reference-command-line.md) +* [UnityTest attribute](./reference-attribute-unitytest.md) +* [Setup and cleanup at build time](./reference-setup-and-cleanup.md) + * [IPrebuildSetup](./reference-setup-and-cleanup.md#iprebuildsetup) + * [IPostBuildCleanup](./reference-setup-and-cleanup.md#ipostbuildcleanup) +* [Actions outside of tests](./reference-actions-outside-tests.md) + * [Action execution order](./reference-actions-outside-tests.md#action-execution-order) + * [UnitySetUp and UnityTearDown](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [OuterUnityTestAction](./reference-actions-outside-tests.md#outerunitytestaction) + * [Domain Reloads](./reference-actions-outside-tests.md#domain-reloads) +* [Custom attributes](./reference-custom-attributes.md) + * [ConditionalIgnore attribute](./reference-attribute-conditionalignore.md) + * [PostBuildCleanup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) + * [PrebuildSetup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) + * [TestMustExpectAllLogs attribute](./reference-attribute-testmustexpectalllogs.md) + * [TestPlayerBuildModifier attribute](./reference-attribute-testplayerbuildmodifier.md) + * [TestRunCallback attribute](./reference-attribute-testruncallback.md) + * [UnityPlatform attribute](./reference-attribute-unityplatform.md) + * [UnitySetUp attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [UnityTearDown attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [UnityTest attribute](./reference-attribute-unitytest.md) +* [Custom equality comparers](./reference-custom-equality-comparers.md) + * [ColorEqualityComparer](./reference-comparer-color.md) + * [FloatEqualityComparer](./reference-comparer-float.md) + * [QuaternionEqualityComparer](./reference-comparer-quaternion.md) + * [Vector2EqualityComparer](./reference-comparer-vector2.md) + * [Vector3EqualityComparer](./reference-comparer-vector3.md) + * [Vector4EqualityComparer](./reference-comparer-vector4.md) + * [Custom equality comparers with equals operator](./reference-comparer-equals.md) + * [Test Utils](./reference-test-utils.md) +* [Custom yield instructions](./reference-custom-yield-instructions.md) + * [IEditModeTestYieldInstruction](./reference-custom-yield-instructions.md#IEditModeTestYieldInstruction) + * [EnterPlayMode](./reference-custom-yield-instructions.md#enterplaymode) + * [ExitPlayMode](./reference-custom-yield-instructions.md#exitplaymode) +* [Custom assertion](./reference-custom-assertion.md) + * [LogAssert](./reference-custom-assertion.md#logassert) +* [Custom constraints](./reference-custom-constraints.md) + * [Is](./reference-custom-constraints.md#is) +* [Parameterized tests](./reference-tests-parameterized.md) +* [MonoBehaviour tests](./reference-tests-monobehaviour.md) + * [MonoBehaviourTest<T>](./reference-tests-monobehaviour.md#monobehaviourtestt) + * [IMonoBehaviourTest](./reference-tests-monobehaviour.md#imonobehaviourtest) + +* [TestRunnerApi](./reference-test-runner-api.md) + * [ExecutionSettings](./reference-execution-settings.md) + * [Filter](./reference-filter.md) + * [ITestRunSettings](./reference-itest-run-settings.md) + * [ICallbacks](./reference-icallbacks.md) + * [IErrorCallbacks](./reference-ierror-callbacks.md) \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-actions-outside-tests.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-actions-outside-tests.md new file mode 100644 index 0000000..7c595b6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-actions-outside-tests.md @@ -0,0 +1,98 @@ +# Actions outside of tests + +When writing tests, it is possible to avoid duplication of code by using the [SetUp and TearDown](https://github.com/nunit/docs/wiki/SetUp-and-TearDown) methods built into [NUnit](http://www.nunit.org/). The Unity Test Framework has extended these methods with extra functionality, which can yield commands and skip frames, in the same way as [UnityTest](./reference-unitytest.md). + +## Action execution order + +The actions related to a test run in the following order: + +* Attributes implementing [IApplyToContext](https://github.com/nunit/docs/wiki/IApplyToContext-Interface) +* Any attribute implementing [OuterUnityTestAction](#outerunitytestaction) has its `BeforeTest` invoked +* Tests with [UnitySetUp](#unitysetup-and-unityteardown) methods in their test class. +* Attributes implementing [IWrapSetUpTearDown](https://github.com/nunit/docs/wiki/ICommandWrapper-Interface) +* Any [SetUp](https://github.com/nunit/docs/wiki/SetUp-and-TearDown) attributes +* [Action attributes](https://nunit.org/docs/2.6/actionAttributes.html) have their `BeforeTest` method invoked +* Attributes implementing of [IWrapTestMethod](https://github.com/nunit/docs/wiki/ICommandWrapper-Interface) +* **The test itself runs** +* [Action attributes](https://nunit.org/docs/2.6/actionAttributes.html) have their `AfterTest` method invoked +* Any method with the [TearDown](https://github.com/nunit/docs/wiki/SetUp-and-TearDown) attribute +* Tests with [UnityTearDown](#unitysetup-and-unityteardown) methods in their test class +* Any [OuterUnityTestAction](#outerunitytestaction) has its `AfterTest` invoked + +The list of actions is the same for both `Test` and `UnityTest`. + +## UnitySetUp and UnityTearDown + +The `UnitySetUp` and `UnityTearDown` attributes are identical to the standard `SetUp` and `TearDown` attributes, with the exception that they allow for [yielding instructions](reference-custom-yield-instructions.md). The `UnitySetUp` and `UnityTearDown` attributes expect a return type of [IEnumerator](https://docs.microsoft.com/en-us/dotnet/api/system.collections.ienumerator?view=netframework-4.8). + +### Example + +```c# +public class SetUpTearDownExample +{ + [UnitySetUp] + public IEnumerator SetUp() + { + yield return new EnterPlayMode(); + } + + [Test] + public void MyTest() + { + Debug.Log("This runs inside playmode"); + } + + [UnitySetUp] + public IEnumerator TearDown() + { + + yield return new ExitPlayMode(); + } +} +``` + + + +## OuterUnityTestAction + +`OuterUnityTestAction` is a wrapper outside of the tests, which allows for any tests with this attribute to run code before and after the tests. This method allows for yielding commands in the same way as `UnityTest`. The attribute must inherit the `NUnit` attribute and implement `IOuterUnityTestAction`. + +### Example + +```c# +using System.Collections; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestTools; + +public class MyTestClass +{ + [UnityTest, MyOuterActionAttribute] + public IEnumerator MyTestInsidePlaymode() + { + Assert.IsTrue(Application.isPlaying); + yield return null; + } +} + +public class MyOuterActionAttribute : NUnitAttribute, IOuterUnityTestAction +{ + public IEnumerator BeforeTest(ITest test) + { + yield return new EnterPlayMode(); + } + + public IEnumerator AfterTest(ITest test) + { + yield return new ExitPlayMode(); + } +} + +``` + + + +## Domain Reloads + +In **Edit Mode** tests it is possible to yield instructions that can result in a domain reload, such as entering or exiting **Play Mode** (see [Custom yield instructions](./reference-custom-yield-instructions.md)). When a domain reload happens, all non-Unity actions (such as `OneTimeSetup` and `Setup`) are rerun before the code, which initiated the domain reload, continues. Unity actions (such as `UnitySetup`) are not rerun. If the Unity action is the code that initiated the domain reload, then the rest of the code in the `UnitySetup` method runs after the domain reload. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-conditionalignore.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-conditionalignore.md new file mode 100644 index 0000000..c051e01 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-conditionalignore.md @@ -0,0 +1,39 @@ +# ConditionalIgnore attribute + +This attribute is an alternative to the standard `Ignore` attribute in [NUnit](http://www.nunit.org/). It allows for ignoring tests only under a specified condition. The condition evaluates during `OnLoad`, referenced by ID. + +## Example + +The following example shows a method to use the `ConditionalIgnore` attribute to ignore a test if the Unity Editor is running macOS: + +```C# +using UnityEditor; +using NUnit.Framework; +using UnityEngine.TestTools; + +[InitializeOnLoad] +public class OnLoad +{ + static OnLoad() + { + var editorIsOSX = false; + #if UNITY_EDITOR_OSX + editorIsOSX = true; + #endif + + ConditionalIgnoreAttribute.AddConditionalIgnoreMapping("IgnoreInMacEditor", editorIsOSX); + } +} + +public class MyTestClass +{ + [Test, ConditionalIgnore("IgnoreInMacEditor", "Ignored on Mac editor.")] + public void TestNeverRunningInMacEditor() + { + Assert.Pass(); + } +} + +``` + +> **Note**: You can only use `InitializeOnLoad` in **Edit Mode** tests. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-testmustexpectalllogs.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-testmustexpectalllogs.md new file mode 100644 index 0000000..f0c4665 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-testmustexpectalllogs.md @@ -0,0 +1,11 @@ +# TestMustExpectAllLogs attribute + +The presence of this attribute causes the **Test Runner** to expect every single log. By default, the Test Runner only fails on error logs, but `TestMustExpectAllLogs` fails on warnings and info level messages as well. It is the same as calling the method [LogAssert.NoUnexpectedReceived](./reference-custom-assertion.md#static-methods) at the bottom of every affected test. + +## Assembly-wide usage + +You can apply this attribute to test assemblies (that affects every test in the assembly), fixtures (affects every test in the fixture), or on individual test methods. It is also inherited from base fixtures. + +The `MustExpect` property (`true` by default) lets you enable or disable the higher level value. + +For example when migrating an assembly to this more strict checking method, you might attach `[assembly:TestMustExpectAllLogs]` to the assembly itself, but then whitelist failing fixtures and test methods with `[TestMustExpectAllLogs(MustExpect=false)]` until you have migrated them. This also means new tests in that assembly would have the more strict checking. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-testplayerbuildmodifier.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-testplayerbuildmodifier.md new file mode 100644 index 0000000..db16a71 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-testplayerbuildmodifier.md @@ -0,0 +1,105 @@ +# TestPlayerBuildModifier attribute + +You can use the `TestPlayerBuildModifier` attribute to accomplish a couple of different scenarios: + +## Modify the Player build options for Play Mode tests + +It is possible to change the [BuildPlayerOptions](https://docs.unity3d.com/ScriptReference/BuildPlayerOptions.html) for the test **Player**, to achieve custom behavior when running **Play Mode** tests. Modifying the build options allows for changing the target location of the build as well as changing [BuildOptions](https://docs.unity3d.com/ScriptReference/BuildOptions.html). + +To modify the `BuildPlayerOptions`, do the following: + +* Implement the `ITestPlayerBuildModifier` +* Reference the implementation type in a `TestPlayerBuildModifier` attribute on an assembly level. + +### Example + +```c# +using UnityEditor; +using UnityEditor.TestTools; + +[assembly:TestPlayerBuildModifier(typeof(BuildModifier))] +public class BuildModifier : ITestPlayerBuildModifier +{ + public BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions) + { + if (playerOptions.target == BuildTarget.iOS) + { + playerOptions.options |= BuildOptions.SymlinkLibraries; // Enable symlink libraries when running on iOS + } + + playerOptions.options |= BuildOptions.AllowDebugging; // Enable allow Debugging flag on the test Player. + return playerOptions; + } +} +``` + +> **Note:** When building the Player, it includes all `TestPlayerBuildModifier` attributes across all loaded assemblies, independent of the currently used test filter. As the implementation references the `UnityEditor` namespace, the code is typically implemented in an Editor only assembly, as the `UnityEditor` namespace is not available otherwise. + +## Split build and run for Play Mode tests + +It is possible to use the Unity Editor for building the Player with tests, without [running the tests](./workflow-run-playmode-test-standalone.md). This allows for running the Player on e.g. another machine. In this case, it is necessary to modify the Player to build and implement a custom handling of the test result. + +By using `TestPlayerBuildModifier`, you can alter the `BuildOptions` to not start the Player after the build as well as build the Player at a specific location. Combined with [PostBuildCleanup](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup), you can automatically exit the Editor on completion of the build. + +### Example + +```c# +using System; +using System.IO; +using System.Linq; +using Tests; +using UnityEditor; +using UnityEditor.TestTools; +using UnityEngine; +using UnityEngine.TestTools; + +[assembly:TestPlayerBuildModifier(typeof(HeadlessPlayModeSetup))] +[assembly:PostBuildCleanup(typeof(HeadlessPlayModeSetup))] + +namespace Tests +{ + public class HeadlessPlayModeSetup : ITestPlayerBuildModifier, IPostBuildCleanup + { + private static bool s_RunningPlayerTests; + public BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions) + { + // Do not launch the player after the build completes. + playerOptions.options &= ~BuildOptions.AutoRunPlayer; + + // Set the headlessBuildLocation to the output directory you desire. It does not need to be inside the project. + var headlessBuildLocation = Path.GetFullPath(Path.Combine(Application.dataPath, ".//..//PlayModeTestPlayer")); + var fileName = Path.GetFileName(playerOptions.locationPathName); + if (!string.IsNullOrEmpty(fileName)) + { + headlessBuildLocation = Path.Combine(headlessBuildLocation, fileName); + } + playerOptions.locationPathName = headlessBuildLocation; + + // Instruct the cleanup to exit the Editor if the run came from the command line. + // The variable is static because the cleanup is being invoked in a new instance of the class. + s_RunningPlayerTests = true; + return playerOptions; + } + + public void Cleanup() + { + if (s_RunningPlayerTests && IsRunningTestsFromCommandLine()) + { + // Exit the Editor on the next update, allowing for other PostBuildCleanup steps to run. + EditorApplication.update += () => { EditorApplication.Exit(0); }; + } + } + + private static bool IsRunningTestsFromCommandLine() + { + var commandLineArgs = Environment.GetCommandLineArgs(); + return commandLineArgs.Any(value => value == "-runTests"); + } + } +} +``` + +If the Editor is still running after the Play Mode tests have run, the Player tries to report the results back, using [PlayerConnection](https://docs.unity3d.com/ScriptReference/Networking.PlayerConnection.PlayerConnection.html), which has a reference to the IP address of the Editor machine, when built. + +To implement a custom way of reporting the results of the test run, let one of the assemblies in the Player include a [TestRunCallback](./reference-attribute-testruncallback.md). At `RunFinished`, it is possible to get the full test report as XML from the [NUnit](http://www.nunit.org/) test result by calling `result.ToXml(true)`. You can save the result and then save it on the device or send it to another machine as needed. + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-testruncallback.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-testruncallback.md new file mode 100644 index 0000000..dad865a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-testruncallback.md @@ -0,0 +1,46 @@ +# TestRunCallback attribute + +It is possible for the test framework to invoke callbacks as the current test run progresses. To do this, there is a `TestRunCallback` attribute which takes the type of `ITestRunCallback` implementation. You can invoke the callbacks with [NUnit](http://www.nunit.org/) `ITest` and `ITestResult` classes. + +At the `RunStarted` and `RunFinished` methods, the test and test results are for the whole test tree. These methods invoke at each node in the test tree; first with the whole test assembly, then with the test class, and last with the test method. + +From these callbacks, it is possible to read the partial or the full results, and it is furthermore possible to save the XML version of the result for further processing or continuous integration. + +## Example + +```C# +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestRunner; + +[assembly:TestRunCallback(typeof(MyTestRunCallback))] + +public class MyTestRunCallback : ITestRunCallback +{ + public void RunStarted(ITest testsToRun) + { + + } + + public void RunFinished(ITestResult testResults) + { + + } + + public void TestStarted(ITest test) + { + + } + + public void TestFinished(ITestResult result) + { + if (!result.Test.IsSuite) + { + Debug.Log($"Result of {result.Name}: {result.ResultState.Status}"); + } + } +} + +``` + +> **Note:** The `TestRunCallback` does not need any references to the `UnityEditor` namespace and is thus able to run in standalone Players, on the **Player** side. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-unityplatform.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-unityplatform.md new file mode 100644 index 0000000..931ab87 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-unityplatform.md @@ -0,0 +1,35 @@ +# UnityPlatform attribute + +Use this attribute to define a specific set of platforms you want or do not want your test(s) to run on. + +You can use this attribute on the test method, test class, or test assembly level. Use the supported [RuntimePlatform](https://docs.unity3d.com/ScriptReference/RuntimePlatform.html) enumeration values to specify the platforms. You can also specify which platforms to test by passing one or more `RuntimePlatform` values along with or without the include or exclude properties as parameters to the [Platform](https://github.com/nunit/docs/wiki/Platform-Attribute) attribute constructor. + +The test(s) skips if the current target platform is: + +- Not explicitly specified in the included platforms list +- In the excluded platforms list + +```c# +using UnityEngine; +using UnityEngine.TestTools; +using NUnit.Framework; + +[TestFixture] +public class TestClass +{ + [Test] + [UnityPlatform(RuntimePlatform.WindowsPlayer)] + public void TestMethod() + { + Assert.AreEqual(Application.platform, RuntimePlatform.WindowsPlayer); + } +} +``` + +## Properties + +| Syntax | Description | +| --------------------------- | ------------------------------------------------------------ | +| `RuntimePlatform[] exclude` | List the platforms you do not want to have your tests run on. | +| `RuntimePlatform[] include` | A subset of platforms you need to have your tests run on. | + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-unitytest.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-unitytest.md new file mode 100644 index 0000000..dd002b2 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-attribute-unitytest.md @@ -0,0 +1,51 @@ +# UnityTest attribute + +`UnityTest` attribute is the main addition to the standard [NUnit](http://www.nunit.org/) library for the Unity Test Framework. This type of unit test allows you to skip a frame from within a test (so background tasks can finish) or give certain commands to the Unity **Editor**, such as performing a domain reload or entering **Play Mode** from an **Edit Mode** test. + +In Play Mode, the `UnityTest` attribute runs as a [coroutine](https://docs.unity3d.com/Manual/Coroutines.html). Whereas Edit Mode tests run in the [EditorApplication.update](https://docs.unity3d.com/ScriptReference/EditorApplication-update.html) callback loop. + +The `UnityTest` attribute is, in fact, an alternative to the `NUnit` [Test attribute](https://github.com/nunit/docs/wiki/Test-Attribute), which allows yielding instructions back to the framework. Once the instruction is complete, the test run continues. If you `yield return null`, you skip a frame. That might be necessary to ensure that some changes do happen on the next iteration of either the `EditorApplication.update` loop or the [game loop](https://docs.unity3d.com/Manual/ExecutionOrder.html). + +## Edit Mode example + +The most simple example of an Edit Mode test could be the one that yields `null` to skip the current frame and then continues to run: + +```C# +[UnityTest] +public IEnumerator EditorUtility_WhenExecuted_ReturnsSuccess() +{ + var utility = RunEditorUtilityInTheBackgroud(); + + while (utility.isRunning) + { + yield return null; + } + + Assert.IsTrue(utility.isSuccess); +} +``` + +## Play Mode example + +In Play Mode, a test runs as a coroutine attached to a [MonoBehaviour](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html). So all the yield instructions available in coroutines, are also available in your test. + +From a Play Mode test you can use one of Unity’s [Yield Instructions](https://docs.unity3d.com/ScriptReference/YieldInstruction.html): + +- [WaitForFixedUpdate](https://docs.unity3d.com/ScriptReference/WaitForFixedUpdate.html): to ensure changes expected within the next cycle of physics calculations. +- [WaitForSeconds](https://docs.unity3d.com/ScriptReference/WaitForSeconds.html): if you want to pause your test coroutine for a fixed amount of time. Be careful about creating long-running tests. + +The simplest example is to yield to `WaitForFixedUpdate`: + +```c# +[UnityTest] +public IEnumerator GameObject_WithRigidBody_WillBeAffectedByPhysics() +{ + var go = new GameObject(); + go.AddComponent(); + var originalPosition = go.transform.position.y; + + yield return new WaitForFixedUpdate(); + + Assert.AreNotEqual(originalPosition, go.transform.position.y); +} +``` diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-command-line.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-command-line.md new file mode 100644 index 0000000..818122e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-command-line.md @@ -0,0 +1,112 @@ +# Running tests from the command line + +It’s pretty simple to run a test project from the command line. Here is an example in Windows: + +```bash +Unity.exe -runTests -batchmode -projectPath PATH_TO_YOUR_PROJECT -testResults C:\temp\results.xml -testPlatform PS4 +``` + +For more information, see [Command line arguments](https://docs.unity3d.com/Manual/CommandLineArguments.html). + +## Commands + +### batchmode + +Runs Unity in batch mode and ensures no pop-up windows appear to eliminate the need for any human intervention. + +### forgetProjectPath + +Don't save your current **Project** into the Unity launcher/hub history. + +### runTest + +Runs tests in the Project. + +### testCategory + +A semicolon-separated list of test categories to include in the run. If using both `testFilter` and `testCategory`, then tests only run that matches both. + +### testFilter + +A semicolon-separated list of test names to run, or a regular expression pattern to match tests by their full name. + +### testPlatform + +The platform you want to run tests on. Available platforms are **EditMode** and **PlayMode**. + +> **Note**: If unspecified, tests run in Edit Mode by default. + +Platform/Type convention is from the [BuildTarget](https://docs.unity3d.com/ScriptReference/BuildTarget.html) enum. Supported platforms are: + +* StandaloneWindows +* StandaloneWindows64 +* StandaloneLinux64 +* StandaloneOSX +* iOS +* Android +* PS4 +* XboxOne + +### testResults + +The path where Unity should save the result file. By default, Unity saves it in the Project’s root folder. + +### testSettingsFile + +Path to a *TestSettings.json* file that allows you to set up extra options for your test run. An example of the *TestSettings.json* file could look like this: + +```json +{ + "scriptingBackend":2, + "Architecture":null, + "apiProfile":0 +} +``` + +#### apiProfile + +The .Net compatibility level. Set to one of the following values: + +- 1 - .Net 2.0 +- 2 - .Net 2.0 Subset +- 3 - .Net 4.6 +- 5 - .Net micro profile (used by Mono scripting backend if **Stripping Level** is set to **Use micro mscorlib**) +- 6 - .Net Standard 2.0 + +#### appleEnableAutomaticSigning + +Sets option for automatic signing of Apple devices. + +#### appleDeveloperTeamID + +Sets the team ID for the apple developer account. + +#### architecture + +Target architecture for Android. Set to one of the following values: + +* None = 0 +* ARMv7 = 1 +* ARM64 = 2 +* X86 = 4 +* All = 4294967295 + +#### iOSManualProvisioningProfileType + +Set to one of the following values: + +* 0 - Automatic +* 1 - Development +* 2 - Distribution iOSManualProvisioningProfileID + +#### scriptingBackend + + Set to one of the following values: + +- Mono2x = 0 +- IL2CPP = 1 +- WinRT DotNET = 2 + +#### useLatestScriptingRuntimeVersion + +Sets option to always use the latest [Scripting Runtime Version](https://docs.unity3d.com/Manual/ScriptingRuntimeUpgrade.html). \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-color.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-color.md new file mode 100644 index 0000000..f4ae57e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-color.md @@ -0,0 +1,47 @@ +# ColorEqualityComparer + +Use this class to compare two `Color` objects. `ColorEqualityComparer.Instance` has default calculation error value set to 0.01f. To set a test specific error value instantiate a comparer instance using the [one argument constructor](#constructors). + +## Static properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `Instance` | A singleton instance of the comparer with a default error value set to 0.01f. | + +## Constructors + +| Syntax | Description | +| ------------------------------------ | ------------------------------------------------------------ | +| `ColorEqualityComparer(float error)` | Creates an instance of the comparer with a custom error value. | + +## Public methods + +| Syntax | Description | +| -------------------------------------------- | ------------------------------------------------------------ | +| `bool Equals(Color expected, Color actual);` | Compares the actual and expected `Color` objects for equality using `Utils.AreFloatsEqualAbsoluteError` to compare the `RGB` and `Alpha` attributes of `Color`. Returns `true` if expected and actual objects are equal otherwise, it returns `false`. | + +## Example + +```c# +[TestFixture] +public class ColorEqualityTest +{ + [Test] + public void GivenColorsAreEqual_WithAllowedCalculationError() + { + // Using default error + var firstColor = new Color(0f, 0f, 0f, 0f); + var secondColor = new Color(0f, 0f, 0f, 0f); + + Assert.That(firstColor, Is.EqualTo(secondColor).Using(ColorEqualityComparer.Instance)); + + // Allowed error 10e-5f + var comparer = new ColorEqualityComparer(10e-5f); + firstColor = new Color(0f, 0f, 0f, 1f); + secondColor = new Color(10e-6f, 0f, 0f, 1f); + + Assert.That(firstColor, Is.EqualTo(secondColor).Using(comparer)); + } +} +``` + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-equals.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-equals.md new file mode 100644 index 0000000..cc5d4d6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-equals.md @@ -0,0 +1,27 @@ +# Custom equality comparers with equals operator + +If you need to compare Vectors using the overloaded operator == (see [Vector2.operator ==](https://docs.unity3d.com/ScriptReference/Vector2-operator_eq.html), [Vector3.operator ==](https://docs.unity3d.com/ScriptReference/Vector3-operator_eq.html), and [Vector4.operator ==](https://docs.unity3d.com/ScriptReference/Vector4-operator_eq.html)) you should use the respective comparer implementations: + +- Vector2ComparerWithEqualsOperator +- Vector3ComparerWithEqualsOperator +- Vector4ComparerWithEqualsOperator + +The interface is the same as for other [equality comparers](./reference-custom-equality-comparers.md) except the public [constructor](./reference-custom-equality-comparers.md#constructors) `error` parameter is inapplicable in this case. + +## Example + +```c# +[TestFixture] +public class Vector3Test +{ + [Test] + public void VerifyThat_TwoVector3ObjectsAreEqual() + { + var actual = new Vector3(10e-7f, 10e-7f, 10e-7f); + var expected = new Vector3(0f, 0f, 0f); + + Assert.That(actual, Is.EqualTo(expected).Using(Vector3ComparerWithEqualsOperator.Instance)); + } +} +``` + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-float.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-float.md new file mode 100644 index 0000000..188d207 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-float.md @@ -0,0 +1,46 @@ +# FloatEqualityComparer + +Use this class to compare two float values for equality with [NUnit](http://www.nunit.org/) constraints. Use `FloatEqualityComparer.Instance` comparer to have the default error value set to 0.0001f. For any other error, use the [one argument constructor](#constructors) to create a comparer. + +## Static Properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `Instance` | A singleton instance of the comparer with a default error value set to 0.0001f. | + +## Constructors + +| Syntax | Description | +| ------------------------------------------- | ------------------------------------------------------------ | +| `FloatEqualityComparer(float allowedError)` | Creates an instance of the comparer with a custom error value. | + +## Public methods + +| Syntax | Description | +| -------------------------------------------- | ------------------------------------------------------------ | +| `bool Equals(float expected, float actual);` | Compares the `actual` and `expected` float values for equality using `Utils.AreFloatsEqual`. | + +## Example + +```c# +[TestFixture] +public class FloatsTest +{ + [Test] + public void VerifyThat_TwoFloatsAreEqual() + { + var comparer = new FloatEqualityComparer(10e-6f); + var actual = -0.00009f; + var expected = 0.00009f; + + Assert.That(actual, Is.EqualTo(expected).Using(comparer)); + + // Default relative error 0.0001f + actual = 10e-8f; + expected = 0f; + + Assert.That(actual, Is.EqualTo(expected).Using(FloatEqualityComparer.Instance)); + } +} +``` + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-quaternion.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-quaternion.md new file mode 100644 index 0000000..5d7abc8 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-quaternion.md @@ -0,0 +1,46 @@ +# QuaternionEqualityComparer + +Use this utility to compare two [Quaternion](https://docs.unity3d.com/ScriptReference/Quaternion.html) objects for equality with [NUnit](http://www.nunit.org/) assertion constraints. Use the static instance `QuaternionEqualityComparer.Instance` to have the default calculation error value set to 0.00001f. For any other custom error value, use the [one argument constructor](#constructors). + +## Static properties + +| Syntax | Description | +| ---------- | ---------------------------------------------------------- | +| `Instance` | A comparer instance with the default error value 0.00001f. | + +## Constructors + +| Syntax | Description | +| ------------------------------------------------ | ------------------------------------------------------------ | +| `QuaternionEqualityComparer(float allowedError)` | Creates an instance of the comparer with a custom allowed error value. | + +## Public methods + +| Syntax | Description | +| ----------------------------------------------------- | ------------------------------------------------------------ | +| `bool Equals(Quaternion expected, Quaternion actual)` | Compares the `actual` and `expected` `Quaternion` objects for equality using the [Quaternion.Dot](https://docs.unity3d.com/ScriptReference/Quaternion.Dot.html) method. | + +## Example + +```c# +[TestFixture] +public class QuaternionTest +{ + [Test] + public void VerifyThat_TwoQuaternionsAreEqual() + { + var actual = new Quaternion(10f, 0f, 0f, 0f); + var expected = new Quaternion(1f, 10f, 0f, 0f); + var comparer = new QuaternionEqualityComparer(10e-6f); + + Assert.That(actual, Is.EqualTo(expected).Using(comparer)); + + //Using default error 0.00001f + actual = new Quaternion(10f, 0f, 0.1f, 0f); + expected = new Quaternion(1f, 10f, 0.1f, 0f); + + Assert.That(actual, Is.EqualTo(expected).Using(QuaternionEqualityComparer.Instance)); + } +} +``` + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-vector2.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-vector2.md new file mode 100644 index 0000000..977879e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-vector2.md @@ -0,0 +1,47 @@ +# Vector2EqualityComparer + +Use this class to compare two [Vector2](https://docs.unity3d.com/ScriptReference/Vector2.html) objects for equality with [NUnit](http://www.nunit.org/) constraints. Use the static `Vector2EqualityComparer.Instance` to have the calculation error value set to default 0.0001f. For any other error value, instantiate a new comparer object with the [one argument constructor](#constructors). + +## Static properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `Instance` | A comparer instance with the default error value set to 0.0001f. | + +## Constructors + +| Syntax | Description | +| -------------------------------------- | ---------------------------------------------- | +| `Vector2EqualityComparer(float error)` | Creates an instance with a custom error value. | + +## Public methods + +| Syntax | Description | +| ------------------------------------------ | ------------------------------------------------------------ | +| `Equals(Vector2 expected, Vector2 actual)` | Compares the `actual` and `expected` `Vector2` objects for equality using the [Utils.AreFloatsEqual](./reference-test-utils.md) method. | + +## Example + +```c# +[TestFixture] +public class Vector2Test +{ + [Test] + public void VerifyThat_TwoVector2ObjectsAreEqual() + { + // Custom calculation error + var actual = new Vector2(10e-7f, 10e-7f); + var expected = new Vector2(0f, 0f); + var comparer = new Vector2EqualityComparer(10e-6f); + + Assert.That(actual, Is.EqualTo(expected).Using(comparer)); + + //Default error 0.0001f + actual = new Vector2(0.01f, 0.01f); + expected = new Vector2(0.01f, 0.01f); + + Assert.That(actual, Is.EqualTo(expected).Using(Vector2EqualityComparer.Instance)); + } +} +``` + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-vector3.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-vector3.md new file mode 100644 index 0000000..6fe1122 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-vector3.md @@ -0,0 +1,47 @@ +# Vector3EqualityComparer + +Use this class to compare two [Vector3](https://docs.unity3d.com/ScriptReference/Vector3.html) objects for equality with `NUnit` constraints. Call `Vector3EqualityComparer.Instance` comparer to perform a comparison with the default calculation error value 0.0001f. To specify a different error value, use the [one argument constructor](#constructors) to instantiate a new comparer. + +## Static properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `Instance` | A comparer instance with the default calculation error value equal to 0.0001f. | + +## Constructors + +| Syntax | Description | +| --------------------------------------------- | ---------------------------------------------- | +| `Vector3EqualityComparer(float allowedError)` | Creates an instance with a custom error value. | + +## Public methods + +| Syntax | Description | +| ----------------------------------------------- | ------------------------------------------------------------ | +| `bool Equals(Vector3 expected, Vector3 actual)` | Compares the `actual` and `expected` `Vector3` objects for equality using [Utils.AreFloatsEqual](http://todo) to compare the `x`, `y`, and `z` attributes of `Vector3`. | + +## Example + +```c# +[TestFixture] +public class Vector3Test +{ + [Test] + public void VerifyThat_TwoVector3ObjectsAreEqual() + { + // Custom error 10e-6f + var actual = new Vector3(10e-8f, 10e-8f, 10e-8f); + var expected = new Vector3(0f, 0f, 0f); + var comparer = new Vector3EqualityComparer(10e-6f); + + Assert.That(actual, Is.EqualTo(expected).Using(comparer)); + + //Default error 0.0001f + actual = new Vector3(0.01f, 0.01f, 0f); + expected = new Vector3(0.01f, 0.01f, 0f); + + Assert.That(actual, Is.EqualTo(expected).Using(Vector3EqualityComparer.Instance)); + } +} +``` + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-vector4.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-vector4.md new file mode 100644 index 0000000..915cd65 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-comparer-vector4.md @@ -0,0 +1,47 @@ +# Vector4EqualityComparer + +Use this class to compare two [Vector4](https://docs.unity3d.com/ScriptReference/Vector4.html) objects for equality with [NUnit](http://www.nunit.org/) constraints. Call `Vector4EqualityComparer.Instance` to perform comparisons using default calculation error value 0.0001f. To set a custom test value, instantiate a new comparer using the [one argument constructor](#constructor). + +## Static Properties + +| Syntax | Description | +| ---------------------------------- | ------------------------------------------------------------ | +| `Vector4EqualityComparer Instance` | A comparer instance with the default calculation error value set to 0.0001f. | + +## Constructors + +| Syntax | Description | +| --------------------------------------------- | ---------------------------------------------- | +| `Vector4EqualityComparer(float allowedError)` | Creates an instance with a custom error value. | + +## Public methods + +| Syntax | Description | +| ------------------------------------------------ | ------------------------------------------------------------ | +| `bool Equals(Vector4 expected, Vector4 actual);` | Compares the `actual` and `expected` `Vector4` objects for equality using [Utils.AreFloatsEqual](http://todo) to compare the `x`, `y`, `z`, and `w` attributes of `Vector4`. | + +## Example + +```c# +[TestFixture] +public class Vector4Test +{ + [Test] + public void VerifyThat_TwoVector4ObjectsAreEqual() + { + // Custom error 10e-6f + var actual = new Vector4(0, 0, 1e-6f, 1e-6f); + var expected = new Vector4(1e-6f, 0f, 0f, 0f); + var comparer = new Vector4EqualityComparer(10e-6f); + + Assert.That(actual, Is.EqualTo(expected).Using(comparer)); + + // Default error 0.0001f + actual = new Vector4(0.01f, 0.01f, 0f, 0f); + expected = new Vector4(0.01f, 0.01f, 0f, 0f); + + Assert.That(actual, Is.EqualTo(expected).Using(Vector4EqualityComparer.Instance)); + } +} +``` + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-assertion.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-assertion.md new file mode 100644 index 0000000..665597b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-assertion.md @@ -0,0 +1,66 @@ +# Custom assertion + +A test fails if Unity logs a message other than a regular log or warning message. Use [LogAssert](#logassert) to check for an expected message in the log so that the test does not fail when Unity logs the message. + +Use `LogAssert.Expect` before running the code under test, as the check for expected logs runs at the end of each frame. + +A test also reports a failure, if an expected message does not appear, or if Unity does not log any regular log or warning messages. + +## Example + +```c# +[Test] +public void LogAssertExample() +{ + // Expect a regular log message + LogAssert.Expect(LogType.Log, "Log message"); + + // The test fails without the following expected log message + Debug.Log("Log message"); + + // An error log + Debug.LogError("Error message"); + + // Without expecting an error log, the test would fail + LogAssert.Expect(LogType.Error, "Error message"); +} +``` + +## LogAssert + +`LogAssert` lets you expect Unity log messages that would otherwise cause the test to fail. + +### Static properties + +| Syntax | Description | +| ---------------------------- | ------------------------------------------------------------ | +| `bool ignoreFailingMessages` | Set this property to `true` to prevent unexpected error log messages from triggering an assertion. By default, it is `false`. | + +### Static Methods + +| Syntax | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| `void Expect(LogType type, string message);` `void Expect(LogType type, Regex message);` | Verifies that a log message of a specified type appears in the log. A test won’t fail from an expected error, assertion, or exception log message. It does fail if an expected message does not appear in the log. | +| `void NoUnexpectedReceived();` | Triggers an assertion when receiving any log messages and fails the test if some are unexpected messages. If multiple tests need to check for no received unexpected logs, consider using the [TestMustExpectAllLogs](./reference-attribute-testmustexpectalllogs.md) attribute instead. | + +### Expect string message + +`void Expect(LogType type, string message);` + +#### Parameters + +| Syntax | Description | +| ---------------- | ------------------------------------------------------------ | +| `LogType type` | A type of log to expect. It can take one of the [LogType enum](https://docs.unity3d.com/ScriptReference/LogType.html) values. | +| `string message` | A string value that should equate to the expected message. | + +### Expect Regex message + +`void Expect(LogType type, Regex message);` + +#### Parameters + +| Syntax | Description | +| --------------- | ------------------------------------------------------------ | +| `LogType type` | A type of log to expect. It can take one of the [LogType enum](https://docs.unity3d.com/ScriptReference/LogType.html) values. | +| `Regex message` | A regular expression pattern to match the expected message. | \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-attributes.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-attributes.md new file mode 100644 index 0000000..115e4cb --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-attributes.md @@ -0,0 +1,15 @@ +# Custom attributes + +As a part of UTF’s public API we provide the following attributes: + +* [ConditionalIgnore attribute](./reference-attribute-conditionalignore.md) +* [PostBuildCleanup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) +* [PrebuildSetup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) +* [TestMustExpectAllLogs attribute](./reference-attribute-testmustexpectalllogs.md) +* [TestPlayerBuildModifier attribute](./reference-attribute-testplayerbuildmodifier.md) +* [TestRunCallback attribute](./reference-attribute-testruncallback.md) +* [UnityPlatform attribute](./reference-attribute-unityplatform.md) +* [UnitySetUp attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) +* [UnityTearDown attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) +* [UnityTest attribute](./reference-attribute-unitytest.md) + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-constraints.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-constraints.md new file mode 100644 index 0000000..10b205b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-constraints.md @@ -0,0 +1,31 @@ +# Custom constraints + +`NUnit` allows you to write test assertions in a more descriptive and human readable way using the [Assert.That](https://github.com/nunit/docs/wiki/Assertions) mechanism, where the first parameter is an object under test and the second parameter describes conditions that the object has to meet. + +## Is + +We’ve extended `NUnit` API with a custom constraint type and declared an overlay `Is` class. To resolve ambiguity between the original implementation and the custom one you must explicitly declare it with a using statement or via addressing through the full type name `UnityEngine.TestTools.Constraints.Is`. + +### Static Methods + +| Syntax | Description | +| -------------------- | ------------------------------------------------------------ | +| `AllocatingGCMemory` | A constraint type that invokes the delegate you provide as the parameter of `Assert.That` and checks whether it causes any GC memory allocations. It passes if any GC memory is allocated and fails if not. | + +## Example + +```c# +using Is = UnityEngine.TestTools.Constraints.Is; + +class MyTestClass +{ + [Test] + public void MyTest() + { + Assert.That(() => { + var i = new int[500]; + }, Is.AllocatingGCMemory()); + } +} +``` + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-equality-comparers.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-equality-comparers.md new file mode 100644 index 0000000..8203a32 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-equality-comparers.md @@ -0,0 +1,32 @@ +# Custom equality comparers + +To enable easier verification of custom Unity type values in your tests we provide you with some custom equality comparers: + +* [ColorEqualityComparer](./reference-comparer-color.md) +* [FloatEqualityComparer](./reference-comparer-float.md) +* [QuaternionEqualityComparer](./reference-comparer-quaternion.md) +* [Vector2EqualityComparer](./reference-comparer-vector2.md) +* [Vector3EqualityComparer](./reference-comparer-vector3.md) +* [Vector4EqualityComparer](./reference-comparer-vector4.md) + +Use these classes to compare two objects of the same type for equality within the range of a given tolerance using [NUnit ](https://github.com/nunit/docs/wiki/Constraints)or [custom constraints](./reference-custom-constraints.md) . Call Instance to apply the default calculation error value to the comparison. To set a specific error value, instantiate a new comparer object using a one argument constructor `ctor(float error)`. + +## Static properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `Instance` | A singleton instance of the comparer with a predefined default error value. | + +## Constructors + +| Syntax | Description | +| ------------------- | ------------------------------------------------------------ | +| `ctor(float error)` | Creates an instance of comparer with a custom error `value.allowedError`. The relative error to be considered while comparing two values. | + +## Public methods + +| Syntax | Description | +| ------------------------------------ | ------------------------------------------------------------ | +| `bool Equals(T expected, T actual);` | Compares the actual and expected objects for equality using a custom comparison mechanism. Returns `true` if expected and actual objects are equal, otherwise it returns `false`. | + + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-yield-instructions.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-yield-instructions.md new file mode 100644 index 0000000..9814ca3 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-custom-yield-instructions.md @@ -0,0 +1,60 @@ +# Custom yield instructions + +By implementing this interface below, you can define custom yield instructions in **Edit Mode** tests. + +## IEditModeTestYieldInstruction + +In an Edit Mode test, you can use `IEditModeTestYieldInstruction` interface to implement your own instruction. There are also a couple of commonly used implementations available: + +- [EnterPlayMode](#enterplaymode) +- [ExitPlayMode](#exitplaymode) +- [RecompileScripts](./reference-recompile-scripts.md) +- [WaitForDomainReload](./reference-wait-for-domain-reload.md) + +## Example + +```c# +[UnityTest] + +public IEnumerator PlayOnAwakeDisabled_DoesntPlayWhenEnteringPlayMode() + +{ + var videoPlayer = PrefabUtility.InstantiatePrefab(m_VideoPlayerPrefab.GetComponent()) as VideoPlayer; + + videoPlayer.playOnAwake = false; + + yield return new EnterPlayMode(); + + var videoPlayerGO = GameObject.Find(m_VideoPlayerPrefab.name); + + Assert.IsFalse(videoPlayerGO.GetComponent().isPlaying); + + yield return new ExitPlayMode(); + + Object.DestroyImmediate(GameObject.Find(m_VideoPlayerPrefab.name)); +} +``` + +## Properties + +| Syntax | Description | +| ---------------------------- | ------------------------------------------------------------ | +| `bool ExpectDomainReload` | Returns `true` if the instruction expects a domain reload to occur. | +| `bool ExpectedPlaymodeState` | Returns `true` if the instruction expects the Unity Editor to be in **Play Mode**. | + +## Methods + +| Syntax | Description | +| ----------------------- | ------------------------------------------------------------ | +| `IEnumerator Perform()` | Used to define multi-frame operations performed when instantiating a yield instruction. | + +## EnterPlayMode + +* Implements `IEditModeTestYieldInstruction`. Creates a yield instruction to enter Play Mode. +* When creating an Editor test that uses the `UnityTest` attribute, use this to trigger the Editor to enter Play Mode. +* Throws an exception if the Editor is already in Play Mode or if there is a [script compilation error](https://support.unity3d.com/hc/en-us/articles/205930539-How-do-I-interpret-a-compiler-error-). + +## ExitPlayMode + +* Implements `IEditModeTestYieldInstruction`. A new instance of the class is a yield instruction to exit Play Mode. +* Throws an exception if the Editor is not in Play Mode. diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-execution-settings.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-execution-settings.md new file mode 100644 index 0000000..e219bf0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-execution-settings.md @@ -0,0 +1,16 @@ +# ExecutionSettings +The `ExecutionSettings` is a set of filters and other settings provided when running a set of tests from the [TestRunnerApi](./reference-test-runner-api.md). + +## Constructors + +| Syntax | Description | +| ----------------------------------------------------- | -------------------------------------------------------- | +| `ExecutionSettings(params Filter[] filtersToExecute)` | Creates an instance with a given set of filters, if any. | + +## Fields + +| Syntax | Description | +| ---------------------------- | ------------------------------------------------------------ | +| `Filter[] filters` | A collection of [Filters](./reference-filter.md) to execute tests on. | +| `ITestRunSettings overloadTestRunSettings` | An instance of [ITestRunSettings](./reference-itest-run-settings.md) to set up before running tests on a Player. | +| `bool runSynchronously` | If true, the call to `Execute()` will run tests synchronously, guaranteeing that all tests have finished running by the time the call returns. Note that this is only supported for EditMode tests, and that tests which take multiple frames (i.e. `[UnityTest]` tests, or tests with `[UnitySetUp]` or `[UnityTearDown]` scaffolding) will be filtered out. | diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-filter.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-filter.md new file mode 100644 index 0000000..8cfa910 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-filter.md @@ -0,0 +1,15 @@ +# Filter +The filter class provides the [TestRunnerApi](./reference-test-runner-api.md) with a specification of what tests to run when [running tests programmatically](./extension-run-tests.md). + +## Fields + +| Syntax | Description | +| ----------------------------- | ------------------------------------------------------------ | +| `TestMode testMode` | An enum flag that specifies if **Edit Mode** or **Play Mode** tests should run. Applying both Edit Mode and Play Mode is currently not supported when running tests from the API. | +| `string[] testNames` | The full name of the tests to match the filter. This is usually in the format `FixtureName.TestName`. If the test has test arguments, then include them in parenthesis. E.g. `MyTestClass2.MyTestWithMultipleValues(1)`. | +| `string[] groupNames` | The same as `testNames`, except that it allows for Regex. This is useful for running specific fixtures or namespaces. E.g. `"^MyNamespace\\."` Runs any tests where the top namespace is `MyNamespace`. | +| `string[] categoryNames` | The name of a [Category](https://nunit.org/docs/2.2.7/category.html) to include in the run. Any test or fixtures runs that have a `Category` matching the string. | +| `string[] assemblyNames` | The name of assemblies included in the run. That is the assembly name, without the .dll file extension. E.g., `MyTestAssembly`. | +| `BuildTarget? targetPlatform` | The [BuildTarget](https://docs.unity3d.com/ScriptReference/BuildTarget.html) platform to run the test on. If set to `null`, then the Editor is the target for the tests. | + + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-icallbacks.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-icallbacks.md new file mode 100644 index 0000000..b04e7e8 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-icallbacks.md @@ -0,0 +1,48 @@ +# ICallbacks +An interface for receiving callbacks when running tests. All test runs invoke the callbacks until the next domain reload. + +The `RunStarted` method runs when the whole test run starts. Then the `TestStarted` method runs with information about the tests it is about to run on an assembly level. Afterward, it runs on a test fixture level and then on the individual test. If the test is a [parameterized test](./https://github.com/nunit/docs/wiki/Parameterized-Tests), then it is also invoked for each parameter combination. After each part of the test tree have completed running, the corresponding `TestFinished` method runs with the test result. At the end of the run, the `RunFinished` event runs with the test result. + +An extended version of the callback, [IErrorCallbacks](./reference-ierror-callbacks.md), extends this `ICallbacks` to receive calls when a run fails due to a build error. + +## Public methods + +| Syntax | Description | +| ---------------------------------------------- | ------------------------------------------------------------ | +| `void RunStarted(ITestAdaptor testsToRun)` | Invoked when the test run starts. The [ITestAdaptor](./reference-itest-adaptor.md) represents the tree of tests to run. | +| `void RunFinished(ITestResultAdaptor result)` | Invoked when the test run finishes. The [ITestResultAdaptor](./reference-itest-result-adaptor.md) represents the results of the set of tests that have run. | +| `void TestStarted(ITestAdaptor test)` | Invoked on each node of the test tree, as that part of the tree starts to run. | +| `void TestFinished(ITestResultAdaptor result)` | Invoked on each node of the test tree once that part of the test tree has finished running. The [ITestResultAdaptor](./reference-itest-result-adaptor.md) represents the results of the current node of the test tree. | + +## Example +An example that sets up a listener on the API. The listener prints the number of failed tests after the run has finished: +``` C# +public void SetupListeners() +{ + var api = ScriptableObject.CreateInstance(); + api.RegisterCallbacks(new MyCallbacks()); +} + +private class MyCallbacks : ICallbacks +{ + public void RunStarted(ITestAdaptor testsToRun) + { + + } + + public void RunFinished(ITestResultAdaptor result) + { + Debug.Log(string.Format("Run finished {0} test(s) failed.", result.FailCount)); + } + + public void TestStarted(ITestAdaptor test) + { + + } + + public void TestFinished(ITestResultAdaptor result) + { + + } +} +``` \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-ierror-callbacks.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-ierror-callbacks.md new file mode 100644 index 0000000..bf83309 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-ierror-callbacks.md @@ -0,0 +1,9 @@ +# IErrorCallbacks +An extended version of the [ICallbacks](./reference-icallbacks.md), which get invoked if the test run fails due to a build error or if any [IPrebuildSetup](./reference-setup-and-cleanup.md) has a failure. + +## Public methods + +| Syntax | Description | +| ---------------------------- | ------------------------------------------------------------------- | +| void OnError(string message) | The error message detailing the reason for the run to fail. | + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-itest-adaptor.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-itest-adaptor.md new file mode 100644 index 0000000..04e72f6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-itest-adaptor.md @@ -0,0 +1,31 @@ +# ITestAdaptor +`ITestAdaptor` is a representation of a node in the test tree implemented as a wrapper around the [NUnit](http://www.nunit.org/) [ITest](https://github.com/nunit/nunit/blob/master/src/NUnitFramework/framework/Interfaces/ITest.cs) interface. + +## Properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `string Id` | The ID of the test tree node. The ID can change if you add new tests to the suite. Use `UniqueName`, if you want to have a more permanent point of reference. | +| `string Name` | The name of the test. E.g., `MyTest`. | +| `string FullName` | The full name of the test. E.g., `MyNamespace.MyTestClass.MyTest`. | +| `int TestCaseCount` | The total number of test cases in the node and all sub-nodes. | +| `bool HasChildren` | Whether the node has any children. | +| `bool IsSuite` | Whether the node is a test suite/fixture. | +| `IEnumerable Children` | The child nodes. | +| `ITestAdaptor Parent` | The parent node, if any. | +| `int TestCaseTimeout` | The test case timeout in milliseconds. Note that this value is only available on TestFinished. | +| `ITypeInfo TypeInfo` | The type of test class as an `NUnit` [ITypeInfo](https://github.com/nunit/nunit/blob/master/src/NUnitFramework/framework/Interfaces/ITypeInfo.cs). If the node is not a test class, then the value is `null`. | +| `IMethodInfo Method` | The [Nunit IMethodInfo](https://github.com/nunit/nunit/blob/master/src/NUnitFramework/framework/Interfaces/IMethodInfo.cs) of the test method. If the node is not a test method, then the value is `null`. | +| `string[] Categories` | An array of the categories applied to the test or fixture. | +| `bool IsTestAssembly` | Whether the node represents a test assembly. | +| `RunState RunState` | The run state of the test node. Either `NotRunnable`, `Runnable`, `Explicit`, `Skipped`, or `Ignored`. | +| `string Description` | The description of the test. | +| `string SkipReason` | The skip reason. E.g., if ignoring the test. | +| `string ParentId` | The ID of the parent node. | +| `string ParentFullName` | The full name of the parent node. | +| `string UniqueName` | A unique generated name for the test node. E.g., `Tests.dll/MyNamespace/MyTestClass/[Tests][MyNamespace.MyTestClass.MyTest]`. | +| `string ParentUniqueName` | A unique name of the parent node. E.g., `Tests.dll/MyNamespace/[Tests][MyNamespace.MyTestClass][suite]`. | +| `int ChildIndex` | The child index of the node in its parent. | +| `TestMode TestMode` | The mode of the test. Either **Edit Mode** or **Play Mode**. | + +> **Note**: Some properties are not available when receiving the test tree as a part of a test result coming from a standalone Player, such as `TypeInfo` and `Method`. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-itest-result-adaptor.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-itest-result-adaptor.md new file mode 100644 index 0000000..63280f6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-itest-result-adaptor.md @@ -0,0 +1,25 @@ +# ITestResultAdaptor +The `ITestResultAdaptor` is the representation of the test results for a node in the test tree implemented as a wrapper around the [NUnit](http://www.nunit.org/) [ITest](https://github.com/nunit/nunit/blob/master/src/NUnitFramework/framework/Interfaces/ITestResults.cs) interface. +## Properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `ITestAdaptor Test` | The test details of the test result tree node as a [TestAdaptor](./reference-itest-adaptor.md). | +| `string Name` | The name of the test node. | +| `string FullName` | Gets the full name of the test result | +| `string ResultState` | The state of the result as a string. E.g., `Success`, `Skipped`, `Failure`, `Explicit`, `Cancelled`. | +| `TestStatus TestStatus` | The status of the test as an enum. Either `Inconclusive`, `Skipped`, `Passed`, or `Failed`. | +| `double Duration` | Gets the elapsed time for running the test in seconds. | +| `DateTime StartTime` | Gets or sets the time the test started running. | +| `DateTime EndTime` | Gets or sets the time the test finished running. | +| `string Message` | Gets the message associated with a test failure or with not running the test | +| `string StackTrace` | Gets any stack trace associated with an error or failure. Not available in the [Compact Framework](https://en.wikipedia.org/wiki/.NET_Compact_Framework) 1.0. | +| `int AssertCount` | Gets the number of asserts that ran during the test and all its children. | +| `int FailCount` | Gets the number of test cases that failed when running the test and all its children. | +| `int PassCount` | Gets the number of test cases that passed when running the test and all its children. | +| `int SkipCount` | Gets the number of test cases skipped when running the test and all its children. | +| `int InconclusiveCount` | Gets the number of test cases that were inconclusive when running the test and all its children. | +| `bool HasChildren` | Indicates whether this result has any child results. Accessing HasChildren should not force the creation of the Children collection in classes implementing this interface. | +| `IEnumerable Children` | Gets the collection of child results. | +| `string Output` | Gets any text output written to this result. | +| `TNode ToXml` | Gets the test results as an `NUnit` XML node. Use this to save the results to an XML file. | diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-itest-run-settings.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-itest-run-settings.md new file mode 100644 index 0000000..79c344b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-itest-run-settings.md @@ -0,0 +1,29 @@ +# ITestRunSettings +`ITestRunSettings` lets you set any of the global settings right before building a Player for a test run and then reverts the settings afterward. +`ITestRunSettings` implements [IDisposable](https://docs.microsoft.com/en-us/dotnet/api/system.idisposable), and runs after building the Player with tests. + +## Public methods + +| Syntax | Description | +| ---------------- | ------------------------------------------------------------ | +| `void Apply()` | A method called before building the Player. | +| `void Dispose()` | A method called after building the Player or if the build failed. | + +## Example +The following example sets the iOS SDK version to be the simulator SDK and resets it to the original value after the run. +``` C# +public class MyTestSettings : ITestRunSettings +{ + private iOSSdkVersion originalSdkVersion; + public void Apply() + { + originalSdkVersion = PlayerSettings.iOS.sdkVersion; + PlayerSettings.iOS.sdkVersion = iOSSdkVersion.SimulatorSDK; + } + + public void Dispose() + { + PlayerSettings.iOS.sdkVersion = originalSdkVersion; + } +} +``` \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-recompile-scripts.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-recompile-scripts.md new file mode 100644 index 0000000..0fb8644 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-recompile-scripts.md @@ -0,0 +1,22 @@ +# RecompileScripts +`RecompileScripts` is an [IEditModeTestYieldInstruction](./reference-custom-yield-instructions.md) that you can yield in Edit Mode tests. It lets you trigger a recompilation of scripts in the Unity Editor. + +## Constructors + +| Syntax | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| `RecompileScripts(bool expectScriptCompilation = true, bool expectScriptCompilationSuccess = true)` | Creates a new instance of the `RecompileScripts` yield instruction. The parameter `expectScriptCompilation` indicates if you expect a script compilation to start (defaults to true). If a script compilation does not start and `expectScriptCompilation` is `true`, then it throws an exception. | + +## Example +``` C@ +[UnitySetUp] +public IEnumerator SetUp() +{ + using (var file = File.CreateText("Assets/temp/myScript.cs")) + { + file.Write("public class ATempClass { }"); + } + AssetDatabase.Refresh(); + yield return new RecompileScripts(); +} +``` \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-setup-and-cleanup.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-setup-and-cleanup.md new file mode 100644 index 0000000..93e77a5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-setup-and-cleanup.md @@ -0,0 +1,91 @@ +# Setup and cleanup at build time + +In some cases, it is relevant to perform changes to Unity or the file system before building the tests. In the same way, it may be necessary to clean up such changes after the test run. In response to such needs, you can incorporate the pre-build setup and post-build cleanup concepts into your tests in one of the following ways: + +1. Via implementation of `IPrebuildSetup` and `IPostBuildCleanup` interfaces by a test class. +2. Via applying the `PrebuildSetup` attribute and `PostBuildCleanup` attribute on your test class, one of the tests or the test assembly, providing a class name that implements the corresponding interface as an argument (fx `[PrebuildSetup("MyTestSceneSetup")]`). + +## Execution order + +All setups run in a deterministic order one after another. The first to run are the setups defined with attributes. Then any test class implementing the interface runs, in alphabetical order inside their namespace, which is the same order as the tests run. + +> **Note**: Cleanup runs right away for a standalone test run, but only after related tests run in the Unity Editor. + +## PrebuildSetup and PostBuildCleanup + +Both `PrebuildSetup` and `PostBuildCleanup` attributes run if the respective test or test class is in the current test run. The test is included either by running all tests or setting a [filter](./workflow-create-test.md#filters) that includes the test. If multiple tests reference the same pre-built setup or post-build cleanup, then it only runs once. + +## IPrebuildSetup + +Implement this interface if you want to define a set of actions to run as a pre-build step. + +### Public methods + +| Syntax | Description | +| -------------- | ------------------------------------------------------------ | +| `void Setup()` | Implement this method to call actions automatically before the build process. | + +## IPostBuildCleanup + +Implement this interface if you want to define a set of actions to execute as a post-build step. Cleanup runs right away for a standalone test run, but only after all the tests run within the Editor. + +### Public methods + +| Syntax | Description | +| ---------------- | ------------------------------------------------------------ | +| `void Cleanup()` | Implement this method to specify actions that should run as a post-build cleanup step. | + +## Example + +```c# +[TestFixture] +public class CreateSpriteTest : IPrebuildSetup +{ + Texture2D m_Texture; + Sprite m_Sprite; + + public void Setup() + { + +#if UNITY_EDITOR + + var spritePath = "Assets/Resources/Circle.png"; + + var ti = UnityEditor.AssetImporter.GetAtPath(spritePath) as UnityEditor.TextureImporter; + + ti.textureCompression = UnityEditor.TextureImporterCompression.Uncompressed; + + ti.SaveAndReimport(); + +#endif + } + + [SetUp] + public void SetUpTest() + { + m_Texture = Resources.Load("Circle"); + } + + [Test] + public void WhenNullTextureIsPassed_CreateShouldReturnNullSprite() + { + + // Check with Valid Texture. + + LogAssert.Expect(LogType.Log, "Circle Sprite Created"); + + Sprite.Create(m_Texture, new Rect(0, 0, m_Texture.width, m_Texture.height), new Vector2(0.5f, 0.5f)); + + Debug.Log("Circle Sprite Created"); + + // Check with NULL Texture. Should return NULL Sprite. + + m_Sprite = Sprite.Create(null, new Rect(0, 0, m_Texture.width, m_Texture.heig`t), new Vector2(0.5f, 0.5f)); + + Assert.That(m_Sprite, Is.Null, "Sprite created with null texture should be null"); + + } +} +``` + +> **Tip**: Use `#if UNITY_EDITOR` if you want to access Editor only APIs, but the setup/cleanup is inside a **Play Mode** assembly. diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-test-runner-api.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-test-runner-api.md new file mode 100644 index 0000000..b594f7e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-test-runner-api.md @@ -0,0 +1,23 @@ +# TestRunnerApi +The `TestRunnerApi` retrieves and runs tests programmatically from code inside the project, or inside other packages. `TestRunnerApi` is a [ScriptableObject](https://docs.unity3d.com/ScriptReference/ScriptableObject.html). + +You can initialize the API like this: + +```c# +var testRunnerApi = ScriptableObject.CreateInstance(); +``` +> **Note**: You can subscribe and receive test results in one instance of the API, even if the run starts from another instance. + +The `TestRunnerApi` supports the following workflows: +* [How to run tests programmatically](./extension-run-tests.md) +* [How to get test results](./extension-get-test-results.md) +* [How to retrieve the list of tests](./extension-retrieve-test-list.md) + +## Public methods + +| Syntax | Description | +| ------------------------------------------ | ------------------------------------------------------------ | +| `void Execute(ExecutionSettings executionSettings)` | Starts a test run with a given set of [ExecutionSettings](./reference-execution-settings.md). | +| `void RegisterCallbacks(ICallbacks testCallbacks, int priority = 0)` | Sets up a given instance of [ICallbacks](./reference-icallbacks.md) to be invoked on test runs. | +| `void UnregisterCallbacks(ICallbacks testCallbacks)` | Unregisters an instance of ICallbacks to no longer receive callbacks from test runs. | +| `void RetrieveTestList(TestMode testMode, Action callback)` | Retrieve the full test tree as [ITestAdaptor](./reference-itest-adaptor.md) for a given test mode. | \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-test-utils.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-test-utils.md new file mode 100644 index 0000000..dae8dae --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-test-utils.md @@ -0,0 +1,40 @@ +# Test Utils + +This contains test utility functions for float value comparison and creating primitives. + +## Static Methods + +| Syntax | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| `bool AreFloatsEqual(float expected, float actual, float allowedRelativeError)` | Relative epsilon comparison of two float values for equality. `allowedRelativeError` is the relative error to be used in relative epsilon comparison. The relative error is the absolute error divided by the magnitude of the exact value. Returns `true` if the actual value is equivalent to the expected value. | +| `bool AreFloatsEqualAbsoluteError(float expected, float actual, float allowedAbsoluteError)` | Compares two floating point numbers for equality under the given absolute tolerance. `allowedAbsoluteError` is the permitted error tolerance. Returns `true` if the actual value is equivalent to the expected value under the given tolerance. | +| `GameObject CreatePrimitive( type)` | Creates a [GameObject](https://docs.unity3d.com/ScriptReference/GameObject.html) with a primitive [MeshRenderer](https://docs.unity3d.com/ScriptReference/MeshRenderer.html). This is an analogue to the [GameObject.CreatePrimitive](https://docs.unity3d.com/ScriptReference/GameObject.CreatePrimitive.html), but creates a primitive `MeshRenderer` with a fast [Shader](https://docs.unity3d.com/ScriptReference/Shader.html) instead of the default built-in `Shader`, optimized for testing performance. `type` is the [primitive type](https://docs.unity3d.com/ScriptReference/PrimitiveType.html) of the required `GameObject`. Returns a `GameObject` with primitive `MeshRenderer` and [Collider](https://docs.unity3d.com/ScriptReference/Collider.html). | + +## Example + +```c# +[TestFixture] +class UtilsTests +{ + [Test] + public void ChechThat_FloatsAreEqual() + { + float expected = 10e-8f; + float actual = 0f; + float allowedRelativeError = 10e-6f; + + Assert.That(Utils.AreFloatsEqual(expected, actual, allowedRelativeError), Is.True); + } + + [Test] + public void ChechThat_FloatsAreAbsoluteEqual() + { + float expected = 0f; + float actual = 10e-6f; + float error = 10e-5f; + + Assert.That(Utils.AreFloatsEqualAbsoluteError(expected, actual, error), Is.True); + } +} +``` + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-tests-monobehaviour.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-tests-monobehaviour.md new file mode 100644 index 0000000..6409333 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-tests-monobehaviour.md @@ -0,0 +1,51 @@ +# MonoBehaviour tests + +`MonoBehaviourTest` is a [coroutine](https://docs.unity3d.com/ScriptReference/Coroutine.html) and a helper for writing [MonoBehaviour](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html) tests. + +Yield a `MonoBehaviourTest` when using the `UnityTest` attribute to instantiate the `MonoBehaviour` you wish to test and wait for it to finish running. Implement the `IMonoBehaviourTest` interface on the `MonoBehaviour` to state when the test completes. + +## Example + +```c# +[UnityTest] +public IEnumerator MonoBehaviourTest_Works() +{ + yield return new MonoBehaviourTest(); +} + +public class MyMonoBehaviourTest : MonoBehaviour, IMonoBehaviourTest +{ + private int frameCount; + public bool IsTestFinished + { + get { return frameCount > 10; } + } + + void Update() + { + frameCount++; + } +} +``` + +## MonoBehaviourTest<T> + +This is a wrapper that allows running tests on `MonoBehaviour` scripts. Inherits from [CustomYieldInstruction](https://docs.unity3d.com/ScriptReference/CustomYieldInstruction.html). + +### Properties + +| Syntax | Description | +| ----------------------- | ------------------------------------------------------------ | +| `T component` | A `MonoBehaviour` component created for the test and attached to the test’s [GameObject](https://docs.unity3d.com/ScriptReference/GameObject.html). | +| `GameObject gameObject` | A `GameObject` created as a container for the test component. | +| `bool keepWaiting` | (Inherited) Returns `true` if the test is not finished yet, which keeps the coroutine suspended. | + +## IMonoBehaviourTest + +An interface implemented by a `MonoBehaviour` test. + +### Properties + +| Syntax | Description | +| --------------------- | ----------------------------------------------- | +| `bool IsTestFinished` | Indicates when the test is considered finished. | \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-tests-parameterized.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-tests-parameterized.md new file mode 100644 index 0000000..6182bad --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-tests-parameterized.md @@ -0,0 +1,18 @@ +# Parameterized tests + +For data-driven testing, you may want to have your tests parameterized. You may use both the [NUnit](http://www.nunit.org/) attributes [TestCase](https://github.com/nunit/docs/wiki/TestCase-Attribute) and [ValueSource](https://github.com/nunit/docs/wiki/ValueSource-Attribute) with a unit test. + +> **Note**: With `UnityTest` it is recommended to use `ValueSource` since `TestCase` is not supported. + +## Example + +```c# +static int[] values = new int[] { 1, 5, 6 }; + +[UnityTest] +public IEnumerator MyTestWithMultipleValues([ValueSource("values")] int value) +{ + yield return null; +} +``` + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-wait-for-domain-reload.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-wait-for-domain-reload.md new file mode 100644 index 0000000..8d42e70 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/reference-wait-for-domain-reload.md @@ -0,0 +1,19 @@ +# WaitForDomainReload +`WaitForDomainReload` is an [IEditModeTestYieldInstruction](./reference-custom-yield-instructions.md) that you can yield in Edit Mode tests. It delays the execution of scripts until after an incoming domain reload. If the domain reload results in a script compilation failure, then it throws an exception. + +## Constructors + +| Syntax | Description | +| ---------------------------- | ------------------------------------------------------------ | +| `WaitForDomainReload()` | Create a new instance of the `WaitForDomainReload` yield instruction. | + +## Example +``` C@ +[UnitySetUp] +public IEnumerator SetUp() +{ + File.Copy("Resources/MyDll.dll", @"Assets/MyDll.dll", true); // Trigger a domain reload. + AssetDatabase.Refresh(); + yield return new WaitForDomainReload(); +} +``` \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/resources.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/resources.md new file mode 100644 index 0000000..ce261e9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/resources.md @@ -0,0 +1,6 @@ +# Resources + +Here you can find other related resources to the Unity Test Framework: + +* [Performance Benchmarking in Unity: How to Get Started](https://blogs.unity3d.com/2018/09/25/performance-benchmarking-in-unity-how-to-get-started/) [Blog] +* [Testing Test-Driven Development with the Unity Test Runner](https://blogs.unity3d.com/2018/11/02/testing-test-driven-development-with-the-unity-test-runner/) [Blog] \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-create-playmode-test.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-create-playmode-test.md new file mode 100644 index 0000000..a21b619 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-create-playmode-test.md @@ -0,0 +1,28 @@ +# Workflow: How to create a Play Mode test + +To create a **Play Mode** test, you can follow a similar process as when you want to create an **Edit Mode** test. + +1. Start with switching to the **PlayMode** tab in the **Test Runner** window. +2. Create a test assembly folder (see [How to create a new test assembly)](./workflow-create-test-assembly.md). The folder name is *Tests* by default (or *Tests 1*, *Tests 2*, etc. if the preceding name is already in use). + +![PlayMode tab](./images/playmode-tab.png) + +> **Note**: If you don’t see the **Create Play Mode Test Assembly Folder** button enabled, make sure that in the Project window you navigate out of a folder with another .asmdef (such as one for Edit Mode tests). + +3. When you have your Play Mode test assembly folder ready, then [create your Play Mode test](./workflow-create-test.md). + +> **Note**: [Pre-defined Unity assemblies](https://docs.unity3d.com/Manual/ScriptCompileOrderFolders.html) (such as _Assembly-CSharp.dll_) do not reference your new assembly. + +## References and builds + +Unity Test Framework adds a reference to `TestAssemblies` in the [Assembly Definition](https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html) file, but it won't include any other references (e.g., to other scripting assemblies within the Unity project). So you need to add other assemblies yourself if you want to test them too. + +Unity does not include `TestAssemblies` in Player builds, but in the Test Runner window, we have such an option. If you need to test code in pre-defined assemblies, you can reference `TestAssemblies` from other assemblies. You must remove these tests after the test run so that Unity does not add them to the final Player build. + +To do this, in the Test Runner window choose **Enable playmode tests for all assemblies** option from the drop-down menu (to expand, click on the small list item in the top right corner). In the dialog box, click **OK** to manually restart the Editor. + +![Enable Play Mode tests for all assemblies](./images/playmode-enable-all.png) + +> **Note**: **Enabling Play Mode tests for all assemblies** includes additional assemblies in your project build, which can increase the project’s size as well as the build time. + +For more information, see [Edit Mode vs. Play Mode tests](./edit-mode-vs-play-mode-tests.md). \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-create-test-assembly.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-create-test-assembly.md new file mode 100644 index 0000000..eb35896 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-create-test-assembly.md @@ -0,0 +1,17 @@ +# Workflow: **How to create a new test assembly** + +Unity Test Framework looks for a test inside any assembly that references [NUnit](http://www.nunit.org/). We refer to such assemblies as `TestAssemblies`. The [Test Runner](./getting-started.md) UI can help you set up `TestAssemblies`. **Play Mode** and **Edit Mode** tests need to be in separate assemblies. + +In the **Test Runner** window, you will see an **EditMode** tab enabled by default, as well as a **Create EditMode Test Assembly Folder** button. + +![Test Runner window EditMode tab](./images/editmode-tab.png) + +Click the button to create a *Tests* folder with a respective .asmdef file by default. Change the name of the new [Assembly Definition](https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html), if necessary, and press Enter to accept it. + +![New Test folder and assembly file](./images/tests-folder-assembly.png) + +In the Inspector window, it should have references to **nunit.framework.dll***,* **UnityEngine.TestRunner,** and **UnityEditor.TestRunner** assemblies, as well as **Editor** preselected as a target platform. + +> **Note**: The **UnityEditor.TestRunner** reference is only available for [Edit Mode tests](./edit-mode-vs-play-mode-tests.md#edit-mode-tests). + +![Assembly definition import settings](./images/import-settings.png) diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-create-test.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-create-test.md new file mode 100644 index 0000000..612106e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-create-test.md @@ -0,0 +1,36 @@ +# Workflow: How to create a test + +To create a test, do the following: + +1. Create your *Test* [assembly folder](./workflow-create-test-assembly.md) and select it in the **Project** window. +2. Click the button **Create Test Script in current folder** option in the **Test Runner** window. + +![EditMode create test script](./images/editmode-create-test-script.png) + +3. It creates a *NewTestScript.cs* file in the *Tests* folder. Change the name of the script, if necessary, and press Enter to accept it. + +![NewTestScript.cs](./images/new-test-script.png) + +Now you’ll see two sample tests in the Test Runner window: + +![Test templates](./images/test-templates.png) + +Now you can open the tests in your favorite script editor. + +You can also create test scripts by navigating to **Assets** > **Create > Testing** > **C# Test Script**, unless adding a test script would result in a compilation error. + +> **Note**: Unity does not include `TestAssemblies` ([NUnit](http://www.nunit.org/), Unity Test Framework, and user script assemblies) when using the normal build pipeline, but does include them when using **Run on <Platform>** in the Test Runner window. + +## Filters + +If you have a lot of tests, and you only want to view/run a sub-set of them, you can filter them in three ways (see image above): + +* Type in the search box in the top left + +* Click a test class or fixture (such as **NewTestScript** in the image above) + +* Click one of the test result icon buttons in the top right + + + +For more information, see [Edit Mode vs. Play Mode tests](./edit-mode-vs-play-mode-tests.md). diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-run-playmode-test-standalone.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-run-playmode-test-standalone.md new file mode 100644 index 0000000..0a2fa81 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-run-playmode-test-standalone.md @@ -0,0 +1,21 @@ +# Workflow: How to run a Play Mode test in player + +If you run a **Play Mode** test in the same way as an [Editor test](./workflow-run-test.md), it runs inside the Unity Editor. You can also run Play Mode tests on specific platforms. Click **Run all in the player** to build and run your tests on the currently active target platform. + +![Run PlayMode test in player](./images/playmode-run-standalone.png) + +> **Note**: Your current platform displays in brackets on the button. For example, in the image above, the button reads **Run all in player (StandaloneWindows)**, because the current platform is Windows. The target platform is always the current Platform selected in [Build Settings](https://docs.unity3d.com/Manual/BuildSettings.html) (menu: **File** > **Build Settings**). + +The test result displays in the build once the test completes: + +![Results of PlayMode in player test run](./images/playmode-results-standalone.png) + +The application running on the platform reports back the test results to the Editor UI then displays the executed tests and shuts down. To make sure you receive the test results from the Player on your target platform back into the Editor that’s running the test, both should be on the same network. + +> **Note:** Some platforms do not support shutting down the application with `Application.Quit`, so it will continue running after reporting the test results. + +If Unity cannot instantiate the connection, you can see the tests succeed in the running application. Running tests on platforms with arguments, in this state, does not provide XML test results. + + + +For more information, see [Edit Mode vs Play Mode tests](./edit-mode-vs-play-mode-tests.md). \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-run-test.md b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-run-test.md new file mode 100644 index 0000000..506194b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/Documentation~/workflow-run-test.md @@ -0,0 +1,19 @@ +# Workflow: How to run a test + +To run a test, you need to double-click on the test or test fixture name in the **Test Runner** window. + +You can also use one of the buttons on the top bar, **Run All** or **Run Selected**. As a result, you’ll see the test status icon changed and a counter in the top right corner updated: + +![EditMode Run Test](./images/editmode-run-test.png) + +You may also use a context menu option **Run**, right-click on any item in the test tree to have it (with all its children if any) run. + +![EditMode Run Tests](./images/editmode-run-tests.png) + + + +## Run tests within Rider + +It is possible to run unit tests in the Unity Test Framework directly from [JetBrains Rider](https://www.jetbrains.com/rider/). + +For more information, see the [JetBrains official documentation](https://www.jetbrains.com/help/rider/Running_and_Debugging_Unity_Tests.html) and their blog post [Run Unity tests in Rider 2018.1](https://blog.jetbrains.com/dotnet/2018/04/18/run-unity-tests-rider-2018-1/). \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/LICENSE.md b/Library/PackageCache/com.unity.test-framework@1.1.3/LICENSE.md new file mode 100644 index 0000000..f2dc729 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/LICENSE.md @@ -0,0 +1,5 @@ +Test Framework copyright © 2019 Unity Technologies ApS + +Licensed under the Unity Companion License for Unity-dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). + +Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. Please review the license for details on these and other terms and conditions. diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/LICENSE.md.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/LICENSE.md.meta new file mode 100644 index 0000000..f6a2ca2 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3ec7596410385054a9e0bc90377fbe63 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner.meta new file mode 100644 index 0000000..d1eb573 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95cdf27b47eb82747ba9e51f41e72a35 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api.meta new file mode 100644 index 0000000..2ffb8f9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fa423365b1ce06a4dbdc6fb4a8597bfa +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegator.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegator.cs new file mode 100644 index 0000000..022e4b1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegator.cs @@ -0,0 +1,136 @@ +using System; +using System.Linq; +using System.Text; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class CallbacksDelegator + { + private static CallbacksDelegator s_instance; + public static CallbacksDelegator instance + { + get + { + if (s_instance == null) + { + s_instance = new CallbacksDelegator(CallbacksHolder.instance.GetAll, new TestAdaptorFactory()); + } + return s_instance; + } + } + + private readonly Func m_CallbacksProvider; + private readonly ITestAdaptorFactory m_AdaptorFactory; + + public CallbacksDelegator(Func callbacksProvider, ITestAdaptorFactory adaptorFactory) + { + m_CallbacksProvider = callbacksProvider; + m_AdaptorFactory = adaptorFactory; + } + + public void RunStarted(ITest testsToRun) + { + m_AdaptorFactory.ClearResultsCache(); + var testRunnerTestsToRun = m_AdaptorFactory.Create(testsToRun); + TryInvokeAllCallbacks(callbacks => callbacks.RunStarted(testRunnerTestsToRun)); + } + + public void RunStartedRemotely(byte[] testsToRunData) + { + var testData = Deserialize(testsToRunData); + var testsToRun = m_AdaptorFactory.BuildTree(testData); + TryInvokeAllCallbacks(callbacks => callbacks.RunStarted(testsToRun)); + } + + public void RunFinished(ITestResult testResults) + { + var testResult = m_AdaptorFactory.Create(testResults); + TryInvokeAllCallbacks(callbacks => callbacks.RunFinished(testResult)); + } + + public void RunFinishedRemotely(byte[] testResultsData) + { + var remoteTestResult = Deserialize(testResultsData); + var testResult = m_AdaptorFactory.Create(remoteTestResult.results.First(), remoteTestResult); + TryInvokeAllCallbacks(callbacks => callbacks.RunFinished(testResult)); + } + + public void RunFailed(string failureMessage) + { + Debug.LogError(failureMessage); + TryInvokeAllCallbacks(callbacks => + { + var errorCallback = callbacks as IErrorCallbacks; + if (errorCallback != null) + { + errorCallback.OnError(failureMessage); + } + }); + } + + public void TestStarted(ITest test) + { + var testRunnerTest = m_AdaptorFactory.Create(test); + TryInvokeAllCallbacks(callbacks => callbacks.TestStarted(testRunnerTest)); + } + + public void TestStartedRemotely(byte[] testStartedData) + { + var testData = Deserialize(testStartedData); + var testsToRun = m_AdaptorFactory.BuildTree(testData); + + TryInvokeAllCallbacks(callbacks => callbacks.TestStarted(testsToRun)); + } + + public void TestFinished(ITestResult result) + { + var testResult = m_AdaptorFactory.Create(result); + TryInvokeAllCallbacks(callbacks => callbacks.TestFinished(testResult)); + } + + public void TestFinishedRemotely(byte[] testResultsData) + { + var remoteTestResult = Deserialize(testResultsData); + var testResult = m_AdaptorFactory.Create(remoteTestResult.results.First(), remoteTestResult); + TryInvokeAllCallbacks(callbacks => callbacks.TestFinished(testResult)); + } + + public void TestTreeRebuild(ITest test) + { + m_AdaptorFactory.ClearTestsCache(); + var testAdaptor = m_AdaptorFactory.Create(test); + TryInvokeAllCallbacks(callbacks => + { + var rebuildCallbacks = callbacks as ITestTreeRebuildCallbacks; + if (rebuildCallbacks != null) + { + rebuildCallbacks.TestTreeRebuild(testAdaptor); + } + }); + } + + private void TryInvokeAllCallbacks(Action callbackAction) + { + foreach (var testRunnerApiCallback in m_CallbacksProvider()) + { + try + { + callbackAction(testRunnerApiCallback); + } + catch (Exception ex) + { + Debug.LogException(ex); + } + } + } + + private static T Deserialize(byte[] data) + { + return JsonUtility.FromJson(Encoding.UTF8.GetString(data)); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegator.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegator.cs.meta new file mode 100644 index 0000000..89e0904 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0de03ebd74e2b474fa23d05ab42d0cd8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs new file mode 100644 index 0000000..c19621d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs @@ -0,0 +1,28 @@ +using UnityEngine; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class CallbacksDelegatorListener : ScriptableObject, ITestRunnerListener + { + public void RunStarted(NUnit.Framework.Interfaces.ITest testsToRun) + { + CallbacksDelegator.instance.RunStarted(testsToRun); + } + + public void RunFinished(NUnit.Framework.Interfaces.ITestResult testResults) + { + CallbacksDelegator.instance.RunFinished(testResults); + } + + public void TestStarted(NUnit.Framework.Interfaces.ITest test) + { + CallbacksDelegator.instance.TestStarted(test); + } + + public void TestFinished(NUnit.Framework.Interfaces.ITestResult result) + { + CallbacksDelegator.instance.TestFinished(result); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs.meta new file mode 100644 index 0000000..c9bb94a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f3e1b3cbf3fac6a459b1a602167ad311 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksHolder.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksHolder.cs new file mode 100644 index 0000000..5df378d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksHolder.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class CallbacksHolder : ScriptableSingleton, ICallbacksHolder + { + private List m_Callbacks = new List(); + public void Add(ICallbacks callback, int priority) + { + m_Callbacks.Add(new CallbackWithPriority(callback, priority)); + } + + public void Remove(ICallbacks callback) + { + m_Callbacks.RemoveAll(callbackWithPriority => callbackWithPriority.Callback == callback); + } + + public ICallbacks[] GetAll() + { + return m_Callbacks.OrderByDescending(callback => callback.Priority).Select(callback => callback.Callback).ToArray(); + } + + public void Clear() + { + m_Callbacks.Clear(); + } + + private struct CallbackWithPriority + { + public ICallbacks Callback; + public int Priority; + public CallbackWithPriority(ICallbacks callback, int priority) + { + Callback = callback; + Priority = priority; + } + } + + // Sometimes - such as when we want to test the test framework itself - it's necessary to launch a test run from + // inside a test. Because callbacks are registered globally, this can cause a lot of confusion (e.g. the in-test + // run will emit UTP messages, utterly confusing UTR). In such circumstances the safest thing to do is to + // temporarily suppress all registered callbacks for the duration of the in-test run. This method can be called + // to set up a using() block which will suppress the callbacks for the scope. + public IDisposable TemporarilySuppressCallbacks() + { + return new Suppressor(this); + } + + private sealed class Suppressor : IDisposable + { + private readonly CallbacksHolder _instance; + private readonly List _suppressed; + + public Suppressor(CallbacksHolder instance) + { + _instance = instance; + _suppressed = new List(instance.m_Callbacks); + instance.m_Callbacks.Clear(); + } + + public void Dispose() + { + _instance.m_Callbacks.AddRange(_suppressed); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksHolder.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksHolder.cs.meta new file mode 100644 index 0000000..7c42028 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/CallbacksHolder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4884ccc3528cb2e40a0e6f0a19a2b35b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ExecutionSettings.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ExecutionSettings.cs new file mode 100644 index 0000000..4a059a4 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ExecutionSettings.cs @@ -0,0 +1,18 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + public class ExecutionSettings + { + public ExecutionSettings(params Filter[] filtersToExecute) + { + filters = filtersToExecute; + } + + internal BuildTarget? targetPlatform; + public ITestRunSettings overloadTestRunSettings; + internal Filter filter; + public Filter[] filters; + public bool runSynchronously; + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ExecutionSettings.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ExecutionSettings.cs.meta new file mode 100644 index 0000000..602a117 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ExecutionSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eea34a28297f9bc4c9f4c573bc8d5d1c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/Filter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/Filter.cs new file mode 100644 index 0000000..d787c72 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/Filter.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Filters; +using UnityEngine; +using UnityEngine.TestRunner.NUnitExtensions.Filters; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + [Serializable] + public class Filter + { + [SerializeField] + public TestMode testMode; + [SerializeField] + public string[] testNames; + [SerializeField] + public string[] groupNames; + [SerializeField] + public string[] categoryNames; + [SerializeField] + public string[] assemblyNames; + [SerializeField] + public BuildTarget? targetPlatform; + + internal TestRunnerFilter ToTestRunnerFilter() + { + return new TestRunnerFilter() + { + testNames = testNames, + categoryNames = categoryNames, + groupNames = groupNames, + assemblyNames = assemblyNames + }; + } + + internal ITestFilter BuildNUnitFilter(bool synchronousOnly) + { + var filters = new List(); + + if (testNames != null && testNames.Length != 0) + { + var nameFilter = new OrFilter(testNames.Select(n => new FullNameFilter(n)).ToArray()); + filters.Add(nameFilter); + } + + if (groupNames != null && groupNames.Length != 0) + { + var exactNamesFilter = new OrFilter(groupNames.Select(n => + { + var f = new FullNameFilter(n); + f.IsRegex = true; + return f; + }).ToArray()); + filters.Add(exactNamesFilter); + } + + if (assemblyNames != null && assemblyNames.Length != 0) + { + var assemblyFilter = new OrFilter(assemblyNames.Select(c => new AssemblyNameFilter(c)).ToArray()); + filters.Add(assemblyFilter); + } + + if (categoryNames != null && categoryNames.Length != 0) + { + var categoryFilter = new OrFilter(categoryNames.Select(c => new CategoryFilterExtended(c) {IsRegex = true}).ToArray()); + filters.Add(categoryFilter); + } + + if (synchronousOnly) + { + filters.Add(new SynchronousFilter()); + } + + return filters.Count == 0 ? TestFilter.Empty : new AndFilter(filters.ToArray()); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/Filter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/Filter.cs.meta new file mode 100644 index 0000000..bbb21b5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/Filter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 05f92e4a2414cb144a92157752dfa324 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacks.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacks.cs new file mode 100644 index 0000000..365102b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacks.cs @@ -0,0 +1,10 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + public interface ICallbacks + { + void RunStarted(ITestAdaptor testsToRun); + void RunFinished(ITestResultAdaptor result); + void TestStarted(ITestAdaptor test); + void TestFinished(ITestResultAdaptor result); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacks.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacks.cs.meta new file mode 100644 index 0000000..851e3f6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93eea84e53d0226479c9a584f19427b5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacksHolder.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacksHolder.cs new file mode 100644 index 0000000..ff7128b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacksHolder.cs @@ -0,0 +1,10 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal interface ICallbacksHolder + { + void Add(ICallbacks callback, int priority); + void Remove(ICallbacks callback); + ICallbacks[] GetAll(); + void Clear(); + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacksHolder.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacksHolder.cs.meta new file mode 100644 index 0000000..7f11d80 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ICallbacksHolder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d742f2caefd9f934d9f19dad07a08e6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/IErrorCallbacks.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/IErrorCallbacks.cs new file mode 100644 index 0000000..2d7a922 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/IErrorCallbacks.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + public interface IErrorCallbacks : ICallbacks + { + void OnError(string message); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/IErrorCallbacks.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/IErrorCallbacks.cs.meta new file mode 100644 index 0000000..34728c6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/IErrorCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1a06c562b0c5eb046bcb876a29f93c98 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptor.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptor.cs new file mode 100644 index 0000000..7e7736a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptor.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + public interface ITestAdaptor + { + string Id { get; } + string Name { get; } + string FullName { get; } + int TestCaseCount { get; } + bool HasChildren { get; } + bool IsSuite { get; } + IEnumerable Children { get; } + ITestAdaptor Parent { get; } + int TestCaseTimeout { get; } + ITypeInfo TypeInfo { get; } + IMethodInfo Method { get; } + string[] Categories { get; } + bool IsTestAssembly { get; } + RunState RunState { get; } + string Description { get; } + string SkipReason { get; } + string ParentId { get; } + string ParentFullName { get; } + string UniqueName { get; } + string ParentUniqueName { get; } + int ChildIndex { get; } + TestMode TestMode { get; } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptor.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptor.cs.meta new file mode 100644 index 0000000..2ae45af --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 85dd7af03f02aea4aae13a3945e3b313 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs new file mode 100644 index 0000000..021b313 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal interface ITestAdaptorFactory + { + ITestAdaptor Create(ITest test); + ITestAdaptor Create(RemoteTestData testData); + ITestResultAdaptor Create(ITestResult testResult); + ITestResultAdaptor Create(RemoteTestResultData testResult, RemoteTestResultDataWithTestData allData); + ITestAdaptor BuildTree(RemoteTestResultDataWithTestData data); + IEnumerator BuildTreeAsync(RemoteTestResultDataWithTestData data); + void ClearResultsCache(); + void ClearTestsCache(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs.meta new file mode 100644 index 0000000..05dadba --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 803abab0f7e17044db56f8760186dbd1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestLauncherFactory.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestLauncherFactory.cs new file mode 100644 index 0000000..b732322 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestLauncherFactory.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal interface ITestLauncherFactory + { + TestLauncherBase GetLauncher(ExecutionSettings executionSettings); + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestLauncherFactory.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestLauncherFactory.cs.meta new file mode 100644 index 0000000..18e7dca --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestLauncherFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b720ed91bb8eb8498f82f90e622104f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs new file mode 100644 index 0000000..ae4b9f6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework.Interfaces; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + public interface ITestResultAdaptor + { + ITestAdaptor Test { get; } + string Name { get; } + + /// Gets the full name of the test result + string FullName { get; } + + string ResultState { get; } + + TestStatus TestStatus { get; } + + /// Gets the elapsed time for running the test in seconds + double Duration { get; } + + /// Gets or sets the time the test started running. + DateTime StartTime { get; } + + /// Gets or sets the time the test finished running. + DateTime EndTime { get; } + + /// + /// Gets the message associated with a test + /// failure or with not running the test + /// + string Message { get; } + + /// + /// Gets any stacktrace associated with an + /// error or failure. Not available in + /// the Compact Framework 1.0. + /// + string StackTrace { get; } + + /// + /// Gets the number of asserts executed + /// when running the test and all its children. + /// + int AssertCount { get; } + + /// + /// Gets the number of test cases that failed + /// when running the test and all its children. + /// + int FailCount { get; } + + /// + /// Gets the number of test cases that passed + /// when running the test and all its children. + /// + int PassCount { get; } + + /// + /// Gets the number of test cases that were skipped + /// when running the test and all its children. + /// + int SkipCount { get; } + + /// + /// Gets the number of test cases that were inconclusive + /// when running the test and all its children. + /// + int InconclusiveCount { get; } + + /// + /// Indicates whether this result has any child results. + /// Accessing HasChildren should not force creation of the + /// Children collection in classes implementing this interface. + /// + bool HasChildren { get; } + + /// Gets the the collection of child results. + IEnumerable Children { get; } + + /// Gets any text output written to this result. + string Output { get; } + + TNode ToXml(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs.meta new file mode 100644 index 0000000..5ea944f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4f90cfe4bf5cfb44f84a5b11387f2a42 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunSettings.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunSettings.cs new file mode 100644 index 0000000..90058c1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunSettings.cs @@ -0,0 +1,9 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + public interface ITestRunSettings : IDisposable + { + void Apply(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunSettings.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunSettings.cs.meta new file mode 100644 index 0000000..27a3a33 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2ae2ce6274819484fa8747a28cebdf3a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunnerApi.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunnerApi.cs new file mode 100644 index 0000000..fd24a1e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunnerApi.cs @@ -0,0 +1,12 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal interface ITestRunnerApi + { + void Execute(ExecutionSettings executionSettings); + void RegisterCallbacks(T testCallbacks, int priority = 0) where T : ICallbacks; + void UnregisterCallbacks(T testCallbacks) where T : ICallbacks; + void RetrieveTestList(TestMode testMode, Action callback); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunnerApi.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunnerApi.cs.meta new file mode 100644 index 0000000..d581ffd --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestRunnerApi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a7842a837a4b13e41ae16193db753418 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs new file mode 100644 index 0000000..cc5a301 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal interface ITestTreeRebuildCallbacks : ICallbacks + { + void TestTreeRebuild(ITestAdaptor test); + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs.meta new file mode 100644 index 0000000..eb1117c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4230e406313f1db43a4b548e7a3ad2e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/RunState.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/RunState.cs new file mode 100644 index 0000000..ab449de --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/RunState.cs @@ -0,0 +1,11 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + public enum RunState + { + NotRunnable, + Runnable, + Explicit, + Skipped, + Ignored, + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/RunState.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/RunState.cs.meta new file mode 100644 index 0000000..818e3c0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/RunState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bb59cb2f66d156418ca1bd1e2703233 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptor.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptor.cs new file mode 100644 index 0000000..556bb0c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptor.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestRunner.TestLaunchers; +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class TestAdaptor : ITestAdaptor + { + internal TestAdaptor(ITest test, ITestAdaptor[] children = null) + { + Id = test.Id; + Name = test.Name; + var childIndex = -1; + if (test.Properties["childIndex"].Count > 0) + { + childIndex = (int)test.Properties["childIndex"][0]; + } + FullName = childIndex != -1 ? GetIndexedTestCaseName(test.FullName, childIndex) : test.FullName; + TestCaseCount = test.TestCaseCount; + HasChildren = test.HasChildren; + IsSuite = test.IsSuite; + if (UnityTestExecutionContext.CurrentContext != null) + { + TestCaseTimeout = UnityTestExecutionContext.CurrentContext.TestCaseTimeout; + } + else + { + TestCaseTimeout = CoroutineRunner.k_DefaultTimeout; + } + + TypeInfo = test.TypeInfo; + Method = test.Method; + Categories = test.GetAllCategoriesFromTest().Distinct().ToArray(); + IsTestAssembly = test is TestAssembly; + RunState = (RunState)Enum.Parse(typeof(RunState), test.RunState.ToString()); + Description = (string)test.Properties.Get(PropertyNames.Description); + SkipReason = test.GetSkipReason(); + ParentId = test.GetParentId(); + ParentFullName = test.GetParentFullName(); + UniqueName = test.GetUniqueName(); + ParentUniqueName = test.GetParentUniqueName(); + ChildIndex = childIndex; + + if (test.Parent != null) + { + if (test.Parent.Parent == null) // Assembly level + { + TestMode = (TestMode)Enum.Parse(typeof(TestMode),test.Properties.Get("platform").ToString()); + } + } + + Children = children; + } + + public void SetParent(ITestAdaptor parent) + { + Parent = parent; + if (parent != null) + { + TestMode = parent.TestMode; + } + } + + internal TestAdaptor(RemoteTestData test) + { + Id = test.id; + Name = test.name; + FullName = test.ChildIndex != -1 ? GetIndexedTestCaseName(test.fullName, test.ChildIndex) : test.fullName; + TestCaseCount = test.testCaseCount; + HasChildren = test.hasChildren; + IsSuite = test.isSuite; + m_ChildrenIds = test.childrenIds; + TestCaseTimeout = test.testCaseTimeout; + Categories = test.Categories; + IsTestAssembly = test.IsTestAssembly; + RunState = (RunState)Enum.Parse(typeof(RunState), test.RunState.ToString()); + Description = test.Description; + SkipReason = test.SkipReason; + ParentId = test.ParentId; + UniqueName = test.UniqueName; + ParentUniqueName = test.ParentUniqueName; + ParentFullName = test.ParentFullName; + ChildIndex = test.ChildIndex; + TestMode = TestMode.PlayMode; + } + + internal void ApplyChildren(IEnumerable allTests) + { + Children = m_ChildrenIds.Select(id => allTests.First(t => t.Id == id)).ToArray(); + if (!string.IsNullOrEmpty(ParentId)) + { + Parent = allTests.FirstOrDefault(t => t.Id == ParentId); + } + } + + public string Id { get; private set; } + public string Name { get; private set; } + public string FullName { get; private set; } + public int TestCaseCount { get; private set; } + public bool HasChildren { get; private set; } + public bool IsSuite { get; private set; } + public IEnumerable Children { get; private set; } + public ITestAdaptor Parent { get; private set; } + public int TestCaseTimeout { get; private set; } + public ITypeInfo TypeInfo { get; private set; } + public IMethodInfo Method { get; private set; } + private string[] m_ChildrenIds; + public string[] Categories { get; private set; } + public bool IsTestAssembly { get; private set; } + public RunState RunState { get; } + public string Description { get; } + public string SkipReason { get; } + public string ParentId { get; } + public string ParentFullName { get; } + public string UniqueName { get; } + public string ParentUniqueName { get; } + public int ChildIndex { get; } + public TestMode TestMode { get; private set; } + + private static string GetIndexedTestCaseName(string fullName, int index) + { + var generatedTestSuffix = " GeneratedTestCase" + index; + if (fullName.EndsWith(")")) + { + // Test names from generated TestCaseSource look like Test(TestCaseSourceType) + // This inserts a unique test case index in the name, so that it becomes Test(TestCaseSourceType GeneratedTestCase0) + return fullName.Substring(0, fullName.Length - 1) + generatedTestSuffix + fullName[fullName.Length - 1]; + } + + // In some cases there can be tests with duplicate names generated in other ways and they won't have () in their name + // We just append a suffix at the end of the name in that case + return fullName + generatedTestSuffix; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptor.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptor.cs.meta new file mode 100644 index 0000000..81e39b7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6e0e62db88935c74288c97c907243bd0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs new file mode 100644 index 0000000..7a25ec8 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs @@ -0,0 +1,91 @@ +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class TestAdaptorFactory : ITestAdaptorFactory + { + private Dictionary m_TestAdaptorCache = new Dictionary(); + private Dictionary m_TestResultAdaptorCache = new Dictionary(); + public ITestAdaptor Create(ITest test) + { + var uniqueName = test.GetUniqueName(); + if (m_TestAdaptorCache.ContainsKey(uniqueName)) + { + return m_TestAdaptorCache[uniqueName]; + } + + var adaptor = new TestAdaptor(test, test.Tests.Select(Create).ToArray()); + foreach (var child in adaptor.Children) + { + (child as TestAdaptor).SetParent(adaptor); + } + m_TestAdaptorCache[uniqueName] = adaptor; + return adaptor; + } + + public ITestAdaptor Create(RemoteTestData testData) + { + return new TestAdaptor(testData); + } + + public ITestResultAdaptor Create(ITestResult testResult) + { + var uniqueName = testResult.Test.GetUniqueName(); + if (m_TestResultAdaptorCache.ContainsKey(uniqueName)) + { + return m_TestResultAdaptorCache[uniqueName]; + } + var adaptor = new TestResultAdaptor(testResult, Create(testResult.Test), testResult.Children.Select(Create).ToArray()); + m_TestResultAdaptorCache[uniqueName] = adaptor; + return adaptor; + } + + public ITestResultAdaptor Create(RemoteTestResultData testResult, RemoteTestResultDataWithTestData allData) + { + return new TestResultAdaptor(testResult, allData); + } + + public ITestAdaptor BuildTree(RemoteTestResultDataWithTestData data) + { + var tests = data.tests.Select(remoteTestData => new TestAdaptor(remoteTestData)).ToList(); + + foreach (var test in tests) + { + test.ApplyChildren(tests); + } + + return tests.First(); + } + + public IEnumerator BuildTreeAsync(RemoteTestResultDataWithTestData data) + { + var tests = data.tests.Select(remoteTestData => new TestAdaptor(remoteTestData)).ToList(); + + for (var index = 0; index < tests.Count; index++) + { + var test = tests[index]; + test.ApplyChildren(tests); + if (index % 100 == 0) + { + yield return null; + } + } + + yield return tests.First(); + } + + public void ClearResultsCache() + { + m_TestResultAdaptorCache.Clear(); + } + + public void ClearTestsCache() + { + m_TestAdaptorCache.Clear(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs.meta new file mode 100644 index 0000000..0b1175f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d0663d520c26b7c48a4135599e66acf8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestLauncherFactory.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestLauncherFactory.cs new file mode 100644 index 0000000..430adfa --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestLauncherFactory.cs @@ -0,0 +1,75 @@ +using System; +using System.Linq; +using UnityEngine.TestTools; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class TestLauncherFactory : ITestLauncherFactory + { + public TestLauncherBase GetLauncher(ExecutionSettings executionSettings) + { + var filters = GetFilters(executionSettings); + if (filters[0].testMode == TestMode.EditMode || filters[0].testMode == 0) + { + return GetEditModeLauncher(GetFilters(executionSettings), executionSettings.runSynchronously); + } + else + { + if (executionSettings.runSynchronously) + throw new NotSupportedException("Playmode tests cannot be run synchronously."); + + var settings = PlaymodeTestsControllerSettings.CreateRunnerSettings(filters.Select(filter => filter.ToTestRunnerFilter()).ToArray()); + return GetPlayModeLauncher(settings, executionSettings); + } + } + + static Filter[] GetFilters(ExecutionSettings executionSettings) + { + if (executionSettings.filters != null && executionSettings.filters.Length > 0) + { + return executionSettings.filters; + } + + return new[] {executionSettings.filter ?? new Filter()}; + } + + static TestLauncherBase GetEditModeLauncher(Filter[] filters, bool runSynchronously) + { + return GetEditModeLauncherForProvidedAssemblies(filters, TestPlatform.EditMode, runSynchronously); + } + + static TestLauncherBase GetPlayModeLauncher(PlaymodeTestsControllerSettings settings, ExecutionSettings executionSettings) + { + if (executionSettings.targetPlatform != null) + { + return GetPlayerLauncher(settings, executionSettings); + } + + if (PlayerSettings.runPlayModeTestAsEditModeTest) + { + return GetEditModeLauncherForProvidedAssemblies(executionSettings.filters, TestPlatform.PlayMode, false); + } + + return GetPlayModeLauncher(settings); + } + + static TestLauncherBase GetEditModeLauncherForProvidedAssemblies(Filter[] filters, TestPlatform testPlatform, bool runSynchronously) + { + return new EditModeLauncher(filters, testPlatform, runSynchronously); + } + + static TestLauncherBase GetPlayModeLauncher(PlaymodeTestsControllerSettings settings) + { + return new PlaymodeLauncher(settings); + } + + static TestLauncherBase GetPlayerLauncher(PlaymodeTestsControllerSettings settings, ExecutionSettings executionSettings) + { + return new PlayerLauncher( + settings, + executionSettings.targetPlatform.Value, + executionSettings.overloadTestRunSettings); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestLauncherFactory.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestLauncherFactory.cs.meta new file mode 100644 index 0000000..d214c7d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestLauncherFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f33e570b8b9af1048b80a27e7848cb09 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestMode.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestMode.cs new file mode 100644 index 0000000..e55ee3a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestMode.cs @@ -0,0 +1,11 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + [Flags] + public enum TestMode + { + EditMode = 1 << 0, + PlayMode = 1 << 1 + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestMode.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestMode.cs.meta new file mode 100644 index 0000000..e04594b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestMode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cad095eccea17b741bc4cd264e7441cd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestResultAdaptor.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestResultAdaptor.cs new file mode 100644 index 0000000..7374b3f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestResultAdaptor.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class TestResultAdaptor : ITestResultAdaptor + { + private TNode m_Node; + + internal TestResultAdaptor(ITestResult result, ITestAdaptor test, ITestResultAdaptor[] children = null) + { + Test = test; + Name = result.Name; + FullName = result.FullName; + ResultState = result.ResultState.ToString(); + TestStatus = ParseTestStatus(result.ResultState.Status); + Duration = result.Duration; + StartTime = result.StartTime; + EndTime = result.EndTime; + Message = result.Message; + StackTrace = result.StackTrace; + AssertCount = result.AssertCount; + FailCount = result.FailCount; + PassCount = result.PassCount; + SkipCount = result.SkipCount; + InconclusiveCount = result.InconclusiveCount; + HasChildren = result.HasChildren; + Output = result.Output; + Children = children; + m_Node = result.ToXml(true); + } + + internal TestResultAdaptor(RemoteTestResultData result, RemoteTestResultDataWithTestData allData) + { + Test = new TestAdaptor(allData.tests.First(t => t.id == result.testId)); + Name = result.name; + FullName = result.fullName; + ResultState = result.resultState; + TestStatus = ParseTestStatus(result.testStatus); + Duration = result.duration; + StartTime = result.startTime; + EndTime = result.endTime; + Message = result.message; + StackTrace = result.stackTrace; + AssertCount = result.assertCount; + FailCount = result.failCount; + PassCount = result.passCount; + SkipCount = result.skipCount; + InconclusiveCount = result.inconclusiveCount; + HasChildren = result.hasChildren; + Output = result.output; + Children = result.childrenIds.Select(childId => new TestResultAdaptor(allData.results.First(r => r.testId == childId), allData)).ToArray(); + m_Node = TNode.FromXml(result.xml); + } + + public ITestAdaptor Test { get; private set; } + public string Name { get; private set; } + public string FullName { get; private set; } + public string ResultState { get; private set; } + public TestStatus TestStatus { get; private set; } + public double Duration { get; private set; } + public DateTime StartTime { get; private set; } + public DateTime EndTime { get; private set; } + public string Message { get; private set; } + public string StackTrace { get; private set; } + public int AssertCount { get; private set; } + public int FailCount { get; private set; } + public int PassCount { get; private set; } + public int SkipCount { get; private set; } + public int InconclusiveCount { get; private set; } + public bool HasChildren { get; private set; } + public IEnumerable Children { get; private set; } + public string Output { get; private set; } + public TNode ToXml() + { + return m_Node; + } + + private static TestStatus ParseTestStatus(NUnit.Framework.Interfaces.TestStatus testStatus) + { + return (TestStatus)Enum.Parse(typeof(TestStatus), testStatus.ToString()); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestResultAdaptor.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestResultAdaptor.cs.meta new file mode 100644 index 0000000..c2b119e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestResultAdaptor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d061ada5d3169454daf54243390b5fdb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunData.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunData.cs new file mode 100644 index 0000000..decdf28 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunData.cs @@ -0,0 +1,12 @@ +using System; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + [Serializable] + internal class TestRunData : ScriptableSingleton + { + [SerializeField] + public ExecutionSettings executionSettings; + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunData.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunData.cs.meta new file mode 100644 index 0000000..701da80 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 973b024861c5ae84f869aad614234b04 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunnerApi.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunnerApi.cs new file mode 100644 index 0000000..b5bb9ab --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunnerApi.cs @@ -0,0 +1,106 @@ +using System; +using System.Linq; +using System.Threading; +using UnityEngine; +using UnityEngine.TestRunner.TestLaunchers; +using UnityEngine.TestTools; +using UnityEngine.TestTools.NUnitExtensions; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + public class TestRunnerApi : ScriptableObject, ITestRunnerApi + { + internal ITestLauncherFactory launcherFactory = new TestLauncherFactory(); + internal ICallbacksHolder callbacksHolder; + + private ICallbacksHolder m_CallbacksHolder + { + get + { + if (callbacksHolder == null) + { + return CallbacksHolder.instance; + } + + return callbacksHolder; + } + } + + public void Execute(ExecutionSettings executionSettings) + { + if (executionSettings == null) + { + throw new ArgumentNullException(nameof(executionSettings)); + } + + if (executionSettings.targetPlatform == null && executionSettings.filters != null && + executionSettings.filters.Length > 0) + { + executionSettings.targetPlatform = executionSettings.filters[0].targetPlatform; + } + + var data = TestRunData.instance; + data.executionSettings = executionSettings; + + var testLauncher = launcherFactory.GetLauncher(executionSettings); + testLauncher.Run(); + } + + public void RegisterCallbacks(T testCallbacks, int priority = 0) where T : ICallbacks + { + if (testCallbacks == null) + { + throw new ArgumentNullException(nameof(testCallbacks)); + } + + m_CallbacksHolder.Add(testCallbacks, priority); + } + + public void UnregisterCallbacks(T testCallbacks) where T : ICallbacks + { + if (testCallbacks == null) + { + throw new ArgumentNullException(nameof(testCallbacks)); + } + + m_CallbacksHolder.Remove(testCallbacks); + } + + internal void RetrieveTestList(ExecutionSettings executionSettings, Action callback) + { + if (executionSettings == null) + { + throw new ArgumentNullException(nameof(executionSettings)); + } + + var firstFilter = executionSettings.filters?.FirstOrDefault() ?? executionSettings.filter; + RetrieveTestList(firstFilter.testMode, callback); + } + + public void RetrieveTestList(TestMode testMode, Action callback) + { + if (callback == null) + { + throw new ArgumentNullException(nameof(callback)); + } + + var platform = ParseTestMode(testMode); + var testAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy()); + var testAdaptorFactory = new TestAdaptorFactory(); + var testListCache = new TestListCache(testAdaptorFactory, new RemoteTestResultDataFactory(), TestListCacheData.instance); + var testListProvider = new TestListProvider(testAssemblyProvider, new UnityTestAssemblyBuilder()); + var cachedTestListProvider = new CachingTestListProvider(testListProvider, testListCache, testAdaptorFactory); + + var job = new TestListJob(cachedTestListProvider, platform, (testRoot) => + { + callback(testRoot); + }); + job.Start(); + } + + private static TestPlatform ParseTestMode(TestMode testMode) + { + return (((testMode & TestMode.EditMode) == TestMode.EditMode) ? TestPlatform.EditMode : 0) | (((testMode & TestMode.PlayMode) == TestMode.PlayMode) ? TestPlatform.PlayMode : 0); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunnerApi.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunnerApi.cs.meta new file mode 100644 index 0000000..7ad5fc1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestRunnerApi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68993ba529ae04440916cb7c23bf3279 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestStatus.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestStatus.cs new file mode 100644 index 0000000..f330fa1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestStatus.cs @@ -0,0 +1,10 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + public enum TestStatus + { + Inconclusive, + Skipped, + Passed, + Failed + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestStatus.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestStatus.cs.meta new file mode 100644 index 0000000..38bd6af --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/Api/TestStatus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9ec94545c5b00344c9bd8e691f15d799 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/AssemblyInfo.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/AssemblyInfo.cs new file mode 100644 index 0000000..49b650e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/AssemblyInfo.cs @@ -0,0 +1,15 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyTitle("UnityEditor.TestRunner")] +[assembly: InternalsVisibleTo("Assembly-CSharp-Editor-testable")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] +[assembly: InternalsVisibleTo("Unity.PerformanceTesting.Editor")] +[assembly: InternalsVisibleTo("Unity.IntegrationTests")] +[assembly: InternalsVisibleTo("UnityEditor.TestRunner.Tests")] +[assembly: InternalsVisibleTo("Unity.TestTools.CodeCoverage.Editor")] +[assembly: InternalsVisibleTo("Unity.PackageManagerUI.Develop.Editor")] +[assembly: InternalsVisibleTo("Unity.PackageManagerUI.Develop.EditorTests")] +[assembly: InternalsVisibleTo("Unity.PackageValidationSuite.Editor")] + +[assembly: AssemblyVersion("1.0.0")] diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/AssemblyInfo.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/AssemblyInfo.cs.meta new file mode 100644 index 0000000..5e1b8dd --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9db19a04003fca7439552acd4de9baa1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser.meta new file mode 100644 index 0000000..b5a29bd --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7602252bdb82b8d45ae3483c3a00d3e1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs new file mode 100644 index 0000000..1a2d98a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs @@ -0,0 +1,45 @@ +using System; +using System.Linq; + +namespace UnityEditor.TestRunner.CommandLineParser +{ + internal class CommandLineOption : ICommandLineOption + { + Action m_ArgAction; + + public CommandLineOption(string argName, Action action) + { + ArgName = argName; + m_ArgAction = s => action(); + } + + public CommandLineOption(string argName, Action action) + { + ArgName = argName; + m_ArgAction = action; + } + + public CommandLineOption(string argName, Action action) + { + ArgName = argName; + m_ArgAction = s => action(SplitStringToArray(s)); + } + + public string ArgName { get; private set; } + + public void ApplyValue(string value) + { + m_ArgAction(value); + } + + static string[] SplitStringToArray(string value) + { + if (string.IsNullOrEmpty(value)) + { + return null; + } + + return value.Split(';').ToArray(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs.meta new file mode 100644 index 0000000..65f3256 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3529368f4cd0424a89aa51080a16b06 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs new file mode 100644 index 0000000..d08c233 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs @@ -0,0 +1,49 @@ +using System; + +namespace UnityEditor.TestRunner.CommandLineParser +{ + internal class CommandLineOptionSet + { + ICommandLineOption[] m_Options; + + public CommandLineOptionSet(params ICommandLineOption[] options) + { + m_Options = options; + } + + public void Parse(string[] args) + { + var i = 0; + while (i < args.Length) + { + var arg = args[i]; + if (!arg.StartsWith("-")) + { + i++; + continue; + } + + string value = null; + if (i + 1 < args.Length && !args[i + 1].StartsWith("-")) + { + value = args[i + 1]; + i++; + } + + ApplyValueToMatchingOptions(arg, value); + i++; + } + } + + private void ApplyValueToMatchingOptions(string argName, string value) + { + foreach (var option in m_Options) + { + if ("-" + option.ArgName == argName) + { + option.ApplyValue(value); + } + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs.meta new file mode 100644 index 0000000..1db24d0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 139c5eac101a4dc4fb3098e30c29f15e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs new file mode 100644 index 0000000..7f699ad --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs @@ -0,0 +1,8 @@ +namespace UnityEditor.TestRunner.CommandLineParser +{ + interface ICommandLineOption + { + string ArgName { get; } + void ApplyValue(string value); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs.meta new file mode 100644 index 0000000..613d95f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f445ca0c614a846449fcd8ae648c24e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest.meta new file mode 100644 index 0000000..d005718 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b477d1f29b65a674e9d5cdab4eb72b01 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/Executer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/Executer.cs new file mode 100644 index 0000000..fe0eb3b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/Executer.cs @@ -0,0 +1,134 @@ +using System; +using System.Linq; +using UnityEditor.TestRunner.TestLaunchers; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class Executer + { + private ITestRunnerApi m_TestRunnerApi; + private ISettingsBuilder m_SettingsBuilder; + private Action m_LogErrorFormat; + private Action m_LogException; + private Action m_ExitEditorApplication; + private Func m_ScriptCompilationFailedCheck; + + public Executer(ITestRunnerApi testRunnerApi, ISettingsBuilder settingsBuilder, Action logErrorFormat, Action logException, Action exitEditorApplication, Func scriptCompilationFailedCheck) + { + m_TestRunnerApi = testRunnerApi; + m_SettingsBuilder = settingsBuilder; + m_LogErrorFormat = logErrorFormat; + m_LogException = logException; + m_ExitEditorApplication = exitEditorApplication; + m_ScriptCompilationFailedCheck = scriptCompilationFailedCheck; + } + + internal void InitializeAndExecuteRun(string[] commandLineArgs) + { + Api.ExecutionSettings executionSettings; + try + { + executionSettings = m_SettingsBuilder.BuildApiExecutionSettings(commandLineArgs); + if (executionSettings.targetPlatform.HasValue) + RemotePlayerLogController.instance.SetBuildTarget(executionSettings.targetPlatform.Value); + } + catch (SetupException exception) + { + HandleSetupException(exception); + return; + } + + try + { + Debug.Log("Executing tests with settings: " + ExecutionSettingsToString(executionSettings)); + m_TestRunnerApi.Execute(executionSettings); + } + catch (Exception exception) + { + m_LogException(exception); + m_ExitEditorApplication((int)ReturnCodes.RunError); + } + } + + internal ExecutionSettings BuildExecutionSettings(string[] commandLineArgs) + { + return m_SettingsBuilder.BuildExecutionSettings(commandLineArgs); + } + + internal enum ReturnCodes + { + Ok = 0, + Failed = 2, + RunError = 3, + PlatformNotFoundReturnCode = 4 + } + + internal void SetUpCallbacks(ExecutionSettings executionSettings) + { + RemotePlayerLogController.instance.SetLogsDirectory(executionSettings.DeviceLogsDirectory); + + var resultSavingCallback = ScriptableObject.CreateInstance(); + resultSavingCallback.m_ResultFilePath = executionSettings.TestResultsFile; + + var logSavingCallback = ScriptableObject.CreateInstance(); + + m_TestRunnerApi.RegisterCallbacks(resultSavingCallback); + m_TestRunnerApi.RegisterCallbacks(logSavingCallback); + m_TestRunnerApi.RegisterCallbacks(ScriptableObject.CreateInstance(), -10); + } + + internal void ExitOnCompileErrors() + { + if (m_ScriptCompilationFailedCheck()) + { + var handling = s_ExceptionHandlingMapping.First(h => h.m_ExceptionType == SetupException.ExceptionType.ScriptCompilationFailed); + m_LogErrorFormat(handling.m_Message, new object[0]); + m_ExitEditorApplication(handling.m_ReturnCode); + } + } + + void HandleSetupException(SetupException exception) + { + ExceptionHandling handling = s_ExceptionHandlingMapping.FirstOrDefault(h => h.m_ExceptionType == exception.Type) ?? new ExceptionHandling(exception.Type, "Unknown command line test run error. " + exception.Type, ReturnCodes.RunError); + m_LogErrorFormat(handling.m_Message, exception.Details); + m_ExitEditorApplication(handling.m_ReturnCode); + } + + private class ExceptionHandling + { + internal SetupException.ExceptionType m_ExceptionType; + internal string m_Message; + internal int m_ReturnCode; + public ExceptionHandling(SetupException.ExceptionType exceptionType, string message, ReturnCodes returnCode) + { + m_ExceptionType = exceptionType; + m_Message = message; + m_ReturnCode = (int)returnCode; + } + } + + static ExceptionHandling[] s_ExceptionHandlingMapping = new[] + { + new ExceptionHandling(SetupException.ExceptionType.ScriptCompilationFailed, "Scripts had compilation errors.", ReturnCodes.RunError), + new ExceptionHandling(SetupException.ExceptionType.PlatformNotFound, "Test platform not found ({0}).", ReturnCodes.PlatformNotFoundReturnCode), + new ExceptionHandling(SetupException.ExceptionType.TestSettingsFileNotFound, "Test settings file not found at {0}.", ReturnCodes.RunError) + }; + + private static string ExecutionSettingsToString(Api.ExecutionSettings executionSettings) + { + if (executionSettings == null) + { + return "none"; + } + + if (executionSettings.filters == null || executionSettings.filters.Length == 0) + { + return "no filter"; + } + + return "test mode = " + executionSettings.filters[0].testMode; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/Executer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/Executer.cs.meta new file mode 100644 index 0000000..e57a010 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/Executer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 083c6a3a5426382449369ddc12b691d8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs new file mode 100644 index 0000000..3ff2356 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs @@ -0,0 +1,11 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + [Serializable] + internal class ExecutionSettings + { + public string TestResultsFile; + public string DeviceLogsDirectory; + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs.meta new file mode 100644 index 0000000..35edc4c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3a75354f6ceac94ca15ca9d96593290 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs new file mode 100644 index 0000000..cd7b370 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs @@ -0,0 +1,53 @@ +using System; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + [Serializable] + internal class ExitCallbacks : ScriptableObject, IErrorCallbacks + { + private bool m_AnyTestsExecuted; + private bool m_RunFailed; + internal static bool preventExit; + + public void RunFinished(ITestResultAdaptor testResults) + { + if (preventExit) + { + return; + } + + if (!m_AnyTestsExecuted) + { + Debug.LogFormat(LogType.Warning, LogOption.NoStacktrace, null, "No tests were executed"); + } + EditorApplication.Exit(m_RunFailed ? (int)Executer.ReturnCodes.Failed : (int)Executer.ReturnCodes.Ok); + } + + public void TestStarted(ITestAdaptor test) + { + if (!test.IsSuite) + { + m_AnyTestsExecuted = true; + } + } + + public void TestFinished(ITestResultAdaptor result) + { + if (!result.Test.IsSuite && (result.TestStatus == TestStatus.Failed)) + { + m_RunFailed = true; + } + } + + public void RunStarted(ITestAdaptor testsToRun) + { + } + + public void OnError(string message) + { + EditorApplication.Exit((int)Executer.ReturnCodes.Failed); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs.meta new file mode 100644 index 0000000..6296463 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1adaa8dcc4fda3d4cb4d3c8e0cb65d12 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs new file mode 100644 index 0000000..557195d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs @@ -0,0 +1,10 @@ +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + interface ISettingsBuilder + { + Api.ExecutionSettings BuildApiExecutionSettings(string[] commandLineArgs); + ExecutionSettings BuildExecutionSettings(string[] commandLineArgs); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs.meta new file mode 100644 index 0000000..cc0b248 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8a13cbeb2099aca47bb456f49845f86c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs new file mode 100644 index 0000000..40a185f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs @@ -0,0 +1,29 @@ +using System; +using UnityEditor.TestRunner.TestLaunchers; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + [Serializable] + internal class LogSavingCallbacks : ScriptableObject, ICallbacks + { + public void RunStarted(ITestAdaptor testsToRun) + { + RemotePlayerLogController.instance.StartLogWriters(); + } + + public virtual void RunFinished(ITestResultAdaptor testResults) + { + RemotePlayerLogController.instance.StopLogWriters(); + } + + public void TestStarted(ITestAdaptor test) + { + } + + public void TestFinished(ITestResultAdaptor result) + { + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs.meta new file mode 100644 index 0000000..c968178 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8d20eedbe40f0ce41a4c4f633f225de8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs new file mode 100644 index 0000000..5470fd7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEditor.DeploymentTargets; +using UnityEditor.Utils; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class LogWriter : IDisposable + { + private string m_LogsDirectory; + private string m_DeviceID; + private Dictionary m_LogStreams; + private DeploymentTargetLogger m_Logger; + + internal LogWriter(string logsDirectory, string deviceID, DeploymentTargetLogger logger) + { + m_LogStreams = new Dictionary(); + m_Logger = logger; + m_LogsDirectory = logsDirectory; + m_DeviceID = deviceID; + + logger.logMessage += WriteLogToFile; + } + + private void WriteLogToFile(string id, string logLine) + { + StreamWriter logStream; + var streamExists = m_LogStreams.TryGetValue(id, out logStream); + if (!streamExists) + { + var filePath = GetLogFilePath(m_LogsDirectory, m_DeviceID, id); + logStream = CreateLogFile(filePath); + + m_LogStreams.Add(id, logStream); + } + + try + { + if (logLine != null) + logStream.WriteLine(logLine); + } + catch (Exception ex) + { + Debug.LogError($"Writing {id} log failed."); + Debug.LogException(ex); + } + } + + public void Stop() + { + m_Logger.Stop(); + foreach (var logStream in m_LogStreams) + { + logStream.Value.Close(); + } + } + + public void Dispose() + { + Stop(); + } + + private StreamWriter CreateLogFile(string path) + { + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "Creating {0} device log: {1}", m_DeviceID, path); + StreamWriter streamWriter = null; + try + { + if (!Directory.Exists(path)) + Directory.CreateDirectory(Path.GetDirectoryName(path)); + + streamWriter = File.CreateText(path); + } + catch (Exception ex) + { + Debug.LogError($"Creating device log {path} file failed."); + Debug.LogException(ex); + } + + return streamWriter; + } + + private string GetLogFilePath(string lgosDirectory, string deviceID, string logID) + { + var fileName = "Device-" + deviceID + "-" + logID + ".txt"; + fileName = string.Join("_", fileName.Split(Path.GetInvalidFileNameChars())); + return Paths.Combine(lgosDirectory, fileName); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs.meta new file mode 100644 index 0000000..56872b9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 05778dd1de4433d418793b6f3d3c18cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs new file mode 100644 index 0000000..a3837bf --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs @@ -0,0 +1,50 @@ +using System; +using System.IO; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.Utils; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + [Serializable] + internal class ResultsSavingCallbacks : ScriptableObject, ICallbacks + { + [SerializeField] + public string m_ResultFilePath; + + public ResultsSavingCallbacks() + { + this.m_ResultFilePath = GetDefaultResultFilePath(); + } + + public void RunStarted(ITestAdaptor testsToRun) + { + } + + public virtual void RunFinished(ITestResultAdaptor testResults) + { + if (string.IsNullOrEmpty(m_ResultFilePath)) + { + m_ResultFilePath = GetDefaultResultFilePath(); + } + + var resultWriter = new ResultsWriter(); + resultWriter.WriteResultToFile(testResults, m_ResultFilePath); + } + + public void TestStarted(ITestAdaptor test) + { + } + + public void TestFinished(ITestResultAdaptor result) + { + } + + private static string GetDefaultResultFilePath() + { + var fileName = "TestResults-" + DateTime.Now.Ticks + ".xml"; + var projectPath = Directory.GetCurrentDirectory(); + return Paths.Combine(projectPath, fileName); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs.meta new file mode 100644 index 0000000..ca06f3a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ef563c5a6ecf64d4193dc144cb7d472a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs new file mode 100644 index 0000000..073d2ec --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs @@ -0,0 +1,99 @@ +using System; +using System.IO; +using System.Xml; +using NUnit.Framework.Interfaces; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class ResultsWriter + { + private const string k_nUnitVersion = "3.5.0.0"; + + private const string k_TestRunNode = "test-run"; + private const string k_Id = "id"; + private const string k_Testcasecount = "testcasecount"; + private const string k_Result = "result"; + private const string k_Total = "total"; + private const string k_Passed = "passed"; + private const string k_Failed = "failed"; + private const string k_Inconclusive = "inconclusive"; + private const string k_Skipped = "skipped"; + private const string k_Asserts = "asserts"; + private const string k_EngineVersion = "engine-version"; + private const string k_ClrVersion = "clr-version"; + private const string k_StartTime = "start-time"; + private const string k_EndTime = "end-time"; + private const string k_Duration = "duration"; + + private const string k_TimeFormat = "u"; + + public void WriteResultToFile(ITestResultAdaptor result, string filePath) + { + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "Saving results to: {0}", filePath); + + try + { + if (!Directory.Exists(filePath)) + { + CreateDirectory(filePath); + } + + using (var fileStream = File.CreateText(filePath)) + { + WriteResultToStream(result, fileStream); + } + } + catch (Exception ex) + { + Debug.LogError("Saving result file failed."); + Debug.LogException(ex); + } + } + + void CreateDirectory(string filePath) + { + Directory.CreateDirectory(Path.GetDirectoryName(filePath)); + } + + public void WriteResultToStream(ITestResultAdaptor result, StreamWriter streamWriter, XmlWriterSettings settings = null) + { + settings = settings ?? new XmlWriterSettings(); + settings.Indent = true; + settings.NewLineOnAttributes = false; + + using (var xmlWriter = XmlWriter.Create(streamWriter, settings)) + { + WriteResultsToXml(result, xmlWriter); + } + } + + void WriteResultsToXml(ITestResultAdaptor result, XmlWriter xmlWriter) + { + // XML format as specified at https://github.com/nunit/docs/wiki/Test-Result-XML-Format + + var testRunNode = new TNode(k_TestRunNode); + + testRunNode.AddAttribute(k_Id, "2"); + testRunNode.AddAttribute(k_Testcasecount, (result.PassCount + result.FailCount + result.SkipCount + result.InconclusiveCount).ToString()); + testRunNode.AddAttribute(k_Result, result.ResultState.ToString()); + testRunNode.AddAttribute(k_Total, (result.PassCount + result.FailCount + result.SkipCount + result.InconclusiveCount).ToString()); + testRunNode.AddAttribute(k_Passed, result.PassCount.ToString()); + testRunNode.AddAttribute(k_Failed, result.FailCount.ToString()); + testRunNode.AddAttribute(k_Inconclusive, result.InconclusiveCount.ToString()); + testRunNode.AddAttribute(k_Skipped, result.SkipCount.ToString()); + testRunNode.AddAttribute(k_Asserts, result.AssertCount.ToString()); + testRunNode.AddAttribute(k_EngineVersion, k_nUnitVersion); + testRunNode.AddAttribute(k_ClrVersion, Environment.Version.ToString()); + testRunNode.AddAttribute(k_StartTime, result.StartTime.ToString(k_TimeFormat)); + testRunNode.AddAttribute(k_EndTime, result.EndTime.ToString(k_TimeFormat)); + testRunNode.AddAttribute(k_Duration, result.Duration.ToString()); + + var resultNode = result.ToXml(); + testRunNode.ChildNodes.Add(resultNode); + + testRunNode.WriteTo(xmlWriter); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs.meta new file mode 100644 index 0000000..074fe65 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 29d603e0a726a9043b3503112271844a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunData.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunData.cs new file mode 100644 index 0000000..6a469a7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunData.cs @@ -0,0 +1,8 @@ +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class RunData : ScriptableSingleton + { + public bool isRunning; + public ExecutionSettings executionSettings; + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunData.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunData.cs.meta new file mode 100644 index 0000000..4cfe30e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f8c1075884df0249b80e23a0598f9c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs new file mode 100644 index 0000000..9b914c7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs @@ -0,0 +1,29 @@ +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class RunSettings : ITestRunSettings + { + private ITestSettings m_TestSettings; + public RunSettings(ITestSettings testSettings) + { + this.m_TestSettings = testSettings; + } + + public void Apply() + { + if (m_TestSettings != null) + { + m_TestSettings.SetupProjectParameters(); + } + } + + public void Dispose() + { + if (m_TestSettings != null) + { + m_TestSettings.Dispose(); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs.meta new file mode 100644 index 0000000..0e241ba --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 59d3f5586b341a74c84c8f72144a4568 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs new file mode 100644 index 0000000..38a0e58 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs @@ -0,0 +1,173 @@ +using System; +using System.IO; +using UnityEditor.TestRunner.CommandLineParser; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class SettingsBuilder : ISettingsBuilder + { + private ITestSettingsDeserializer m_TestSettingsDeserializer; + private Action m_LogAction; + private Action m_LogWarningAction; + private Func m_FileExistsCheck; + private Func m_ScriptCompilationFailedCheck; + public SettingsBuilder(ITestSettingsDeserializer testSettingsDeserializer, Action logAction, Action logWarningAction, Func fileExistsCheck, Func scriptCompilationFailedCheck) + { + m_LogAction = logAction; + m_LogWarningAction = logWarningAction; + m_FileExistsCheck = fileExistsCheck; + m_ScriptCompilationFailedCheck = scriptCompilationFailedCheck; + m_TestSettingsDeserializer = testSettingsDeserializer; + } + + public Api.ExecutionSettings BuildApiExecutionSettings(string[] commandLineArgs) + { + var quit = false; + string testPlatform = TestMode.EditMode.ToString(); + string[] testFilters = null; + string[] testCategories = null; + string testSettingsFilePath = null; + int testRepetitions = 1; + + var optionSet = new CommandLineOptionSet( + new CommandLineOption("quit", () => { quit = true; }), + new CommandLineOption("testPlatform", platform => { testPlatform = platform; }), + new CommandLineOption("editorTestsFilter", filters => { testFilters = filters; }), + new CommandLineOption("testFilter", filters => { testFilters = filters; }), + new CommandLineOption("editorTestsCategories", catagories => { testCategories = catagories; }), + new CommandLineOption("testCategory", catagories => { testCategories = catagories; }), + new CommandLineOption("testSettingsFile", settingsFilePath => { testSettingsFilePath = settingsFilePath; }), + new CommandLineOption("testRepetitions", reps => { testRepetitions = int.Parse(reps); }) + ); + optionSet.Parse(commandLineArgs); + + DisplayQuitWarningIfQuitIsGiven(quit); + + CheckForScriptCompilationErrors(); + + LogParametersForRun(testPlatform, testFilters, testCategories, testSettingsFilePath); + + var testSettings = GetTestSettings(testSettingsFilePath); + + var filter = new Filter() + { + groupNames = testFilters, + categoryNames = testCategories + }; + + var buildTarget = SetFilterAndGetBuildTarget(testPlatform, filter); + + RerunCallbackData.instance.runFilters = new []{new TestRunnerFilter() + { + categoryNames = filter.categoryNames, + groupNames = filter.groupNames, + testRepetitions = testRepetitions + }}; + + RerunCallbackData.instance.testMode = filter.testMode; + + return new Api.ExecutionSettings() + { + filters = new []{filter}, + overloadTestRunSettings = new RunSettings(testSettings), + targetPlatform = buildTarget + }; + } + + public ExecutionSettings BuildExecutionSettings(string[] commandLineArgs) + { + string resultFilePath = null; + string deviceLogsDirectory = null; + + var optionSet = new CommandLineOptionSet( + new CommandLineOption("editorTestsResultFile", filePath => { resultFilePath = filePath; }), + new CommandLineOption("testResults", filePath => { resultFilePath = filePath; }), + new CommandLineOption("deviceLogs", dirPath => { deviceLogsDirectory = dirPath; }) + ); + optionSet.Parse(commandLineArgs); + + return new ExecutionSettings() + { + TestResultsFile = resultFilePath, + DeviceLogsDirectory = deviceLogsDirectory + }; + } + + void DisplayQuitWarningIfQuitIsGiven(bool quitIsGiven) + { + if (quitIsGiven) + { + m_LogWarningAction("Running tests from command line arguments will not work when \"quit\" is specified."); + } + } + + void CheckForScriptCompilationErrors() + { + if (m_ScriptCompilationFailedCheck()) + { + throw new SetupException(SetupException.ExceptionType.ScriptCompilationFailed); + } + } + + void LogParametersForRun(string testPlatform, string[] testFilters, string[] testCategories, string testSettingsFilePath) + { + m_LogAction("Running tests for " + testPlatform); + if (testFilters != null && testFilters.Length > 0) + { + m_LogAction("With test filter: " + string.Join(", ", testFilters)); + } + if (testCategories != null && testCategories.Length > 0) + { + m_LogAction("With test categories: " + string.Join(", ", testCategories)); + } + if (!string.IsNullOrEmpty(testSettingsFilePath)) + { + m_LogAction("With test settings file: " + testSettingsFilePath); + } + } + + ITestSettings GetTestSettings(string testSettingsFilePath) + { + ITestSettings testSettings = null; + if (!string.IsNullOrEmpty(testSettingsFilePath)) + { + if (!m_FileExistsCheck(testSettingsFilePath)) + { + throw new SetupException(SetupException.ExceptionType.TestSettingsFileNotFound, testSettingsFilePath); + } + + testSettings = m_TestSettingsDeserializer.GetSettingsFromJsonFile(testSettingsFilePath); + } + return testSettings; + } + + static BuildTarget? SetFilterAndGetBuildTarget(string testPlatform, Filter filter) + { + BuildTarget? buildTarget = null; + if (testPlatform.ToLower() == "editmode") + { + filter.testMode = TestMode.EditMode; + } + else if (testPlatform.ToLower() == "playmode") + { + filter.testMode = TestMode.PlayMode; + } + else + { + try + { + buildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), testPlatform, true); + + filter.testMode = TestMode.PlayMode; + } + catch (ArgumentException) + { + throw new SetupException(SetupException.ExceptionType.PlatformNotFound, testPlatform); + } + } + return buildTarget; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs.meta new file mode 100644 index 0000000..1e2f8c9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b7468a027a77337478e133b40b42b4f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SetupException.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SetupException.cs new file mode 100644 index 0000000..3337713 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SetupException.cs @@ -0,0 +1,23 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class SetupException : Exception + { + public ExceptionType Type { get; } + public object[] Details { get; } + + public SetupException(ExceptionType type, params object[] details) + { + Type = type; + Details = details; + } + + public enum ExceptionType + { + ScriptCompilationFailed, + PlatformNotFound, + TestSettingsFileNotFound, + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SetupException.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SetupException.cs.meta new file mode 100644 index 0000000..bdb235c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/SetupException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 63572993f2104574099a48392460b211 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs new file mode 100644 index 0000000..bced727 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs @@ -0,0 +1,80 @@ +using System; +using System.IO; +using UnityEditor.TestRunner.CommandLineParser; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + [InitializeOnLoad] + static class TestStarter + { + static TestStarter() + { + if (!ShouldRunTests()) + { + return; + } + + if (EditorApplication.isCompiling) + { + return; + } + + executer.ExitOnCompileErrors(); + + if (RunData.instance.isRunning) + { + executer.SetUpCallbacks(RunData.instance.executionSettings); + return; + } + + EditorApplication.update += UpdateWatch; + } + + static void UpdateWatch() + { + EditorApplication.update -= UpdateWatch; + + if (RunData.instance.isRunning) + { + return; + } + + RunData.instance.isRunning = true; + var commandLineArgs = Environment.GetCommandLineArgs(); + RunData.instance.executionSettings = executer.BuildExecutionSettings(commandLineArgs); + executer.SetUpCallbacks(RunData.instance.executionSettings); + executer.InitializeAndExecuteRun(commandLineArgs); + } + + static bool ShouldRunTests() + { + var shouldRunTests = false; + var optionSet = new CommandLineOptionSet( + new CommandLineOption("runTests", () => { shouldRunTests = true; }), + new CommandLineOption("runEditorTests", () => { shouldRunTests = true; }) + ); + optionSet.Parse(Environment.GetCommandLineArgs()); + return shouldRunTests; + } + + static Executer s_Executer; + + static Executer executer + { + get + { + if (s_Executer == null) + { + Func compilationCheck = () => EditorUtility.scriptCompilationFailed; + Action actionLogger = (string msg) => { Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, msg); }; + var apiSettingsBuilder = new SettingsBuilder(new TestSettingsDeserializer(() => new TestSettings()), actionLogger, Debug.LogWarning, File.Exists, compilationCheck); + s_Executer = new Executer(ScriptableObject.CreateInstance(), apiSettingsBuilder, Debug.LogErrorFormat, Debug.LogException, EditorApplication.Exit, compilationCheck); + } + + return s_Executer; + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs.meta new file mode 100644 index 0000000..4d5dfdc --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4d616d1a494edd144b262cf6cd5e5fda +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI.meta new file mode 100644 index 0000000..bc9308a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e609b27ad2caa14c83dd9951b6c13c6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs new file mode 100644 index 0000000..0016142 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs @@ -0,0 +1,11 @@ +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class AssetsDatabaseHelper : IAssetsDatabaseHelper + { + public void OpenAssetInItsDefaultExternalEditor(string assetPath, int line) + { + var asset = AssetDatabase.LoadMainAssetAtPath(assetPath); + AssetDatabase.OpenAsset(asset, line); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs.meta new file mode 100644 index 0000000..4fad1fc --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 740b3785866edda4b8d1e1a05570a5f8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/GuiHelper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/GuiHelper.cs new file mode 100644 index 0000000..26aba74 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/GuiHelper.cs @@ -0,0 +1,101 @@ +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; +using UnityEditor.Utils; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class GuiHelper : IGuiHelper + { + public GuiHelper(IMonoCecilHelper monoCecilHelper, IAssetsDatabaseHelper assetsDatabaseHelper) + { + MonoCecilHelper = monoCecilHelper; + AssetsDatabaseHelper = assetsDatabaseHelper; + } + + protected IMonoCecilHelper MonoCecilHelper { get; private set; } + public IAssetsDatabaseHelper AssetsDatabaseHelper { get; private set; } + + public void OpenScriptInExternalEditor(Type type, MethodInfo method) + { + var fileOpenInfo = GetFileOpenInfo(type, method); + + if (string.IsNullOrEmpty(fileOpenInfo.FilePath)) + { + Debug.LogWarning("Failed to open test method source code in external editor. Inconsistent filename and yield return operator in target method."); + + return; + } + + if (fileOpenInfo.LineNumber == 1) + { + Debug.LogWarning("Failed to get a line number for unity test method. So please find it in opened file in external editor."); + } + + AssetsDatabaseHelper.OpenAssetInItsDefaultExternalEditor(fileOpenInfo.FilePath, fileOpenInfo.LineNumber); + } + + public IFileOpenInfo GetFileOpenInfo(Type type, MethodInfo method) + { + const string fileExtension = ".cs"; + + var fileOpenInfo = MonoCecilHelper.TryGetCecilFileOpenInfo(type, method); + if (string.IsNullOrEmpty(fileOpenInfo.FilePath)) + { + var dirPath = Paths.UnifyDirectorySeparator(Application.dataPath); + var allCsFiles = Directory.GetFiles(dirPath, string.Format("*{0}", fileExtension), SearchOption.AllDirectories) + .Select(Paths.UnifyDirectorySeparator); + + var fileName = allCsFiles.FirstOrDefault(x => + x.Split(Path.DirectorySeparatorChar).Last().Equals(string.Concat(type.Name, fileExtension))); + + fileOpenInfo.FilePath = fileName ?? string.Empty; + } + + fileOpenInfo.FilePath = FilePathToAssetsRelativeAndUnified(fileOpenInfo.FilePath); + + return fileOpenInfo; + } + + public string FilePathToAssetsRelativeAndUnified(string filePath) + { + if (string.IsNullOrEmpty(filePath)) + return string.Empty; + + filePath = Paths.UnifyDirectorySeparator(filePath); + var length = Paths.UnifyDirectorySeparator(Application.dataPath).Length - "Assets".Length; + + return filePath.Substring(length); + } + + public bool OpenScriptInExternalEditor(string stacktrace) + { + if (string.IsNullOrEmpty(stacktrace)) + return false; + + var regex = new Regex("in (?.*):{1}(?[0-9]+)"); + + var matchingLines = stacktrace.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Where(x => regex.IsMatch(x)).ToList(); + if (!matchingLines.Any()) + return false; + + var fileOpenInfo = matchingLines + .Select(x => regex.Match(x)) + .Select(x => + new FileOpenInfo + { + FilePath = x.Groups["path"].Value, + LineNumber = int.Parse(x.Groups["line"].Value) + }) + .First(openInfo => !string.IsNullOrEmpty(openInfo.FilePath) && File.Exists(openInfo.FilePath)); + + var filePath = FilePathToAssetsRelativeAndUnified(fileOpenInfo.FilePath); + AssetsDatabaseHelper.OpenAssetInItsDefaultExternalEditor(filePath, fileOpenInfo.LineNumber); + + return true; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/GuiHelper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/GuiHelper.cs.meta new file mode 100644 index 0000000..a1512d0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/GuiHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d0138170d24533e47b8e6c250c6d7fbc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs new file mode 100644 index 0000000..3e26c53 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal interface IAssetsDatabaseHelper + { + void OpenAssetInItsDefaultExternalEditor(string assetPath, int line); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs.meta new file mode 100644 index 0000000..622fe68 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 208e46d59ff6e304db0318377d20f5a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IGuiHelper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IGuiHelper.cs new file mode 100644 index 0000000..a87fb8d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IGuiHelper.cs @@ -0,0 +1,13 @@ +using System; +using System.Reflection; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal interface IGuiHelper + { + bool OpenScriptInExternalEditor(string stacktrace); + void OpenScriptInExternalEditor(Type type, MethodInfo method); + IFileOpenInfo GetFileOpenInfo(Type type, MethodInfo method); + string FilePathToAssetsRelativeAndUnified(string filePath); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IGuiHelper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IGuiHelper.cs.meta new file mode 100644 index 0000000..9c6e266 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/IGuiHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fd57cf917f61bbb42b8f030436426ddd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder.meta new file mode 100644 index 0000000..e682923 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 07ea0326ed848fb4489187cb58f96113 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs new file mode 100644 index 0000000..34118d6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs @@ -0,0 +1,12 @@ +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class RenderingOptions + { + public string nameFilter; + public bool showSucceeded; + public bool showFailed; + public bool showIgnored; + public bool showNotRunned; + public string[] categories; + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs.meta new file mode 100644 index 0000000..57e6748 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 87357ff0dec4ef348a295235835c6ee4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs new file mode 100644 index 0000000..cee81da --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs @@ -0,0 +1,175 @@ +// **************************************************************** +// Based on nUnit 2.6.2 (http://www.nunit.org/) +// **************************************************************** + +using System; +using System.Collections.Generic; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + /// + /// Summary description for ResultSummarizer. + /// + internal class ResultSummarizer + { + private int m_ErrorCount = -1; + private int m_FailureCount; + private int m_IgnoreCount = -1; + private int m_InconclusiveCount = -1; + private int m_NotRunnable = -1; + private int m_ResultCount; + private int m_SkipCount; + private int m_SuccessCount; + private int m_TestsRun; + + private TimeSpan m_Duration = TimeSpan.FromSeconds(0); + + public ResultSummarizer(IEnumerable results) + { + foreach (var result in results) + Summarize(result); + } + + public bool success + { + get { return m_FailureCount == 0; } + } + + /// + /// Returns the number of test cases for which results + /// have been summarized. Any tests excluded by use of + /// Category or Explicit attributes are not counted. + /// + public int ResultCount + { + get { return m_ResultCount; } + } + + /// + /// Returns the number of test cases actually run, which + /// is the same as ResultCount, less any Skipped, Ignored + /// or NonRunnable tests. + /// + public int TestsRun + { + get { return m_TestsRun; } + } + + /// + /// Returns the number of tests that passed + /// + public int Passed + { + get { return m_SuccessCount; } + } + + /// + /// Returns the number of test cases that had an error. + /// + public int errors + { + get { return m_ErrorCount; } + } + + /// + /// Returns the number of test cases that failed. + /// + public int failures + { + get { return m_FailureCount; } + } + + /// + /// Returns the number of test cases that failed. + /// + public int inconclusive + { + get { return m_InconclusiveCount; } + } + + /// + /// Returns the number of test cases that were not runnable + /// due to errors in the signature of the class or method. + /// Such tests are also counted as Errors. + /// + public int notRunnable + { + get { return m_NotRunnable; } + } + + /// + /// Returns the number of test cases that were skipped. + /// + public int Skipped + { + get { return m_SkipCount; } + } + + public int ignored + { + get { return m_IgnoreCount; } + } + + public double duration + { + get { return m_Duration.TotalSeconds; } + } + + public int testsNotRun + { + get { return m_SkipCount + m_IgnoreCount + m_NotRunnable; } + } + + public void Summarize(TestRunnerResult result) + { + m_Duration += TimeSpan.FromSeconds(result.duration); + m_ResultCount++; + + if (result.resultStatus != TestRunnerResult.ResultStatus.NotRun) + { + //TODO implement missing features + // if(result.IsIgnored) + // { + // m_IgnoreCount++; + // return; + // } + + m_SkipCount++; + return; + } + + switch (result.resultStatus) + { + case TestRunnerResult.ResultStatus.Passed: + m_SuccessCount++; + m_TestsRun++; + break; + case TestRunnerResult.ResultStatus.Failed: + m_FailureCount++; + m_TestsRun++; + break; + //TODO implement missing features + // case TestResultState.Error: + // case TestResultState.Cancelled: + // m_ErrorCount++; + // m_TestsRun++; + // break; + // case TestResultState.Inconclusive: + // m_InconclusiveCount++; + // m_TestsRun++; + // break; + // case TestResultState.NotRunnable: + // m_NotRunnable++; + // // errorCount++; + // break; + // case TestResultState.Ignored: + // m_IgnoreCount++; + // break; + default: + m_SkipCount++; + break; + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs.meta new file mode 100644 index 0000000..bc4b465 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95a2914724952ef40bb590d0607fc878 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs new file mode 100644 index 0000000..576a685 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs @@ -0,0 +1,105 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class TestFilterSettings + { + public bool showSucceeded; + public bool showFailed; + public bool showIgnored; + public bool showNotRun; + + public string filterByName; + public int filterByCategory; + + private GUIContent m_SucceededBtn; + private GUIContent m_FailedBtn; + private GUIContent m_IgnoredBtn; + private GUIContent m_NotRunBtn; + + public string[] availableCategories; + + private readonly string m_PrefsKey; + + public TestFilterSettings(string prefsKey) + { + availableCategories = null; + m_PrefsKey = prefsKey; + Load(); + UpdateCounters(Enumerable.Empty()); + } + + public void Load() + { + showSucceeded = EditorPrefs.GetBool(m_PrefsKey + ".ShowSucceeded", true); + showFailed = EditorPrefs.GetBool(m_PrefsKey + ".ShowFailed", true); + showIgnored = EditorPrefs.GetBool(m_PrefsKey + ".ShowIgnored", true); + showNotRun = EditorPrefs.GetBool(m_PrefsKey + ".ShowNotRun", true); + filterByName = EditorPrefs.GetString(m_PrefsKey + ".FilterByName", string.Empty); + filterByCategory = EditorPrefs.GetInt(m_PrefsKey + ".FilterByCategory", 0); + } + + public void Save() + { + EditorPrefs.SetBool(m_PrefsKey + ".ShowSucceeded", showSucceeded); + EditorPrefs.SetBool(m_PrefsKey + ".ShowFailed", showFailed); + EditorPrefs.SetBool(m_PrefsKey + ".ShowIgnored", showIgnored); + EditorPrefs.SetBool(m_PrefsKey + ".ShowNotRun", showNotRun); + EditorPrefs.SetString(m_PrefsKey + ".FilterByName", filterByName); + EditorPrefs.SetInt(m_PrefsKey + ".FilterByCategory", filterByCategory); + } + + public void UpdateCounters(IEnumerable results) + { + var summary = new ResultSummarizer(results); + + m_SucceededBtn = new GUIContent(summary.Passed.ToString(), Icons.s_SuccessImg, "Show tests that succeeded"); + m_FailedBtn = new GUIContent((summary.errors + summary.failures + summary.inconclusive).ToString(), Icons.s_FailImg, "Show tests that failed"); + m_IgnoredBtn = new GUIContent((summary.ignored + summary.notRunnable).ToString(), Icons.s_IgnoreImg, "Show tests that are ignored"); + m_NotRunBtn = new GUIContent((summary.testsNotRun - summary.ignored - summary.notRunnable).ToString(), Icons.s_UnknownImg, "Show tests that didn't run"); + } + + public string[] GetSelectedCategories() + { + if (availableCategories == null) + return new string[0]; + + return availableCategories.Where((c, i) => (filterByCategory & (1 << i)) != 0).ToArray(); + } + + public void OnGUI() + { + EditorGUI.BeginChangeCheck(); + + filterByName = GUILayout.TextField(filterByName, "ToolbarSeachTextField", GUILayout.MinWidth(100), GUILayout.MaxWidth(250), GUILayout.ExpandWidth(true)); + if (GUILayout.Button(GUIContent.none, string.IsNullOrEmpty(filterByName) ? "ToolbarSeachCancelButtonEmpty" : "ToolbarSeachCancelButton")) + filterByName = string.Empty; + + if (availableCategories != null && availableCategories.Length > 0) + filterByCategory = EditorGUILayout.MaskField(filterByCategory, availableCategories, EditorStyles.toolbarDropDown, GUILayout.MaxWidth(90)); + + showSucceeded = GUILayout.Toggle(showSucceeded, m_SucceededBtn, EditorStyles.toolbarButton); + showFailed = GUILayout.Toggle(showFailed, m_FailedBtn, EditorStyles.toolbarButton); + showIgnored = GUILayout.Toggle(showIgnored, m_IgnoredBtn, EditorStyles.toolbarButton); + showNotRun = GUILayout.Toggle(showNotRun, m_NotRunBtn, EditorStyles.toolbarButton); + + if (EditorGUI.EndChangeCheck()) + Save(); + } + + public RenderingOptions BuildRenderingOptions() + { + var options = new RenderingOptions(); + options.showSucceeded = showSucceeded; + options.showFailed = showFailed; + options.showIgnored = showIgnored; + options.showNotRunned = showNotRun; + options.nameFilter = filterByName; + options.categories = GetSelectedCategories(); + return options; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs.meta new file mode 100644 index 0000000..af8b799 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 046c3854296c5ec48bac50da6ca248ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs new file mode 100644 index 0000000..86d42f3 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs @@ -0,0 +1,111 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEditor.IMGUI.Controls; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestTools.TestRunner.GUI; +using UnityEngine.TestRunner.NUnitExtensions.Filters; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class TestTreeViewBuilder + { + public List results = new List(); + private readonly List m_OldTestResultList; + private readonly TestRunnerUIFilter m_UIFilter; + private readonly ITestAdaptor m_TestListRoot; + + private readonly List m_AvailableCategories = new List(); + + public string[] AvailableCategories + { + get { return m_AvailableCategories.Distinct().OrderBy(a => a).ToArray(); } + } + + public TestTreeViewBuilder(ITestAdaptor tests, List oldTestResultResults, TestRunnerUIFilter uiFilter) + { + m_AvailableCategories.Add(CategoryFilterExtended.k_DefaultCategory); + m_OldTestResultList = oldTestResultResults; + m_TestListRoot = tests; + m_UIFilter = uiFilter; + } + + public TreeViewItem BuildTreeView(TestFilterSettings settings, bool sceneBased, string sceneName) + { + var rootItem = new TreeViewItem(int.MaxValue, 0, null, "Invisible Root Item"); + ParseTestTree(0, rootItem, m_TestListRoot); + return rootItem; + } + + private bool IsFilteredOutByUIFilter(ITestAdaptor test, TestRunnerResult result) + { + if (m_UIFilter.PassedHidden && result.resultStatus == TestRunnerResult.ResultStatus.Passed) + return true; + if (m_UIFilter.FailedHidden && (result.resultStatus == TestRunnerResult.ResultStatus.Failed || result.resultStatus == TestRunnerResult.ResultStatus.Inconclusive)) + return true; + if (m_UIFilter.NotRunHidden && (result.resultStatus == TestRunnerResult.ResultStatus.NotRun || result.resultStatus == TestRunnerResult.ResultStatus.Skipped)) + return true; + if (m_UIFilter.CategoryFilter.Length > 0) + return !test.Categories.Any(category => m_UIFilter.CategoryFilter.Contains(category)); + return false; + } + + private void ParseTestTree(int depth, TreeViewItem rootItem, ITestAdaptor testElement) + { + m_AvailableCategories.AddRange(testElement.Categories); + + var testElementId = testElement.UniqueName; + if (!testElement.HasChildren) + { + var result = m_OldTestResultList.FirstOrDefault(a => a.uniqueId == testElementId); + + if (result != null && + (result.ignoredOrSkipped + || result.notRunnable + || testElement.RunState == RunState.NotRunnable + || testElement.RunState == RunState.Ignored + || testElement.RunState == RunState.Skipped + ) + ) + { + //if the test was or becomes ignored or not runnable, we recreate the result in case it has changed + result = null; + } + if (result == null) + { + result = new TestRunnerResult(testElement); + } + results.Add(result); + + var test = new TestTreeViewItem(testElement, depth, rootItem); + if (!IsFilteredOutByUIFilter(testElement, result)) + rootItem.AddChild(test); + test.SetResult(result); + return; + } + + var groupResult = m_OldTestResultList.FirstOrDefault(a => a.uniqueId == testElementId); + if (groupResult == null) + { + groupResult = new TestRunnerResult(testElement); + } + + results.Add(groupResult); + var group = new TestTreeViewItem(testElement, depth, rootItem); + group.SetResult(groupResult); + + depth++; + foreach (var child in testElement.Children) + { + ParseTestTree(depth, group, child); + } + + + if (testElement.IsTestAssembly && !testElement.HasChildren) + return; + + if (group.hasChildren) + rootItem.AddChild(group); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs.meta new file mode 100644 index 0000000..68a6c25 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e17c88b021c2a4c409b3f15b0d80ac62 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs new file mode 100644 index 0000000..05cadba --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs @@ -0,0 +1,135 @@ +using System; +using System.IO; +using System.Linq; +using UnityEditor.ProjectWindowCallback; +using UnityEditor.Scripting.ScriptCompilation; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class TestListGUIHelper + { + private const string kResourcesTemplatePath = "Resources/ScriptTemplates"; + private const string kAssemblyDefinitionTestTemplate = "92-Assembly Definition-NewTestAssembly.asmdef.txt"; + + private const string kAssemblyDefinitionEditModeTestTemplate = + "92-Assembly Definition-NewEditModeTestAssembly.asmdef.txt"; + + private const string kTestScriptTemplate = "83-C# Script-NewTestScript.cs.txt"; + private const string kNewTestScriptName = "NewTestScript.cs"; + private const string kNunit = "nunit.framework.dll"; + + [MenuItem("Assets/Create/Testing/Tests Assembly Folder", false, 83)] + public static void MenuItemAddFolderAndAsmDefForTesting() + { + AddFolderAndAsmDefForTesting(); + } + + [MenuItem("Assets/Create/Testing/Tests Assembly Folder", true, 83)] + public static bool MenuItemAddFolderAndAsmDefForTestingWithValidation() + { + return !SelectedFolderContainsTestAssembly(); + } + + public static void AddFolderAndAsmDefForTesting(bool isEditorOnly = false) + { + ProjectWindowUtil.CreateFolderWithTemplates("Tests", + isEditorOnly ? kAssemblyDefinitionEditModeTestTemplate : kAssemblyDefinitionTestTemplate); + } + + public static bool SelectedFolderContainsTestAssembly() + { + var theNearestCustomScriptAssembly = GetTheNearestCustomScriptAssembly(); + if (theNearestCustomScriptAssembly != null) + { + return theNearestCustomScriptAssembly.PrecompiledReferences != null && theNearestCustomScriptAssembly.PrecompiledReferences.Any(x => Path.GetFileName(x) == kNunit); + } + + return false; + } + + [MenuItem("Assets/Create/Testing/C# Test Script", false, 83)] + public static void AddTest() + { + var basePath = Path.Combine(EditorApplication.applicationContentsPath, kResourcesTemplatePath); + var destPath = Path.Combine(GetActiveFolderPath(), kNewTestScriptName); + var templatePath = Path.Combine(basePath, kTestScriptTemplate); + var icon = EditorGUIUtility.IconContent("cs Script Icon").image as Texture2D; + ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, + ScriptableObject.CreateInstance(), destPath, icon, templatePath); + + AssetDatabase.Refresh(); + } + + [MenuItem("Assets/Create/Testing/C# Test Script", true, 83)] + public static bool CanAddScriptAndItWillCompile() + { + return CanAddEditModeTestScriptAndItWillCompile() || CanAddPlayModeTestScriptAndItWillCompile(); + } + + public static bool CanAddEditModeTestScriptAndItWillCompile() + { + var theNearestCustomScriptAssembly = GetTheNearestCustomScriptAssembly(); + if (theNearestCustomScriptAssembly != null) + { + return (theNearestCustomScriptAssembly.AssemblyFlags & AssemblyFlags.EditorOnly) == + AssemblyFlags.EditorOnly; + } + + var activeFolderPath = GetActiveFolderPath(); + return activeFolderPath.ToLower().Contains("/editor"); + } + + public static bool CanAddPlayModeTestScriptAndItWillCompile() + { + if (PlayerSettings.playModeTestRunnerEnabled) + { + return true; + } + + var theNearestCustomScriptAssembly = GetTheNearestCustomScriptAssembly(); + + if (theNearestCustomScriptAssembly == null) + { + return false; + } + + var hasTestAssemblyFlag = theNearestCustomScriptAssembly.PrecompiledReferences != null && theNearestCustomScriptAssembly.PrecompiledReferences.Any(x => Path.GetFileName(x) == kNunit);; + var editorOnlyAssembly = (theNearestCustomScriptAssembly.AssemblyFlags & AssemblyFlags.EditorOnly) != 0; + + return hasTestAssemblyFlag && !editorOnlyAssembly; + } + + public static string GetActiveFolderPath() + { + var path = "Assets"; + + foreach (var obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets)) + { + path = AssetDatabase.GetAssetPath(obj); + if (!string.IsNullOrEmpty(path) && File.Exists(path)) + { + path = Path.GetDirectoryName(path); + break; + } + } + return path; + } + + private static CustomScriptAssembly GetTheNearestCustomScriptAssembly() + { + CustomScriptAssembly findCustomScriptAssemblyFromScriptPath; + try + { + findCustomScriptAssemblyFromScriptPath = + EditorCompilationInterface.Instance.FindCustomScriptAssemblyFromScriptPath( + Path.Combine(GetActiveFolderPath(), "Foo.cs")); + } + catch (Exception) + { + return null; + } + return findCustomScriptAssemblyFromScriptPath; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs.meta new file mode 100644 index 0000000..70d8f19 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 97a05971510726f438153cd4987526fb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView.meta new file mode 100644 index 0000000..63ce2ad --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 68cb547af0187634aad591a09c01cd5b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs new file mode 100644 index 0000000..52c94a5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs @@ -0,0 +1,24 @@ +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal static class Icons + { + public static readonly Texture2D s_FailImg; + public static readonly Texture2D s_IgnoreImg; + public static readonly Texture2D s_SuccessImg; + public static readonly Texture2D s_UnknownImg; + public static readonly Texture2D s_InconclusiveImg; + public static readonly Texture2D s_StopwatchImg; + + static Icons() + { + s_FailImg = EditorGUIUtility.IconContent("TestFailed").image as Texture2D; + s_IgnoreImg = EditorGUIUtility.IconContent("TestIgnored").image as Texture2D; + s_SuccessImg = EditorGUIUtility.IconContent("TestPassed").image as Texture2D; + s_UnknownImg = EditorGUIUtility.IconContent("TestNormal").image as Texture2D; + s_InconclusiveImg = EditorGUIUtility.IconContent("TestInconclusive").image as Texture2D; + s_StopwatchImg = EditorGUIUtility.IconContent("TestStopwatch").image as Texture2D; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs.meta new file mode 100644 index 0000000..3ddb7ee --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27769e9b00b038d47aefe306a4d20bec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs new file mode 100644 index 0000000..0fc9409 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs @@ -0,0 +1,99 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEditor.IMGUI.Controls; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.SceneManagement; +using UnityEngine.TestTools.TestRunner; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class TestListTreeViewDataSource : TreeViewDataSource + { + private bool m_ExpandTreeOnCreation; + private readonly TestListGUI m_TestListGUI; + private ITestAdaptor m_RootTest; + + public TestListTreeViewDataSource(TreeViewController testListTree, TestListGUI testListGUI, ITestAdaptor rootTest) : base(testListTree) + { + showRootItem = false; + rootIsCollapsable = false; + m_TestListGUI = testListGUI; + m_RootTest = rootTest; + } + + public void UpdateRootTest(ITestAdaptor rootTest) + { + m_RootTest = rootTest; + } + + public override void FetchData() + { + var sceneName = SceneManager.GetActiveScene().name; + if (sceneName.StartsWith("InitTestScene")) + sceneName = PlaymodeTestsController.GetController().settings.originalScene; + + var testListBuilder = new TestTreeViewBuilder(m_RootTest, m_TestListGUI.newResultList, m_TestListGUI.m_TestRunnerUIFilter); + + m_RootItem = testListBuilder.BuildTreeView(null, false, sceneName); + SetExpanded(m_RootItem, true); + if (m_RootItem.hasChildren && m_RootItem.children.Count == 1) + SetExpanded(m_RootItem.children[0], true); + + if (m_ExpandTreeOnCreation) + SetExpandedWithChildren(m_RootItem, true); + + m_TestListGUI.newResultList = new List(testListBuilder.results); + m_TestListGUI.m_TestRunnerUIFilter.availableCategories = testListBuilder.AvailableCategories; + m_NeedRefreshRows = true; + } + + public override bool IsRenamingItemAllowed(TreeViewItem item) + { + return false; + } + + public void ExpandTreeOnCreation() + { + m_ExpandTreeOnCreation = true; + } + + public override bool IsExpandable(TreeViewItem item) + { + if (item is TestTreeViewItem) + return ((TestTreeViewItem)item).IsGroupNode; + return base.IsExpandable(item); + } + + protected override List Search(TreeViewItem rootItem, string search) + { + var result = new List(); + + if (rootItem.hasChildren) + { + foreach (var child in rootItem.children) + { + SearchTestTree(child, search, result); + } + } + return result; + } + + protected void SearchTestTree(TreeViewItem item, string search, IList searchResult) + { + var testItem = item as TestTreeViewItem; + if (!testItem.IsGroupNode) + { + if (testItem.FullName.ToLower().Contains(search)) + { + searchResult.Add(item); + } + } + else if (item.children != null) + { + foreach (var child in item.children) + SearchTestTree(child, search, searchResult); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs.meta new file mode 100644 index 0000000..5ec5332 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ce87c287371edde43a4b5fcfdee7b9ef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs new file mode 100644 index 0000000..6657813 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs @@ -0,0 +1,11 @@ +using UnityEditor.IMGUI.Controls; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class TestListTreeViewGUI : TreeViewGUI + { + public TestListTreeViewGUI(TreeViewController testListTree) : base(testListTree) + { + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs.meta new file mode 100644 index 0000000..ed09e25 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 52c907c81459f324497af504b84fd557 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs new file mode 100644 index 0000000..8d99de9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs @@ -0,0 +1,118 @@ +using System; +using System.Reflection; +using System.Text; +using UnityEditor.IMGUI.Controls; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal sealed class TestTreeViewItem : TreeViewItem + { + public TestRunnerResult result; + internal ITestAdaptor m_Test; + + public Type type; + public MethodInfo method; + + private const int k_ResultTestMaxLength = 15000; + + public bool IsGroupNode { get { return m_Test.IsSuite; } } + + public string FullName { get { return m_Test.FullName; } } + + public TestTreeViewItem(ITestAdaptor test, int depth, TreeViewItem parent) + : base(GetId(test), depth, parent, test.Name) + { + m_Test = test; + + if (test.TypeInfo != null) + { + type = test.TypeInfo.Type; + } + if (test.Method != null) + { + method = test.Method.MethodInfo; + } + + displayName = test.Name.Replace("\n", ""); + icon = Icons.s_UnknownImg; + } + + private static int GetId(ITestAdaptor test) + { + return test.UniqueName.GetHashCode(); + } + + public void SetResult(TestRunnerResult testResult) + { + result = testResult; + result.SetResultChangedCallback(ResultUpdated); + ResultUpdated(result); + } + + public string GetResultText() + { + var durationString = String.Format("{0:0.000}", result.duration); + var sb = new StringBuilder(string.Format("{0} ({1}s)", displayName.Trim(), durationString)); + if (!string.IsNullOrEmpty(result.description)) + { + sb.AppendFormat("\n{0}", result.description); + } + if (!string.IsNullOrEmpty(result.messages)) + { + sb.Append("\n---\n"); + sb.Append(result.messages.Trim()); + } + if (!string.IsNullOrEmpty(result.stacktrace)) + { + sb.Append("\n---\n"); + sb.Append(result.stacktrace.Trim()); + } + if (!string.IsNullOrEmpty(result.output)) + { + sb.Append("\n---\n"); + sb.Append(result.output.Trim()); + } + if (sb.Length > k_ResultTestMaxLength) + { + sb.Length = k_ResultTestMaxLength; + sb.AppendFormat("...\n\n---MESSAGE TRUNCATED AT {0} CHARACTERS---", k_ResultTestMaxLength); + } + return sb.ToString().Trim(); + } + + private void ResultUpdated(TestRunnerResult testResult) + { + switch (testResult.resultStatus) + { + case TestRunnerResult.ResultStatus.Passed: + icon = Icons.s_SuccessImg; + break; + case TestRunnerResult.ResultStatus.Failed: + icon = Icons.s_FailImg; + break; + case TestRunnerResult.ResultStatus.Inconclusive: + icon = Icons.s_InconclusiveImg; + break; + case TestRunnerResult.ResultStatus.Skipped: + icon = Icons.s_IgnoreImg; + break; + default: + if (testResult.ignoredOrSkipped) + { + icon = Icons.s_IgnoreImg; + } + else if (testResult.notRunnable) + { + icon = Icons.s_FailImg; + } + else + { + icon = Icons.s_UnknownImg; + } + break; + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs.meta new file mode 100644 index 0000000..1a29abe --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ce567ddbf30368344bc7b80e20cac36e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerResult.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerResult.cs new file mode 100644 index 0000000..b70d0ab --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerResult.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + [Serializable] + internal class TestRunnerResult : TestRunnerFilter.IClearableResult + { + public string id; + public string uniqueId; + public string name; + public string fullName; + public ResultStatus resultStatus = ResultStatus.NotRun; + public float duration; + public string messages; + public string output; + public string stacktrace; + public bool notRunnable; + public bool ignoredOrSkipped; + public string description; + public bool isSuite; + public List categories; + public string parentId; + public string parentUniqueId; + + //This field is suppose to mark results from before domain reload + //Such result is outdated because the code might haev changed + //This field will get reset every time a domain reload happens + [NonSerialized] + public bool notOutdated; + + protected Action m_OnResultUpdate; + + internal TestRunnerResult(ITestAdaptor test) + { + id = test.Id; + uniqueId = test.UniqueName; + + fullName = test.FullName; + name = test.Name; + description = test.Description; + isSuite = test.IsSuite; + + ignoredOrSkipped = test.RunState == RunState.Ignored || test.RunState == RunState.Skipped; + notRunnable = test.RunState == RunState.NotRunnable; + + if (ignoredOrSkipped) + { + messages = test.SkipReason; + } + if (notRunnable) + { + resultStatus = ResultStatus.Failed; + messages = test.SkipReason; + } + categories = test.Categories.ToList(); + parentId = test.ParentId; + parentUniqueId = test.ParentUniqueName; + } + + internal TestRunnerResult(ITestResultAdaptor testResult) : this(testResult.Test) + { + notOutdated = true; + + messages = testResult.Message; + output = testResult.Output; + stacktrace = testResult.StackTrace; + duration = (float)testResult.Duration; + if (testResult.Test.IsSuite && testResult.ResultState == "Ignored") + { + resultStatus = ResultStatus.Passed; + } + else + { + resultStatus = ParseNUnitResultStatus(testResult.TestStatus); + } + } + + public void Update(TestRunnerResult result) + { + if (ReferenceEquals(result, null)) + return; + resultStatus = result.resultStatus; + duration = result.duration; + messages = result.messages; + output = result.output; + stacktrace = result.stacktrace; + ignoredOrSkipped = result.ignoredOrSkipped; + notRunnable = result.notRunnable; + description = result.description; + notOutdated = result.notOutdated; + if (m_OnResultUpdate != null) + m_OnResultUpdate(this); + } + + public void SetResultChangedCallback(Action resultUpdated) + { + m_OnResultUpdate = resultUpdated; + } + + [Serializable] + internal enum ResultStatus + { + NotRun, + Passed, + Failed, + Inconclusive, + Skipped + } + + private static ResultStatus ParseNUnitResultStatus(TestStatus status) + { + switch (status) + { + case TestStatus.Passed: + return ResultStatus.Passed; + case TestStatus.Failed: + return ResultStatus.Failed; + case TestStatus.Inconclusive: + return ResultStatus.Inconclusive; + case TestStatus.Skipped: + return ResultStatus.Skipped; + default: + return ResultStatus.NotRun; + } + } + + public override string ToString() + { + return string.Format("{0} ({1})", name, fullName); + } + + public string Id { get { return uniqueId; } } + public string FullName { get { return fullName; } } + public string ParentId { get { return parentUniqueId; } } + public bool IsSuite { get { return isSuite; } } + public List Categories { get { return categories; } } + + public void Clear() + { + resultStatus = ResultStatus.NotRun; + if (m_OnResultUpdate != null) + m_OnResultUpdate(this); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerResult.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerResult.cs.meta new file mode 100644 index 0000000..771053c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a04a45bbed9e1714f9902fc9443669b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs new file mode 100644 index 0000000..14054ea --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + [Serializable] + internal class TestRunnerUIFilter + { + private int m_PassedCount; + private int m_FailedCount; + private int m_NotRunCount; + private int m_InconclusiveCount; + private int m_SkippedCount; + + public int PassedCount { get { return m_PassedCount; } } + public int FailedCount { get { return m_FailedCount + m_InconclusiveCount; } } + public int NotRunCount { get { return m_NotRunCount + m_SkippedCount; } } + + [SerializeField] + public bool PassedHidden; + [SerializeField] + public bool FailedHidden; + [SerializeField] + public bool NotRunHidden; + + [SerializeField] + private string m_SearchString; + [SerializeField] + private int selectedCategoryMask; + + public string[] availableCategories = new string[0]; + + + private GUIContent m_SucceededBtn; + private GUIContent m_FailedBtn; + private GUIContent m_NotRunBtn; + + public Action RebuildTestList; + public Action SearchStringChanged; + public Action SearchStringCleared; + public bool IsFiltering + { + get + { + return !string.IsNullOrEmpty(m_SearchString) || PassedHidden || FailedHidden || NotRunHidden || + selectedCategoryMask != 0; + } + } + + public string[] CategoryFilter + { + get + { + var list = new List(); + for (int i = 0; i < availableCategories.Length; i++) + { + if ((selectedCategoryMask & (1 << i)) != 0) + { + list.Add(availableCategories[i]); + } + } + return list.ToArray(); + } + } + + public void UpdateCounters(List resultList) + { + m_PassedCount = m_FailedCount = m_NotRunCount = m_InconclusiveCount = m_SkippedCount = 0; + foreach (var result in resultList) + { + if (result.isSuite) + continue; + switch (result.resultStatus) + { + case TestRunnerResult.ResultStatus.Passed: + m_PassedCount++; + break; + case TestRunnerResult.ResultStatus.Failed: + m_FailedCount++; + break; + case TestRunnerResult.ResultStatus.Inconclusive: + m_InconclusiveCount++; + break; + case TestRunnerResult.ResultStatus.Skipped: + m_SkippedCount++; + break; + case TestRunnerResult.ResultStatus.NotRun: + default: + m_NotRunCount++; + break; + } + } + + var succeededTooltip = string.Format("Show tests that succeeded\n{0} succeeded", m_PassedCount); + m_SucceededBtn = new GUIContent(PassedCount.ToString(), Icons.s_SuccessImg, succeededTooltip); + var failedTooltip = string.Format("Show tests that failed\n{0} failed\n{1} inconclusive", m_FailedCount, m_InconclusiveCount); + m_FailedBtn = new GUIContent(FailedCount.ToString(), Icons.s_FailImg, failedTooltip); + var notRunTooltip = string.Format("Show tests that didn't run\n{0} didn't run\n{1} skipped or ignored", m_NotRunCount, m_SkippedCount); + m_NotRunBtn = new GUIContent(NotRunCount.ToString(), Icons.s_UnknownImg, notRunTooltip); + } + + public void Draw() + { + EditorGUI.BeginChangeCheck(); + m_SearchString = EditorGUILayout.ToolbarSearchField(m_SearchString); + if (EditorGUI.EndChangeCheck() && SearchStringChanged != null) + { + SearchStringChanged(m_SearchString); + if (String.IsNullOrEmpty(m_SearchString)) + SearchStringCleared(); + } + + if (availableCategories != null && availableCategories.Any()) + { + EditorGUI.BeginChangeCheck(); + selectedCategoryMask = EditorGUILayout.MaskField(selectedCategoryMask, availableCategories, EditorStyles.toolbarDropDown, GUILayout.MaxWidth(150)); + if (EditorGUI.EndChangeCheck() && RebuildTestList != null) + { + RebuildTestList(); + } + } + else + { + EditorGUILayout.Popup(0, new[] { "" }, EditorStyles.toolbarDropDown, GUILayout.MaxWidth(150)); + } + + EditorGUI.BeginChangeCheck(); + if (m_SucceededBtn != null) + { + PassedHidden = !GUILayout.Toggle(!PassedHidden, m_SucceededBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(PassedCount))); + } + if (m_FailedBtn != null) + { + FailedHidden = !GUILayout.Toggle(!FailedHidden, m_FailedBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(FailedCount))); + } + if (m_NotRunBtn != null) + { + NotRunHidden = !GUILayout.Toggle(!NotRunHidden, m_NotRunBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(NotRunCount))); + } + + if (EditorGUI.EndChangeCheck() && RebuildTestList != null) + { + RebuildTestList(); + } + } + + private static int GetMaxWidth(int count) + { + if (count < 10) + return 33; + return count < 100 ? 40 : 47; + } + + public void Clear() + { + PassedHidden = false; + FailedHidden = false; + NotRunHidden = false; + selectedCategoryMask = 0; + m_SearchString = ""; + if (SearchStringChanged != null) + { + SearchStringChanged(m_SearchString); + } + if (SearchStringCleared != null) + { + SearchStringCleared(); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs.meta new file mode 100644 index 0000000..e65f91a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 15f870c6975ad6449b5b52514b90dc2b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views.meta new file mode 100644 index 0000000..ca14182 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c5535d742ea2e4941850b421f9c70a1f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs new file mode 100644 index 0000000..c465909 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs @@ -0,0 +1,92 @@ +using System; +using System.Linq; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.TestTools; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + [Serializable] + internal class EditModeTestListGUI : TestListGUI + { + public override TestMode TestMode + { + get { return TestMode.EditMode; } + } + + public override void RenderNoTestsInfo() + { + if (!TestListGUIHelper.SelectedFolderContainsTestAssembly()) + { + var noTestText = "No tests to show"; + + if (!PlayerSettings.playModeTestRunnerEnabled) + { + const string testsArePulledFromCustomAssemblies = + "EditMode tests can be in Editor only Assemblies, either in the editor special folder or Editor only Assembly Definitions with added Unity References \"Test Assemblies\"."; + noTestText += Environment.NewLine + testsArePulledFromCustomAssemblies; + } + + EditorGUILayout.HelpBox(noTestText, MessageType.Info); + if (GUILayout.Button("Create EditMode Test Assembly Folder")) + { + TestListGUIHelper.AddFolderAndAsmDefForTesting(isEditorOnly: true); + } + } + + if (!TestListGUIHelper.CanAddEditModeTestScriptAndItWillCompile()) + { + UnityEngine.GUI.enabled = false; + EditorGUILayout.HelpBox("EditMode test scripts can only be created in editor test assemblies.", MessageType.Warning); + } + if (GUILayout.Button("Create Test Script in current folder")) + { + TestListGUIHelper.AddTest(); + } + UnityEngine.GUI.enabled = true; + } + + public override void PrintHeadPanel() + { + base.PrintHeadPanel(); + DrawFilters(); + } + + protected override void RunTests(params TestRunnerFilter[] filters) + { + if (EditorUtility.scriptCompilationFailed) + { + Debug.LogError("Fix compilation issues before running tests"); + return; + } + + foreach (var filter in filters) + { + filter.ClearResults(newResultList.OfType().ToList()); + } + + RerunCallbackData.instance.runFilters = filters; + RerunCallbackData.instance.testMode = TestMode.EditMode; + + var testRunnerApi = ScriptableObject.CreateInstance(); + testRunnerApi.Execute(new ExecutionSettings() + { + filters = filters.Select(filter => new Filter() + { + assemblyNames = filter.assemblyNames, + categoryNames = filter.categoryNames, + groupNames = filter.groupNames, + testMode = TestMode, + testNames = filter.testNames + }).ToArray() + }); + } + + public override TestPlatform TestPlatform { get { return TestPlatform.EditMode; } } + protected override bool IsBusy() + { + return EditModeLauncher.IsRunning || EditorApplication.isCompiling || EditorApplication.isPlaying; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs.meta new file mode 100644 index 0000000..afd4abb --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0336a32a79bfaed43a3fd2d88b91e974 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs new file mode 100644 index 0000000..07a2c7d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs @@ -0,0 +1,116 @@ +using System; +using System.Linq; +using UnityEditor.SceneManagement; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.TestTools; +using UnityEngine.SceneManagement; +using UnityEngine.TestTools.TestRunner; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + [Serializable] + internal class PlayModeTestListGUI : TestListGUI + { + public override TestMode TestMode + { + get { return TestMode.PlayMode; } + } + public override void PrintHeadPanel() + { + EditorGUILayout.BeginHorizontal(GUILayout.ExpandHeight(false)); + base.PrintHeadPanel(); + if (GUILayout.Button("Run all in player (" + EditorUserBuildSettings.activeBuildTarget + ")", EditorStyles.toolbarButton)) + { + RunTestsInPlayer(); + } + EditorGUILayout.EndHorizontal(); + DrawFilters(); + EditorGUILayout.BeginHorizontal(GUILayout.ExpandHeight(false)); + EditorGUILayout.EndHorizontal(); + } + + public override void RenderNoTestsInfo() + { + if (!TestListGUIHelper.SelectedFolderContainsTestAssembly()) + { + var noTestText = "No tests to show"; + if (!PlayerSettings.playModeTestRunnerEnabled) + { + const string testsArePulledFromCustomAssemblues = "Test Assemblies are defined by Assembly Definitions where you add Unity References \"Test Assemblies\""; + const string infoTextAboutTestsInAllAssemblies = + "To have tests in all assemblies enable it in the Test Runner window context menu"; + noTestText += Environment.NewLine + testsArePulledFromCustomAssemblues + Environment.NewLine + + infoTextAboutTestsInAllAssemblies; + } + + EditorGUILayout.HelpBox(noTestText, MessageType.Info); + if (GUILayout.Button("Create PlayMode Test Assembly Folder")) + { + TestListGUIHelper.AddFolderAndAsmDefForTesting(); + } + } + + if (!TestListGUIHelper.CanAddPlayModeTestScriptAndItWillCompile()) + { + UnityEngine.GUI.enabled = false; + EditorGUILayout.HelpBox("PlayMode test scripts can only be created in non editor test assemblies.", MessageType.Warning); + } + if (GUILayout.Button("Create Test Script in current folder")) + { + TestListGUIHelper.AddTest(); + } + UnityEngine.GUI.enabled = true; + } + + protected override void RunTests(TestRunnerFilter[] filters) + { + // Give user chance to save the changes to their currently open scene because we close it and load our own + var cancelled = !EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo(); + if (cancelled) + return; + + foreach (var filter in filters) + { + filter.ClearResults(newResultList.OfType().ToList()); + } + + RerunCallbackData.instance.runFilters = filters; + RerunCallbackData.instance.testMode = TestMode.PlayMode; + + var testRunnerApi = ScriptableObject.CreateInstance(); + testRunnerApi.Execute(new ExecutionSettings() + { + filters = filters.Select(filter => new Filter() + { + assemblyNames = filter.assemblyNames, + categoryNames = filter.categoryNames, + groupNames = filter.groupNames, + testMode = TestMode, + testNames = filter.testNames + }).ToArray() + }); + } + + protected void RunTestsInPlayer() + { + var testRunnerApi = ScriptableObject.CreateInstance(); + testRunnerApi.Execute(new ExecutionSettings() + { + filters = new [] { new Filter() + { + testMode = TestMode, + }}, + targetPlatform = EditorUserBuildSettings.activeBuildTarget + }); + GUIUtility.ExitGUI(); + } + + public override TestPlatform TestPlatform { get { return TestPlatform.PlayMode; } } + protected override bool IsBusy() + { + return PlaymodeLauncher.IsRunning || EditorApplication.isCompiling || EditorApplication.isPlaying; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs.meta new file mode 100644 index 0000000..6f0c1d6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3efd39f2cfb43a4c830d4fd5689900f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs new file mode 100644 index 0000000..d04d743 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs @@ -0,0 +1,525 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using UnityEditor.IMGUI.Controls; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.TestTools.TestRunner.GUI; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal abstract class TestListGUI + { + private static readonly GUIContent s_GUIRunSelectedTests = EditorGUIUtility.TrTextContent("Run Selected", "Run selected test(s)"); + private static readonly GUIContent s_GUIRunAllTests = EditorGUIUtility.TrTextContent("Run All", "Run all tests"); + private static readonly GUIContent s_GUIRerunFailedTests = EditorGUIUtility.TrTextContent("Rerun Failed", "Rerun all failed tests"); + private static readonly GUIContent s_GUIRun = EditorGUIUtility.TrTextContent("Run"); + private static readonly GUIContent s_GUIRunUntilFailed = EditorGUIUtility.TrTextContent("Run Until Failed"); + private static readonly GUIContent s_GUIRun100Times = EditorGUIUtility.TrTextContent("Run 100 times"); + private static readonly GUIContent s_GUIOpenTest = EditorGUIUtility.TrTextContent("Open source code"); + private static readonly GUIContent s_GUIOpenErrorLine = EditorGUIUtility.TrTextContent("Open error line"); + private static readonly GUIContent s_GUIClearResults = EditorGUIUtility.TrTextContent("Clear Results", "Clear all test results"); + + [SerializeField] + protected TestRunnerWindow m_Window; + [SerializeField] + public List newResultList = new List(); + [SerializeField] + private string m_ResultText; + [SerializeField] + private string m_ResultStacktrace; + + private TreeViewController m_TestListTree; + [SerializeField] + internal TreeViewState m_TestListState; + [SerializeField] + internal TestRunnerUIFilter m_TestRunnerUIFilter = new TestRunnerUIFilter(); + + private Vector2 m_TestInfoScroll, m_TestListScroll; + private string m_PreviousProjectPath; + private List m_QueuedResults = new List(); + + protected TestListGUI() + { + MonoCecilHelper = new MonoCecilHelper(); + AssetsDatabaseHelper = new AssetsDatabaseHelper(); + + GuiHelper = new GuiHelper(MonoCecilHelper, AssetsDatabaseHelper); + } + + protected IMonoCecilHelper MonoCecilHelper { get; private set; } + protected IAssetsDatabaseHelper AssetsDatabaseHelper { get; private set; } + protected IGuiHelper GuiHelper { get; private set; } + + public abstract TestMode TestMode { get; } + + public virtual void PrintHeadPanel() + { + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); + using (new EditorGUI.DisabledScope(IsBusy())) + { + if (GUILayout.Button(s_GUIRunAllTests, EditorStyles.toolbarButton)) + { + var filter = new TestRunnerFilter {categoryNames = m_TestRunnerUIFilter.CategoryFilter}; + RunTests(filter); + GUIUtility.ExitGUI(); + } + } + using (new EditorGUI.DisabledScope(m_TestListTree == null || !m_TestListTree.HasSelection() || IsBusy())) + { + if (GUILayout.Button(s_GUIRunSelectedTests, EditorStyles.toolbarButton)) + { + RunTests(GetSelectedTestsAsFilter(m_TestListTree.GetSelection())); + GUIUtility.ExitGUI(); + } + } + using (new EditorGUI.DisabledScope(m_TestRunnerUIFilter.FailedCount == 0 || IsBusy())) + { + if (GUILayout.Button(s_GUIRerunFailedTests, EditorStyles.toolbarButton)) + { + var failedTestnames = new List(); + foreach (var result in newResultList) + { + if (result.isSuite) + continue; + if (result.resultStatus == TestRunnerResult.ResultStatus.Failed || + result.resultStatus == TestRunnerResult.ResultStatus.Inconclusive) + failedTestnames.Add(result.fullName); + } + RunTests(new TestRunnerFilter() {testNames = failedTestnames.ToArray(), categoryNames = m_TestRunnerUIFilter.CategoryFilter}); + GUIUtility.ExitGUI(); + } + } + using (new EditorGUI.DisabledScope(IsBusy())) + { + if (GUILayout.Button(s_GUIClearResults, EditorStyles.toolbarButton)) + { + foreach (var result in newResultList) + { + result.Clear(); + } + m_TestRunnerUIFilter.UpdateCounters(newResultList); + GUIUtility.ExitGUI(); + } + } + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + } + + protected void DrawFilters() + { + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); + m_TestRunnerUIFilter.Draw(); + EditorGUILayout.EndHorizontal(); + } + + public bool HasTreeData() + { + return m_TestListTree != null; + } + + public virtual void RenderTestList() + { + if (m_TestListTree == null) + { + GUILayout.Label("Loading..."); + return; + } + + m_TestListScroll = EditorGUILayout.BeginScrollView(m_TestListScroll, + GUILayout.ExpandWidth(true), + GUILayout.MaxWidth(2000)); + + if (m_TestListTree.data.root == null || m_TestListTree.data.rowCount == 0 || (!m_TestListTree.isSearching && !m_TestListTree.data.GetItem(0).hasChildren)) + { + if (m_TestRunnerUIFilter.IsFiltering) + { + if (GUILayout.Button("Clear filters")) + { + m_TestRunnerUIFilter.Clear(); + m_TestListTree.ReloadData(); + m_Window.Repaint(); + } + } + RenderNoTestsInfo(); + } + else + { + var treeRect = EditorGUILayout.GetControlRect(GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true)); + var treeViewKeyboardControlId = GUIUtility.GetControlID(FocusType.Keyboard); + + m_TestListTree.OnGUI(treeRect, treeViewKeyboardControlId); + } + + EditorGUILayout.EndScrollView(); + } + + public virtual void RenderNoTestsInfo() + { + EditorGUILayout.HelpBox("No tests to show", MessageType.Info); + } + + public void RenderDetails() + { + m_TestInfoScroll = EditorGUILayout.BeginScrollView(m_TestInfoScroll); + var resultTextSize = TestRunnerWindow.Styles.info.CalcSize(new GUIContent(m_ResultText)); + EditorGUILayout.SelectableLabel(m_ResultText, TestRunnerWindow.Styles.info, + GUILayout.ExpandHeight(true), + GUILayout.ExpandWidth(true), + GUILayout.MinWidth(resultTextSize.x), + GUILayout.MinHeight(resultTextSize.y)); + EditorGUILayout.EndScrollView(); + } + + public void Reload() + { + if (m_TestListTree != null) + { + m_TestListTree.ReloadData(); + UpdateQueuedResults(); + } + } + + public void Repaint() + { + if (m_TestListTree == null || m_TestListTree.data.root == null) + { + return; + } + + m_TestListTree.Repaint(); + if (m_TestListTree.data.rowCount == 0) + m_TestListTree.SetSelection(new int[0], false); + TestSelectionCallback(m_TestListState.selectedIDs.ToArray()); + } + + public void Init(TestRunnerWindow window, ITestAdaptor rootTest) + { + if (m_Window == null) + { + m_Window = window; + } + + if (m_TestListTree == null) + { + if (m_TestListState == null) + { + m_TestListState = new TreeViewState(); + } + if (m_TestListTree == null) + m_TestListTree = new TreeViewController(m_Window, m_TestListState); + + m_TestListTree.deselectOnUnhandledMouseDown = false; + + m_TestListTree.selectionChangedCallback += TestSelectionCallback; + m_TestListTree.itemDoubleClickedCallback += TestDoubleClickCallback; + m_TestListTree.contextClickItemCallback += TestContextClickCallback; + + var testListTreeViewDataSource = new TestListTreeViewDataSource(m_TestListTree, this, rootTest); + + if (!newResultList.Any()) + testListTreeViewDataSource.ExpandTreeOnCreation(); + + m_TestListTree.Init(new Rect(), + testListTreeViewDataSource, + new TestListTreeViewGUI(m_TestListTree), + null); + } + + EditorApplication.update += RepaintIfProjectPathChanged; + + m_TestRunnerUIFilter.UpdateCounters(newResultList); + m_TestRunnerUIFilter.RebuildTestList = () => m_TestListTree.ReloadData(); + m_TestRunnerUIFilter.SearchStringChanged = s => m_TestListTree.searchString = s; + m_TestRunnerUIFilter.SearchStringCleared = () => FrameSelection(); + } + + public void UpdateResult(TestRunnerResult result) + { + if (!HasTreeData()) + { + m_QueuedResults.Add(result); + return; + } + + if (newResultList.All(x => x.uniqueId != result.uniqueId)) + { + return; + } + + var testRunnerResult = newResultList.FirstOrDefault(x => x.uniqueId == result.uniqueId); + if (testRunnerResult != null) + { + testRunnerResult.Update(result); + } + + Repaint(); + m_Window.Repaint(); + } + + public void UpdateTestTree(ITestAdaptor test) + { + if (!HasTreeData()) + { + return; + } + + (m_TestListTree.data as TestListTreeViewDataSource).UpdateRootTest(test); + + m_TestListTree.ReloadData(); + Repaint(); + m_Window.Repaint(); + } + + private void UpdateQueuedResults() + { + foreach (var testRunnerResult in m_QueuedResults) + { + var existingResult = newResultList.FirstOrDefault(x => x.uniqueId == testRunnerResult.uniqueId); + if (existingResult != null) + { + existingResult.Update(testRunnerResult); + } + } + m_QueuedResults.Clear(); + TestSelectionCallback(m_TestListState.selectedIDs.ToArray()); + Repaint(); + m_Window.Repaint(); + } + + internal void TestSelectionCallback(int[] selected) + { + if (m_TestListTree != null && selected.Length == 1) + { + if (m_TestListTree != null) + { + var node = m_TestListTree.FindItem(selected[0]); + if (node is TestTreeViewItem) + { + var test = node as TestTreeViewItem; + m_ResultText = test.GetResultText(); + m_ResultStacktrace = test.result.stacktrace; + } + } + } + else if (selected.Length == 0) + { + m_ResultText = ""; + } + } + + protected virtual void TestDoubleClickCallback(int id) + { + if (IsBusy()) + return; + + RunTests(GetSelectedTestsAsFilter(new List { id })); + GUIUtility.ExitGUI(); + } + + protected virtual void RunTests(params TestRunnerFilter[] filters) + { + throw new NotImplementedException(); + } + + protected virtual void TestContextClickCallback(int id) + { + if (id == 0) + return; + + var m = new GenericMenu(); + var testFilters = GetSelectedTestsAsFilter(m_TestListState.selectedIDs); + var multilineSelection = m_TestListState.selectedIDs.Count > 1; + + if (!multilineSelection) + { + var testNode = GetSelectedTest(); + var isNotSuite = !testNode.IsGroupNode; + if (isNotSuite) + { + if (!string.IsNullOrEmpty(m_ResultStacktrace)) + { + m.AddItem(s_GUIOpenErrorLine, + false, + data => + { + if (!GuiHelper.OpenScriptInExternalEditor(m_ResultStacktrace)) + { + GuiHelper.OpenScriptInExternalEditor(testNode.type, testNode.method); + } + }, + ""); + } + + m.AddItem(s_GUIOpenTest, + false, + data => GuiHelper.OpenScriptInExternalEditor(testNode.type, testNode.method), + ""); + m.AddSeparator(""); + } + } + + if (!IsBusy()) + { + m.AddItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRun, + false, + data => RunTests(testFilters), + ""); + + if (EditorPrefs.GetBool("DeveloperMode", false)) + { + m.AddItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRunUntilFailed, + false, + data => + { + foreach (var filter in testFilters) + { + filter.testRepetitions = int.MaxValue; + } + + RunTests(testFilters); + }, + ""); + + m.AddItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRun100Times, + false, + data => + { + foreach (var filter in testFilters) + { + filter.testRepetitions = 100; + } + + RunTests(testFilters); + }, + ""); + } + } + else + m.AddDisabledItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRun, false); + + m.ShowAsContext(); + } + + private TestRunnerFilter[] GetSelectedTestsAsFilter(IEnumerable selectedIDs) + { + var namesToRun = new List(); + var exactNamesToRun = new List(); + var assembliesToRun = new List(); + foreach (var lineId in selectedIDs) + { + var line = m_TestListTree.FindItem(lineId); + if (line is TestTreeViewItem) + { + var testLine = line as TestTreeViewItem; + if (testLine.IsGroupNode && !testLine.FullName.Contains("+")) + { + if (testLine.parent != null && testLine.parent.displayName == "Invisible Root Item") + { + //Root node selected. Use an empty TestRunnerFilter to run every test + return new[] {new TestRunnerFilter()}; + } + + if (testLine.FullName.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) + assembliesToRun.Add(TestRunnerFilter.AssemblyNameFromPath(testLine.FullName)); + else + namesToRun.Add(string.Format("^{0}$", Regex.Escape(testLine.FullName))); + } + else + exactNamesToRun.Add(testLine.FullName); + } + } + + var filters = new List(); + + if (assembliesToRun.Count > 0) + { + filters.Add(new TestRunnerFilter() + { + assemblyNames = assembliesToRun.ToArray() + }); + } + + if (namesToRun.Count > 0) + { + filters.Add(new TestRunnerFilter() + { + groupNames = namesToRun.ToArray() + }); + } + + if (exactNamesToRun.Count > 0) + { + filters.Add(new TestRunnerFilter() + { + testNames = exactNamesToRun.ToArray() + }); + } + + if (filters.Count == 0) + { + filters.Add(new TestRunnerFilter()); + } + + var categories = m_TestRunnerUIFilter.CategoryFilter.ToArray(); + if (categories.Length > 0) + { + foreach (var filter in filters) + { + filter.categoryNames = categories; + } + } + + return filters.ToArray(); + } + + private TestTreeViewItem GetSelectedTest() + { + foreach (var lineId in m_TestListState.selectedIDs) + { + var line = m_TestListTree.FindItem(lineId); + if (line is TestTreeViewItem) + { + return line as TestTreeViewItem; + } + } + return null; + } + + private void FrameSelection() + { + if (m_TestListTree.HasSelection()) + { + var firstClickedID = m_TestListState.selectedIDs.First() == m_TestListState.lastClickedID ? m_TestListState.selectedIDs.Last() : m_TestListState.selectedIDs.First(); + m_TestListTree.Frame(firstClickedID, true, false); + } + } + + public abstract TestPlatform TestPlatform { get; } + + public void RebuildUIFilter() + { + m_TestRunnerUIFilter.UpdateCounters(newResultList); + if (m_TestRunnerUIFilter.IsFiltering) + { + m_TestListTree.ReloadData(); + } + } + + public void RepaintIfProjectPathChanged() + { + var path = TestListGUIHelper.GetActiveFolderPath(); + if (path != m_PreviousProjectPath) + { + m_PreviousProjectPath = path; + TestRunnerWindow.s_Instance.Repaint(); + } + + EditorApplication.update -= RepaintIfProjectPathChanged; + } + + protected abstract bool IsBusy(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs.meta new file mode 100644 index 0000000..3bef151 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b8abb41ceb6f62c45a00197ae59224c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension.meta new file mode 100644 index 0000000..0c99889 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3f9202a39620f51418046c7754f215f0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes.meta new file mode 100644 index 0000000..a5930f1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 96c503bf059df984c86eecf572370347 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs new file mode 100644 index 0000000..e71b62c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs @@ -0,0 +1,63 @@ +using System; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEditor.TestTools +{ + /// + /// Ignore attributes dedicated to Asset Import Pipeline backend version handling. + /// + internal static class AssetPipelineIgnore + { + internal enum AssetPipelineBackend + { + V1, + V2 + } + + /// + /// Ignore the test when running with the legacy Asset Import Pipeline V1 backend. + /// + internal class IgnoreInV1 : AssetPipelineIgnoreAttribute + { + public IgnoreInV1(string ignoreReason) : base(AssetPipelineBackend.V1, ignoreReason) {} + } + + /// + /// Ignore the test when running with the latest Asset Import Pipeline V2 backend. + /// + internal class IgnoreInV2 : AssetPipelineIgnoreAttribute + { + public IgnoreInV2(string ignoreReason) : base(AssetPipelineBackend.V2, ignoreReason) {} + } + + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + internal class AssetPipelineIgnoreAttribute : NUnitAttribute, IApplyToTest + { + readonly string m_IgnoreReason; + readonly AssetPipelineBackend m_IgnoredBackend; + static readonly AssetPipelineBackend k_ActiveBackend = AssetDatabase.IsV2Enabled() + ? AssetPipelineBackend.V2 + : AssetPipelineBackend.V1; + + static string ActiveBackendName = Enum.GetName(typeof(AssetPipelineBackend), k_ActiveBackend); + + public AssetPipelineIgnoreAttribute(AssetPipelineBackend backend, string ignoreReason) + { + m_IgnoredBackend = backend; + m_IgnoreReason = ignoreReason; + } + + public void ApplyToTest(Test test) + { + if (k_ActiveBackend == m_IgnoredBackend) + { + test.RunState = RunState.Ignored; + var skipReason = string.Format("Not supported by asset pipeline {0} backend {1}", ActiveBackendName, m_IgnoreReason); + test.Properties.Add(PropertyNames.SkipReason, skipReason); + } + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs.meta new file mode 100644 index 0000000..5f7207f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b88caca58e05ee74486d86fb404c48e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs new file mode 100644 index 0000000..08bab3a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools +{ + public interface ITestPlayerBuildModifier + { + BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions); + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs.meta new file mode 100644 index 0000000..1bb36a6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d2f47eae5f447748892c46848956d5f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs new file mode 100644 index 0000000..328e666 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs @@ -0,0 +1,25 @@ +using System; + +namespace UnityEditor.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly)] + public class TestPlayerBuildModifierAttribute : Attribute + { + private Type m_Type; + public TestPlayerBuildModifierAttribute(Type type) + { + var interfaceType = typeof(ITestPlayerBuildModifier); + if (!interfaceType.IsAssignableFrom(type)) + { + throw new ArgumentException(string.Format("Type provided to {0} does not implement {1}", this.GetType().Name, interfaceType.Name)); + } + m_Type = type; + } + + internal ITestPlayerBuildModifier ConstructModifier() + { + return Activator.CreateInstance(m_Type) as ITestPlayerBuildModifier; + } + } +} + diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs.meta new file mode 100644 index 0000000..3f9dfe3 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd57b1176859fc84e93586103d3b5f73 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs new file mode 100644 index 0000000..a24190e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs @@ -0,0 +1,162 @@ +using System; +using System.Reflection; +using System.Text; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.NUnitExtensions; +using UnityEngine.TestTools.Logging; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class TestRunnerStateSerializer : IStateSerializer + { + private const BindingFlags Flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy; + + [SerializeField] + private HideFlags m_OriginalHideFlags; + + [SerializeField] + private bool m_ShouldRestore; + + [SerializeField] + private string m_TestObjectTypeName; + + [SerializeField] + private ScriptableObject m_TestObject; + + [SerializeField] + private string m_TestObjectTxt; + + [SerializeField] + private long StartTicks; + + [SerializeField] + private double StartTimeOA; + + [SerializeField] + private string output; + + [SerializeField] + private LogMatch[] m_ExpectedLogs; + + public bool ShouldRestore() + { + return m_ShouldRestore; + } + + public void SaveContext() + { + var currentContext = UnityTestExecutionContext.CurrentContext; + + if (currentContext.TestObject != null) + { + m_TestObjectTypeName = currentContext.TestObject.GetType().AssemblyQualifiedName; + m_TestObject = null; + m_TestObjectTxt = null; + if (currentContext.TestObject is ScriptableObject) + { + m_TestObject = currentContext.TestObject as ScriptableObject; + m_OriginalHideFlags = m_TestObject.hideFlags; + m_TestObject.hideFlags |= HideFlags.DontSave; + } + else + { + m_TestObjectTxt = JsonUtility.ToJson(currentContext.TestObject); + } + } + + output = currentContext.CurrentResult.Output; + StartTicks = currentContext.StartTicks; + StartTimeOA = currentContext.StartTime.ToOADate(); + if (LogScope.HasCurrentLogScope()) + { + m_ExpectedLogs = LogScope.Current.ExpectedLogs.ToArray(); + } + + m_ShouldRestore = true; + } + + public void RestoreContext() + { + var currentContext = UnityTestExecutionContext.CurrentContext; + + var outputProp = currentContext.CurrentResult.GetType().BaseType.GetField("_output", Flags); + (outputProp.GetValue(currentContext.CurrentResult) as StringBuilder).Append(output); + + currentContext.StartTicks = StartTicks; + currentContext.StartTime = DateTime.FromOADate(StartTimeOA); + if (LogScope.HasCurrentLogScope()) + { + LogScope.Current.ExpectedLogs = new Queue(m_ExpectedLogs); + } + + m_ShouldRestore = false; + } + + public bool CanRestoreFromScriptableObject(Type requestedType) + { + if (m_TestObject == null) + { + return false; + } + return m_TestObjectTypeName == requestedType.AssemblyQualifiedName; + } + + public ScriptableObject RestoreScriptableObjectInstance() + { + if (m_TestObject == null) + { + Debug.LogError("No object to restore"); + return null; + } + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + var temp = m_TestObject; + m_TestObject = null; + m_TestObjectTypeName = null; + return temp; + } + + public bool CanRestoreFromJson(Type requestedType) + { + if (string.IsNullOrEmpty(m_TestObjectTxt)) + { + return false; + } + return m_TestObjectTypeName == requestedType.AssemblyQualifiedName; + } + + public void RestoreClassFromJson(ref object instance) + { + if (string.IsNullOrEmpty(m_TestObjectTxt)) + { + Debug.LogWarning("No JSON representation to restore"); + return; + } + JsonUtility.FromJsonOverwrite(m_TestObjectTxt, instance); + m_TestObjectTxt = null; + m_TestObjectTypeName = null; + } + + private void OnPlayModeStateChanged(PlayModeStateChange state) + { + if (m_TestObject == null) + { + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + return; + } + + //We set the DontSave flag here because the ScriptableObject would be nulled right before entering EditMode + if (state == PlayModeStateChange.ExitingPlayMode) + { + m_TestObject.hideFlags |= HideFlags.DontSave; + } + else if (state == PlayModeStateChange.EnteredEditMode) + { + m_TestObject.hideFlags = m_OriginalHideFlags; + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs.meta new file mode 100644 index 0000000..7d36e9d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 124533853216377448d786fd7c725701 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequireApiProfileAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequireApiProfileAttribute.cs new file mode 100644 index 0000000..e99d452 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequireApiProfileAttribute.cs @@ -0,0 +1,32 @@ +using System; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEditor.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + internal class RequireApiProfileAttribute : NUnitAttribute, IApplyToTest + { + public ApiCompatibilityLevel[] apiProfiles { get; private set; } + + public RequireApiProfileAttribute(params ApiCompatibilityLevel[] apiProfiles) + { + this.apiProfiles = apiProfiles; + } + + void IApplyToTest.ApplyToTest(Test test) + { + test.Properties.Add(PropertyNames.Category, string.Format("ApiProfile({0})", string.Join(", ", apiProfiles.Select(p => p.ToString()).OrderBy(p => p).ToArray()))); + ApiCompatibilityLevel testProfile = PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup); + + if (!apiProfiles.Contains(testProfile)) + { + string skipReason = "Skipping test as it requires a compatible api profile set: " + string.Join(", ", apiProfiles.Select(p => p.ToString()).ToArray()); + test.RunState = RunState.Skipped; + test.Properties.Add(PropertyNames.SkipReason, skipReason); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequireApiProfileAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequireApiProfileAttribute.cs.meta new file mode 100644 index 0000000..66d03bd --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequireApiProfileAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a667f6654ad7a9548b8c8e68b51c8895 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs new file mode 100644 index 0000000..321a0fe --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs @@ -0,0 +1,33 @@ +using System; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEditor.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public class RequirePlatformSupportAttribute : NUnitAttribute, IApplyToTest + { + public RequirePlatformSupportAttribute(params BuildTarget[] platforms) + { + this.platforms = platforms; + } + + public BuildTarget[] platforms { get; private set; } + + void IApplyToTest.ApplyToTest(Test test) + { + test.Properties.Add(PropertyNames.Category, string.Format("RequirePlatformSupport({0})", string.Join(", ", platforms.Select(p => p.ToString()).OrderBy(p => p).ToArray()))); + + if (!platforms.All(p => BuildPipeline.IsBuildTargetSupported(BuildTargetGroup.Unknown, p))) + { + var missingPlatforms = platforms.Where(p => !BuildPipeline.IsBuildTargetSupported(BuildTargetGroup.Unknown, p)).Select(p => p.ToString()).ToArray(); + string skipReason = "Test cannot be run as it requires support for the following platforms to be installed: " + string.Join(", ", missingPlatforms); + + test.RunState = RunState.Skipped; + test.Properties.Add(PropertyNames.SkipReason, skipReason); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs.meta new file mode 100644 index 0000000..8493058 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d2146428d3f1ad54eb7326c9a44b3284 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs new file mode 100644 index 0000000..4f0a041 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs @@ -0,0 +1,21 @@ +using System.Linq; +using UnityEditor.Build; + +namespace UnityEditor.TestRunner +{ + internal class TestBuildAssemblyFilter : IFilterBuildAssemblies + { + private const string nunitAssemblyName = "nunit.framework"; + private const string unityTestRunnerAssemblyName = "UnityEngine.TestRunner"; + + public int callbackOrder { get; } + public string[] OnFilterAssemblies(BuildOptions buildOptions, string[] assemblies) + { + if ((buildOptions & BuildOptions.IncludeTestAssemblies) == BuildOptions.IncludeTestAssemblies || PlayerSettings.playModeTestRunnerEnabled) + { + return assemblies; + } + return assemblies.Where(x => !x.Contains(nunitAssemblyName) && !x.Contains(unityTestRunnerAssemblyName)).ToArray(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs.meta new file mode 100644 index 0000000..f3cd3bd --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3411e19edd44cfd46b548b058c3bc36c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers.meta new file mode 100644 index 0000000..c6a951b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d64d92e4f04a13e4b99ea8d48e9e8ae9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs new file mode 100644 index 0000000..0bfc868 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal abstract class AttributeFinderBase + { + public abstract IEnumerable Search(ITest tests, ITestFilter filter, RuntimePlatform testTargetPlatform); + } + + internal abstract class AttributeFinderBase : AttributeFinderBase where T2 : Attribute + { + private readonly Func m_TypeSelector; + protected AttributeFinderBase(Func typeSelector) + { + m_TypeSelector = typeSelector; + } + + public override IEnumerable Search(ITest tests, ITestFilter filter, RuntimePlatform testTargetPlatform) + { + var selectedTests = new List(); + GetMatchingTests(tests, filter, ref selectedTests, testTargetPlatform); + + var result = new List(); + result.AddRange(GetTypesFromPrebuildAttributes(selectedTests)); + result.AddRange(GetTypesFromInterface(selectedTests, testTargetPlatform)); + + return result.Distinct(); + } + + private static void GetMatchingTests(ITest tests, ITestFilter filter, ref List resultList, RuntimePlatform testTargetPlatform) + { + foreach (var test in tests.Tests) + { + if (IsTestEnabledOnPlatform(test, testTargetPlatform)) + { + if (test.IsSuite) + { + GetMatchingTests(test, filter, ref resultList, testTargetPlatform); + } + else + { + if (filter.Pass(test)) + resultList.Add(test); + } + } + } + } + + private static bool IsTestEnabledOnPlatform(ITest test, RuntimePlatform testTargetPlatform) + { + if (test.Method == null) + { + return true; + } + + var attributesFromMethods = test.Method.GetCustomAttributes(true).Select(attribute => attribute); + var attributesFromTypes = test.Method.TypeInfo.GetCustomAttributes(true).Select(attribute => attribute); + + if (!attributesFromMethods.All(a => a.IsPlatformSupported(testTargetPlatform))) + { + return false; + } + + if (!attributesFromTypes.All(a => a.IsPlatformSupported(testTargetPlatform))) + { + return false; + } + + return true; + } + + private IEnumerable GetTypesFromPrebuildAttributes(IEnumerable tests) + { + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + allAssemblies = allAssemblies.Where(x => x.GetReferencedAssemblies().Any(z => z.Name == "UnityEditor.TestRunner")).ToArray(); + var attributesFromAssemblies = allAssemblies.SelectMany(assembly => assembly.GetCustomAttributes(typeof(T2), true).OfType()); + var attributesFromMethods = tests.SelectMany(t => t.Method.GetCustomAttributes(true).Select(attribute => attribute)); + var attributesFromTypes = tests.SelectMany(t => t.Method.TypeInfo.GetCustomAttributes(true).Select(attribute => attribute)); + + var result = new List(); + result.AddRange(attributesFromAssemblies); + result.AddRange(attributesFromMethods); + result.AddRange(attributesFromTypes); + + return result.Select(m_TypeSelector).Where(type => type != null); + } + + private static IEnumerable GetTypesFromInterface(IEnumerable selectedTests, RuntimePlatform testTargetPlatform) + { + var typesWithInterfaces = selectedTests.Where(t => typeof(T1).IsAssignableFrom(t.Method.TypeInfo.Type) && IsTestEnabledOnPlatform(t, testTargetPlatform)); + return typesWithInterfaces.Select(t => t.Method.TypeInfo.Type); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs.meta new file mode 100644 index 0000000..19986f0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5d4de3d4682a8d641907cc75e4fb950e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs new file mode 100644 index 0000000..5156f61 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs @@ -0,0 +1,160 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEditor.SceneManagement; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.TestRunner.Utils; +using UnityEngine.TestTools; +using UnityEngine.TestTools.TestRunner; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditModeLauncher : TestLauncherBase + { + public static bool IsRunning; + private readonly EditModeRunner m_EditModeRunner; + + // provided for backward compatibility with Rider UnitTesting prior to Rider package v.1.1.1 + public EditModeLauncher(TestRunnerFilter filter, TestPlatform platform) : this(new[] + { + new Filter() + { + testNames = filter.testNames, + categoryNames = filter.categoryNames, + groupNames = filter.groupNames, + assemblyNames = filter.assemblyNames + } + }, platform, false) + { + } + + public EditModeLauncher(Filter[] filters, TestPlatform platform, bool runSynchronously) + { + m_EditModeRunner = ScriptableObject.CreateInstance(); + m_EditModeRunner.UnityTestAssemblyRunnerFactory = new UnityTestAssemblyRunnerFactory(); + m_EditModeRunner.Init(filters, platform, runSynchronously); + } + + public override void Run() + { + // Give user chance to save the changes to their currently open scene because we close it and load our own + var cancelled = !EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo(); + if (cancelled) + return; + + IsRunning = true; + var exceptionThrown = ExecutePreBuildSetupMethods(m_EditModeRunner.GetLoadedTests(), m_EditModeRunner.GetFilter()); + if (exceptionThrown) + { + CallbacksDelegator.instance.RunFailed("Run Failed: One or more errors in a prebuild setup. See the editor log for details."); + return; + } + + var undoGroup = Undo.GetCurrentGroup(); + SceneSetup[] previousSceneSetup; + if (!OpenNewScene(out previousSceneSetup)) + return; + + var callback = AddEventHandler(); + callback.previousSceneSetup = previousSceneSetup; + callback.undoGroup = undoGroup; + callback.runner = m_EditModeRunner; + AddEventHandler(); + + m_EditModeRunner.Run(); + AddEventHandler(); + AddEventHandler(); + + if (m_EditModeRunner.RunningSynchronously) + m_EditModeRunner.CompleteSynchronously(); + } + + private static bool OpenNewScene(out SceneSetup[] previousSceneSetup) + { + previousSceneSetup = null; + + var sceneCount = SceneManager.sceneCount; + + var scene = SceneManager.GetSceneAt(0); + var isSceneNotPersisted = string.IsNullOrEmpty(scene.path); + + if (sceneCount == 1 && isSceneNotPersisted) + { + EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single); + return true; + } + RemoveUntitledScenes(); + + // In case the user chose not to save the dirty scenes we reload them + ReloadUnsavedDirtyScene(); + + previousSceneSetup = EditorSceneManager.GetSceneManagerSetup(); + + scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Additive); + SceneManager.SetActiveScene(scene); + + return true; + } + + private static void ReloadUnsavedDirtyScene() + { + for (var i = 0; i < SceneManager.sceneCount; i++) + { + var scene = SceneManager.GetSceneAt(i); + var isSceneNotPersisted = string.IsNullOrEmpty(scene.path); + var isSceneDirty = scene.isDirty; + if (isSceneNotPersisted && isSceneDirty) + { + EditorSceneManager.ReloadScene(scene); + } + } + } + + private static void RemoveUntitledScenes() + { + int sceneCount = SceneManager.sceneCount; + + var scenesToClose = new List(); + for (var i = 0; i < sceneCount; i++) + { + var scene = SceneManager.GetSceneAt(i); + var isSceneNotPersisted = string.IsNullOrEmpty(scene.path); + if (isSceneNotPersisted) + { + scenesToClose.Add(scene); + } + } + foreach (Scene scene in scenesToClose) + { + EditorSceneManager.CloseScene(scene, true); + } + } + + public class BackgroundListener : ScriptableObject, ITestRunnerListener + { + public void RunStarted(ITest testsToRun) + { + } + + public void RunFinished(ITestResult testResults) + { + IsRunning = false; + } + + public void TestStarted(ITest test) + { + } + + public void TestFinished(ITestResult result) + { + } + } + + public T AddEventHandler() where T : ScriptableObject, ITestRunnerListener + { + return m_EditModeRunner.AddEventHandler(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs.meta new file mode 100644 index 0000000..694d7d6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac68f5ae37c8957468562b8da42f9984 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs new file mode 100644 index 0000000..e20305c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs @@ -0,0 +1,31 @@ +using System; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditModeLauncherContextSettings : IDisposable + { + private bool m_RunInBackground; + + public EditModeLauncherContextSettings() + { + SetupProjectParameters(); + } + + public void Dispose() + { + CleanupProjectParameters(); + } + + private void SetupProjectParameters() + { + m_RunInBackground = Application.runInBackground; + Application.runInBackground = true; + } + + private void CleanupProjectParameters() + { + Application.runInBackground = m_RunInBackground; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs.meta new file mode 100644 index 0000000..2bed8fd --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a582090813554df479fb9ca03e9857d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup.meta new file mode 100644 index 0000000..4947382 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ebc4d20cc106cea49b1df1153f0b3b5e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs new file mode 100644 index 0000000..9f39c0a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs @@ -0,0 +1,62 @@ +using System; +using UnityEngine; +using System.Net; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class AndroidPlatformSetup : IPlatformSetup + { + private string m_oldApplicationIdentifier; + private string m_oldDeviceSocketAddress; + [SerializeField] + private bool m_Stripping; + + public void Setup() + { + m_oldApplicationIdentifier = PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android); + PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, "com.UnityTestRunner.UnityTestRunner"); + + m_oldDeviceSocketAddress = EditorUserBuildSettings.androidDeviceSocketAddress; + var androidDeviceConnection = Environment.GetEnvironmentVariable("ANDROID_DEVICE_CONNECTION"); + EditorUserBuildSettings.waitForPlayerConnection = true; + if (androidDeviceConnection != null) + { + EditorUserBuildSettings.androidDeviceSocketAddress = androidDeviceConnection; + } + m_Stripping = PlayerSettings.stripEngineCode; + PlayerSettings.stripEngineCode = false; + } + + public void PostBuildAction() + { + PlayerSettings.stripEngineCode = m_Stripping; + } + + public void PostSuccessfulBuildAction() + { + var connectionResult = -1; + var maxTryCount = 10; + var tryCount = maxTryCount; + while (tryCount-- > 0 && connectionResult == -1) + { + connectionResult = EditorConnectionInternal.ConnectPlayerProxy(IPAddress.Loopback.ToString(), 34999); + if (EditorUtility.DisplayCancelableProgressBar("Editor Connection", "Connecting to the player", + 1 - ((float)tryCount / maxTryCount))) + { + EditorUtility.ClearProgressBar(); + throw new TestLaunchFailedException(); + } + } + EditorUtility.ClearProgressBar(); + if (connectionResult == -1) + throw new TestLaunchFailedException( + "Timed out trying to connect to the player. Player failed to launch or crashed soon after launching"); + } + + public void CleanUp() + { + EditorUserBuildSettings.androidDeviceSocketAddress = m_oldDeviceSocketAddress; + PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, m_oldApplicationIdentifier); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs.meta new file mode 100644 index 0000000..6e18a7c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 961642509dec50b44a293d26240140ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs new file mode 100644 index 0000000..59cc688 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs @@ -0,0 +1,38 @@ +using System; +using System.Diagnostics; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class ApplePlatformSetup : IPlatformSetup + { + [SerializeField] + private bool m_Stripping; + + public ApplePlatformSetup(BuildTarget buildTarget) + { + } + + public void Setup() + { + // Camera and fonts are stripped out and app crashes on iOS when test runner is trying to add a scene with... camera and text + m_Stripping = PlayerSettings.stripEngineCode; + PlayerSettings.stripEngineCode = false; + } + + public void PostBuildAction() + { + // Restoring player setting as early as possible + PlayerSettings.stripEngineCode = m_Stripping; + } + + public void PostSuccessfulBuildAction() + { + } + + public void CleanUp() + { + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs.meta new file mode 100644 index 0000000..36f22a6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f6c189a159d3bde4c964cee562e508ea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs new file mode 100644 index 0000000..0cbcb33 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs @@ -0,0 +1,10 @@ +namespace UnityEditor.TestTools.TestRunner +{ + internal interface IPlatformSetup + { + void Setup(); + void PostBuildAction(); + void PostSuccessfulBuildAction(); + void CleanUp(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs.meta new file mode 100644 index 0000000..94405b5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d614808f9add8a4f8e4860db2c7af0d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs new file mode 100644 index 0000000..1d03809 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs @@ -0,0 +1,46 @@ +using System; +using System.Threading; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class LuminPlatformSetup : IPlatformSetup + { + private const string kDeviceAddress = "127.0.0.1"; + private const int kDevicePort = 55000; + + public void Setup() + { + } + + public void PostBuildAction() + { + } + + public void PostSuccessfulBuildAction() + { + var connectionResult = -1; + var maxTryCount = 100; + var tryCount = maxTryCount; + while (tryCount-- > 0 && connectionResult == -1) + { + Thread.Sleep(1000); + connectionResult = EditorConnectionInternal.ConnectPlayerProxy(kDeviceAddress, kDevicePort); + if (EditorUtility.DisplayCancelableProgressBar("Editor Connection", "Connecting to the player", + 1 - ((float)tryCount / maxTryCount))) + { + EditorUtility.ClearProgressBar(); + throw new TestLaunchFailedException(); + } + } + EditorUtility.ClearProgressBar(); + if (connectionResult == -1) + throw new TestLaunchFailedException( + "Timed out trying to connect to the player. Player failed to launch or crashed soon after launching"); + } + + public void CleanUp() + { + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs.meta new file mode 100644 index 0000000..9e4dcc5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c38ae0585d6a55042a2d678330689685 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs new file mode 100644 index 0000000..7db5801 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class PlatformSpecificSetup + { + [SerializeField] + private ApplePlatformSetup m_AppleiOSPlatformSetup = new ApplePlatformSetup(BuildTarget.iOS); + [SerializeField] + private ApplePlatformSetup m_AppleTvOSPlatformSetup = new ApplePlatformSetup(BuildTarget.tvOS); + [SerializeField] + private XboxOnePlatformSetup m_XboxOnePlatformSetup = new XboxOnePlatformSetup(); + [SerializeField] + private AndroidPlatformSetup m_AndroidPlatformSetup = new AndroidPlatformSetup(); + [SerializeField] + private SwitchPlatformSetup m_SwitchPlatformSetup = new SwitchPlatformSetup(); + + [SerializeField] + private UwpPlatformSetup m_UwpPlatformSetup = new UwpPlatformSetup(); + + [SerializeField] + private LuminPlatformSetup m_LuminPlatformSetup = new LuminPlatformSetup(); + + + private IDictionary m_SetupTypes; + + [SerializeField] + private BuildTarget m_Target; + + public PlatformSpecificSetup() + { + } + + public PlatformSpecificSetup(BuildTarget target) + { + m_Target = target; + } + + public void Setup() + { + var dictionary = GetSetup(); + + if (!dictionary.ContainsKey(m_Target)) + { + return; + } + + dictionary[m_Target].Setup(); + } + + public void PostBuildAction() + { + var dictionary = GetSetup(); + + if (!dictionary.ContainsKey(m_Target)) + { + return; + } + + dictionary[m_Target].PostBuildAction(); + } + + public void PostSuccessfulBuildAction() + { + var dictionary = GetSetup(); + + if (!dictionary.ContainsKey(m_Target)) + { + return; + } + + dictionary[m_Target].PostSuccessfulBuildAction(); + } + + public void CleanUp() + { + var dictionary = GetSetup(); + + if (!dictionary.ContainsKey(m_Target)) + { + return; + } + + dictionary[m_Target].CleanUp(); + } + + private IDictionary GetSetup() + { + m_SetupTypes = new Dictionary() + { + {BuildTarget.iOS, m_AppleiOSPlatformSetup}, + {BuildTarget.tvOS, m_AppleTvOSPlatformSetup}, + {BuildTarget.XboxOne, m_XboxOnePlatformSetup}, + {BuildTarget.Android, m_AndroidPlatformSetup}, + {BuildTarget.WSAPlayer, m_UwpPlatformSetup}, + {BuildTarget.Lumin, m_LuminPlatformSetup}, + {BuildTarget.Switch, m_SwitchPlatformSetup} + }; + return m_SetupTypes; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs.meta new file mode 100644 index 0000000..a250a1a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6cccd50ebf7384242bda4d7bcb282ebf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs new file mode 100644 index 0000000..20cabe0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs @@ -0,0 +1,33 @@ +namespace UnityEditor.TestTools.TestRunner +{ + internal class SwitchPlatformSetup : IPlatformSetup + { + public void Setup() + { + EditorUserBuildSettings.switchCreateRomFile = true; + EditorUserBuildSettings.switchNVNGraphicsDebugger = false; + EditorUserBuildSettings.switchNVNDrawValidation = true; // catches more graphics errors + EditorUserBuildSettings.development = true; + EditorUserBuildSettings.switchRedirectWritesToHostMount = true; + + // We can use these when more debugging is required: + //EditorUserBuildSettings.switchNVNDrawValidation = false; // cannot be used with shader debug + //EditorUserBuildSettings.switchNVNGraphicsDebugger = true; + //EditorUserBuildSettings.switchNVNShaderDebugging = true; + //EditorUserBuildSettings.switchCreateSolutionFile = true; // for shorter iteration time + //EditorUserBuildSettings.allowDebugging = true; // managed debugger can be attached + } + + public void PostBuildAction() + { + } + + public void PostSuccessfulBuildAction() + { + } + + public void CleanUp() + { + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs.meta new file mode 100644 index 0000000..fb9dd05 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: adf7bea9401c1834380d55601add6cfb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs new file mode 100644 index 0000000..6eb634a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs @@ -0,0 +1,48 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class UwpPlatformSetup : IPlatformSetup + { + private const string k_SettingsBuildConfiguration = "BuildConfiguration"; + private bool m_InternetClientServer; + private bool m_PrivateNetworkClientServer; + + public void Setup() + { + m_InternetClientServer = PlayerSettings.WSA.GetCapability(PlayerSettings.WSACapability.InternetClientServer); + m_PrivateNetworkClientServer = PlayerSettings.WSA.GetCapability(PlayerSettings.WSACapability.PrivateNetworkClientServer); + PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.InternetClientServer, true); + PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.PrivateNetworkClientServer, true); + + // This setting is initialized only when Window Store App is selected from the Build Settings window, and + // is typically an empty strings when running tests via UTR on the command-line. + bool wsaSettingNotInitialized = string.IsNullOrEmpty(EditorUserBuildSettings.wsaArchitecture); + + // If WSA build settings aren't fully initialized or running from a build machine, specify a default build configuration. + // Otherwise we can use the existing configuration specified by the user in Build Settings. + if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("UNITY_THISISABUILDMACHINE")) || wsaSettingNotInitialized) + { + EditorUserBuildSettings.wsaSubtarget = WSASubtarget.PC; + EditorUserBuildSettings.wsaArchitecture = "x64"; + EditorUserBuildSettings.SetPlatformSettings(BuildPipeline.GetBuildTargetName(BuildTarget.WSAPlayer), k_SettingsBuildConfiguration, WSABuildType.Debug.ToString()); + EditorUserBuildSettings.wsaUWPBuildType = WSAUWPBuildType.ExecutableOnly; + PlayerSettings.SetIl2CppCompilerConfiguration(BuildTargetGroup.WSA, Il2CppCompilerConfiguration.Debug); + } + } + + public void PostBuildAction() + { + } + + public void PostSuccessfulBuildAction() + { + } + + public void CleanUp() + { + PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.InternetClientServer, m_InternetClientServer); + PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.PrivateNetworkClientServer, m_PrivateNetworkClientServer); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs.meta new file mode 100644 index 0000000..751ac7e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 667c6ad86a0b7a548aaa5c287f2c2861 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs new file mode 100644 index 0000000..0897dc5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs @@ -0,0 +1,43 @@ +namespace UnityEditor.TestTools.TestRunner +{ + internal class XboxOnePlatformSetup : IPlatformSetup + { + private XboxOneDeployMethod oldXboxOneDeployMethod; + private XboxOneDeployDrive oldXboxOneDeployDrive; + private string oldXboxOneAdditionalDebugPorts; + + public void Setup() + { + oldXboxOneDeployMethod = EditorUserBuildSettings.xboxOneDeployMethod; + oldXboxOneDeployDrive = EditorUserBuildSettings.xboxOneDeployDrive; + oldXboxOneAdditionalDebugPorts = EditorUserBuildSettings.xboxOneAdditionalDebugPorts; + + EditorUserBuildSettings.xboxOneDeployMethod = XboxOneDeployMethod.Package; + EditorUserBuildSettings.xboxOneDeployDrive = XboxOneDeployDrive.Default; + + // This causes the XboxOne post processing systems to open this port in your package manifest. + // In addition it will open the ephemeral range for debug connections as well. + // Failure to do this will cause connection problems. + EditorUserBuildSettings.xboxOneAdditionalDebugPorts = "34999"; + } + + public void PostBuildAction() + { + } + + public void PostSuccessfulBuildAction() + { + } + + public void CleanUp() + { + EditorUserBuildSettings.xboxOneDeployMethod = oldXboxOneDeployMethod; + EditorUserBuildSettings.xboxOneDeployDrive = oldXboxOneDeployDrive; + + // This causes the XboxOne post processing systems to open this port in your package manifest. + // In addition it will open the ephemeral range for debug connections as well. + // Failure to do this will cause connection problems. + EditorUserBuildSettings.xboxOneAdditionalDebugPorts = oldXboxOneAdditionalDebugPorts; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs.meta new file mode 100644 index 0000000..771c853 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aed7ab02155e43341a2dbcb7bc17c160 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs new file mode 100644 index 0000000..43d1779 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using NUnit.Framework.Internal.Filters; +using UnityEditor; +using UnityEditor.TestRunner.TestLaunchers; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.TestRunner.Utils; +using UnityEngine.TestTools.TestRunner; +using UnityEngine.TestTools.TestRunner.Callbacks; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestLaunchFailedException : Exception + { + public TestLaunchFailedException() {} + public TestLaunchFailedException(string message) : base(message) {} + } + + [Serializable] + internal class PlayerLauncher : RuntimeTestLauncherBase + { + private readonly PlaymodeTestsControllerSettings m_Settings; + private readonly BuildTarget m_TargetPlatform; + private ITestRunSettings m_OverloadTestRunSettings; + private string m_SceneName; + + public PlayerLauncher(PlaymodeTestsControllerSettings settings, BuildTarget? targetPlatform, ITestRunSettings overloadTestRunSettings) + { + m_Settings = settings; + m_TargetPlatform = targetPlatform ?? EditorUserBuildSettings.activeBuildTarget; + m_OverloadTestRunSettings = overloadTestRunSettings; + } + + protected override RuntimePlatform? TestTargetPlatform + { + get { return BuildTargetConverter.TryConvertToRuntimePlatform(m_TargetPlatform); } + } + + public override void Run() + { + var editorConnectionTestCollector = RemoteTestRunController.instance; + editorConnectionTestCollector.hideFlags = HideFlags.HideAndDontSave; + editorConnectionTestCollector.Init(m_TargetPlatform); + + var remotePlayerLogController = RemotePlayerLogController.instance; + remotePlayerLogController.hideFlags = HideFlags.HideAndDontSave; + + using (var settings = new PlayerLauncherContextSettings(m_OverloadTestRunSettings)) + { + m_SceneName = CreateSceneName(); + var scene = PrepareScene(m_SceneName); + string scenePath = scene.path; + + var filter = m_Settings.BuildNUnitFilter(); + var runner = LoadTests(filter); + var exceptionThrown = ExecutePreBuildSetupMethods(runner.LoadedTest, filter); + if (exceptionThrown) + { + ReopenOriginalScene(m_Settings.originalScene); + AssetDatabase.DeleteAsset(m_SceneName); + CallbacksDelegator.instance.RunFailed("Run Failed: One or more errors in a prebuild setup. See the editor log for details."); + return; + } + + var playerBuildOptions = GetBuildOptions(scenePath); + + var success = BuildAndRunPlayer(playerBuildOptions); + editorConnectionTestCollector.PostBuildAction(); + ExecutePostBuildCleanupMethods(runner.LoadedTest, filter); + + ReopenOriginalScene(m_Settings.originalScene); + AssetDatabase.DeleteAsset(m_SceneName); + + if (!success) + { + ScriptableObject.DestroyImmediate(editorConnectionTestCollector); + Debug.LogError("Player build failed"); + throw new TestLaunchFailedException("Player build failed"); + } + + editorConnectionTestCollector.PostSuccessfulBuildAction(); + } + } + + public Scene PrepareScene(string sceneName) + { + var scene = CreateBootstrapScene(sceneName, runner => + { + runner.AddEventHandlerMonoBehaviour(); + runner.settings = m_Settings; + runner.AddEventHandlerMonoBehaviour(); + runner.AddEventHandlerScriptableObject(); + }); + return scene; + } + + private static bool BuildAndRunPlayer(PlayerLauncherBuildOptions buildOptions) + { + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "Building player with following options:\n{0}", buildOptions); + + + // Android has to be in listen mode to establish player connection + if (buildOptions.BuildPlayerOptions.target == BuildTarget.Android) + { + buildOptions.BuildPlayerOptions.options &= ~BuildOptions.ConnectToHost; + } + + // For now, so does Lumin + if (buildOptions.BuildPlayerOptions.target == BuildTarget.Lumin) + { + buildOptions.BuildPlayerOptions.options &= ~BuildOptions.ConnectToHost; + } + + var result = BuildPipeline.BuildPlayer(buildOptions.BuildPlayerOptions); + if (result.summary.result != Build.Reporting.BuildResult.Succeeded) + Debug.LogError(result.SummarizeErrors()); + + return result.summary.result == Build.Reporting.BuildResult.Succeeded; + } + + private PlayerLauncherBuildOptions GetBuildOptions(string scenePath) + { + var buildOptions = new BuildPlayerOptions(); + var reduceBuildLocationPathLength = false; + + //Some platforms hit MAX_PATH limits during the build process, in these cases minimize the path length + if ((m_TargetPlatform == BuildTarget.WSAPlayer) || (m_TargetPlatform == BuildTarget.XboxOne)) + { + reduceBuildLocationPathLength = true; + } + + var scenes = new List() { scenePath }; + scenes.AddRange(EditorBuildSettings.scenes.Select(x => x.path)); + buildOptions.scenes = scenes.ToArray(); + + buildOptions.options |= BuildOptions.AutoRunPlayer | BuildOptions.Development | BuildOptions.ConnectToHost | BuildOptions.IncludeTestAssemblies | BuildOptions.StrictMode; + buildOptions.target = m_TargetPlatform; + + if (EditorUserBuildSettings.waitForPlayerConnection) + buildOptions.options |= BuildOptions.WaitForPlayerConnection; + + var buildTargetGroup = EditorUserBuildSettings.activeBuildTargetGroup; + + //Check if Lz4 is supported for the current buildtargetgroup and enable it if need be + if (PostprocessBuildPlayer.SupportsLz4Compression(buildTargetGroup, m_TargetPlatform)) + { + if (EditorUserBuildSettings.GetCompressionType(buildTargetGroup) == Compression.Lz4) + buildOptions.options |= BuildOptions.CompressWithLz4; + else if (EditorUserBuildSettings.GetCompressionType(buildTargetGroup) == Compression.Lz4HC) + buildOptions.options |= BuildOptions.CompressWithLz4HC; + } + + var uniqueTempPathInProject = FileUtil.GetUniqueTempPathInProject(); + var playerDirectoryName = reduceBuildLocationPathLength ? "PwT" : "PlayerWithTests"; + + if (reduceBuildLocationPathLength) + { + uniqueTempPathInProject = Path.GetTempFileName(); + File.Delete(uniqueTempPathInProject); + Directory.CreateDirectory(uniqueTempPathInProject); + } + var tempPath = Path.GetFullPath(uniqueTempPathInProject); + var buildLocation = Path.Combine(tempPath, playerDirectoryName); + + // iOS builds create a folder with Xcode project instead of an executable, therefore no executable name is added + if (m_TargetPlatform == BuildTarget.iOS) + { + buildOptions.locationPathName = buildLocation; + } + else + { + string extensionForBuildTarget = PostprocessBuildPlayer.GetExtensionForBuildTarget(buildTargetGroup, buildOptions.target, buildOptions.options); + var playerExecutableName = "PlayerWithTests"; + playerExecutableName += string.Format(".{0}", extensionForBuildTarget); + buildOptions.locationPathName = Path.Combine(buildLocation, playerExecutableName); + } + + return new PlayerLauncherBuildOptions + { + BuildPlayerOptions = ModifyBuildOptions(buildOptions), + PlayerDirectory = buildLocation, + }; + } + + private BuildPlayerOptions ModifyBuildOptions(BuildPlayerOptions buildOptions) + { + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + var attributes = allAssemblies.SelectMany(assembly => assembly.GetCustomAttributes(typeof(TestPlayerBuildModifierAttribute), true).OfType()).ToArray(); + var modifiers = attributes.Select(attribute => attribute.ConstructModifier()).ToArray(); + + foreach (var modifier in modifiers) + { + buildOptions = modifier.ModifyOptions(buildOptions); + } + + return buildOptions; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs.meta new file mode 100644 index 0000000..60bb1c7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d973fc1524e4d724081553934c55958c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs new file mode 100644 index 0000000..b498514 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs @@ -0,0 +1,23 @@ +using System.Text; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class PlayerLauncherBuildOptions + { + public BuildPlayerOptions BuildPlayerOptions; + public string PlayerDirectory; + + public override string ToString() + { + var str = new StringBuilder(); + str.AppendLine("locationPathName = " + BuildPlayerOptions.locationPathName); + str.AppendLine("target = " + BuildPlayerOptions.target); + str.AppendLine("scenes = " + string.Join(", ", BuildPlayerOptions.scenes)); + str.AppendLine("assetBundleManifestPath = " + BuildPlayerOptions.assetBundleManifestPath); + str.AppendLine("options.Development = " + ((BuildPlayerOptions.options & BuildOptions.Development) != 0)); + str.AppendLine("options.AutoRunPlayer = " + ((BuildPlayerOptions.options & BuildOptions.AutoRunPlayer) != 0)); + str.AppendLine("options.ForceEnableAssertions = " + ((BuildPlayerOptions.options & BuildOptions.ForceEnableAssertions) != 0)); + return str.ToString(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs.meta new file mode 100644 index 0000000..73c1779 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a0bd678385f98e4d8eabdfc07d62b4f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs new file mode 100644 index 0000000..8b027c5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs @@ -0,0 +1,112 @@ +using System; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class PlayerLauncherContextSettings : IDisposable + { + private ITestRunSettings m_OverloadSettings; + + private EditorBuildSettingsScene[] m_EditorBuildSettings; +#pragma warning disable 618 + private ResolutionDialogSetting m_DisplayResolutionDialog; +#pragma warning restore 618 + private bool m_RunInBackground; + private FullScreenMode m_FullScreenMode; + private bool m_ResizableWindow; + private bool m_ShowUnitySplashScreen; + private string m_OldproductName; + private string m_OldAotOptions; +#pragma warning disable 618 + private Lightmapping.GIWorkflowMode m_OldLightmapping; +#pragma warning restore 618 + private bool m_explicitNullChecks; + + private bool m_Disposed; + + public PlayerLauncherContextSettings(ITestRunSettings overloadSettings) + { + m_OverloadSettings = overloadSettings; + SetupProjectParameters(); + + if (overloadSettings != null) + { + overloadSettings.Apply(); + } + } + + public void Dispose() + { + if (!m_Disposed) + { + CleanupProjectParameters(); + if (m_OverloadSettings != null) + { + m_OverloadSettings.Dispose(); + } + + m_Disposed = true; + } + } + + private void SetupProjectParameters() + { + EditorApplication.LockReloadAssemblies(); + + m_EditorBuildSettings = EditorBuildSettings.scenes; + +#pragma warning disable 618 + m_DisplayResolutionDialog = PlayerSettings.displayResolutionDialog; + PlayerSettings.displayResolutionDialog = ResolutionDialogSetting.Disabled; +#pragma warning restore 618 + + m_RunInBackground = PlayerSettings.runInBackground; + PlayerSettings.runInBackground = true; + + m_FullScreenMode = PlayerSettings.fullScreenMode; + PlayerSettings.fullScreenMode = FullScreenMode.Windowed; + + m_OldAotOptions = PlayerSettings.aotOptions; + PlayerSettings.aotOptions = "nimt-trampolines=1024"; + + m_ResizableWindow = PlayerSettings.resizableWindow; + PlayerSettings.resizableWindow = true; + + m_ShowUnitySplashScreen = PlayerSettings.SplashScreen.show; + PlayerSettings.SplashScreen.show = false; + + m_OldproductName = PlayerSettings.productName; + PlayerSettings.productName = "UnityTestFramework"; + +#pragma warning disable 618 + m_OldLightmapping = Lightmapping.giWorkflowMode; + Lightmapping.giWorkflowMode = Lightmapping.GIWorkflowMode.OnDemand; +#pragma warning restore 618 + + m_explicitNullChecks = EditorUserBuildSettings.explicitNullChecks; + EditorUserBuildSettings.explicitNullChecks = true; + } + + private void CleanupProjectParameters() + { + EditorBuildSettings.scenes = m_EditorBuildSettings; + + PlayerSettings.fullScreenMode = m_FullScreenMode; + PlayerSettings.runInBackground = m_RunInBackground; +#pragma warning disable 618 + PlayerSettings.displayResolutionDialog = m_DisplayResolutionDialog; +#pragma warning restore 618 + PlayerSettings.resizableWindow = m_ResizableWindow; + PlayerSettings.SplashScreen.show = m_ShowUnitySplashScreen; + PlayerSettings.productName = m_OldproductName; + PlayerSettings.aotOptions = m_OldAotOptions; +#pragma warning disable 618 + Lightmapping.giWorkflowMode = m_OldLightmapping; +#pragma warning restore 618 + EditorUserBuildSettings.explicitNullChecks = m_explicitNullChecks; + + EditorApplication.UnlockReloadAssemblies(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs.meta new file mode 100644 index 0000000..29cb891 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6965880f76f40194593cb53a88f74005 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs new file mode 100644 index 0000000..223db27 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal.Filters; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.TestRunner.Utils; +using UnityEngine.TestTools.TestRunner; +using UnityEngine.TestTools.TestRunner.Callbacks; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class PlaymodeLauncher : RuntimeTestLauncherBase + { + public static bool IsRunning; + private Scene m_Scene; + private bool m_IsTestSetupPerformed; + private readonly PlaymodeTestsControllerSettings m_Settings; + private ITestFilter testFilter; + + [SerializeField] + private List m_EventHandlers = new List(); + + public PlaymodeLauncher(PlaymodeTestsControllerSettings settings) + { + m_Settings = settings; + } + + public override void Run() + { + IsRunning = true; + ConsoleWindow.SetConsoleErrorPause(false); + Application.runInBackground = true; + + var sceneName = CreateSceneName(); + m_Scene = CreateBootstrapScene(sceneName, runner => + { + runner.AddEventHandlerMonoBehaviour(); + runner.AddEventHandlerScriptableObject(); + runner.AddEventHandlerScriptableObject(); + runner.AddEventHandlerScriptableObject(); + + foreach (var eventHandler in m_EventHandlers) + { + var obj = ScriptableObject.CreateInstance(eventHandler); + runner.AddEventHandlerScriptableObject(obj as ITestRunnerListener); + } + + runner.settings = m_Settings; + }); + + if (m_Settings.sceneBased) + { + var newListOfScenes = + new List {new EditorBuildSettingsScene(sceneName, true)}; + newListOfScenes.AddRange(EditorBuildSettings.scenes); + EditorBuildSettings.scenes = newListOfScenes.ToArray(); + } + + EditorApplication.update += UpdateCallback; + } + + public void UpdateCallback() + { + if (m_IsTestSetupPerformed) + { + if (m_Scene.IsValid()) + SceneManager.SetActiveScene(m_Scene); + EditorApplication.update -= UpdateCallback; + EditorApplication.isPlaying = true; + } + else + { + testFilter = m_Settings.BuildNUnitFilter(); + var runner = LoadTests(testFilter); + + var exceptionThrown = ExecutePreBuildSetupMethods(runner.LoadedTest, testFilter); + if (exceptionThrown) + { + EditorApplication.update -= UpdateCallback; + IsRunning = false; + var controller = PlaymodeTestsController.GetController(); + ReopenOriginalScene(controller); + AssetDatabase.DeleteAsset(controller.settings.bootstrapScene); + CallbacksDelegator.instance.RunFailed("Run Failed: One or more errors in a prebuild setup. See the editor log for details."); + return; + } + m_IsTestSetupPerformed = true; + } + } + + [InitializeOnLoad] + public class BackgroundWatcher + { + static BackgroundWatcher() + { + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + } + + private static void OnPlayModeStateChanged(PlayModeStateChange state) + { + if (!PlaymodeTestsController.IsControllerOnScene()) + return; + var runner = PlaymodeTestsController.GetController(); + if (runner == null) + return; + if (state == PlayModeStateChange.ExitingPlayMode) + { + AssetDatabase.DeleteAsset(runner.settings.bootstrapScene); + ExecutePostBuildCleanupMethods(runner.m_Runner.LoadedTest, runner.settings.BuildNUnitFilter(), Application.platform); + IsRunning = false; + } + else if (state == PlayModeStateChange.EnteredEditMode) + { + //reopen the original scene once we exit playmode + ReopenOriginalScene(runner); + } + } + } + + protected static void ReopenOriginalScene(PlaymodeTestsController runner) + { + ReopenOriginalScene(runner.settings.originalScene); + } + + public void AddEventHandler() where T : ScriptableObject, ITestRunnerListener + { + m_EventHandlers.Add(typeof(T)); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs.meta new file mode 100644 index 0000000..ddb6e1c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d3217d58bbd1d2b4aaee933e2e8b9195 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs new file mode 100644 index 0000000..32dee2b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs @@ -0,0 +1,9 @@ +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class PostbuildCleanupAttributeFinder : AttributeFinderBase + { + public PostbuildCleanupAttributeFinder() : base(attribute => attribute.TargetClass) {} + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs.meta new file mode 100644 index 0000000..454dd10 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2c2dfcbbb77359547bcaa7cdabd47ebb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs new file mode 100644 index 0000000..b51241f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs @@ -0,0 +1,9 @@ +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class PrebuildSetupAttributeFinder : AttributeFinderBase + { + public PrebuildSetupAttributeFinder() : base((attribute) => attribute.TargetClass) {} + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs.meta new file mode 100644 index 0000000..d524e56 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c4ccfb0896bcf44da13e152b267aa49 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs new file mode 100644 index 0000000..25f4b65 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using UnityEditor.DeploymentTargets; +using UnityEditor.TestTools.TestRunner.CommandLineTest; +using UnityEngine; + +namespace UnityEditor.TestRunner.TestLaunchers +{ + [Serializable] + internal class RemotePlayerLogController : ScriptableSingleton + { + private List m_LogWriters; + + private Dictionary m_Loggers; + + private string m_DeviceLogsDirectory; + + public void SetBuildTarget(BuildTarget buildTarget) + { + m_Loggers = GetDeploymentTargetLoggers(buildTarget); + } + + public void SetLogsDirectory(string dir) + { + m_DeviceLogsDirectory = dir; + } + + public void StartLogWriters() + { + if (m_DeviceLogsDirectory == null || m_Loggers == null) + return; + + m_LogWriters = new List(); + + foreach (var logger in m_Loggers) + { + m_LogWriters.Add(new LogWriter(m_DeviceLogsDirectory, logger.Key, logger.Value)); + logger.Value.Start(); + } + } + + public void StopLogWriters() + { + if (m_LogWriters == null) + return; + + foreach (var logWriter in m_LogWriters) + { + logWriter.Stop(); + } + } + + private Dictionary GetDeploymentTargetLoggers(BuildTarget buildTarget) + { + DeploymentTargetManager deploymentTargetManager; + + try + { + deploymentTargetManager = DeploymentTargetManager.CreateInstance(EditorUserBuildSettings.activeBuildTargetGroup, buildTarget); + } + catch (NotSupportedException ex) + { + Debug.Log(ex.Message); + Debug.Log("Deployment target logger not initialised"); + return null; + } + + var targets = deploymentTargetManager.GetKnownTargets(); + var loggers = new Dictionary(); + + foreach (var target in targets) + { + if (target.status != DeploymentTargetStatus.Ready) continue; + + var logger = deploymentTargetManager.GetTargetLogger(target.id); + logger.Clear(); + loggers.Add(target.id, logger); + } + + return loggers; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs.meta new file mode 100644 index 0000000..b208419 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: edd2a1fe1acbbde43aad39862bb3f4a8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs new file mode 100644 index 0000000..2ef8a27 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs @@ -0,0 +1,102 @@ +using System; +using UnityEditor.Networking.PlayerConnection; +using UnityEditor.TestTools.TestRunner; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.TestTools.TestRunner.UnityTestProtocol; +using UnityEngine; +using UnityEngine.Networking.PlayerConnection; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestRunner.TestLaunchers +{ + [Serializable] + internal class RemoteTestRunController : ScriptableSingleton + { + internal const int k_HeartbeatTimeout = 60 * 10; + + [SerializeField] + private RemoteTestResultReciever m_RemoteTestResultReciever; + + [SerializeField] + private PlatformSpecificSetup m_PlatformSpecificSetup; + + [SerializeField] + private bool m_RegisteredConnectionCallbacks; + + private IDelayedCallback m_TimeoutCallback; + + public void Init(BuildTarget buildTarget) + { + m_PlatformSpecificSetup = new PlatformSpecificSetup(buildTarget); + m_PlatformSpecificSetup.Setup(); + m_RemoteTestResultReciever = new RemoteTestResultReciever(); + EditorConnection.instance.Initialize(); + if (!m_RegisteredConnectionCallbacks) + { + EditorConnection.instance.Initialize(); + DelegateEditorConnectionEvents(); + } + + m_TimeoutCallback = new DelayedCallback(TimeoutCallback, k_HeartbeatTimeout); + } + + private void DelegateEditorConnectionEvents() + { + m_RegisteredConnectionCallbacks = true; + //This is needed because RemoteTestResultReciever is not a ScriptableObject + EditorConnection.instance.Register(PlayerConnectionMessageIds.runStartedMessageId, RunStarted); + EditorConnection.instance.Register(PlayerConnectionMessageIds.runFinishedMessageId, RunFinished); + EditorConnection.instance.Register(PlayerConnectionMessageIds.testStartedMessageId, TestStarted); + EditorConnection.instance.Register(PlayerConnectionMessageIds.testFinishedMessageId, TestFinished); + EditorConnection.instance.Register(PlayerConnectionMessageIds.playerAliveHeartbeat, PlayerAliveHearbeat); + } + + private void RunStarted(MessageEventArgs messageEventArgs) + { + m_TimeoutCallback.Reset(); + m_RemoteTestResultReciever.RunStarted(messageEventArgs); + CallbacksDelegator.instance.RunStartedRemotely(messageEventArgs.data); + } + + private void RunFinished(MessageEventArgs messageEventArgs) + { + m_TimeoutCallback.Clear(); + m_RemoteTestResultReciever.RunFinished(messageEventArgs); + m_PlatformSpecificSetup.CleanUp(); + + CallbacksDelegator.instance.RunFinishedRemotely(messageEventArgs.data); + } + + private void TestStarted(MessageEventArgs messageEventArgs) + { + m_TimeoutCallback.Reset(); + CallbacksDelegator.instance.TestStartedRemotely(messageEventArgs.data); + } + + private void TestFinished(MessageEventArgs messageEventArgs) + { + m_TimeoutCallback.Reset(); + CallbacksDelegator.instance.TestFinishedRemotely(messageEventArgs.data); + } + + private void PlayerAliveHearbeat(MessageEventArgs messageEventArgs) + { + m_TimeoutCallback.Reset(); + } + + private void TimeoutCallback() + { + CallbacksDelegator.instance.RunFailed($"Test execution timed out. No activity received from the player in {k_HeartbeatTimeout/60} minutes."); + } + + public void PostBuildAction() + { + m_PlatformSpecificSetup.PostBuildAction(); + } + + public void PostSuccessfulBuildAction() + { + m_PlatformSpecificSetup.PostSuccessfulBuildAction(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs.meta new file mode 100644 index 0000000..020222b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7d36034e63ad8254b9b2f55280fcc040 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs new file mode 100644 index 0000000..75b0712 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs @@ -0,0 +1,22 @@ +using System; +using UnityEditor.Networking.PlayerConnection; +using UnityEngine; +using UnityEngine.Networking.PlayerConnection; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class RemoteTestResultReciever + { + public void RunStarted(MessageEventArgs messageEventArgs) + { + } + + public void RunFinished(MessageEventArgs messageEventArgs) + { + EditorConnection.instance.Send(PlayerConnectionMessageIds.quitPlayerMessageId, null, messageEventArgs.playerId); + EditorConnection.instance.DisconnectAll(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs.meta new file mode 100644 index 0000000..e701015 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fdb35ef8fc437e14fa4b6c74a0609e86 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs new file mode 100644 index 0000000..87d9672 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs @@ -0,0 +1,92 @@ +using System; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEditor.Events; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools; +using UnityEngine.TestTools.NUnitExtensions; +using UnityEngine.TestTools.TestRunner; +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner +{ + internal abstract class RuntimeTestLauncherBase : TestLauncherBase + { + protected Scene CreateBootstrapScene(string sceneName, Action runnerSetup) + { + var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); + var go = new GameObject(PlaymodeTestsController.kPlaymodeTestControllerName); + + var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy()); + + var runner = go.AddComponent(); + runnerSetup(runner); + runner.settings.bootstrapScene = sceneName; + runner.AssembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList(); + + EditorSceneManager.MarkSceneDirty(scene); + AssetDatabase.SaveAssets(); + EditorSceneManager.SaveScene(scene, sceneName, false); + + return scene; + } + + public string CreateSceneName() + { + return "Assets/InitTestScene" + DateTime.Now.Ticks + ".unity"; + } + + protected UnityTestAssemblyRunner LoadTests(ITestFilter filter) + { + var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy()); + var assembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList(); + + var nUnitTestAssemblyRunner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), null); + var assemblyProvider = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), assembliesWithTests); + nUnitTestAssemblyRunner.Load(assemblyProvider.GetUserAssemblies().Select(a => a.Assembly).ToArray(), TestPlatform.PlayMode, UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode)); + return nUnitTestAssemblyRunner; + } + + protected static void ReopenOriginalScene(string originalSceneName) + { + EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects); + if (!string.IsNullOrEmpty(originalSceneName)) + { + EditorSceneManager.OpenScene(originalSceneName); + } + } + } + + internal static class PlaymodeTestsControllerExtensions + { + internal static T AddEventHandlerMonoBehaviour(this PlaymodeTestsController controller) where T : MonoBehaviour, ITestRunnerListener + { + var eventHandler = controller.gameObject.AddComponent(); + SetListeners(controller, eventHandler); + return eventHandler; + } + + internal static T AddEventHandlerScriptableObject(this PlaymodeTestsController controller) where T : ScriptableObject, ITestRunnerListener + { + var eventListener = ScriptableObject.CreateInstance(); + AddEventHandlerScriptableObject(controller, eventListener); + return eventListener; + } + + internal static void AddEventHandlerScriptableObject(this PlaymodeTestsController controller, ITestRunnerListener obj) + { + SetListeners(controller, obj); + } + + private static void SetListeners(PlaymodeTestsController controller, ITestRunnerListener eventHandler) + { + UnityEventTools.AddPersistentListener(controller.testStartedEvent, eventHandler.TestStarted); + UnityEventTools.AddPersistentListener(controller.testFinishedEvent, eventHandler.TestFinished); + UnityEventTools.AddPersistentListener(controller.runStartedEvent, eventHandler.RunStarted); + UnityEventTools.AddPersistentListener(controller.runFinishedEvent, eventHandler.RunFinished); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs.meta new file mode 100644 index 0000000..28c7416 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0efb23ecb373b6d4bbe5217485785138 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs new file mode 100644 index 0000000..7bfd354 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs @@ -0,0 +1,85 @@ +using System; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestTools; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner +{ + internal abstract class TestLauncherBase + { + public abstract void Run(); + + protected virtual RuntimePlatform? TestTargetPlatform + { + get { return Application.platform; } + } + + protected bool ExecutePreBuildSetupMethods(ITest tests, ITestFilter testRunnerFilter) + { + var attributeFinder = new PrebuildSetupAttributeFinder(); + var logString = "Executing setup for: {0}"; + return ExecuteMethods(tests, testRunnerFilter, attributeFinder, logString, targetClass => targetClass.Setup(), TestTargetPlatform); + } + + public void ExecutePostBuildCleanupMethods(ITest tests, ITestFilter testRunnerFilter) + { + ExecutePostBuildCleanupMethods(tests, testRunnerFilter, TestTargetPlatform); + } + + public static void ExecutePostBuildCleanupMethods(ITest tests, ITestFilter testRunnerFilter, RuntimePlatform? testTargetPlatform) + { + var attributeFinder = new PostbuildCleanupAttributeFinder(); + var logString = "Executing cleanup for: {0}"; + ExecuteMethods(tests, testRunnerFilter, attributeFinder, logString, targetClass => targetClass.Cleanup(), testTargetPlatform); + } + + private static bool ExecuteMethods(ITest tests, ITestFilter testRunnerFilter, AttributeFinderBase attributeFinder, string logString, Action action, RuntimePlatform? testTargetPlatform) + { + var exceptionsThrown = false; + + if (testTargetPlatform == null) + { + Debug.LogError("Could not determine test target platform from build target " + EditorUserBuildSettings.activeBuildTarget); + return true; + } + + foreach (var targetClassType in attributeFinder.Search(tests, testRunnerFilter, testTargetPlatform.Value)) + { + try + { + var targetClass = (T)Activator.CreateInstance(targetClassType); + + Debug.LogFormat(logString, targetClassType.FullName); + + using (var logScope = new LogScope()) + { + action(targetClass); + + if (logScope.AnyFailingLogs()) + { + var failingLog = logScope.FailingLogs.First(); + throw new UnhandledLogMessageException(failingLog); + } + + if (logScope.ExpectedLogs.Any()) + { + var expectedLogs = logScope.ExpectedLogs.First(); + throw new UnexpectedLogMessageException(expectedLogs); + } + } + } + catch (InvalidCastException) {} + catch (Exception e) + { + Debug.LogException(e); + exceptionsThrown = true; + } + } + + return exceptionsThrown; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs.meta new file mode 100644 index 0000000..c36990c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1cddf785b0d07434d8e0607c97b09135 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestResultSerializer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestResultSerializer.cs new file mode 100644 index 0000000..f471fee --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestResultSerializer.cs @@ -0,0 +1,71 @@ +using System; +using System.Reflection; +using System.Text; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class TestResultSerializer + { + private static readonly BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Public | + BindingFlags.Instance | BindingFlags.FlattenHierarchy; + + [SerializeField] public string id; + + [SerializeField] public string fullName; + + [SerializeField] private double duration; + + [SerializeField] private string label; + + [SerializeField] private string message; + + [SerializeField] private string output; + + [SerializeField] private string site; + + [SerializeField] private string stacktrace; + + [SerializeField] private double startTimeAO; + + [SerializeField] private string status; + + public static TestResultSerializer MakeFromTestResult(ITestResult result) + { + var wrapper = new TestResultSerializer(); + wrapper.id = result.Test.Id; + wrapper.fullName = result.FullName; + wrapper.status = result.ResultState.Status.ToString(); + wrapper.label = result.ResultState.Label; + wrapper.site = result.ResultState.Site.ToString(); + wrapper.output = result.Output; + wrapper.duration = result.Duration; + wrapper.stacktrace = result.StackTrace; + wrapper.message = result.Message; + wrapper.startTimeAO = result.StartTime.ToOADate(); + return wrapper; + } + + public void RestoreTestResult(TestResult result) + { + var resultState = new ResultState((TestStatus)Enum.Parse(typeof(TestStatus), status), label, + (FailureSite)Enum.Parse(typeof(FailureSite), site)); + result.GetType().BaseType.GetField("_resultState", flags).SetValue(result, resultState); + result.GetType().BaseType.GetField("_output", flags).SetValue(result, new StringBuilder(output)); + result.GetType().BaseType.GetField("_duration", flags).SetValue(result, duration); + result.GetType().BaseType.GetField("_message", flags).SetValue(result, message); + result.GetType().BaseType.GetField("_stackTrace", flags).SetValue(result, stacktrace); + result.GetType() + .BaseType.GetProperty("StartTime", flags) + .SetValue(result, DateTime.FromOADate(startTimeAO), null); + } + + public bool IsPassed() + { + return status == TestStatus.Passed.ToString(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestResultSerializer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestResultSerializer.cs.meta new file mode 100644 index 0000000..96f2960 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestResultSerializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 559482fe33c79e44882d3a6cedc55fb5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner.meta new file mode 100644 index 0000000..d09886b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 49d4c2ab7ff0f4442af256bad7c9d57c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks.meta new file mode 100644 index 0000000..9e611a4 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5d7f0d6acfced954682a89e7002c04d9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs new file mode 100644 index 0000000..9b92fbc --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditModeRunnerCallback : ScriptableObject, ITestRunnerListener + { + private EditModeLauncherContextSettings m_Settings; + public SceneSetup[] previousSceneSetup; + public int undoGroup; + public EditModeRunner runner; + + private bool m_Canceled; + private ITest m_CurrentTest; + private int m_TotalTests; + + [SerializeField] + private List m_PendingTests; + [SerializeField] + private string m_LastCountedTestName; + [SerializeField] + private bool m_RunRestarted; + + public void OnDestroy() + { + CleanUp(); + } + + public void RunStarted(ITest testsToRun) + { + Setup(); + if (m_PendingTests == null) + { + m_PendingTests = GetTestsExpectedToRun(testsToRun, runner.GetFilter()); + m_TotalTests = m_PendingTests.Count; + } + } + + public void OnEnable() + { + if (m_RunRestarted) + { + Setup(); + } + } + + private void Setup() + { + m_Settings = new EditModeLauncherContextSettings(); + Application.logMessageReceivedThreaded += LogReceived; + EditorApplication.playModeStateChanged += WaitForExitPlaymode; + EditorApplication.update += DisplayProgressBar; + AssemblyReloadEvents.beforeAssemblyReload += BeforeAssemblyReload; + } + + private void BeforeAssemblyReload() + { + if (m_CurrentTest != null) + { + m_LastCountedTestName = m_CurrentTest.FullName; + m_RunRestarted = true; + } + } + + private void DisplayProgressBar() + { + if (m_CurrentTest == null) + return; + if (!m_Canceled && EditorUtility.DisplayCancelableProgressBar("Test Runner", "Running test " + m_CurrentTest.Name, Math.Min(1.0f, (float)(m_TotalTests - m_PendingTests.Count) / m_TotalTests))) + { + EditorApplication.update -= DisplayProgressBar; + m_Canceled = true; + EditorUtility.ClearProgressBar(); + runner.OnRunCancel(); + } + } + + private static void LogReceived(string message, string stacktrace, LogType type) + { + if (TestContext.Out != null) + TestContext.Out.WriteLine(message); + } + + private static void WaitForExitPlaymode(PlayModeStateChange state) + { + if (state == PlayModeStateChange.EnteredEditMode) + { + EditorApplication.playModeStateChanged -= WaitForExitPlaymode; + //because logMessage is reset on Enter EditMode + //we remove and add the callback + //because Unity + Application.logMessageReceivedThreaded -= LogReceived; + Application.logMessageReceivedThreaded += LogReceived; + } + } + + public void RunFinished(ITestResult result) + { + if (previousSceneSetup != null && previousSceneSetup.Length > 0) + { + try + { + EditorSceneManager.RestoreSceneManagerSetup(previousSceneSetup); + } + catch (ArgumentException e) + { + Debug.LogWarning(e.Message); + } + } + else + { + EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single); + } + CleanUp(); + PerformUndo(undoGroup); + } + + private void CleanUp() + { + m_CurrentTest = null; + EditorUtility.ClearProgressBar(); + if (m_Settings != null) + { + m_Settings.Dispose(); + } + Application.logMessageReceivedThreaded -= LogReceived; + EditorApplication.update -= DisplayProgressBar; + } + + public void TestStarted(ITest test) + { + if (test.IsSuite || !(test is TestMethod)) + { + return; + } + + m_CurrentTest = test; + + if (m_RunRestarted) + { + if (test.FullName == m_LastCountedTestName) + m_RunRestarted = false; + } + } + + public void TestFinished(ITestResult result) + { + if (result.Test is TestMethod) + { + m_PendingTests.Remove(result.Test.FullName); + } + } + + private static void PerformUndo(int undoGroup) + { + EditorUtility.DisplayProgressBar("Undo", "Reverting changes to the scene", 0); + var undoStartTime = DateTime.Now; + Undo.RevertAllDownToGroup(undoGroup); + if ((DateTime.Now - undoStartTime).TotalSeconds > 1) + Debug.LogWarning("Undo after editor test run took " + (DateTime.Now - undoStartTime).Seconds + " seconds."); + EditorUtility.ClearProgressBar(); + } + + private static List GetTestsExpectedToRun(ITest test, ITestFilter filter) + { + var expectedTests = new List(); + + if (filter.Pass(test)) + { + if (test.IsSuite) + { + expectedTests.AddRange(test.Tests.SelectMany(subTest => GetTestsExpectedToRun(subTest, filter))); + } + else + { + expectedTests.Add(test.FullName); + } + } + + return expectedTests; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs.meta new file mode 100644 index 0000000..1a0d71c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc456ba93311a3a43ad896449fee9868 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs new file mode 100644 index 0000000..bf8e698 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs @@ -0,0 +1,86 @@ +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.TestTools.TestRunner.CommandLineTest; +using UnityEngine.TestTools.TestRunner.GUI; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class RerunCallback : ScriptableObject, ICallbacks + { + public static bool useMockRunFilter = false; + public static TestRunnerFilter mockRunFilter = null; + + public void RunFinished(ITestResultAdaptor result) + { + if (RerunCallbackData.instance.runFilters == null || RerunCallbackData.instance.runFilters.Length == 0) + RerunCallbackData.instance.runFilters = new[] {new TestRunnerFilter()}; + + var runFilter = RerunCallbackData.instance.runFilters[0]; + + if (useMockRunFilter) + { + runFilter = mockRunFilter; + } + + runFilter.testRepetitions--; + if (runFilter.testRepetitions <= 0 || result.TestStatus != TestStatus.Passed) + { + ExitCallbacks.preventExit = false; + return; + } + + ExitCallbacks.preventExit = true; + if (EditorApplication.isPlaying) + { + EditorApplication.playModeStateChanged += WaitForExitPlaymode; + return; + } + + if (!useMockRunFilter) + { + ExecuteTestRunnerAPI(); + } + } + + private static void WaitForExitPlaymode(PlayModeStateChange state) + { + if (state == PlayModeStateChange.EnteredEditMode) + { + ExecuteTestRunnerAPI(); + } + } + + private static void ExecuteTestRunnerAPI() + { + var runFilter = RerunCallbackData.instance.runFilters[0]; + var testMode = RerunCallbackData.instance.testMode; + + var testRunnerApi = ScriptableObject.CreateInstance(); + testRunnerApi.Execute(new Api.ExecutionSettings() + { + filters = new[] + { + new Filter() + { + categoryNames = runFilter.categoryNames, + groupNames = runFilter.groupNames, + testMode = testMode, + testNames = runFilter.testNames + } + } + }); + } + + public void TestStarted(ITestAdaptor test) + { + } + + public void TestFinished(ITestResultAdaptor result) + { + } + + public void RunStarted(ITestAdaptor testsToRun) + { + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs.meta new file mode 100644 index 0000000..3a3be6c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b7ff2b2e91321ff4381d4ab45870a32e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs new file mode 100644 index 0000000..710069c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs @@ -0,0 +1,15 @@ +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class RerunCallbackData : ScriptableSingleton + { + [SerializeField] + internal TestRunnerFilter[] runFilters; + + [SerializeField] + internal TestMode testMode; + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs.meta new file mode 100644 index 0000000..e72f3af --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 087cba9fa6ac867479a0b0fdc0a5864b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs new file mode 100644 index 0000000..2260d4d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs @@ -0,0 +1,17 @@ +using UnityEngine; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner +{ + [InitializeOnLoad] + static class RerunCallbackInitializer + { + static RerunCallbackInitializer() + { + var testRunnerApi = ScriptableObject.CreateInstance(); + + var rerunCallback = ScriptableObject.CreateInstance(); + testRunnerApi.RegisterCallbacks(rerunCallback); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs.meta new file mode 100644 index 0000000..5149605 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f73fc901e4b0f2d4daf11f46506054ba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs new file mode 100644 index 0000000..4234754 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs @@ -0,0 +1,37 @@ +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestRunnerCallback : ScriptableObject, ITestRunnerListener + { + public void RunStarted(ITest testsToRun) + { + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + } + + private void OnPlayModeStateChanged(PlayModeStateChange state) + { + if (state == PlayModeStateChange.ExitingPlayMode) + { + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + //We need to make sure we don't block NUnit thread in case we exit PlayMode earlier + PlaymodeTestsController.TryCleanup(); + } + } + + public void RunFinished(ITestResult testResults) + { + EditorApplication.isPlaying = false; + } + + public void TestStarted(ITest testName) + { + } + + public void TestFinished(ITestResult test) + { + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs.meta new file mode 100644 index 0000000..1356ff9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d44e6804bc58be84ea71a619b468f150 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs new file mode 100644 index 0000000..527a079 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs @@ -0,0 +1,44 @@ +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class WindowResultUpdater : ICallbacks, ITestTreeRebuildCallbacks + { + public void RunStarted(ITestAdaptor testsToRun) + { + } + + public void RunFinished(ITestResultAdaptor testResults) + { + if (TestRunnerWindow.s_Instance != null) + { + TestRunnerWindow.s_Instance.RebuildUIFilter(); + } + } + + public void TestStarted(ITestAdaptor testName) + { + } + + public void TestFinished(ITestResultAdaptor test) + { + if (TestRunnerWindow.s_Instance == null) + { + return; + } + + var result = new TestRunnerResult(test); + TestRunnerWindow.s_Instance.m_SelectedTestTypes.UpdateResult(result); + } + + public void TestTreeRebuild(ITestAdaptor test) + { + if (TestRunnerWindow.s_Instance == null) + { + return; + } + + TestRunnerWindow.s_Instance.m_SelectedTestTypes.UpdateTestTree(test); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs.meta new file mode 100644 index 0000000..d9e35df --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d468ee3657be7a43a2ef2178ec14239 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs new file mode 100644 index 0000000..8776887 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs @@ -0,0 +1,32 @@ +using System.Collections; +using System.Reflection; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditModePcHelper : TestCommandPcHelper + { + public override void SetEnumeratorPC(IEnumerator enumerator, int pc) + { + GetPCFieldInfo(enumerator).SetValue(enumerator, pc); + } + + public override int GetEnumeratorPC(IEnumerator enumerator) + { + if (enumerator == null) + { + return 0; + } + return (int)GetPCFieldInfo(enumerator).GetValue(enumerator); + } + + private FieldInfo GetPCFieldInfo(IEnumerator enumerator) + { + var field = enumerator.GetType().GetField("$PC", BindingFlags.NonPublic | BindingFlags.Instance); + if (field == null) // Roslyn + field = enumerator.GetType().GetField("<>1__state", BindingFlags.NonPublic | BindingFlags.Instance); + + return field; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs.meta new file mode 100644 index 0000000..ce559af --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d16f2e78a356d34c9a32108929de932 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs new file mode 100644 index 0000000..cdc6853 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs @@ -0,0 +1,438 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Filters; +using UnityEngine; +using UnityEngine.TestTools.NUnitExtensions; +using UnityEngine.TestTools.TestRunner; +using UnityEngine.TestTools; +using UnityEngine.TestTools.TestRunner.GUI; +using UnityEditor.Callbacks; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEditor.TestTools.TestRunner +{ + internal interface IUnityTestAssemblyRunnerFactory + { + IUnityTestAssemblyRunner Create(TestPlatform testPlatform, WorkItemFactory factory); + } + + internal class UnityTestAssemblyRunnerFactory : IUnityTestAssemblyRunnerFactory + { + public IUnityTestAssemblyRunner Create(TestPlatform testPlatform, WorkItemFactory factory) + { + return new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), factory); + } + } + + [Serializable] + internal class EditModeRunner : ScriptableObject, IDisposable + { + [SerializeField] + private Filter[] m_Filters; + + //The counter from the IEnumerator object + [SerializeField] + private int m_CurrentPC; + + [SerializeField] + private bool m_ExecuteOnEnable; + + [SerializeField] + private List m_AlreadyStartedTests; + + [SerializeField] + private List m_ExecutedTests; + + [SerializeField] + private List m_CallbackObjects = new List(); + + [SerializeField] + private TestStartedEvent m_TestStartedEvent = new TestStartedEvent(); + + [SerializeField] + private TestFinishedEvent m_TestFinishedEvent = new TestFinishedEvent(); + + [SerializeField] + private RunStartedEvent m_RunStartedEvent = new RunStartedEvent(); + + [SerializeField] + private RunFinishedEvent m_RunFinishedEvent = new RunFinishedEvent(); + + [SerializeField] + private TestRunnerStateSerializer m_TestRunnerStateSerializer = new TestRunnerStateSerializer(); + + [SerializeField] + private TestFileCleanupVerifier m_CleanupVerifier = new TestFileCleanupVerifier(); + + [SerializeField] + private bool m_RunningTests; + + [SerializeField] + private TestPlatform m_TestPlatform; + + [SerializeField] + private object m_CurrentYieldObject; + + [SerializeField] + private BeforeAfterTestCommandState m_SetUpTearDownState; + [SerializeField] + private BeforeAfterTestCommandState m_OuterUnityTestActionState; + + public bool RunningSynchronously { get; private set; } + + internal IUnityTestAssemblyRunner m_Runner; + + private ConstructDelegator m_ConstructDelegator; + + private IEnumerator m_RunStep; + + public IUnityTestAssemblyRunnerFactory UnityTestAssemblyRunnerFactory { get; set; } + + public void Init(Filter[] filters, TestPlatform platform, bool runningSynchronously) + { + m_Filters = filters; + m_TestPlatform = platform; + m_AlreadyStartedTests = new List(); + m_ExecutedTests = new List(); + RunningSynchronously = runningSynchronously; + InitRunner(); + } + + private void InitRunner() + { + //We give the EditMode platform here so we dont suddenly create Playmode work items in the test Runner. + m_Runner = (UnityTestAssemblyRunnerFactory ?? new UnityTestAssemblyRunnerFactory()).Create(TestPlatform.EditMode, new EditmodeWorkItemFactory()); + var testAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy()); + var assemblies = testAssemblyProvider.GetAssembliesGroupedByType(m_TestPlatform).Select(x => x.Assembly).ToArray(); + var loadedTests = m_Runner.Load(assemblies, TestPlatform.EditMode, + UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(m_TestPlatform)); + loadedTests.ParseForNameDuplicates(); + CallbacksDelegator.instance.TestTreeRebuild(loadedTests); + hideFlags |= HideFlags.DontSave; + EnumerableSetUpTearDownCommand.ActivePcHelper = new EditModePcHelper(); + OuterUnityTestActionCommand.ActivePcHelper = new EditModePcHelper(); + } + + public void OnEnable() + { + if (m_ExecuteOnEnable) + { + InitRunner(); + m_ExecuteOnEnable = false; + foreach (var callback in m_CallbackObjects) + { + AddListeners(callback as ITestRunnerListener); + } + m_ConstructDelegator = new ConstructDelegator(m_TestRunnerStateSerializer); + + EnumeratorStepHelper.SetEnumeratorPC(m_CurrentPC); + + UnityWorkItemDataHolder.alreadyExecutedTests = m_ExecutedTests.Select(x => x.fullName).ToList(); + UnityWorkItemDataHolder.alreadyStartedTests = m_AlreadyStartedTests; + Run(); + } + } + + public void TestStartedEvent(ITest test) + { + m_AlreadyStartedTests.Add(test.FullName); + } + + public void TestFinishedEvent(ITestResult testResult) + { + m_AlreadyStartedTests.Remove(testResult.FullName); + m_ExecutedTests.Add(TestResultSerializer.MakeFromTestResult(testResult)); + } + + public void Run() + { + EditModeTestCallbacks.RestoringTestContext += OnRestoringTest; + var context = m_Runner.GetCurrentContext(); + if (m_SetUpTearDownState == null) + { + m_SetUpTearDownState = CreateInstance(); + } + context.SetUpTearDownState = m_SetUpTearDownState; + + if (m_OuterUnityTestActionState == null) + { + m_OuterUnityTestActionState = CreateInstance(); + } + context.OuterUnityTestActionState = m_OuterUnityTestActionState; + + m_CleanupVerifier.RegisterExistingFiles(); + + if (!m_RunningTests) + { + m_RunStartedEvent.Invoke(m_Runner.LoadedTest); + } + + if (m_ConstructDelegator == null) + m_ConstructDelegator = new ConstructDelegator(m_TestRunnerStateSerializer); + + Reflect.ConstructorCallWrapper = m_ConstructDelegator.Delegate; + m_TestStartedEvent.AddListener(TestStartedEvent); + m_TestFinishedEvent.AddListener(TestFinishedEvent); + + AssemblyReloadEvents.beforeAssemblyReload += OnBeforeAssemblyReload; + + RunningTests = true; + + EditorApplication.LockReloadAssemblies(); + + var testListenerWrapper = new TestListenerWrapper(m_TestStartedEvent, m_TestFinishedEvent); + m_RunStep = m_Runner.Run(testListenerWrapper, GetFilter()).GetEnumerator(); + m_RunningTests = true; + + if (!RunningSynchronously) + EditorApplication.update += TestConsumer; + } + + public void CompleteSynchronously() + { + while (!m_Runner.IsTestComplete) + TestConsumer(); + } + + private void OnBeforeAssemblyReload() + { + EditorApplication.update -= TestConsumer; + + if (m_ExecuteOnEnable) + { + AssemblyReloadEvents.beforeAssemblyReload -= OnBeforeAssemblyReload; + return; + } + + if (m_Runner != null && m_Runner.TopLevelWorkItem != null) + m_Runner.TopLevelWorkItem.ResultedInDomainReload = true; + + if (RunningTests) + { + Debug.LogError("TestRunner: Unexpected assembly reload happened while running tests"); + + EditorUtility.ClearProgressBar(); + + if (m_Runner.GetCurrentContext() != null && m_Runner.GetCurrentContext().CurrentResult != null) + { + m_Runner.GetCurrentContext().CurrentResult.SetResult(ResultState.Cancelled, "Unexpected assembly reload happened"); + } + OnRunCancel(); + } + } + + private bool RunningTests; + + private Stack StepStack = new Stack(); + + private bool MoveNextAndUpdateYieldObject() + { + var result = m_RunStep.MoveNext(); + + if (result) + { + m_CurrentYieldObject = m_RunStep.Current; + while (m_CurrentYieldObject is IEnumerator) // going deeper + { + var currentEnumerator = (IEnumerator)m_CurrentYieldObject; + + // go deeper and add parent to stack + StepStack.Push(m_RunStep); + + m_RunStep = currentEnumerator; + m_CurrentYieldObject = m_RunStep.Current; + } + + if (StepStack.Count > 0 && m_CurrentYieldObject != null) // not null and not IEnumerator, nested + { + Debug.LogError("EditMode test can only yield null, but not <" + m_CurrentYieldObject.GetType().Name + ">"); + } + + return true; + } + + if (StepStack.Count == 0) // done + return false; + + m_RunStep = StepStack.Pop(); // going up + return MoveNextAndUpdateYieldObject(); + } + + private void TestConsumer() + { + var moveNext = MoveNextAndUpdateYieldObject(); + + if (m_CurrentYieldObject != null) + { + InvokeDelegator(); + } + + if (!moveNext && !m_Runner.IsTestComplete) + { + CompleteTestRun(); + throw new IndexOutOfRangeException("There are no more elements to process and IsTestComplete is false"); + } + + if (m_Runner.IsTestComplete) + { + CompleteTestRun(); + } + } + + private void CompleteTestRun() + { + if (!RunningSynchronously) + EditorApplication.update -= TestConsumer; + + TestLauncherBase.ExecutePostBuildCleanupMethods(this.GetLoadedTests(), this.GetFilter(), Application.platform); + m_CleanupVerifier.VerifyNoNewFilesAdded(); + m_RunFinishedEvent.Invoke(m_Runner.Result); + + if (m_ConstructDelegator != null) + m_ConstructDelegator.DestroyCurrentTestObjectIfExists(); + Dispose(); + UnityWorkItemDataHolder.alreadyExecutedTests = null; + } + + private void OnRestoringTest() + { + var item = m_ExecutedTests.Find(t => t.fullName == UnityTestExecutionContext.CurrentContext.CurrentTest.FullName); + if (item != null) + { + item.RestoreTestResult(UnityTestExecutionContext.CurrentContext.CurrentResult); + } + } + + private static bool IsCancelled() + { + return UnityTestExecutionContext.CurrentContext.ExecutionStatus == TestExecutionStatus.AbortRequested || UnityTestExecutionContext.CurrentContext.ExecutionStatus == TestExecutionStatus.StopRequested; + } + + private void InvokeDelegator() + { + if (m_CurrentYieldObject == null) + { + return; + } + + if (IsCancelled()) + { + return; + } + + if (m_CurrentYieldObject is RestoreTestContextAfterDomainReload) + { + if (m_TestRunnerStateSerializer.ShouldRestore()) + { + m_TestRunnerStateSerializer.RestoreContext(); + } + + return; + } + + try + { + if (m_CurrentYieldObject is IEditModeTestYieldInstruction) + { + var editModeTestYieldInstruction = (IEditModeTestYieldInstruction)m_CurrentYieldObject; + if (editModeTestYieldInstruction.ExpectDomainReload) + { + PrepareForDomainReload(); + } + return; + } + } + catch (Exception e) + { + UnityTestExecutionContext.CurrentContext.CurrentResult.RecordException(e); + return; + } + + Debug.LogError("EditMode test can only yield null"); + } + + private void CompilationFailureWatch() + { + if (EditorApplication.isCompiling) + return; + + EditorApplication.update -= CompilationFailureWatch; + + if (EditorUtility.scriptCompilationFailed) + { + EditorUtility.ClearProgressBar(); + OnRunCancel(); + } + } + + private void PrepareForDomainReload() + { + m_TestRunnerStateSerializer.SaveContext(); + m_CurrentPC = EnumeratorStepHelper.GetEnumeratorPC(TestEnumerator.Enumerator); + m_ExecuteOnEnable = true; + + RunningTests = false; + } + + public T AddEventHandler() where T : ScriptableObject, ITestRunnerListener + { + var eventHandler = CreateInstance(); + eventHandler.hideFlags |= HideFlags.DontSave; + m_CallbackObjects.Add(eventHandler); + + AddListeners(eventHandler); + + return eventHandler; + } + + private void AddListeners(ITestRunnerListener eventHandler) + { + m_TestStartedEvent.AddListener(eventHandler.TestStarted); + m_TestFinishedEvent.AddListener(eventHandler.TestFinished); + m_RunStartedEvent.AddListener(eventHandler.RunStarted); + m_RunFinishedEvent.AddListener(eventHandler.RunFinished); + } + + public void Dispose() + { + Reflect.MethodCallWrapper = null; + EditorApplication.update -= TestConsumer; + + DestroyImmediate(this); + + if (m_CallbackObjects != null) + { + foreach (var obj in m_CallbackObjects) + { + DestroyImmediate(obj); + } + m_CallbackObjects.Clear(); + } + RunningTests = false; + EditorApplication.UnlockReloadAssemblies(); + } + + public void OnRunCancel() + { + UnityWorkItemDataHolder.alreadyExecutedTests = null; + m_ExecuteOnEnable = false; + m_Runner.StopRun(); + } + + public ITest GetLoadedTests() + { + return m_Runner.LoadedTest; + } + + public ITestFilter GetFilter() + { + return new OrFilter(m_Filters.Select(filter => filter.BuildNUnitFilter(RunningSynchronously)).ToArray()); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs.meta new file mode 100644 index 0000000..78c0039 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9219e99d466b7741a057132d1994f35 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs new file mode 100644 index 0000000..c2bf921 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs @@ -0,0 +1,14 @@ +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditmodeWorkItemFactory : WorkItemFactory + { + protected override UnityWorkItem Create(TestMethod method, ITestFilter filter, ITest loadedTest) + { + return new EditorEnumeratorTestWorkItem(method, filter); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs.meta new file mode 100644 index 0000000..ab4bd45 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3dde15f260b0dd1469e60d16eaa795dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs new file mode 100644 index 0000000..288c70a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs @@ -0,0 +1,179 @@ +using System; +using System.Collections; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditorEnumeratorTestWorkItem : UnityWorkItem + { + private TestCommand m_Command; + + public EditorEnumeratorTestWorkItem(TestMethod test, ITestFilter filter) + : base(test, null) + { + m_Command = TestCommandBuilder.BuildTestCommand(test, filter); + } + + private static IEnumerableTestMethodCommand FindFirstIEnumerableTestMethodCommand(TestCommand command) + { + if (command == null) + { + return null; + } + + if (command is IEnumerableTestMethodCommand) + { + return (IEnumerableTestMethodCommand)command; + } + + if (command is DelegatingTestCommand) + { + var delegatingTestCommand = (DelegatingTestCommand)command; + return FindFirstIEnumerableTestMethodCommand(delegatingTestCommand.GetInnerCommand()); + } + return null; + } + + protected override IEnumerable PerformWork() + { + if (IsCancelledRun()) + { + yield break; + } + + if (m_DontRunRestoringResult) + { + if (EditModeTestCallbacks.RestoringTestContext == null) + { + throw new NullReferenceException("RestoringTestContext is not set"); + } + EditModeTestCallbacks.RestoringTestContext(); + Result = Context.CurrentResult; + yield break; + } + + try + { + if (IsCancelledRun()) + { + yield break; + } + + if (m_Command is SkipCommand) + { + m_Command.Execute(Context); + Result = Context.CurrentResult; + yield break; + } + + //Check if we can execute this test + var firstEnumerableCommand = FindFirstIEnumerableTestMethodCommand(m_Command); + if (firstEnumerableCommand == null) + { + Context.CurrentResult.SetResult(ResultState.Error, "Returning IEnumerator but not using test attribute supporting this"); + yield break; + } + + if (m_Command.Test.Method.ReturnType.IsType(typeof(IEnumerator))) + { + if (m_Command is ApplyChangesToContextCommand) + { + var applyChangesToContextCommand = ((ApplyChangesToContextCommand)m_Command); + applyChangesToContextCommand.ApplyChanges(Context); + m_Command = applyChangesToContextCommand.GetInnerCommand(); + } + + var innerCommand = m_Command as IEnumerableTestMethodCommand; + if (innerCommand == null) + { + Debug.Log("failed getting innerCommand"); + throw new Exception("Tests returning IEnumerator can only use test attributes handling those"); + } + + foreach (var workItemStep in innerCommand.ExecuteEnumerable(Context)) + { + if (IsCancelledRun()) + { + yield break; + } + + if (workItemStep is TestEnumerator) + { + if (EnumeratorStepHelper.UpdateEnumeratorPcIfNeeded(TestEnumerator.Enumerator)) + { + yield return new RestoreTestContextAfterDomainReload(); + } + continue; + } + + if (workItemStep is AsyncOperation) + { + var asyncOperation = (AsyncOperation)workItemStep; + while (!asyncOperation.isDone) + { + if (IsCancelledRun()) + { + yield break; + } + + yield return null; + } + continue; + } + + ResultedInDomainReload = false; + + if (workItemStep is IEditModeTestYieldInstruction) + { + var editModeTestYieldInstruction = (IEditModeTestYieldInstruction)workItemStep; + yield return editModeTestYieldInstruction; + var enumerator = editModeTestYieldInstruction.Perform(); + while (true) + { + bool moveNext; + try + { + moveNext = enumerator.MoveNext(); + } + catch (Exception e) + { + Context.CurrentResult.RecordException(e); + break; + } + + if (!moveNext) + { + break; + } + yield return null; + } + } + else + { + yield return workItemStep; + } + } + + Result = Context.CurrentResult; + EditorApplication.isPlaying = false; + yield return null; + } + } + finally + { + WorkItemComplete(); + } + } + + private bool IsCancelledRun() + { + return Context.ExecutionStatus == TestExecutionStatus.AbortRequested || Context.ExecutionStatus == TestExecutionStatus.StopRequested; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs.meta new file mode 100644 index 0000000..982f7ee --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ebc1994f9a3d5649a1201d3a84b38df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs new file mode 100644 index 0000000..98eeda8 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs @@ -0,0 +1,51 @@ +using System.Collections; +using System.Reflection; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EnumeratorStepHelper + { + private static int m_PC; + + public static void SetEnumeratorPC(int pc) + { + m_PC = pc; + } + + /// + /// Gets the current enumerator PC + /// + /// + /// The PC + /// 0 if no current Enumeration + /// + public static int GetEnumeratorPC(IEnumerator enumerator) + { + if (enumerator == null) + { + return 0; + } + return (int)GetPCFieldInfo(enumerator).GetValue(enumerator); + } + + public static bool UpdateEnumeratorPcIfNeeded(IEnumerator enumerator) + { + if (m_PC > 0) + { + GetPCFieldInfo(enumerator).SetValue(enumerator, m_PC); + m_PC = 0; + return true; + } + return false; + } + + private static FieldInfo GetPCFieldInfo(IEnumerator enumerator) + { + var field = enumerator.GetType().GetField("$PC", BindingFlags.NonPublic | BindingFlags.Instance); + if (field == null) // Roslyn + field = enumerator.GetType().GetField("<>1__state", BindingFlags.NonPublic | BindingFlags.Instance); + + return field; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs.meta new file mode 100644 index 0000000..08662b9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 901b761c5c1e22d4e8a3ba7d95bc1f5d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages.meta new file mode 100644 index 0000000..0660c63 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d9682e749d3efc642af54d789d9090a6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs new file mode 100644 index 0000000..796c531 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections; +using UnityEditor; + +namespace UnityEngine.TestTools +{ + public class EnterPlayMode : IEditModeTestYieldInstruction + { + public bool ExpectDomainReload { get; } + public bool ExpectedPlaymodeState { get; private set; } + + public EnterPlayMode(bool expectDomainReload = true) + { + ExpectDomainReload = expectDomainReload; + } + + public IEnumerator Perform() + { + if (EditorApplication.isPlaying) + { + throw new Exception("Editor is already in PlayMode"); + } + if (EditorUtility.scriptCompilationFailed) + { + throw new Exception("Script compilation failed"); + } + yield return null; + ExpectedPlaymodeState = true; + + EditorApplication.UnlockReloadAssemblies(); + EditorApplication.isPlaying = true; + + while (!EditorApplication.isPlaying) + { + yield return null; + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs.meta new file mode 100644 index 0000000..fa1dc2e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9bd5a110ed89025499ddee8c7e73778e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs new file mode 100644 index 0000000..2eed28b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections; +using UnityEditor; + +namespace UnityEngine.TestTools +{ + public class ExitPlayMode : IEditModeTestYieldInstruction + { + public bool ExpectDomainReload { get; } + public bool ExpectedPlaymodeState { get; private set; } + + public ExitPlayMode() + { + ExpectDomainReload = false; + ExpectedPlaymodeState = false; + } + + public IEnumerator Perform() + { + if (!EditorApplication.isPlayingOrWillChangePlaymode) + { + throw new Exception("Editor is already in EditMode"); + } + + EditorApplication.isPlaying = false; + while (EditorApplication.isPlaying) + { + yield return null; + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs.meta new file mode 100644 index 0000000..1de769d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 408674d91d506a54aac9a7f07951c018 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs new file mode 100644 index 0000000..52af5a7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections; +using UnityEditor; + +namespace UnityEngine.TestTools +{ + public class RecompileScripts : IEditModeTestYieldInstruction + { + public RecompileScripts() : this(true) + { + } + + public RecompileScripts(bool expectScriptCompilation) : this(expectScriptCompilation, true) + { + } + + public RecompileScripts(bool expectScriptCompilation, bool expectScriptCompilationSuccess) + { + ExpectScriptCompilation = expectScriptCompilation; + ExpectScriptCompilationSuccess = expectScriptCompilationSuccess; + ExpectDomainReload = true; + } + + public bool ExpectDomainReload { get; private set; } + public bool ExpectedPlaymodeState { get; } + public bool ExpectScriptCompilation { get; private set; } + public bool ExpectScriptCompilationSuccess { get; private set; } + public static RecompileScripts Current { get; private set; } + + public IEnumerator Perform() + { + Current = this; + + // We need to yield, to give the test runner a chance to prepare for the domain reload + // If the script compilation happens very fast, then EditModeRunner.MoveNextAndUpdateYieldObject will not have a chance to set m_CurrentYieldObject + // This really should be fixed in EditModeRunner.MoveNextAndUpdateYieldObject + yield return null; + + AssetDatabase.Refresh(); + + if (ExpectScriptCompilation && !EditorApplication.isCompiling) + { + Current = null; + throw new Exception("Editor does not need to recompile scripts"); + } + + EditorApplication.UnlockReloadAssemblies(); + + while (EditorApplication.isCompiling) + { + yield return null; + } + + Current = null; + + if (ExpectScriptCompilationSuccess && EditorUtility.scriptCompilationFailed) + { + EditorApplication.LockReloadAssemblies(); + throw new Exception("Script compilation failed"); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs.meta new file mode 100644 index 0000000..f764d6e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9202fbba95ea8294cb5e718f028f21b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs new file mode 100644 index 0000000..b71630a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections; +using UnityEditor; + +namespace UnityEngine.TestTools +{ + public class WaitForDomainReload : IEditModeTestYieldInstruction + { + public WaitForDomainReload() + { + ExpectDomainReload = true; + } + + public bool ExpectDomainReload { get;  } + public bool ExpectedPlaymodeState { get; } + + public IEnumerator Perform() + { + EditorApplication.UnlockReloadAssemblies(); + + // Detect if AssetDatabase.Refresh was called (true) or if it will be called on next tick + bool isAsync = EditorApplication.isCompiling; + + yield return null; + + if (!isAsync) + { + EditorApplication.LockReloadAssemblies(); + throw new Exception("Expected domain reload, but it did not occur"); + } + + while (EditorApplication.isCompiling) + { + yield return null; + } + + if (EditorUtility.scriptCompilationFailed) + { + EditorApplication.LockReloadAssemblies(); + throw new Exception("Script compilation failed"); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs.meta new file mode 100644 index 0000000..7fa45cb --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5df3c21c5237c994db89660fbdfee07d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/TestFileCleanupVerifier.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/TestFileCleanupVerifier.cs new file mode 100644 index 0000000..45417cd --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/TestFileCleanupVerifier.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class TestFileCleanupVerifier + { + const string k_Indent = " "; + + [SerializeField] + List m_ExistingFiles; + + [SerializeField] + bool m_ExistingFilesScanned; + + public Action logAction = Debug.LogWarning; + + private Func getAllAssetPathsAction; + public Func GetAllAssetPathsAction + { + get + { + if (getAllAssetPathsAction != null) + { + return getAllAssetPathsAction; + } + return AssetDatabase.GetAllAssetPaths; + } + set + { + getAllAssetPathsAction = value; + } + } + + public void RegisterExistingFiles() + { + if (m_ExistingFilesScanned) + { + return; + } + + m_ExistingFiles = GetAllFilesInAssetsDirectory().ToList(); + m_ExistingFilesScanned = true; + } + + public void VerifyNoNewFilesAdded() + { + var currentFiles = GetAllFilesInAssetsDirectory().ToList(); + + //Expect that if its the same amount of files, there havent been any changes + //This is to optimize if there are many files + if (currentFiles.Count != m_ExistingFiles.Count) + { + LogWarningForFilesIfAny(currentFiles.Except(m_ExistingFiles)); + } + } + + void LogWarningForFilesIfAny(IEnumerable filePaths) + { + if (!filePaths.Any()) + { + return; + } + + var stringWriter = new StringWriter(); + stringWriter.WriteLine("Files generated by test without cleanup."); + stringWriter.WriteLine(k_Indent + "Found {0} new files.", filePaths.Count()); + + foreach (var filePath in filePaths) + { + stringWriter.WriteLine(k_Indent + filePath); + } + + LogAction(stringWriter.ToString()); + } + + private void LogAction(object obj) + { + if (this.logAction != null) + { + this.logAction(obj); + } + else + { + Debug.LogWarning(obj); + } + } + + private IEnumerable GetAllFilesInAssetsDirectory() + { + return GetAllAssetPathsAction(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/TestFileCleanupVerifier.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/TestFileCleanupVerifier.cs.meta new file mode 100644 index 0000000..6a4fc47 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/TestFileCleanupVerifier.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d6e23541e3b2fea489be46f704b64707 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils.meta new file mode 100644 index 0000000..78ceec0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1f5bbb88ca730434483440cbc0278ef6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs new file mode 100644 index 0000000..ff540e6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class CachingTestListProvider + { + private readonly ITestListProvider m_InnerTestListProvider; + private readonly ITestListCache m_TestListCache; + private readonly ITestAdaptorFactory m_TestAdaptorFactory; + public CachingTestListProvider(ITestListProvider innerTestListProvider, ITestListCache testListCache, ITestAdaptorFactory testAdaptorFactory) + { + m_InnerTestListProvider = innerTestListProvider; + m_TestListCache = testListCache; + m_TestAdaptorFactory = testAdaptorFactory; + } + + public IEnumerator GetTestListAsync(TestPlatform platform) + { + var testFromCache = m_TestListCache.GetTestFromCacheAsync(platform); + while (testFromCache.MoveNext()) + { + yield return null; + } + + + if (testFromCache.Current != null) + { + yield return testFromCache.Current; + } + else + { + var test = m_InnerTestListProvider.GetTestListAsync(platform); + while (test.MoveNext()) + { + yield return null; + } + + test.Current.ParseForNameDuplicates(); + m_TestListCache.CacheTest(platform, test.Current); + yield return m_TestAdaptorFactory.Create(test.Current); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs.meta new file mode 100644 index 0000000..5756623 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 26f3e7301af463c4ca72fa98d59b429e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs new file mode 100644 index 0000000..bc0fe19 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs @@ -0,0 +1,13 @@ +using System.Linq; +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditorAssembliesProxy : IEditorAssembliesProxy + { + public IAssemblyWrapper[] loadedAssemblies + { + get { return EditorAssemblies.loadedAssemblies.OrderBy(a => a.FullName).Select(x => new EditorAssemblyWrapper(x)).ToArray(); } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs.meta new file mode 100644 index 0000000..fdb1b6c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f96d0ea807c081145a1170ed1b6d71e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs new file mode 100644 index 0000000..804eb4b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs @@ -0,0 +1,18 @@ +using System.Reflection; +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditorAssemblyWrapper : AssemblyWrapper + { + public EditorAssemblyWrapper(Assembly assembly) + : base(assembly) {} + + public override AssemblyName[] GetReferencedAssemblies() + { + return Assembly.GetReferencedAssemblies(); + } + + public override string Location { get { return Assembly.Location; } } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs.meta new file mode 100644 index 0000000..70bd58b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 20cdb37e6fea6d946bbb84d2c923db85 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs new file mode 100644 index 0000000..ad0b5ad --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs @@ -0,0 +1,17 @@ +using UnityEditor.Scripting.ScriptCompilation; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditorCompilationInterfaceProxy : IEditorCompilationInterfaceProxy + { + public ScriptAssembly[] GetAllEditorScriptAssemblies() + { + return EditorCompilationInterface.Instance.GetAllEditorScriptAssemblies(EditorCompilationInterface.GetAdditionalEditorScriptCompilationOptions()); + } + + public PrecompiledAssembly[] GetAllPrecompiledAssemblies() + { + return EditorCompilationInterface.Instance.GetAllPrecompiledAssemblies(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs.meta new file mode 100644 index 0000000..ef5ade0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9b23632c77de204abfe8bf7168d48c0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs new file mode 100644 index 0000000..6fd1319 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs @@ -0,0 +1,69 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor.Scripting.ScriptCompilation; +using UnityEngine.TestTools; +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditorLoadedTestAssemblyProvider + { + private const string k_NunitAssemblyName = "nunit.framework"; + private const string k_TestRunnerAssemblyName = "UnityEngine.TestRunner"; + internal const string k_PerformanceTestingAssemblyName = "Unity.PerformanceTesting"; + + private readonly IEditorAssembliesProxy m_EditorAssembliesProxy; + private readonly ScriptAssembly[] m_AllEditorScriptAssemblies; + private readonly PrecompiledAssembly[] m_AllPrecompiledAssemblies; + + public EditorLoadedTestAssemblyProvider(IEditorCompilationInterfaceProxy compilationInterfaceProxy, IEditorAssembliesProxy editorAssembliesProxy) + { + m_EditorAssembliesProxy = editorAssembliesProxy; + m_AllEditorScriptAssemblies = compilationInterfaceProxy.GetAllEditorScriptAssemblies(); + m_AllPrecompiledAssemblies = compilationInterfaceProxy.GetAllPrecompiledAssemblies(); + } + + public List GetAssembliesGroupedByType(TestPlatform mode) + { + var assemblies = GetAssembliesGroupedByTypeAsync(mode); + while (assemblies.MoveNext()) + { + } + + return assemblies.Current.Where(pair => mode.IsFlagIncluded(pair.Key)).SelectMany(pair => pair.Value).ToList(); + } + + public IEnumerator>> GetAssembliesGroupedByTypeAsync(TestPlatform mode) + { + IAssemblyWrapper[] loadedAssemblies = m_EditorAssembliesProxy.loadedAssemblies; + + IDictionary> result = new Dictionary>() + { + {TestPlatform.EditMode, new List() }, + {TestPlatform.PlayMode, new List() } + }; + + foreach (var loadedAssembly in loadedAssemblies) + { + if (loadedAssembly.GetReferencedAssemblies().Any(x => x.Name == k_NunitAssemblyName || x.Name == k_TestRunnerAssemblyName || x.Name == k_PerformanceTestingAssemblyName)) + { + var assemblyName = new FileInfo(loadedAssembly.Location).Name; + var scriptAssemblies = m_AllEditorScriptAssemblies.Where(x => x.Filename == assemblyName).ToList(); + var precompiledAssemblies = m_AllPrecompiledAssemblies.Where(x => new FileInfo(x.Path).Name == assemblyName).ToList(); + if (scriptAssemblies.Count < 1 && precompiledAssemblies.Count < 1) + { + continue; + } + + var assemblyFlags = scriptAssemblies.Any() ? scriptAssemblies.Single().Flags : precompiledAssemblies.Single().Flags; + var assemblyType = (assemblyFlags & AssemblyFlags.EditorOnly) == AssemblyFlags.EditorOnly ? TestPlatform.EditMode : TestPlatform.PlayMode; + result[assemblyType].Add(loadedAssembly); + yield return null; + } + } + + yield return result; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs.meta new file mode 100644 index 0000000..efba6a7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 033c884ba52437d49bc55935939ef1c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs new file mode 100644 index 0000000..35ec87d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs @@ -0,0 +1,9 @@ +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner +{ + internal interface IEditorAssembliesProxy + { + IAssemblyWrapper[] loadedAssemblies { get; } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs.meta new file mode 100644 index 0000000..ad00f55 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 98808b11e78f6c84a841a6b4bc5a29d2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs new file mode 100644 index 0000000..25defb7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs @@ -0,0 +1,10 @@ +using UnityEditor.Scripting.ScriptCompilation; + +namespace UnityEditor.TestTools.TestRunner +{ + internal interface IEditorCompilationInterfaceProxy + { + ScriptAssembly[] GetAllEditorScriptAssemblies(); + PrecompiledAssembly[] GetAllPrecompiledAssemblies(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs.meta new file mode 100644 index 0000000..2bc608b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 28c8fcb831e6e734a9f564bc4f495eba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs new file mode 100644 index 0000000..5df7a78 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + interface ITestListCache + { + void CacheTest(TestPlatform platform, ITest test); + IEnumerator GetTestFromCacheAsync(TestPlatform platform); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs.meta new file mode 100644 index 0000000..41943d4 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a704c010bcdb1ec4a9f3417b3c393164 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs new file mode 100644 index 0000000..d11fe47 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.TestLaunchers; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + interface ITestListCacheData + { + List platforms { get; } + List cachedData { get; } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs.meta new file mode 100644 index 0000000..b229c0c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7043e9a330ac2d84a80a965ada4589ad +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs new file mode 100644 index 0000000..b734f53 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + interface ITestListProvider + { + IEnumerator GetTestListAsync(TestPlatform platform); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs.meta new file mode 100644 index 0000000..b62929b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 64689f8b25eadac4da519e96f514b653 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs new file mode 100644 index 0000000..e69bfcb --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestRunner.TestLaunchers; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestListCache : ITestListCache + { + private readonly ITestAdaptorFactory m_TestAdaptorFactory; + private readonly IRemoteTestResultDataFactory m_TestResultDataFactory; + private readonly ITestListCacheData m_TestListCacheData; + + public TestListCache(ITestAdaptorFactory testAdaptorFactory, IRemoteTestResultDataFactory testResultDataFactory, ITestListCacheData testListCacheData) + { + m_TestAdaptorFactory = testAdaptorFactory; + m_TestResultDataFactory = testResultDataFactory; + m_TestListCacheData = testListCacheData; + } + + public void CacheTest(TestPlatform platform, ITest test) + { + var index = m_TestListCacheData.platforms.IndexOf(platform); + if (index < 0) + { + m_TestListCacheData.cachedData.Add(test); + m_TestListCacheData.platforms.Add(platform); + } + else + { + m_TestListCacheData.cachedData[index] = test; + } + } + + public IEnumerator GetTestFromCacheAsync(TestPlatform platform) + { + var index = m_TestListCacheData.platforms.IndexOf(platform); + if (index < 0) + { + yield return null; + yield break; + } + + var testData = m_TestListCacheData.cachedData[index]; + yield return m_TestAdaptorFactory.Create(testData); + } + + [Callbacks.DidReloadScripts] + private static void ScriptReloaded() + { + TestListCacheData.instance.cachedData.Clear(); + TestListCacheData.instance.platforms.Clear(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs.meta new file mode 100644 index 0000000..ea8d096 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d685d97a1eb004f49afea0cc982ff728 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs new file mode 100644 index 0000000..175082f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestRunner.TestLaunchers; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestListCacheData : ScriptableSingleton, ITestListCacheData + { + [SerializeField] + private List m_Platforms = new List(); + + [SerializeField] + private List m_CachedData = new List(); + + public List platforms + { + get { return m_Platforms; } + } + + public List cachedData + { + get { return m_CachedData; } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs.meta new file mode 100644 index 0000000..2ad79ac --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f1b6399349763114d9361bc6dfcd025b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs new file mode 100644 index 0000000..0df60c3 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestListJob + { + private CachingTestListProvider m_TestListProvider; + private TestPlatform m_Platform; + private Action m_Callback; + private IEnumerator m_ResultEnumerator; + public TestListJob(CachingTestListProvider testListProvider, TestPlatform platform, Action callback) + { + m_TestListProvider = testListProvider; + m_Platform = platform; + m_Callback = callback; + } + + public void Start() + { + m_ResultEnumerator = m_TestListProvider.GetTestListAsync(m_Platform); + EditorApplication.update += EditorUpdate; + } + + private void EditorUpdate() + { + if (!m_ResultEnumerator.MoveNext()) + { + m_Callback(m_ResultEnumerator.Current); + EditorApplication.update -= EditorUpdate; + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs.meta new file mode 100644 index 0000000..a17c091 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dec9066d4afefe444be0dad3f137730d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs new file mode 100644 index 0000000..1da846e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestTools; +using UnityEngine.TestTools.NUnitExtensions; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestListProvider : ITestListProvider + { + private readonly EditorLoadedTestAssemblyProvider m_AssemblyProvider; + private readonly UnityTestAssemblyBuilder m_AssemblyBuilder; + + public TestListProvider(EditorLoadedTestAssemblyProvider assemblyProvider, UnityTestAssemblyBuilder assemblyBuilder) + { + m_AssemblyProvider = assemblyProvider; + m_AssemblyBuilder = assemblyBuilder; + } + + public IEnumerator GetTestListAsync(TestPlatform platform) + { + var assembliesTask = m_AssemblyProvider.GetAssembliesGroupedByTypeAsync(platform); + while (assembliesTask.MoveNext()) + { + yield return null; + } + + var assemblies = assembliesTask.Current.Where(pair => platform.IsFlagIncluded(pair.Key)) + .SelectMany(pair => pair.Value.Select(assemblyInfo => Tuple.Create(assemblyInfo.Assembly, pair.Key))).ToArray(); + + var settings = UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(platform); + var test = m_AssemblyBuilder.BuildAsync(assemblies.Select(a => a.Item1).ToArray(), assemblies.Select(a => a.Item2).ToArray(), settings); + while (test.MoveNext()) + { + yield return null; + } + + yield return test.Current; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs.meta new file mode 100644 index 0000000..c0e66d5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f15cbb987069826429540d0ea0937442 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindow.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindow.cs new file mode 100644 index 0000000..8db3398 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindow.cs @@ -0,0 +1,262 @@ +using System; +using UnityEditor.Callbacks; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.TestTools.TestRunner.GUI; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class TestRunnerWindow : EditorWindow, IHasCustomMenu + { + internal static class Styles + { + public static GUIStyle info; + public static GUIStyle testList; + + static Styles() + { + info = new GUIStyle(EditorStyles.wordWrappedLabel); + info.wordWrap = false; + info.stretchHeight = true; + info.margin.right = 15; + + testList = new GUIStyle("CN Box"); + testList.margin.top = 0; + testList.padding.left = 3; + } + } + + private readonly GUIContent m_GUIHorizontalSplit = EditorGUIUtility.TrTextContent("Horizontal layout"); + private readonly GUIContent m_GUIVerticalSplit = EditorGUIUtility.TrTextContent("Vertical layout"); + private readonly GUIContent m_GUIEnableaPlaymodeTestsRunner = EditorGUIUtility.TrTextContent("Enable playmode tests for all assemblies"); + private readonly GUIContent m_GUIDisablePlaymodeTestsRunner = EditorGUIUtility.TrTextContent("Disable playmode tests for all assemblies"); + private readonly GUIContent m_GUIRunPlayModeTestAsEditModeTests = EditorGUIUtility.TrTextContent("Run playmode tests as editmode tests"); + + internal static TestRunnerWindow s_Instance; + private bool m_IsBuilding; + [NonSerialized] + private bool m_Enabled; + public TestFilterSettings filterSettings; + + private readonly SplitterState m_Spl = new SplitterState(new float[] { 75, 25 }, new[] { 32, 32 }, null); + + private TestRunnerWindowSettings m_Settings; + + private enum TestRunnerMenuLabels + { + PlayMode = 0, + EditMode = 1 + } + [SerializeField] + private int m_TestTypeToolbarIndex = (int)TestRunnerMenuLabels.EditMode; + [SerializeField] + private PlayModeTestListGUI m_PlayModeTestListGUI; + [SerializeField] + private EditModeTestListGUI m_EditModeTestListGUI; + + internal TestListGUI m_SelectedTestTypes; + + private ITestRunnerApi m_testRunnerApi; + + private WindowResultUpdater m_WindowResultUpdater; + + [MenuItem("Window/General/Test Runner", false, 201, false)] + public static void ShowPlaymodeTestsRunnerWindowCodeBased() + { + s_Instance = GetWindow("Test Runner"); + s_Instance.Show(); + } + + static TestRunnerWindow() + { + InitBackgroundRunners(); + } + + private static void InitBackgroundRunners() + { + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + } + + [DidReloadScripts] + private static void CompilationCallback() + { + UpdateWindow(); + } + + private static void OnPlayModeStateChanged(PlayModeStateChange state) + { + if (s_Instance && state == PlayModeStateChange.EnteredEditMode && s_Instance.m_SelectedTestTypes.HasTreeData()) + { + //repaint message details after exit playmode + s_Instance.m_SelectedTestTypes.TestSelectionCallback(s_Instance.m_SelectedTestTypes.m_TestListState.selectedIDs.ToArray()); + s_Instance.Repaint(); + } + } + + public void OnDestroy() + { + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + if (m_testRunnerApi != null) + { + m_testRunnerApi.UnregisterCallbacks(m_WindowResultUpdater); + } + } + + private void OnEnable() + { + s_Instance = this; + SelectTestListGUI(m_TestTypeToolbarIndex); + + m_testRunnerApi = ScriptableObject.CreateInstance(); + m_WindowResultUpdater = new WindowResultUpdater(); + m_testRunnerApi.RegisterCallbacks(m_WindowResultUpdater); + } + + private void Enable() + { + m_Settings = new TestRunnerWindowSettings("UnityEditor.PlaymodeTestsRunnerWindow"); + filterSettings = new TestFilterSettings("UnityTest.IntegrationTestsRunnerWindow"); + + if (m_SelectedTestTypes == null) + { + SelectTestListGUI(m_TestTypeToolbarIndex); + } + + StartRetrieveTestList(); + m_SelectedTestTypes.Reload(); + m_Enabled = true; + } + + private void SelectTestListGUI(int testTypeToolbarIndex) + { + if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.PlayMode) + { + if (m_PlayModeTestListGUI == null) + { + m_PlayModeTestListGUI = new PlayModeTestListGUI(); + } + m_SelectedTestTypes = m_PlayModeTestListGUI; + } + else if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.EditMode) + { + if (m_EditModeTestListGUI == null) + { + m_EditModeTestListGUI = new EditModeTestListGUI(); + } + m_SelectedTestTypes = m_EditModeTestListGUI; + } + } + + private void StartRetrieveTestList() + { + if (!m_SelectedTestTypes.HasTreeData()) + { + m_testRunnerApi.RetrieveTestList(m_SelectedTestTypes.TestMode, (rootTest) => + { + m_SelectedTestTypes.Init(this, rootTest); + m_SelectedTestTypes.Reload(); + }); + } + } + + public void OnGUI() + { + if (!m_Enabled) + { + Enable(); + } + + if (BuildPipeline.isBuildingPlayer) + { + m_IsBuilding = true; + } + else if (m_IsBuilding) + { + m_IsBuilding = false; + Repaint(); + } + + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + var selectedIndex = m_TestTypeToolbarIndex; + m_TestTypeToolbarIndex = GUILayout.Toolbar(m_TestTypeToolbarIndex, Enum.GetNames(typeof(TestRunnerMenuLabels)), "LargeButton", UnityEngine.GUI.ToolbarButtonSize.FitToContents); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + + if (selectedIndex != m_TestTypeToolbarIndex) + { + SelectTestListGUI(m_TestTypeToolbarIndex); + StartRetrieveTestList(); + } + + EditorGUILayout.BeginVertical(); + using (new EditorGUI.DisabledScope(EditorApplication.isPlayingOrWillChangePlaymode)) + { + m_SelectedTestTypes.PrintHeadPanel(); + } + EditorGUILayout.EndVertical(); + + if (m_Settings.verticalSplit) + SplitterGUILayout.BeginVerticalSplit(m_Spl); + else + SplitterGUILayout.BeginHorizontalSplit(m_Spl); + + EditorGUILayout.BeginVertical(); + EditorGUILayout.BeginVertical(Styles.testList); + m_SelectedTestTypes.RenderTestList(); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndVertical(); + + m_SelectedTestTypes.RenderDetails(); + + if (m_Settings.verticalSplit) + SplitterGUILayout.EndVerticalSplit(); + else + SplitterGUILayout.EndHorizontalSplit(); + } + + public void AddItemsToMenu(GenericMenu menu) + { + menu.AddItem(m_GUIVerticalSplit, m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit); + menu.AddItem(m_GUIHorizontalSplit, !m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit); + + menu.AddSeparator(null); + + var playModeTestRunnerEnabled = PlayerSettings.playModeTestRunnerEnabled; + var currentActive = playModeTestRunnerEnabled ? m_GUIDisablePlaymodeTestsRunner : m_GUIEnableaPlaymodeTestsRunner; + + if (EditorPrefs.GetBool("InternalMode", false)) + { + menu.AddItem(m_GUIRunPlayModeTestAsEditModeTests, PlayerSettings.runPlayModeTestAsEditModeTest, () => + { + PlayerSettings.runPlayModeTestAsEditModeTest = !PlayerSettings.runPlayModeTestAsEditModeTest; + }); + } + + menu.AddItem(currentActive, false, () => + { + PlayerSettings.playModeTestRunnerEnabled = !playModeTestRunnerEnabled; + EditorUtility.DisplayDialog(currentActive.text, "You need to restart the editor now", "Ok"); + }); + } + + public void RebuildUIFilter() + { + if (m_SelectedTestTypes != null && m_SelectedTestTypes.HasTreeData()) + { + m_SelectedTestTypes.RebuildUIFilter(); + } + } + + public static void UpdateWindow() + { + if (s_Instance != null && s_Instance.m_SelectedTestTypes != null) + { + s_Instance.m_SelectedTestTypes.Repaint(); + s_Instance.Repaint(); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindow.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindow.cs.meta new file mode 100644 index 0000000..5cb0e86 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4dfcd3a631f61d248b7cc0b845d40345 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindowSettings.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindowSettings.cs new file mode 100644 index 0000000..366df26 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindowSettings.cs @@ -0,0 +1,26 @@ +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestRunnerWindowSettings + { + public bool verticalSplit; + + private readonly string m_PrefsKey; + + public TestRunnerWindowSettings(string prefsKey) + { + m_PrefsKey = prefsKey; + verticalSplit = EditorPrefs.GetBool(m_PrefsKey + ".verticalSplit", true); + } + + public void ToggleVerticalSplit() + { + verticalSplit = !verticalSplit; + Save(); + } + + private void Save() + { + EditorPrefs.SetBool(m_PrefsKey + ".verticalSplit", verticalSplit); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindowSettings.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindowSettings.cs.meta new file mode 100644 index 0000000..44bcc5a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestRunnerWindowSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2b301b727225f1941974d69e61a55620 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings.meta new file mode 100644 index 0000000..4127631 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95b719082a664ea45bb56759eed1f271 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettings.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettings.cs new file mode 100644 index 0000000..d272037 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettings.cs @@ -0,0 +1,22 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner +{ + internal interface ITestSettings : IDisposable + { + ScriptingImplementation? scriptingBackend { get; set; } + + string Architecture { get; set; } + + ApiCompatibilityLevel? apiProfile { get; set; } + + bool? appleEnableAutomaticSigning { get; set; } + string appleDeveloperTeamID { get; set; } + ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; } + string iOSManualProvisioningProfileID { get; set; } + ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; } + string tvOSManualProvisioningProfileID { get; set; } + + void SetupProjectParameters(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettings.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettings.cs.meta new file mode 100644 index 0000000..9a8563c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 83eda34b7da01e04aa894f268158b0c0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs new file mode 100644 index 0000000..701c91d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner +{ + interface ITestSettingsDeserializer + { + ITestSettings GetSettingsFromJsonFile(string jsonFilePath); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs.meta new file mode 100644 index 0000000..72c587e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d208a1684f8aa6a40ad91d6aa9600c14 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettings.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettings.cs new file mode 100644 index 0000000..a5bdf7a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettings.cs @@ -0,0 +1,160 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestSettings : ITestSettings + { + private readonly TestSetting[] m_Settings = + { + new TestSetting( + settings => settings.scriptingBackend, + () => PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup), + implementation => PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup, implementation.Value)), + new TestSetting( + settings => settings.Architecture, + () => EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android ? PlayerSettings.Android.targetArchitectures.ToString() : null, + architecture => + { + if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) + { + if (!string.IsNullOrEmpty(architecture)) + { + var targetArchitectures = (AndroidArchitecture)Enum.Parse(typeof(AndroidArchitecture), architecture, true); + PlayerSettings.Android.targetArchitectures = targetArchitectures; + } + } + }), + new TestSetting( + settings => settings.apiProfile, + () => PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup), + implementation => + { + if (Enum.IsDefined(typeof(ApiCompatibilityLevel), implementation.Value)) + { + PlayerSettings.SetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup, + implementation.Value); + } + }), + new TestSetting( + settings => settings.appleEnableAutomaticSigning, + () => PlayerSettings.iOS.appleEnableAutomaticSigning, + enableAutomaticSigning => + { + if (enableAutomaticSigning != null) + PlayerSettings.iOS.appleEnableAutomaticSigning = enableAutomaticSigning.Value; + }), + new TestSetting( + settings => settings.appleDeveloperTeamID, + () => PlayerSettings.iOS.appleDeveloperTeamID, + developerTeam => + { + if (developerTeam != null) + PlayerSettings.iOS.appleDeveloperTeamID = developerTeam; + }), + new TestSetting( + settings => settings.iOSManualProvisioningProfileType, + () => PlayerSettings.iOS.iOSManualProvisioningProfileType, + profileType => + { + if (profileType != null) + PlayerSettings.iOS.iOSManualProvisioningProfileType = profileType.Value; + }), + new TestSetting( + settings => settings.iOSManualProvisioningProfileID, + () => PlayerSettings.iOS.iOSManualProvisioningProfileID, + provisioningUUID => + { + if (provisioningUUID != null) + PlayerSettings.iOS.iOSManualProvisioningProfileID = provisioningUUID; + }), + new TestSetting( + settings => settings.tvOSManualProvisioningProfileType, + () => PlayerSettings.iOS.tvOSManualProvisioningProfileType, + profileType => + { + if (profileType != null) + PlayerSettings.iOS.tvOSManualProvisioningProfileType = profileType.Value; + }), + new TestSetting( + settings => settings.tvOSManualProvisioningProfileID, + () => PlayerSettings.iOS.tvOSManualProvisioningProfileID, + provisioningUUID => + { + if (provisioningUUID != null) + PlayerSettings.iOS.tvOSManualProvisioningProfileID = provisioningUUID; + }), + }; + + private bool m_Disposed; + + public ScriptingImplementation? scriptingBackend { get; set; } + + public string Architecture { get; set; } + + public ApiCompatibilityLevel? apiProfile { get; set; } + + public bool? appleEnableAutomaticSigning { get; set; } + public string appleDeveloperTeamID { get; set; } + public ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; } + public string iOSManualProvisioningProfileID { get; set; } + public ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; } + public string tvOSManualProvisioningProfileID { get; set; } + + public void Dispose() + { + if (!m_Disposed) + { + foreach (var testSetting in m_Settings) + { + testSetting.Cleanup(); + } + + m_Disposed = true; + } + } + + public void SetupProjectParameters() + { + foreach (var testSetting in m_Settings) + { + testSetting.Setup(this); + } + } + + private abstract class TestSetting + { + public abstract void Setup(TestSettings settings); + public abstract void Cleanup(); + } + + private class TestSetting : TestSetting + { + private T m_ValueBeforeSetup; + private Func m_GetFromSettings; + private Func m_GetCurrentValue; + private Action m_SetValue; + + public TestSetting(Func getFromSettings, Func getCurrentValue, Action setValue) + { + m_GetFromSettings = getFromSettings; + m_GetCurrentValue = getCurrentValue; + m_SetValue = setValue; + } + + public override void Setup(TestSettings settings) + { + m_ValueBeforeSetup = m_GetCurrentValue(); + var newValue = m_GetFromSettings(settings); + if (newValue != null) + { + m_SetValue(newValue); + } + } + + public override void Cleanup() + { + m_SetValue(m_ValueBeforeSetup); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettings.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettings.cs.meta new file mode 100644 index 0000000..23e6f5e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b32b6725087a0d4bb1670818d26996e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs new file mode 100644 index 0000000..cdba06e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + /// + /// Handles deserialization of TestSettings from a provided json file path. + /// + internal class TestSettingsDeserializer : ITestSettingsDeserializer + { + private static readonly SettingsMap[] s_SettingsMapping = + { + new SettingsMap("scriptingBackend", (settings, value) => settings.scriptingBackend = value), + new SettingsMap("architecture", (settings, value) => settings.Architecture = value), + new SettingsMap("apiProfile", (settings, value) => settings.apiProfile = value), + new SettingsMap("appleEnableAutomaticSigning", (settings, value) => settings.appleEnableAutomaticSigning = value), + new SettingsMap("appleDeveloperTeamID", (settings, value) => settings.appleDeveloperTeamID = value), + new SettingsMap("iOSManualProvisioningProfileType", (settings, value) => settings.iOSManualProvisioningProfileType = value), + new SettingsMap("iOSManualProvisioningProfileID", (settings, value) => settings.iOSManualProvisioningProfileID = value), + new SettingsMap("tvOSManualProvisioningProfileType", (settings, value) => settings.tvOSManualProvisioningProfileType = value), + new SettingsMap("tvOSManualProvisioningProfileID", (settings, value) => settings.tvOSManualProvisioningProfileID = value), + }; + + private readonly Func m_TestSettingsFactory; + public TestSettingsDeserializer(Func testSettingsFactory) + { + m_TestSettingsFactory = testSettingsFactory; + } + + public ITestSettings GetSettingsFromJsonFile(string jsonFilePath) + { + var text = File.ReadAllText(jsonFilePath); + var settingsDictionary = Json.Deserialize(text) as Dictionary; + + var testSettings = m_TestSettingsFactory(); + if (settingsDictionary == null) + { + return testSettings; + } + + foreach (var settingsMap in s_SettingsMapping) + { + if (!settingsDictionary.ContainsKey(settingsMap.Key)) + { + continue; + } + + if (settingsMap.Type.IsEnum) + { + SetEnumValue(settingsMap.Key, settingsDictionary[settingsMap.Key], settingsMap.Type, value => settingsMap.ApplyToSettings(testSettings, value)); + } + else + { + SetValue(settingsMap.Key, settingsDictionary[settingsMap.Key], settingsMap.Type, value => settingsMap.ApplyToSettings(testSettings, value)); + } + } + + return testSettings; + } + + private abstract class SettingsMap + { + public string Key { get; } + public Type Type { get; } + protected SettingsMap(string key, Type type) + { + Key = key; + Type = type; + } + + public abstract void ApplyToSettings(ITestSettings settings, object value); + } + + private class SettingsMap : SettingsMap + { + private Action m_Setter; + public SettingsMap(string key, Action setter) : base(key, typeof(T)) + { + m_Setter = setter; + } + + public override void ApplyToSettings(ITestSettings settings, object value) + { + m_Setter(settings, (T)value); + } + } + + private static void SetEnumValue(string key, object value, Type type, Action setter) + { + object enumValue; + if (TryGetEnum(value as string, type, out enumValue)) + { + setter(enumValue); + return; + } + + var acceptedValues = string.Join(", ", Enum.GetValues(type).OfType().Select(val => val.ToString()).ToArray()); + + Debug.LogFormat("Could not convert '{0}' argument '{1}' to a valid {2}. Accepted values: {3}.", key, value, type.Name, acceptedValues); + } + + private static bool TryGetEnum(string value, Type type, out object enumValue) + { + try + { + enumValue = Enum.Parse(type, value, true); + return true; + } + catch (Exception) + { + enumValue = null; + return false; + } + } + + private static void SetValue(string key, object value, Type type, Action setter) + { + if (type.IsInstanceOfType(value)) + { + setter(value); + return; + } + + Debug.LogFormat("Could not convert '{0}' argument '{1}' to a valid {2}.", key, value, type.Name); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs.meta new file mode 100644 index 0000000..4d50295 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 75e7d7a9a57458841a85fe42d9c9141f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef new file mode 100644 index 0000000..efdc7cf --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef @@ -0,0 +1,21 @@ +{ + "name": "UnityEditor.TestRunner", + "references": [ + "UnityEngine.TestRunner" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll", + "Mono.Cecil.dll", + "Mono.Cecil.Pdb.dll", + "Mono.Cecil.Mdb.dll", + "Mono.Cecil.Rocks.dll" + ], + "autoReferenced": false, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef.meta new file mode 100644 index 0000000..63c0290 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0acc523941302664db1f4e527237feb3 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol.meta new file mode 100644 index 0000000..8499c83 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 936c6340f3468444ebb1785b4c311126 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs new file mode 100644 index 0000000..7f00c5b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs @@ -0,0 +1,13 @@ +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class AssemblyCompilationErrorsMessage : Message + { + public string assembly; + public string[] errors; + + public AssemblyCompilationErrorsMessage() + { + type = "AssemblyCompilationErrors"; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs.meta new file mode 100644 index 0000000..67d5b2a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c346a7445959bba46a96de0747e77c2a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs new file mode 100644 index 0000000..f7dcacf --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + interface ITestRunnerApiMapper + { + string GetRunStateFromResultNunitXml(ITestResultAdaptor result); + TestState GetTestStateFromResult(ITestResultAdaptor result); + List FlattenTestNames(ITestAdaptor testsToRun); + TestPlanMessage MapTestToTestPlanMessage(ITestAdaptor testsToRun); + TestStartedMessage MapTestToTestStartedMessage(ITestAdaptor test); + TestFinishedMessage TestResultToTestFinishedMessage(ITestResultAdaptor result); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs.meta new file mode 100644 index 0000000..75e0ba2 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6de79ae237e51554da96fd28f68b66a6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs new file mode 100644 index 0000000..bdb96c1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + interface IUtpLogger + { + void Log(Message msg); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs.meta new file mode 100644 index 0000000..dbd33aa --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9014630255533ed42915965b4065cde8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs new file mode 100644 index 0000000..3a9895e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using UnityEditor.Compilation; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal interface IUtpMessageReporter + { + void ReportAssemblyCompilationErrors(string assembly, IEnumerable errorCompilerMessages); + void ReportTestFinished(ITestResultAdaptor result); + void ReportTestRunStarted(ITestAdaptor testsToRun); + void ReportTestStarted(ITestAdaptor test); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs.meta new file mode 100644 index 0000000..4c96a90 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 952b3dc7b47846947b37c8d3ae46579a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/Message.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/Message.cs new file mode 100644 index 0000000..d10a5e4 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/Message.cs @@ -0,0 +1,29 @@ +using System; +using System.Diagnostics; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + [Serializable] + internal abstract class Message + { + public string type; + // Milliseconds since unix epoch + public ulong time; + public int version; + public string phase; + public int processId; + + protected Message() + { + version = 2; + phase = "Immediate"; + processId = Process.GetCurrentProcess().Id; + AddTimeStamp(); + } + + public void AddTimeStamp() + { + time = Convert.ToUInt64((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/Message.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/Message.cs.meta new file mode 100644 index 0000000..bfc702b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/Message.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 321dc2c0720f8dd4f9396ecdc12b8746 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs new file mode 100644 index 0000000..6280fd0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs @@ -0,0 +1,17 @@ +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class TestFinishedMessage : Message + { + public string name; + public TestState state; + public string message; + public ulong duration; // milliseconds + public ulong durationMicroseconds; + + public TestFinishedMessage() + { + type = "TestStatus"; + phase = "End"; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs.meta new file mode 100644 index 0000000..15b951b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 423fe2ef878fa1140a7e1f7f9e365815 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs new file mode 100644 index 0000000..c0a76da --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class TestPlanMessage : Message + { + public List tests; + + public TestPlanMessage() + { + type = "TestPlan"; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs.meta new file mode 100644 index 0000000..c057f60 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 28f79a0d7e64c2345bc46f8c4cf788f8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs new file mode 100644 index 0000000..d231b74 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class TestRunnerApiMapper : ITestRunnerApiMapper + { + public TestPlanMessage MapTestToTestPlanMessage(ITestAdaptor testsToRun) + { + var testsNames = testsToRun != null ? FlattenTestNames(testsToRun) : new List(); + + var msg = new TestPlanMessage + { + tests = testsNames + }; + + return msg; + } + + public TestStartedMessage MapTestToTestStartedMessage(ITestAdaptor test) + { + return new TestStartedMessage + { + name = test.FullName + }; + } + + public TestFinishedMessage TestResultToTestFinishedMessage(ITestResultAdaptor result) + { + return new TestFinishedMessage + { + name = result.Test.FullName, + duration = Convert.ToUInt64(result.Duration * 1000), + durationMicroseconds = Convert.ToUInt64(result.Duration * 1000000), + message = result.Message, + state = GetTestStateFromResult(result) + }; + } + + public string GetRunStateFromResultNunitXml(ITestResultAdaptor result) + { + var doc = new XmlDocument(); + doc.LoadXml(result.ToXml().OuterXml); + return doc.FirstChild.Attributes["runstate"].Value; + } + + public TestState GetTestStateFromResult(ITestResultAdaptor result) + { + var state = TestState.Failure; + + if (result.TestStatus == TestStatus.Passed) + { + state = TestState.Success; + + var runstate = GetRunStateFromResultNunitXml(result); + runstate = runstate ?? String.Empty; + + if (runstate.ToLowerInvariant().Equals("explicit")) + state = TestState.Skipped; + } + else if (result.TestStatus == TestStatus.Skipped) + { + state = TestState.Skipped; + + if (result.ResultState.ToLowerInvariant().EndsWith("ignored")) + state = TestState.Ignored; + } + else + { + if (result.ResultState.ToLowerInvariant().Equals("inconclusive")) + state = TestState.Inconclusive; + + if (result.ResultState.ToLowerInvariant().EndsWith("cancelled") || + result.ResultState.ToLowerInvariant().EndsWith("error")) + state = TestState.Error; + } + + return state; + } + + public List FlattenTestNames(ITestAdaptor test) + { + var results = new List(); + + if (!test.IsSuite) + results.Add(test.FullName); + + if (test.Children != null && test.Children.Any()) + foreach (var child in test.Children) + results.AddRange(FlattenTestNames(child)); + + return results; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs.meta new file mode 100644 index 0000000..47634b9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2011a59d3f76b3d4a85cb53f945fceee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs new file mode 100644 index 0000000..c21464f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs @@ -0,0 +1,15 @@ +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class TestStartedMessage : Message + { + public string name; + public TestState state; + + public TestStartedMessage() + { + type = "TestStatus"; + phase = "Begin"; + state = TestState.Inconclusive; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs.meta new file mode 100644 index 0000000..18b53d1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bd3e81baa10021f4d877fa36382bab16 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs new file mode 100644 index 0000000..223a73d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs @@ -0,0 +1,13 @@ +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + // This matches the state definitions expected by the Perl code, which in turn matches the NUnit 2 values... + internal enum TestState + { + Inconclusive = 0, + Skipped = 2, + Ignored = 3, + Success = 4, + Failure = 5, + Error = 6 + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs.meta new file mode 100644 index 0000000..ac66641 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 77f432980bb30084299a138e15c6f571 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs new file mode 100644 index 0000000..09daf8d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs @@ -0,0 +1,35 @@ +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class UnityTestProtocolListener : ScriptableObject, ICallbacks + { + private IUtpMessageReporter m_UtpMessageReporter; + + public UnityTestProtocolListener() + { + m_UtpMessageReporter = new UtpMessageReporter(new UtpDebugLogger()); + } + + public void RunStarted(ITestAdaptor testsToRun) + { + m_UtpMessageReporter.ReportTestRunStarted(testsToRun); + } + + public void RunFinished(ITestResultAdaptor testResults) + { + // Apparently does nothing :) + } + + public void TestStarted(ITestAdaptor test) + { + m_UtpMessageReporter.ReportTestStarted(test); + } + + public void TestFinished(ITestResultAdaptor result) + { + m_UtpMessageReporter.ReportTestFinished(result); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs.meta new file mode 100644 index 0000000..8ba29be --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 900aac3710bc14542a8d164e3f0ff820 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs new file mode 100644 index 0000000..cca2fd8 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs @@ -0,0 +1,37 @@ +using System; +using System.Linq; +using UnityEditor.Compilation; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + [InitializeOnLoad] + internal static class UnityTestProtocolStarter + { + static UnityTestProtocolStarter() + { + var commandLineArgs = Environment.GetCommandLineArgs(); + if (commandLineArgs.Contains("-automated") && commandLineArgs.Contains("-runTests")) // wanna have it only for utr run + { + var api = ScriptableObject.CreateInstance(); + var listener = ScriptableObject.CreateInstance(); + api.RegisterCallbacks(listener); + CompilationPipeline.assemblyCompilationFinished += OnAssemblyCompilationFinished; + } + } + + public static void OnAssemblyCompilationFinished(string assembly, CompilerMessage[] messages) + { + bool checkCompileErrors = RecompileScripts.Current == null || RecompileScripts.Current.ExpectScriptCompilationSuccess; + + if (checkCompileErrors && messages.Any(x => x.type == CompilerMessageType.Error)) + { + var compilerErrorMessages = messages.Where(x => x.type == CompilerMessageType.Error); + var utpMessageReporter = new UtpMessageReporter(new UtpDebugLogger()); + utpMessageReporter.ReportAssemblyCompilationErrors(assembly, compilerErrorMessages); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs.meta new file mode 100644 index 0000000..540b31e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ac58cb55fc8daf4abd3945a2bbbb0c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs new file mode 100644 index 0000000..e32f6d2 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs @@ -0,0 +1,13 @@ +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + class UtpDebugLogger : IUtpLogger + { + public void Log(Message msg) + { + var msgJson = JsonUtility.ToJson(msg); + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "\n##utp:{0}", msgJson); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs.meta new file mode 100644 index 0000000..7debc23 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d0abdd8cb6b29a24c8ee19626ef741b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs new file mode 100644 index 0000000..37c4ee7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEditor.Compilation; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class UtpMessageReporter : IUtpMessageReporter + { + public ITestRunnerApiMapper TestRunnerApiMapper; + public IUtpLogger Logger; + + public UtpMessageReporter(IUtpLogger utpLogger) + { + TestRunnerApiMapper = new TestRunnerApiMapper(); + Logger = utpLogger; + } + + public void ReportAssemblyCompilationErrors(string assembly, IEnumerable errorCompilerMessages) + { + var compilationErrorMessage = new AssemblyCompilationErrorsMessage + { + assembly = assembly, + errors = errorCompilerMessages.Select(x => x.message).ToArray() + }; + + Logger.Log(compilationErrorMessage); + } + + public void ReportTestRunStarted(ITestAdaptor testsToRun) + { + var msg = TestRunnerApiMapper.MapTestToTestPlanMessage(testsToRun); + + Logger.Log(msg); + } + + public void ReportTestStarted(ITestAdaptor test) + { + if (test.IsSuite) + return; + + var msg = TestRunnerApiMapper.MapTestToTestStartedMessage(test); + + Logger.Log(msg); + } + + public void ReportTestFinished(ITestResultAdaptor result) + { + if (result.Test.IsSuite) + return; + + var msg = TestRunnerApiMapper.TestResultToTestFinishedMessage(result); + + Logger.Log(msg); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs.meta new file mode 100644 index 0000000..c818d4f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ebcc5f899d9277642868aeda9a17cbaf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner.meta new file mode 100644 index 0000000..9589050 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 950890083f4907541a6ed06d70959e49 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/AssemblyInfo.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/AssemblyInfo.cs new file mode 100644 index 0000000..4149677 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/AssemblyInfo.cs @@ -0,0 +1,16 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyTitle("UnityEngine.TestRunner")] + +[assembly: InternalsVisibleTo("UnityEditor.TestRunner")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] +[assembly: InternalsVisibleTo("Unity.PerformanceTesting")] +[assembly: InternalsVisibleTo("Unity.PerformanceTesting.Editor")] +[assembly: InternalsVisibleTo("Assembly-CSharp-testable")] +[assembly: InternalsVisibleTo("Assembly-CSharp-Editor-testable")] +[assembly: InternalsVisibleTo("UnityEngine.TestRunner.Tests")] +[assembly: InternalsVisibleTo("UnityEditor.TestRunner.Tests")] +[assembly: InternalsVisibleTo("Unity.PackageManagerUI.Editor")] + +[assembly: AssemblyVersion("1.0.0")] diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/AssemblyInfo.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/AssemblyInfo.cs.meta new file mode 100644 index 0000000..b499e31 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc22cc13b69c1094c85e176c008b9ef8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions.meta new file mode 100644 index 0000000..4e7bbdf --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ad55f5ad04d1d045a1f287409c650dd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs new file mode 100644 index 0000000..339a090 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs @@ -0,0 +1,83 @@ +using System; +using NUnit.Framework; +using NUnit.Framework.Constraints; +using UnityEngine.Profiling; + +namespace UnityEngine.TestTools.Constraints +{ + public class AllocatingGCMemoryConstraint : Constraint + { + private class AllocatingGCMemoryResult : ConstraintResult + { + private readonly int diff; + public AllocatingGCMemoryResult(IConstraint constraint, object actualValue, int diff) : base(constraint, actualValue, diff > 0) + { + this.diff = diff; + } + + public override void WriteMessageTo(MessageWriter writer) + { + if (diff == 0) + writer.WriteMessageLine("The provided delegate did not make any GC allocations."); + else + writer.WriteMessageLine("The provided delegate made {0} GC allocation(s).", diff); + } + } + + private ConstraintResult ApplyTo(Action action, object original) + { + var recorder = Recorder.Get("GC.Alloc"); + + // The recorder was created enabled, which means it captured the creation of the Recorder object itself, etc. + // Disabling it flushes its data, so that we can retrieve the sample block count and have it correctly account + // for these initial allocations. + recorder.enabled = false; + +#if !UNITY_WEBGL + recorder.FilterToCurrentThread(); +#endif + + recorder.enabled = true; + + try + { + action(); + } + finally + { + recorder.enabled = false; +#if !UNITY_WEBGL + recorder.CollectFromAllThreads(); +#endif + } + + return new AllocatingGCMemoryResult(this, original, recorder.sampleBlockCount); + } + + public override ConstraintResult ApplyTo(object obj) + { + if (obj == null) + throw new ArgumentNullException(); + + TestDelegate d = obj as TestDelegate; + if (d == null) + throw new ArgumentException(string.Format("The actual value must be a TestDelegate but was {0}", + obj.GetType())); + + return ApplyTo(() => d.Invoke(), obj); + } + + public override ConstraintResult ApplyTo(ActualValueDelegate del) + { + if (del == null) + throw new ArgumentNullException(); + + return ApplyTo(() => del.Invoke(), del); + } + + public override string Description + { + get { return "allocates GC memory"; } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs.meta new file mode 100644 index 0000000..0933c85 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d09858396dd7adb4bbdb22ea0c8c3a37 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs new file mode 100644 index 0000000..812b1f0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs @@ -0,0 +1,14 @@ +using NUnit.Framework.Constraints; + +namespace UnityEngine.TestTools.Constraints +{ + public static class ConstraintExtensions + { + public static AllocatingGCMemoryConstraint AllocatingGCMemory(this ConstraintExpression chain) + { + var constraint = new AllocatingGCMemoryConstraint(); + chain.Append(constraint); + return constraint; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs.meta new file mode 100644 index 0000000..1343496 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68a48d1900320ed458e118415857faf6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs new file mode 100644 index 0000000..ab4ff8e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs @@ -0,0 +1,18 @@ +using NUnit.Framework; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class InvalidSignatureException : ResultStateException + { + public InvalidSignatureException(string message) + : base(message) + { + } + + public override ResultState ResultState + { + get { return ResultState.NotRunnable; } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs.meta new file mode 100644 index 0000000..86aee7f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9650d910fcaefb34cb45f121c1993892 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/Is.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/Is.cs new file mode 100644 index 0000000..c0871ef --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/Is.cs @@ -0,0 +1,10 @@ +namespace UnityEngine.TestTools.Constraints +{ + public class Is : NUnit.Framework.Is + { + public static AllocatingGCMemoryConstraint AllocatingGCMemory() + { + return new AllocatingGCMemoryConstraint(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/Is.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/Is.cs.meta new file mode 100644 index 0000000..23ed44a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/Is.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d5833966abeadb429de247e4316eef4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogAssert.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogAssert.cs new file mode 100644 index 0000000..51b97de --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogAssert.cs @@ -0,0 +1,39 @@ +using System.Text.RegularExpressions; +using UnityEngine.TestTools.Logging; + +namespace UnityEngine.TestTools +{ + public static class LogAssert + { + public static void Expect(LogType type, string message) + { + LogScope.Current.ExpectedLogs.Enqueue(new LogMatch() { LogType = type, Message = message }); + } + + public static void Expect(LogType type, Regex message) + { + LogScope.Current.ExpectedLogs.Enqueue(new LogMatch() { LogType = type, MessageRegex = message }); + } + + public static void NoUnexpectedReceived() + { + LogScope.Current.NoUnexpectedReceived(); + } + + public static bool ignoreFailingMessages + { + get + { + return LogScope.Current.IgnoreFailingMessages; + } + set + { + if (value != LogScope.Current.IgnoreFailingMessages) + { + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "\nIgnoreFailingMessages:" + (value? "true":"false")); + } + LogScope.Current.IgnoreFailingMessages = value; + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogAssert.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogAssert.cs.meta new file mode 100644 index 0000000..7a278a3 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogAssert.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c97b794b51780d349a16826a4c7898d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope.meta new file mode 100644 index 0000000..284dc6a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b1d8465ba1376b148bdab58965101f47 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs new file mode 100644 index 0000000..750d2b5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Logging +{ + internal interface ILogScope : IDisposable + { + List LogEvents { get; } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs.meta new file mode 100644 index 0000000..69e7d55 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3504aa04cda851b44a65973f9aead6f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs new file mode 100644 index 0000000..bbc805e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs @@ -0,0 +1,18 @@ +namespace UnityEngine.TestTools.Logging +{ + internal class LogEvent + { + public string Message { get; set; } + + public string StackTrace { get; set; } + + public LogType LogType { get; set; } + + public bool IsHandled { get; set; } + + public override string ToString() + { + return string.Format("[{0}] {1}", LogType, Message); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs.meta new file mode 100644 index 0000000..66c9130 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0c56471f08a0f6846afc792f0b4205b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs new file mode 100644 index 0000000..9b862d9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs @@ -0,0 +1,103 @@ +using System; +using System.Text.RegularExpressions; + +namespace UnityEngine.TestTools.Logging +{ + [Serializable] + internal class LogMatch + { + [SerializeField] + private bool m_UseRegex; + [SerializeField] + private string m_Message; + [SerializeField] + private string m_MessageRegex; + [SerializeField] + private string m_LogType; + + public string Message + { + get { return m_Message; } + set + { + m_Message = value; + m_UseRegex = false; + } + } + + public Regex MessageRegex + { + get + { + if (!m_UseRegex) + { + return null; + } + + return new Regex(m_MessageRegex); + } + set + { + if (value != null) + { + m_MessageRegex = value.ToString(); + m_UseRegex = true; + } + else + { + m_MessageRegex = null; + m_UseRegex = false; + } + } + } + + public LogType? LogType + { + get + { + if (!string.IsNullOrEmpty(m_LogType)) + { + return Enum.Parse(typeof(LogType), m_LogType) as LogType ? ; + } + + return null; + } + set + { + if (value != null) + { + m_LogType = value.Value.ToString(); + } + else + { + m_LogType = null; + } + } + } + + public bool Matches(LogEvent log) + { + if (LogType != null && LogType != log.LogType) + { + return false; + } + + if (m_UseRegex) + { + return MessageRegex.IsMatch(log.Message); + } + else + { + return Message.Equals(log.Message); + } + } + + public override string ToString() + { + if (m_UseRegex) + return string.Format("[{0}] Regex: {1}", LogType, MessageRegex); + else + return string.Format("[{0}] {1}", LogType, Message); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs.meta new file mode 100644 index 0000000..ffc2bc3 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9945ffed4692c6044b6d3acf81efd694 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs new file mode 100644 index 0000000..4de98ee --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestTools.Logging +{ + sealed class LogScope : IDisposable + { + static List s_ActiveScopes = new List(); + + readonly object m_Lock = new object(); + bool m_Disposed; + bool m_NeedToProcessLogs; + + public Queue ExpectedLogs { get; set; } + public List AllLogs { get; } + public List FailingLogs { get; } + public bool IgnoreFailingMessages { get; set; } + public bool IsNUnitException { get; private set; } + public bool IsNUnitSuccessException { get; private set; } + public bool IsNUnitInconclusiveException { get; private set; } + public bool IsNUnitIgnoreException { get; private set; } + public string NUnitExceptionMessage { get; private set; } + + public static LogScope Current + { + get + { + if (s_ActiveScopes.Count == 0) + throw new InvalidOperationException("No log scope is available"); + return s_ActiveScopes[0]; + } + } + + public static bool HasCurrentLogScope() + { + return s_ActiveScopes.Count > 0; + } + + public LogScope() + { + AllLogs = new List(); + FailingLogs = new List(); + ExpectedLogs = new Queue(); + IgnoreFailingMessages = false; + Activate(); + } + + void Activate() + { + s_ActiveScopes.Insert(0, this); + RegisterScope(this); + Application.logMessageReceivedThreaded -= AddLog; + Application.logMessageReceivedThreaded += AddLog; + } + + void Deactivate() + { + Application.logMessageReceivedThreaded -= AddLog; + s_ActiveScopes.Remove(this); + UnregisterScope(this); + } + + static void RegisterScope(LogScope logScope) + { + Application.logMessageReceivedThreaded += logScope.AddLog; + } + + static void UnregisterScope(LogScope logScope) + { + Application.logMessageReceivedThreaded -= logScope.AddLog; + } + + public void AddLog(string message, string stacktrace, LogType type) + { + lock (m_Lock) + { + m_NeedToProcessLogs = true; + var log = new LogEvent + { + LogType = type, + Message = message, + StackTrace = stacktrace, + }; + + AllLogs.Add(log); + + if (IsNUnitResultStateException(stacktrace, type)) + { + if (message.StartsWith("SuccessException")) + { + IsNUnitException = true; + IsNUnitSuccessException = true; + if (message.StartsWith("SuccessException: ")) + { + NUnitExceptionMessage = message.Substring("SuccessException: ".Length); + return; + } + } + else if (message.StartsWith("InconclusiveException")) + { + IsNUnitException = true; + IsNUnitInconclusiveException = true; + if (message.StartsWith("InconclusiveException: ")) + { + NUnitExceptionMessage = message.Substring("InconclusiveException: ".Length); + return; + } + } + else if (message.StartsWith("IgnoreException")) + { + IsNUnitException = true; + IsNUnitIgnoreException = true; + if (message.StartsWith("IgnoreException: ")) + { + NUnitExceptionMessage = message.Substring("IgnoreException: ".Length); + return; + } + } + } + + if (IsFailingLog(type) && !IgnoreFailingMessages) + { + FailingLogs.Add(log); + } + } + } + + static bool IsNUnitResultStateException(string stacktrace, LogType logType) + { + if (logType != LogType.Exception) + return false; + + return string.IsNullOrEmpty(stacktrace) || stacktrace.StartsWith("NUnit.Framework.Assert."); + } + + static bool IsFailingLog(LogType type) + { + switch (type) + { + case LogType.Assert: + case LogType.Error: + case LogType.Exception: + return true; + default: + return false; + } + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + void Dispose(bool disposing) + { + if (m_Disposed) + { + return; + } + + m_Disposed = true; + + if (disposing) + { + Deactivate(); + } + } + + public bool AnyFailingLogs() + { + ProcessExpectedLogs(); + return FailingLogs.Any(); + } + + public void ProcessExpectedLogs() + { + lock (m_Lock) + { + if (!m_NeedToProcessLogs || !ExpectedLogs.Any()) + return; + + LogMatch expectedLog = null; + foreach (var logEvent in AllLogs) + { + if (!ExpectedLogs.Any()) + break; + if (expectedLog == null && ExpectedLogs.Any()) + expectedLog = ExpectedLogs.Peek(); + + if (expectedLog != null && expectedLog.Matches(logEvent)) + { + ExpectedLogs.Dequeue(); + logEvent.IsHandled = true; + if (FailingLogs.Any(expectedLog.Matches)) + { + var failingLog = FailingLogs.First(expectedLog.Matches); + FailingLogs.Remove(failingLog); + } + expectedLog = null; + } + } + m_NeedToProcessLogs = false; + } + } + + public void NoUnexpectedReceived() + { + lock (m_Lock) + { + ProcessExpectedLogs(); + + var unhandledLog = AllLogs.FirstOrDefault(x => !x.IsHandled); + if (unhandledLog != null) + { + throw new UnhandledLogMessageException(unhandledLog); + } + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs.meta new file mode 100644 index 0000000..ea13dd6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4bbc17b35884fdf468e4b52ae4222882 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs new file mode 100644 index 0000000..8ad39f4 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs @@ -0,0 +1,29 @@ +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using UnityEngine.TestTools.Logging; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class UnexpectedLogMessageException : ResultStateException + { + public LogMatch LogEvent; + + public UnexpectedLogMessageException(LogMatch log) + : base(BuildMessage(log)) + { + LogEvent = log; + } + + private static string BuildMessage(LogMatch log) + { + return string.Format("Expected log did not appear: {0}", log); + } + + public override ResultState ResultState + { + get { return ResultState.Failure; } + } + + public override string StackTrace { get { return null; } } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs.meta new file mode 100644 index 0000000..7b9e611 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b2eeca598284bd4abb4a15c30df1576 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs new file mode 100644 index 0000000..9427cc8 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs @@ -0,0 +1,35 @@ +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.Utils; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class UnhandledLogMessageException : ResultStateException + { + public LogEvent LogEvent; + private readonly string m_CustomStackTrace; + + public UnhandledLogMessageException(LogEvent log) + : base(BuildMessage(log)) + { + LogEvent = log; + m_CustomStackTrace = StackTraceFilter.Filter(log.StackTrace); + } + + private static string BuildMessage(LogEvent log) + { + return string.Format("Unhandled log message: '{0}'. Use UnityEngine.TestTools.LogAssert.Expect", log); + } + + public override ResultState ResultState + { + get { return ResultState.Failure; } + } + + public override string StackTrace + { + get { return m_CustomStackTrace; } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs.meta new file mode 100644 index 0000000..1019924 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8ed4063f2beecd41a234a582202f3c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs new file mode 100644 index 0000000..6ba39c2 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs @@ -0,0 +1,28 @@ +using NUnit.Framework; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class UnityTestTimeoutException : ResultStateException + { + public UnityTestTimeoutException(int timeout) + : base(BuildMessage(timeout)) + { + } + + private static string BuildMessage(int timeout) + { + return string.Format("UnityTest exceeded Timeout value of {0}ms", timeout); + } + + public override ResultState ResultState + { + get { return ResultState.Failure; } + } + + public override string StackTrace + { + get { return ""; } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs.meta new file mode 100644 index 0000000..d366ec9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ffb335140c799c4408411d81789fb05c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions.meta new file mode 100644 index 0000000..3023e52 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3e8d6af343b383544ba5743d119f4062 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs new file mode 100644 index 0000000..ed8d896 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs @@ -0,0 +1,79 @@ +using System; +using System.Linq; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestTools.NUnitExtensions +{ + /// + /// This class delegates actions from the NUnit thread that should be executed on the main thread. + /// NUnit thread calls Delegate which blocks the execution on the thread until the action is executed. + /// The main thread will poll for awaiting actions (HasAction) and invoke them (Execute). + /// Once the action is executed, the main thread releases the lock and executino on the NUnit thread is continued. + /// + internal class ActionDelegator : BaseDelegator + { + private Func m_Action; + public object Delegate(Action action) + { + return Delegate(() => { action(); return null; }); + } + + public object Delegate(Func action) + { + if (m_Aborted) + { + return null; + } + + AssertState(); + m_Context = UnityTestExecutionContext.CurrentContext; + + m_Signal.Reset(); + m_Action = action; + + WaitForSignal(); + + return HandleResult(); + } + + private void AssertState() + { + if (m_Action != null) + { + throw new Exception("Action not executed yet"); + } + } + + public bool HasAction() + { + return m_Action != null; + } + + public void Execute(LogScope logScope) + { + try + { + SetCurrentTestContext(); + m_Result = m_Action(); + if (logScope.AnyFailingLogs()) + { + var failingLog = logScope.FailingLogs.First(); + throw new UnhandledLogMessageException(failingLog); + } + if (logScope.ExpectedLogs.Any()) + throw new UnexpectedLogMessageException(LogScope.Current.ExpectedLogs.Peek()); + } + catch (Exception e) + { + m_Exception = e; + } + finally + { + m_Action = null; + m_Signal.Set(); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs.meta new file mode 100644 index 0000000..5f4e2d1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4f939b9e23a0946439b812551e07ac81 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes.meta new file mode 100644 index 0000000..c7cae09 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0cb14878543cf3d4f8472b15f7ecf0e3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs new file mode 100644 index 0000000..a8b4780 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools +{ + public class ConditionalIgnoreAttribute : NUnitAttribute, IApplyToTest + { + string m_ConditionKey; + string m_IgnoreReason; + + public ConditionalIgnoreAttribute(string conditionKey, string ignoreReason) + { + m_ConditionKey = conditionKey; + m_IgnoreReason = ignoreReason; + } + + public void ApplyToTest(Test test) + { + var key = m_ConditionKey.ToLowerInvariant(); + if (m_ConditionMap.ContainsKey(key) && m_ConditionMap[key]) + { + test.RunState = RunState.Ignored; + string skipReason = string.Format(m_IgnoreReason); + test.Properties.Add(PropertyNames.SkipReason, skipReason); + } + } + + static Dictionary m_ConditionMap = new Dictionary(); + public static void AddConditionalIgnoreMapping(string key, bool value) + { + m_ConditionMap.Add(key.ToLowerInvariant(), value); + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs.meta new file mode 100644 index 0000000..d737335 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c82a8473f4a8f7b42a004c91e06d2f2b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs new file mode 100644 index 0000000..89c5f76 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools +{ + internal class TestEnumerator + { + private readonly ITestExecutionContext m_Context; + private static IEnumerator m_TestEnumerator; + + public static IEnumerator Enumerator { get { return m_TestEnumerator; } } + + public TestEnumerator(ITestExecutionContext context, IEnumerator testEnumerator) + { + m_Context = context; + m_TestEnumerator = testEnumerator; + } + + public IEnumerator Execute() + { + m_Context.CurrentResult.SetResult(ResultState.Success); + + while (true) + { + object current = null; + try + { + if (!m_TestEnumerator.MoveNext()) + { + yield break; + } + + if (!m_Context.CurrentResult.ResultState.Equals(ResultState.Success)) + { + yield break; + } + + current = m_TestEnumerator.Current; + } + catch (Exception exception) + { + m_Context.CurrentResult.RecordException(exception); + yield break; + } + yield return current; + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs.meta new file mode 100644 index 0000000..6ca4f72 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 750aad009559b814dbc27001341fc1c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs new file mode 100644 index 0000000..f9232ed --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs @@ -0,0 +1,28 @@ +using System; + +namespace UnityEngine.TestTools +{ + /// + /// The presence of this attribute will cause the test runner to require that every single log is expected. By + /// default, the runner will only automatically fail on any error logs, so this adds warnings and infos as well. + /// It is the same as calling `LogAssert.NoUnexpectedReceived()` at the bottom of every affected test. + /// + /// This attribute can be applied to test assemblies (will affect every test in the assembly), fixtures (will + /// affect every test in the fixture), or on individual test methods. It is also automatically inherited from base + /// fixtures. + /// + /// The MustExpect property (on by default) lets you selectively enable or disable the higher level value. For + /// example when migrating an assembly to this more strict checking method, you might attach + /// `[assembly:TestMustExpectAllLogs]` to the assembly itself, but then whitelist failing fixtures and test methods + /// with `[TestMustExpectAllLogs(MustExpect=false)]` until they can be migrated. This also means new tests in that + /// assembly would be required to have the more strict checking. + /// + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public class TestMustExpectAllLogsAttribute : Attribute + { + public TestMustExpectAllLogsAttribute(bool mustExpect = true) + => MustExpect = mustExpect; + + public bool MustExpect { get; } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs.meta new file mode 100644 index 0000000..82c5e47 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3803f736886e77842995ddbc3531afaa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs new file mode 100644 index 0000000..84f8d84 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs @@ -0,0 +1,20 @@ +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal.Builders; + +namespace UnityEngine.TestTools +{ + internal class UnityCombinatorialStrategy : CombinatorialStrategy, ICombiningStrategy + { + public new IEnumerable GetTestCases(IEnumerable[] sources) + { + var testCases = base.GetTestCases(sources); + foreach (var testCase in testCases) + { + testCase.GetType().GetProperty("ExpectedResult").SetValue(testCase, new object(), null); + } + return testCases; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs.meta new file mode 100644 index 0000000..84774ce --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7af6ac3e6b51b8d4aab04adc85b8de2f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs new file mode 100644 index 0000000..ff538ea --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] + public class UnityPlatformAttribute : NUnitAttribute, IApplyToTest + { + public RuntimePlatform[] include { get; set; } + public RuntimePlatform[] exclude { get; set; } + + private string m_skippedReason; + + public UnityPlatformAttribute() + { + include = new List().ToArray(); + exclude = new List().ToArray(); + } + + public UnityPlatformAttribute(params RuntimePlatform[] include) + : this() + { + this.include = include; + } + + public void ApplyToTest(Test test) + { + if (test.RunState == RunState.NotRunnable || test.RunState == RunState.Ignored || IsPlatformSupported(Application.platform)) + { + return; + } + test.RunState = RunState.Skipped; + test.Properties.Add("_SKIPREASON", m_skippedReason); + } + + internal bool IsPlatformSupported(RuntimePlatform testTargetPlatform) + { + if (include.Any() && !include.Any(x => x == testTargetPlatform)) + { + m_skippedReason = string.Format("Only supported on {0}", string.Join(", ", include.Select(x => x.ToString()).ToArray())); + return false; + } + + if (exclude.Any(x => x == testTargetPlatform)) + { + m_skippedReason = string.Format("Not supported on {0}", string.Join(", ", include.Select(x => x.ToString()).ToArray())); + return false; + } + return true; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs.meta new file mode 100644 index 0000000..003e154 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5440c1153b397e14c9c7b1d6eb83b9f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs new file mode 100644 index 0000000..f51da12 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs @@ -0,0 +1,10 @@ +using System; +using NUnit.Framework; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Method)] + public class UnitySetUpAttribute : NUnitAttribute + { + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs.meta new file mode 100644 index 0000000..ccd0d7e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc6401f13df54ba44bfd7cdc93c7d64d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs new file mode 100644 index 0000000..dec605c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs @@ -0,0 +1,10 @@ +using System; +using NUnit.Framework; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Method)] + public class UnityTearDownAttribute : NUnitAttribute + { + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs.meta new file mode 100644 index 0000000..db19904 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 600f4b74746dbf944901257f81a8af6d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs new file mode 100644 index 0000000..69e2020 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs @@ -0,0 +1,33 @@ +using System; +using NUnit.Framework; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Builders; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Method)] + public class UnityTestAttribute : CombiningStrategyAttribute, ISimpleTestBuilder, IImplyFixture + { + public UnityTestAttribute() : base(new UnityCombinatorialStrategy(), new ParameterDataSourceProvider()) {} + + private readonly NUnitTestCaseBuilder _builder = new NUnitTestCaseBuilder(); + + TestMethod ISimpleTestBuilder.BuildFrom(IMethodInfo method, Test suite) + { + TestCaseParameters parms = new TestCaseParameters + { + ExpectedResult = new object(), + HasExpectedResult = true + }; + + var t = _builder.BuildTestMethod(method, suite, parms); + + if (t.parms != null) + t.parms.HasExpectedResult = false; + return t; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs.meta new file mode 100644 index 0000000..e2fcb63 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fedb0f9e5006b1943abae52f52f08a1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs new file mode 100644 index 0000000..65bcbba --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs @@ -0,0 +1,58 @@ +using System; +using System.Threading; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools.NUnitExtensions +{ + internal abstract class BaseDelegator + { + protected ManualResetEvent m_Signal = new ManualResetEvent(false); + + protected object m_Result; + protected Exception m_Exception; + protected ITestExecutionContext m_Context; + + protected bool m_Aborted; + + protected object HandleResult() + { + SetCurrentTestContext(); + if (m_Exception != null) + { + var temp = m_Exception; + m_Exception = null; + throw temp; + } + var tempResult = m_Result; + m_Result = null; + return tempResult; + } + + protected void WaitForSignal() + { + while (!m_Signal.WaitOne(100)) + { + if (m_Aborted) + { + m_Aborted = false; + Reflect.MethodCallWrapper = null; + throw new Exception(); + } + } + } + + public void Abort() + { + m_Aborted = true; + } + + protected void SetCurrentTestContext() + { + var prop = typeof(TestExecutionContext).GetProperty("CurrentContext"); + if (prop != null) + { + prop.SetValue(null, m_Context, null); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs.meta new file mode 100644 index 0000000..613537b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 37cea569bfefafe49a1513c4d7f0e9eb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands.meta new file mode 100644 index 0000000..75dd09d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b72875690e0f7343911e06af3145bd5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs new file mode 100644 index 0000000..af350f1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs @@ -0,0 +1,196 @@ +using System; +using System.Collections; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestTools +{ + internal abstract class BeforeAfterTestCommandBase : DelegatingTestCommand, IEnumerableTestMethodCommand + { + private string m_BeforeErrorPrefix; + private string m_AfterErrorPrefix; + private bool m_SkipYieldAfterActions; + protected BeforeAfterTestCommandBase(TestCommand innerCommand, string beforeErrorPrefix, string afterErrorPrefix, bool skipYieldAfterActions = false) + : base(innerCommand) + { + m_BeforeErrorPrefix = beforeErrorPrefix; + m_AfterErrorPrefix = afterErrorPrefix; + m_SkipYieldAfterActions = skipYieldAfterActions; + } + + protected T[] BeforeActions = new T[0]; + + protected T[] AfterActions = new T[0]; + + protected abstract IEnumerator InvokeBefore(T action, Test test, UnityTestExecutionContext context); + + protected abstract IEnumerator InvokeAfter(T action, Test test, UnityTestExecutionContext context); + + protected abstract BeforeAfterTestCommandState GetState(UnityTestExecutionContext context); + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + var unityContext = (UnityTestExecutionContext)context; + var state = GetState(unityContext); + + if (state == null) + { + // We do not expect a state to exist in playmode + state = ScriptableObject.CreateInstance(); + } + + state.ApplyTestResult(context.CurrentResult); + + while (state.NextBeforeStepIndex < BeforeActions.Length) + { + var action = BeforeActions[state.NextBeforeStepIndex]; + var enumerator = InvokeBefore(action, Test, unityContext); + ActivePcHelper.SetEnumeratorPC(enumerator, state.NextBeforeStepPc); + + using (var logScope = new LogScope()) + { + while (true) + { + try + { + if (!enumerator.MoveNext()) + { + break; + } + } + catch (Exception ex) + { + state.TestHasRun = true; + context.CurrentResult.RecordPrefixedException(m_BeforeErrorPrefix, ex); + state.StoreTestResult(context.CurrentResult); + break; + } + + state.NextBeforeStepPc = ActivePcHelper.GetEnumeratorPC(enumerator); + state.StoreTestResult(context.CurrentResult); + if (m_SkipYieldAfterActions) + { + break; + } + else + { + yield return enumerator.Current; + } + } + + if (logScope.AnyFailingLogs()) + { + state.TestHasRun = true; + context.CurrentResult.RecordPrefixedError(m_BeforeErrorPrefix, new UnhandledLogMessageException(logScope.FailingLogs.First()).Message); + state.StoreTestResult(context.CurrentResult); + } + } + + state.NextBeforeStepIndex++; + state.NextBeforeStepPc = 0; + } + + if (!state.TestHasRun) + { + if (innerCommand is IEnumerableTestMethodCommand) + { + var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context); + foreach (var iterator in executeEnumerable) + { + state.StoreTestResult(context.CurrentResult); + yield return iterator; + } + } + else + { + context.CurrentResult = innerCommand.Execute(context); + state.StoreTestResult(context.CurrentResult); + } + + state.TestHasRun = true; + } + + while (state.NextAfterStepIndex < AfterActions.Length) + { + state.TestAfterStarted = true; + var action = AfterActions[state.NextAfterStepIndex]; + var enumerator = InvokeAfter(action, Test, unityContext); + ActivePcHelper.SetEnumeratorPC(enumerator, state.NextAfterStepPc); + + using (var logScope = new LogScope()) + { + while (true) + { + try + { + if (!enumerator.MoveNext()) + { + break; + } + } + catch (Exception ex) + { + context.CurrentResult.RecordPrefixedException(m_AfterErrorPrefix, ex); + state.StoreTestResult(context.CurrentResult); + break; + } + + state.NextAfterStepPc = ActivePcHelper.GetEnumeratorPC(enumerator); + state.StoreTestResult(context.CurrentResult); + + if (m_SkipYieldAfterActions) + { + break; + } + else + { + yield return enumerator.Current; + } + } + + if (logScope.AnyFailingLogs()) + { + state.TestHasRun = true; + context.CurrentResult.RecordPrefixedError(m_AfterErrorPrefix, new UnhandledLogMessageException(logScope.FailingLogs.First()).Message); + state.StoreTestResult(context.CurrentResult); + } + } + + state.NextAfterStepIndex++; + state.NextAfterStepPc = 0; + } + + state.Reset(); + } + + public override TestResult Execute(ITestExecutionContext context) + { + throw new NotImplementedException("Use ExecuteEnumerable"); + } + + private static TestCommandPcHelper pcHelper; + + internal static TestCommandPcHelper ActivePcHelper + { + get + { + if (pcHelper == null) + { + pcHelper = new TestCommandPcHelper(); + } + + return pcHelper; + } + set + { + pcHelper = value; + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs.meta new file mode 100644 index 0000000..e3e4819 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cbbca1d8a0434be4bbc7f165523763ac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs new file mode 100644 index 0000000..273b61c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs @@ -0,0 +1,49 @@ +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools +{ + internal class BeforeAfterTestCommandState : ScriptableObject + { + public int NextBeforeStepIndex; + public int NextBeforeStepPc; + public int NextAfterStepIndex; + public int NextAfterStepPc; + public bool TestHasRun; + public TestStatus CurrentTestResultStatus; + public string CurrentTestResultLabel; + public FailureSite CurrentTestResultSite; + public string CurrentTestMessage; + public string CurrentTestStrackTrace; + public bool TestAfterStarted; + + public void Reset() + { + NextBeforeStepIndex = 0; + NextBeforeStepPc = 0; + NextAfterStepIndex = 0; + NextAfterStepPc = 0; + TestHasRun = false; + CurrentTestResultStatus = TestStatus.Inconclusive; + CurrentTestResultLabel = null; + CurrentTestResultSite = default(FailureSite); + CurrentTestMessage = null; + CurrentTestStrackTrace = null; + TestAfterStarted = false; + } + + public void StoreTestResult(TestResult result) + { + CurrentTestResultStatus = result.ResultState.Status; + CurrentTestResultLabel = result.ResultState.Label; + CurrentTestResultSite = result.ResultState.Site; + CurrentTestMessage = result.Message; + CurrentTestStrackTrace = result.StackTrace; + } + + public void ApplyTestResult(TestResult result) + { + result.SetResult(new ResultState(CurrentTestResultStatus, CurrentTestResultLabel, CurrentTestResultSite), CurrentTestMessage, CurrentTestStrackTrace); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs.meta new file mode 100644 index 0000000..da9bd2b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f65567c9026afb4db5de3355accc636 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs new file mode 100644 index 0000000..d452f24 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs @@ -0,0 +1,34 @@ + +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class EnumerableApplyChangesToContextCommand : ApplyChangesToContextCommand, IEnumerableTestMethodCommand + { + public EnumerableApplyChangesToContextCommand(TestCommand innerCommand, IEnumerable changes) + : base(innerCommand, changes) { } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + ApplyChanges(context); + + if (innerCommand is IEnumerableTestMethodCommand) + { + var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context); + foreach (var iterator in executeEnumerable) + { + yield return iterator; + } + } + else + { + context.CurrentResult = innerCommand.Execute(context); + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs.meta new file mode 100644 index 0000000..6a955ca --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b4429eff9fcffb48b006e8edcc90338 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs new file mode 100644 index 0000000..1bdac69 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class EnumerableRepeatedTestCommand : DelegatingTestCommand, IEnumerableTestMethodCommand + { + private int repeatCount; + + public EnumerableRepeatedTestCommand(RepeatAttribute.RepeatedTestCommand commandToReplace) : base(commandToReplace.GetInnerCommand()) + { + repeatCount = (int) typeof(RepeatAttribute.RepeatedTestCommand) + .GetField("repeatCount", BindingFlags.NonPublic | BindingFlags.Instance) + .GetValue(commandToReplace); + } + + public override TestResult Execute(ITestExecutionContext context) + { + throw new NotImplementedException("Use ExecuteEnumerable"); + } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + var unityContext = (UnityTestExecutionContext)context; + int count = unityContext.EnumerableRepeatedTestState; + + while (count < repeatCount) + { + count++; + unityContext.EnumerableRepeatedTestState = count; + + if (innerCommand is IEnumerableTestMethodCommand) + { + var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context); + foreach (var iterator in executeEnumerable) + { + yield return iterator; + } + } + else + { + context.CurrentResult = innerCommand.Execute(context); + } + + if (context.CurrentResult.ResultState != ResultState.Success) + { + break; + } + } + + unityContext.EnumerableRepeatedTestState = 0; + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs.meta new file mode 100644 index 0000000..a738fba --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e273462feb9a65948826739f683cc9a9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs new file mode 100644 index 0000000..ee82c29 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class EnumerableRetryTestCommand : DelegatingTestCommand, IEnumerableTestMethodCommand + { + private int retryCount; + + public EnumerableRetryTestCommand(RetryAttribute.RetryCommand commandToReplace) : base(commandToReplace.GetInnerCommand()) + { + retryCount = (int) typeof(RetryAttribute.RetryCommand) + .GetField("_retryCount", BindingFlags.NonPublic | BindingFlags.Instance) + .GetValue(commandToReplace); + } + + public override TestResult Execute(ITestExecutionContext context) + { + throw new NotImplementedException("Use ExecuteEnumerable"); + } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + var unityContext = (UnityTestExecutionContext)context; + int count = unityContext.EnumerableRetryTestState; + + while (count < retryCount) + { + count++; + unityContext.EnumerableRetryTestState = count; + + if (innerCommand is IEnumerableTestMethodCommand) + { + var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context); + foreach (var iterator in executeEnumerable) + { + yield return iterator; + } + } + else + { + context.CurrentResult = innerCommand.Execute(context); + } + + if (context.CurrentResult.ResultState != ResultState.Failure) + { + break; + } + } + + unityContext.EnumerableRetryTestState = 0; + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs.meta new file mode 100644 index 0000000..56f4e14 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6de2f178a24cd2e48a0816cacd9a0583 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs new file mode 100644 index 0000000..e5bf7b8 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections; +using System.Linq; +using System.Reflection; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class EnumerableSetUpTearDownCommand : BeforeAfterTestCommandBase + { + public EnumerableSetUpTearDownCommand(TestCommand innerCommand) + : base(innerCommand, "SetUp", "TearDown") + { + if (Test.TypeInfo.Type != null) + { + BeforeActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(UnitySetUpAttribute)); + AfterActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(UnityTearDownAttribute)).Reverse().ToArray(); + } + } + + private static MethodInfo[] GetMethodsWithAttributeFromFixture(Type fixtureType, Type setUpType) + { + MethodInfo[] methodsWithAttribute = Reflect.GetMethodsWithAttribute(fixtureType, setUpType, true); + return methodsWithAttribute.Where(x => x.ReturnType == typeof(IEnumerator)).ToArray(); + } + + protected override IEnumerator InvokeBefore(MethodInfo action, Test test, UnityTestExecutionContext context) + { + return (IEnumerator)Reflect.InvokeMethod(action, context.TestObject); + } + + protected override IEnumerator InvokeAfter(MethodInfo action, Test test, UnityTestExecutionContext context) + { + return (IEnumerator)Reflect.InvokeMethod(action, context.TestObject); + } + + protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context) + { + return context.SetUpTearDownState; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs.meta new file mode 100644 index 0000000..e61d049 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd85a35169d313840a0874aea1a28629 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs new file mode 100644 index 0000000..7a548ec --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestTools +{ + internal class EnumerableTestMethodCommand : TestCommand, IEnumerableTestMethodCommand + { + private readonly TestMethod testMethod; + + public EnumerableTestMethodCommand(TestMethod testMethod) + : base(testMethod) + { + this.testMethod = testMethod; + } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + yield return null; + + var currentExecutingTestEnumerator = new TestEnumeratorWrapper(testMethod).GetEnumerator(context); + if (currentExecutingTestEnumerator != null) + { + var testEnumeraterYieldInstruction = new TestEnumerator(context, currentExecutingTestEnumerator); + + yield return testEnumeraterYieldInstruction; + + var enumerator = testEnumeraterYieldInstruction.Execute(); + + var executingEnumerator = ExecuteEnumerableAndRecordExceptions(enumerator, context); + while (executingEnumerator.MoveNext()) + { + yield return executingEnumerator.Current; + } + } + else + { + if (context.CurrentResult.ResultState != ResultState.Ignored) + { + context.CurrentResult.SetResult(ResultState.Success); + } + } + } + + private static IEnumerator ExecuteEnumerableAndRecordExceptions(IEnumerator enumerator, ITestExecutionContext context) + { + while (true) + { + try + { + if (!enumerator.MoveNext()) + { + break; + } + } + catch (Exception ex) + { + context.CurrentResult.RecordException(ex); + break; + } + + if (enumerator.Current is IEnumerator) + { + var current = (IEnumerator)enumerator.Current; + yield return ExecuteEnumerableAndRecordExceptions(current, context); + } + else + { + yield return enumerator.Current; + } + } + } + + public override TestResult Execute(ITestExecutionContext context) + { + throw new NotImplementedException("Use ExecuteEnumerable"); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs.meta new file mode 100644 index 0000000..4631e40 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 19a6f000f81e24c4a826c1abd43e77c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs new file mode 100644 index 0000000..ae1b7b7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class ImmediateEnumerableCommand : DelegatingTestCommand + { + public ImmediateEnumerableCommand(TestCommand innerCommand) + : base(innerCommand) { } + + public override TestResult Execute(ITestExecutionContext context) + { + if (innerCommand is IEnumerableTestMethodCommand) + { + var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context); + foreach (var iterator in executeEnumerable) + { + if (iterator != null) + { + throw new Exception("Only null can be yielded at this point."); + } + } + return context.CurrentResult; + } + + return innerCommand.Execute(context); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs.meta new file mode 100644 index 0000000..e650b54 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8349e42a2b30c7a4abd8678c203428ba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs new file mode 100644 index 0000000..a0646f1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class OuterUnityTestActionCommand : BeforeAfterTestCommandBase + { + public OuterUnityTestActionCommand(TestCommand innerCommand) + : base(innerCommand, "BeforeTest", "AfterTest") + { + if (Test.TypeInfo.Type != null) + { + BeforeActions = GetUnityTestActionsFromMethod(Test.Method.MethodInfo); + AfterActions = BeforeActions; + } + } + + private static IOuterUnityTestAction[] GetUnityTestActionsFromMethod(MethodInfo method) + { + var attributes = method.GetCustomAttributes(false); + List actions = new List(); + foreach (var attribute in attributes) + { + if (attribute is IOuterUnityTestAction) + actions.Add(attribute as IOuterUnityTestAction); + } + return actions.ToArray(); + } + + protected override IEnumerator InvokeBefore(IOuterUnityTestAction action, Test test, UnityTestExecutionContext context) + { + return action.BeforeTest(test); + } + + protected override IEnumerator InvokeAfter(IOuterUnityTestAction action, Test test, UnityTestExecutionContext context) + { + return action.AfterTest(test); + } + + protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context) + { + return context.OuterUnityTestActionState; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs.meta new file mode 100644 index 0000000..6415872 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0d4fc309a0784294c8ab658b53b12320 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs new file mode 100644 index 0000000..c6ff0d9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class SetUpTearDownCommand : BeforeAfterTestCommandBase + { + public SetUpTearDownCommand(TestCommand innerCommand) + : base(innerCommand, "SetUp", "TearDown", true) + { + if (Test.TypeInfo.Type != null) + { + BeforeActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(SetUpAttribute)); + AfterActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(TearDownAttribute)).Reverse().ToArray(); + } + } + + private static MethodInfo[] GetMethodsWithAttributeFromFixture(Type fixtureType, Type setUpType) + { + MethodInfo[] methodsWithAttribute = Reflect.GetMethodsWithAttribute(fixtureType, setUpType, true); + return methodsWithAttribute.Where(x => x.ReturnType == typeof(void)).ToArray(); + } + + protected override IEnumerator InvokeBefore(MethodInfo action, Test test, UnityTestExecutionContext context) + { + Reflect.InvokeMethod(action, context.TestObject); + yield return null; + } + + protected override IEnumerator InvokeAfter(MethodInfo action, Test test, UnityTestExecutionContext context) + { + Reflect.InvokeMethod(action, context.TestObject); + yield return null; + } + + protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context) + { + return null; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs.meta new file mode 100644 index 0000000..28b84ac --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e0db3f3921670cd4ca2e925737c3fba4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs new file mode 100644 index 0000000..9b99dd0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class TestActionCommand : BeforeAfterTestCommandBase + { + public TestActionCommand(TestCommand innerCommand) + : base(innerCommand, "BeforeTest", "AfterTest", true) + { + if (Test.TypeInfo.Type != null) + { + BeforeActions = GetTestActionsFromMethod(Test.Method.MethodInfo); + AfterActions = BeforeActions; + } + } + + private static ITestAction[] GetTestActionsFromMethod(MethodInfo method) + { + var attributes = method.GetCustomAttributes(false); + List actions = new List(); + foreach (var attribute in attributes) + { + if (attribute is ITestAction) + actions.Add(attribute as ITestAction); + } + return actions.ToArray(); + } + + protected override IEnumerator InvokeBefore(ITestAction action, Test test, UnityTestExecutionContext context) + { + action.BeforeTest(test); + yield return null; + } + + protected override IEnumerator InvokeAfter(ITestAction action, Test test, UnityTestExecutionContext context) + { + action.AfterTest(test); + yield return null; + } + + protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context) + { + return null; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs.meta new file mode 100644 index 0000000..3f44e9d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2de8ba3b840049641897e0da7ce1d5cd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs new file mode 100644 index 0000000..26eb4b0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections; + +namespace UnityEngine.TestTools +{ + internal class TestCommandPcHelper + { + public virtual void SetEnumeratorPC(IEnumerator enumerator, int pc) + { + // Noop implementation used in playmode. + } + + public virtual int GetEnumeratorPC(IEnumerator enumerator) + { + return 0; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs.meta new file mode 100644 index 0000000..1dbd4f4 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 33e6b78c96bb0694e96383e3c56b7b54 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs new file mode 100644 index 0000000..dd7fbc2 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs @@ -0,0 +1,141 @@ +using System; +using System.Linq; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestTools.NUnitExtensions +{ + /// + /// Specialization of BaseDelegator that makes sure objects are created on the MainThread. + /// It also deals with ScriptableObjects so that tests can survive assembly reload. + /// + internal class ConstructDelegator + { + private Type m_RequestedType; + private object[] m_Arguments; + + private ScriptableObject m_CurrentRunningTest; + private readonly IStateSerializer m_StateSerializer; + + protected Exception m_Exception; + protected object m_Result; + protected ITestExecutionContext m_Context; + + public ConstructDelegator(IStateSerializer stateSerializer) + { + m_StateSerializer = stateSerializer; + } + + protected object HandleResult() + { + SetCurrentTestContext(); + if (m_Exception != null) + { + var temp = m_Exception; + m_Exception = null; + throw temp; + } + var tempResult = m_Result; + m_Result = null; + return tempResult; + } + + protected void SetCurrentTestContext() + { + var prop = typeof(UnityTestExecutionContext).GetProperty("CurrentContext"); + if (prop != null) + { + prop.SetValue(null, m_Context, null); + } + } + + public object Delegate(Type type, object[] arguments) + { + AssertState(); + m_Context = UnityTestExecutionContext.CurrentContext; + + m_RequestedType = type; + m_Arguments = arguments; + + using (var logScope = new LogScope()) + { + Execute(logScope); + } + + return HandleResult(); + } + + private void AssertState() + { + if (m_RequestedType != null) + { + throw new Exception("Constructor not executed yet"); + } + } + + public bool HasAction() + { + return m_RequestedType != null; + } + + public void Execute(LogScope logScope) + { + try + { + if (typeof(ScriptableObject).IsAssignableFrom(m_RequestedType)) + { + if (m_CurrentRunningTest != null && m_RequestedType != m_CurrentRunningTest.GetType()) + { + DestroyCurrentTestObjectIfExists(); + } + if (m_CurrentRunningTest == null) + { + if (m_StateSerializer.CanRestoreFromScriptableObject(m_RequestedType)) + { + m_CurrentRunningTest = m_StateSerializer.RestoreScriptableObjectInstance(); + } + else + { + m_CurrentRunningTest = ScriptableObject.CreateInstance(m_RequestedType); + } + } + m_Result = m_CurrentRunningTest; + } + else + { + DestroyCurrentTestObjectIfExists(); + m_Result = Activator.CreateInstance(m_RequestedType, m_Arguments); + if (m_StateSerializer.CanRestoreFromJson(m_RequestedType)) + { + m_StateSerializer.RestoreClassFromJson(ref m_Result); + } + } + if (logScope.AnyFailingLogs()) + { + var failingLog = logScope.FailingLogs.First(); + throw new UnhandledLogMessageException(failingLog); + } + if (logScope.ExpectedLogs.Any()) + throw new UnexpectedLogMessageException(LogScope.Current.ExpectedLogs.Peek()); + } + catch (Exception e) + { + m_Exception = e; + } + finally + { + m_RequestedType = null; + m_Arguments = null; + } + } + + public void DestroyCurrentTestObjectIfExists() + { + if (m_CurrentRunningTest == null) + return; + Object.DestroyImmediate(m_CurrentRunningTest); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs.meta new file mode 100644 index 0000000..cb04fc8 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b42e1db66fe9c634798674cb9e1df2ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters.meta new file mode 100644 index 0000000..a0aa994 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c3de99f9efc582a48995bc8e8c2df418 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs new file mode 100644 index 0000000..d53a2d0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs @@ -0,0 +1,25 @@ +using System; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal.Filters; + +namespace UnityEngine.TestRunner.NUnitExtensions.Filters +{ + internal class AssemblyNameFilter : ValueMatchFilter + { + public AssemblyNameFilter(string assemblyName) : base(assemblyName) {} + + public override bool Match(ITest test) + { + string assemblyName = string.Empty; + //Assembly fullname is in the format "Assembly-name, meta data ...", so extract the name by looking for the comma + if (test.TypeInfo != null && test.TypeInfo.Assembly != null && test.TypeInfo.FullName != null) + assemblyName = test.TypeInfo.Assembly.FullName.Substring(0, test.TypeInfo.Assembly.FullName.IndexOf(',')).TrimEnd(','); + return ExpectedValue.Equals(assemblyName, StringComparison.OrdinalIgnoreCase); + } + + protected override string ElementName + { + get { return "id"; } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs.meta new file mode 100644 index 0000000..2b89745 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 91319408591cec1478efd3c62f9f418a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs new file mode 100644 index 0000000..58430e8 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs @@ -0,0 +1,36 @@ +using System.Collections; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Filters; + +namespace UnityEngine.TestRunner.NUnitExtensions.Filters +{ + internal class CategoryFilterExtended : CategoryFilter + { + public static string k_DefaultCategory = "Uncategorized"; + + public CategoryFilterExtended(string name) : base(name) + { + } + + public override bool Match(ITest test) + { + IList testCategories = test.Properties[PropertyNames.Category].Cast().ToList(); + + if (test is TestMethod) + { + // Do not count tests with no attribute as Uncategorized if test fixture class has at least one attribute + // The test inherits the attribute from the test fixture + IList fixtureCategories = test.Parent.Properties[PropertyNames.Category].Cast().ToList(); + if (fixtureCategories.Count > 0) + return false; + } + + if (testCategories.Count == 0 && ExpectedValue == k_DefaultCategory && test is TestMethod) + return true; + + return base.Match(test); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs.meta new file mode 100644 index 0000000..a115cd2 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ebeedaa04bb53e24ba2e7fb6745e3fd3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs new file mode 100644 index 0000000..951d079 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs @@ -0,0 +1,12 @@ +using System; + +namespace UnityEngine.TestTools.NUnitExtensions +{ + internal interface IStateSerializer + { + ScriptableObject RestoreScriptableObjectInstance(); + void RestoreClassFromJson(ref object instance); + bool CanRestoreFromJson(Type requestedType); + bool CanRestoreFromScriptableObject(Type requestedType); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs.meta new file mode 100644 index 0000000..1d32715 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5f875a14565308a40a5262d2504da705 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner.meta new file mode 100644 index 0000000..1604cb5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37888acc09d9ee848bf9559f06645c45 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs new file mode 100644 index 0000000..260e3cf --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs @@ -0,0 +1,342 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class CompositeWorkItem : UnityWorkItem + { + private readonly TestSuite _suite; + private readonly TestSuiteResult _suiteResult; + private readonly ITestFilter _childFilter; + private TestCommand _setupCommand; + private TestCommand _teardownCommand; + + public List Children { get; private set; } + + private int _countOrder; + + private CountdownEvent _childTestCountdown; + + public CompositeWorkItem(TestSuite suite, ITestFilter childFilter, WorkItemFactory factory) + : base(suite, factory) + { + _suite = suite; + _suiteResult = Result as TestSuiteResult; + _childFilter = childFilter; + _countOrder = 0; + } + + protected override IEnumerable PerformWork() + { + InitializeSetUpAndTearDownCommands(); + + if (UnityTestExecutionContext.CurrentContext != null && m_DontRunRestoringResult && EditModeTestCallbacks.RestoringTestContext != null) + { + EditModeTestCallbacks.RestoringTestContext(); + } + + if (!CheckForCancellation()) + if (Test.RunState == RunState.Explicit && !_childFilter.IsExplicitMatch(Test)) + SkipFixture(ResultState.Explicit, GetSkipReason(), null); + else + switch (Test.RunState) + { + default: + case RunState.Runnable: + case RunState.Explicit: + Result.SetResult(ResultState.Success); + + CreateChildWorkItems(); + + if (Children.Count > 0) + { + if (!m_DontRunRestoringResult) + { + //This is needed to give the editor a chance to go out of playmode if needed before creating objects. + //If we do not, the objects could be automatically destroyed when exiting playmode and could result in errors later on + yield return null; + PerformOneTimeSetUp(); + } + + if (!CheckForCancellation()) + { + switch (Result.ResultState.Status) + { + case TestStatus.Passed: + foreach (var child in RunChildren()) + { + if (CheckForCancellation()) + { + yield break; + } + + yield return child; + } + break; + case TestStatus.Skipped: + case TestStatus.Inconclusive: + case TestStatus.Failed: + SkipChildren(_suite, Result.ResultState.WithSite(FailureSite.Parent), "OneTimeSetUp: " + Result.Message); + break; + } + } + + if (Context.ExecutionStatus != TestExecutionStatus.AbortRequested && !m_DontRunRestoringResult) + { + PerformOneTimeTearDown(); + } + } + break; + + case RunState.Skipped: + SkipFixture(ResultState.Skipped, GetSkipReason(), null); + break; + + case RunState.Ignored: + SkipFixture(ResultState.Ignored, GetSkipReason(), null); + break; + + case RunState.NotRunnable: + SkipFixture(ResultState.NotRunnable, GetSkipReason(), GetProviderStackTrace()); + break; + } + if (!ResultedInDomainReload) + { + WorkItemComplete(); + } + } + + private bool CheckForCancellation() + { + if (Context.ExecutionStatus != TestExecutionStatus.Running) + { + Result.SetResult(ResultState.Cancelled, "Test cancelled by user"); + return true; + } + + return false; + } + + private void InitializeSetUpAndTearDownCommands() + { + List setUpTearDownItems = _suite.TypeInfo != null + ? CommandBuilder.BuildSetUpTearDownList(_suite.TypeInfo.Type, typeof(OneTimeSetUpAttribute), typeof(OneTimeTearDownAttribute)) + : new List(); + + var actionItems = new List(); + foreach (ITestAction action in Actions) + { + bool applyToSuite = (action.Targets & ActionTargets.Suite) == ActionTargets.Suite + || action.Targets == ActionTargets.Default && !(Test is ParameterizedMethodSuite); + + bool applyToTest = (action.Targets & ActionTargets.Test) == ActionTargets.Test + && !(Test is ParameterizedMethodSuite); + + if (applyToSuite) + actionItems.Add(new TestActionItem(action)); + + if (applyToTest) + Context.UpstreamActions.Add(action); + } + + _setupCommand = CommandBuilder.MakeOneTimeSetUpCommand(_suite, setUpTearDownItems, actionItems); + _teardownCommand = CommandBuilder.MakeOneTimeTearDownCommand(_suite, setUpTearDownItems, actionItems); + } + + private void PerformOneTimeSetUp() + { + var logScope = new LogScope(); + try + { + _setupCommand.Execute(Context); + } + catch (Exception ex) + { + if (ex is NUnitException || ex is TargetInvocationException) + ex = ex.InnerException; + + Result.RecordException(ex, FailureSite.SetUp); + } + + if (logScope.AnyFailingLogs()) + { + Result.RecordException(new UnhandledLogMessageException(logScope.FailingLogs.First())); + } + logScope.Dispose(); + } + + private IEnumerable RunChildren() + { + int childCount = Children.Count; + if (childCount == 0) + throw new InvalidOperationException("RunChildren called but item has no children"); + + _childTestCountdown = new CountdownEvent(childCount); + + foreach (UnityWorkItem child in Children) + { + if (CheckForCancellation()) + { + yield break; + } + + var unityTestExecutionContext = new UnityTestExecutionContext(Context); + child.InitializeContext(unityTestExecutionContext); + + var enumerable = child.Execute().GetEnumerator(); + + while (true) + { + if (!enumerable.MoveNext()) + { + break; + } + ResultedInDomainReload |= child.ResultedInDomainReload; + yield return enumerable.Current; + } + + _suiteResult.AddResult(child.Result); + childCount--; + } + + if (childCount > 0) + { + while (childCount-- > 0) + CountDownChildTest(); + } + } + + private void CreateChildWorkItems() + { + Children = new List(); + var testSuite = _suite; + + foreach (ITest test in testSuite.Tests) + { + if (_childFilter.Pass(test)) + { + var child = m_Factory.Create(test, _childFilter); + + if (test.Properties.ContainsKey(PropertyNames.Order)) + { + Children.Insert(0, child); + _countOrder++; + } + else + { + Children.Add(child); + } + } + } + + if (_countOrder != 0) SortChildren(); + } + + private class UnityWorkItemOrderComparer : IComparer + { + public int Compare(UnityWorkItem x, UnityWorkItem y) + { + var xKey = int.MaxValue; + var yKey = int.MaxValue; + + if (x.Test.Properties.ContainsKey(PropertyNames.Order)) + xKey = (int)x.Test.Properties[PropertyNames.Order][0]; + + if (y.Test.Properties.ContainsKey(PropertyNames.Order)) + yKey = (int)y.Test.Properties[PropertyNames.Order][0]; + + return xKey.CompareTo(yKey); + } + } + + private void SortChildren() + { + Children.Sort(0, _countOrder, new UnityWorkItemOrderComparer()); + } + + private void SkipFixture(ResultState resultState, string message, string stackTrace) + { + Result.SetResult(resultState.WithSite(FailureSite.SetUp), message, StackFilter.Filter(stackTrace)); + SkipChildren(_suite, resultState.WithSite(FailureSite.Parent), "OneTimeSetUp: " + message); + } + + private void SkipChildren(TestSuite suite, ResultState resultState, string message) + { + foreach (Test child in suite.Tests) + { + if (_childFilter.Pass(child)) + { + Context.Listener.TestStarted(child); + TestResult childResult = child.MakeTestResult(); + childResult.SetResult(resultState, message); + _suiteResult.AddResult(childResult); + + if (child.IsSuite) + SkipChildren((TestSuite)child, resultState, message); + + Context.Listener.TestFinished(childResult); + } + } + } + + private void PerformOneTimeTearDown() + { + _teardownCommand.Execute(Context); + } + + private string GetSkipReason() + { + return (string)Test.Properties.Get(PropertyNames.SkipReason); + } + + private string GetProviderStackTrace() + { + return (string)Test.Properties.Get(PropertyNames.ProviderStackTrace); + } + + private void CountDownChildTest() + { + _childTestCountdown.Signal(); + if (_childTestCountdown.CurrentCount == 0) + { + if (Context.ExecutionStatus != TestExecutionStatus.AbortRequested) + PerformOneTimeTearDown(); + + foreach (var childResult in _suiteResult.Children) + if (childResult.ResultState == ResultState.Cancelled) + { + this.Result.SetResult(ResultState.Cancelled, "Cancelled by user"); + break; + } + + WorkItemComplete(); + } + } + + public override void Cancel(bool force) + { + if (Children == null) + return; + + foreach (var child in Children) + { + var ctx = child.Context; + if (ctx != null) + ctx.ExecutionStatus = force ? TestExecutionStatus.AbortRequested : TestExecutionStatus.StopRequested; + + if (child.State == WorkItemState.Running) + child.Cancel(force); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs.meta new file mode 100644 index 0000000..355dd71 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 110d5035a36a6a34580fb65bb40cd78f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs new file mode 100644 index 0000000..666a8dd --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestTools.Utils; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class CoroutineTestWorkItem : UnityWorkItem + { + private static MonoBehaviour m_MonoBehaviourCoroutineRunner; + private TestCommand m_Command; + + public static MonoBehaviour monoBehaviourCoroutineRunner + { + get + { + if (m_MonoBehaviourCoroutineRunner == null) + { + throw new NullReferenceException("MonoBehaviour coroutine runner not set"); + } + return m_MonoBehaviourCoroutineRunner; + } + set { m_MonoBehaviourCoroutineRunner = value; } + } + + public CoroutineTestWorkItem(TestMethod test, ITestFilter filter) + : base(test, null) + { + m_Command = m_Command = TestCommandBuilder.BuildTestCommand(test, filter); + } + + protected override IEnumerable PerformWork() + { + if (m_Command is SkipCommand) + { + m_Command.Execute(Context); + Result = Context.CurrentResult; + WorkItemComplete(); + yield break; + } + + if (m_Command is ApplyChangesToContextCommand) + { + var applyChangesToContextCommand = (ApplyChangesToContextCommand)m_Command; + applyChangesToContextCommand.ApplyChanges(Context); + m_Command = applyChangesToContextCommand.GetInnerCommand(); + } + + var enumerableTestMethodCommand = (IEnumerableTestMethodCommand)m_Command; + try + { + var executeEnumerable = enumerableTestMethodCommand.ExecuteEnumerable(Context).GetEnumerator(); + + var coroutineRunner = new CoroutineRunner(monoBehaviourCoroutineRunner, Context); + yield return coroutineRunner.HandleEnumerableTest(executeEnumerable); + + if (coroutineRunner.HasFailedWithTimeout()) + { + Context.CurrentResult.SetResult(ResultState.Failure, string.Format("Test exceeded Timeout value of {0}ms", Context.TestCaseTimeout)); + } + + while (executeEnumerable.MoveNext()) {} + + Result = Context.CurrentResult; + } + finally + { + WorkItemComplete(); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs.meta new file mode 100644 index 0000000..f5eb998 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b557515fff172984e8c4400b43f1c631 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs new file mode 100644 index 0000000..b1dad83 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestTools; +using SetUpTearDownCommand = NUnit.Framework.Internal.Commands.SetUpTearDownCommand; +using TestActionCommand = NUnit.Framework.Internal.Commands.TestActionCommand; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class EditModeTestCallbacks + { + public static Action RestoringTestContext { get; set; } + } + + internal class DefaultTestWorkItem : UnityWorkItem + { + private TestCommand _command; + + public DefaultTestWorkItem(TestMethod test, ITestFilter filter) + : base(test, null) + { + _command = TestCommandBuilder.BuildTestCommand(test, filter); + } + + protected override IEnumerable PerformWork() + { + if (m_DontRunRestoringResult && EditModeTestCallbacks.RestoringTestContext != null) + { + EditModeTestCallbacks.RestoringTestContext(); + Result = Context.CurrentResult; + yield break; + } + + try + { + if (_command is SkipCommand || _command is FailCommand) + { + Result = _command.Execute(Context); + yield break; + } + + if (!(_command is IEnumerableTestMethodCommand)) + { + Debug.LogError("Cannot perform work on " + _command.GetType().Name); + yield break; + } + + foreach (var workItemStep in ((IEnumerableTestMethodCommand)_command).ExecuteEnumerable(Context)) + { + ResultedInDomainReload = false; + + if (workItemStep is IEditModeTestYieldInstruction) + { + var editModeTestYieldInstruction = (IEditModeTestYieldInstruction)workItemStep; + yield return editModeTestYieldInstruction; + var enumerator = editModeTestYieldInstruction.Perform(); + while (true) + { + bool moveNext; + try + { + moveNext = enumerator.MoveNext(); + } + catch (Exception e) + { + Context.CurrentResult.RecordException(e); + break; + } + + if (!moveNext) + { + break; + } + + yield return null; + } + } + else + { + yield return workItemStep; + } + } + + Result = Context.CurrentResult; + } + finally + { + WorkItemComplete(); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs.meta new file mode 100644 index 0000000..a843b77 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7cfda246e604b945b12b7afedb094ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs new file mode 100644 index 0000000..a01769d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs @@ -0,0 +1,34 @@ + +using System.Collections; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class FailCommand : TestCommand, IEnumerableTestMethodCommand + { + private ResultState m_ResultState; + private string m_Message; + + public FailCommand(Test test, ResultState resultState, string message) + : base(test) + { + m_ResultState = resultState; + m_Message = message; + } + + public override TestResult Execute(ITestExecutionContext context) + { + context.CurrentResult.SetResult(m_ResultState, m_Message); + return context.CurrentResult; + } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + context.CurrentResult.SetResult(m_ResultState, m_Message); + yield return null; + } + } + +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs.meta new file mode 100644 index 0000000..921cc0a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68e5dc8bfd5d72647a93b7f2e1da831a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs new file mode 100644 index 0000000..758e295 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs @@ -0,0 +1,10 @@ +using System.Collections; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal interface IEnumerableTestMethodCommand + { + IEnumerable ExecuteEnumerable(ITestExecutionContext context); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs.meta new file mode 100644 index 0000000..4434337 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dbd43d8a3b8122d4e89b055f53382b11 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs new file mode 100644 index 0000000..5d32f26 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs @@ -0,0 +1,13 @@ +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class PlaymodeWorkItemFactory : WorkItemFactory + { + protected override UnityWorkItem Create(TestMethod method, ITestFilter filter, ITest loadedTest) + { + return new CoroutineTestWorkItem(method, filter); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs.meta new file mode 100644 index 0000000..9c2a8ed --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7ef6801a8b664544aa9f2ab1bc1f8b60 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs new file mode 100644 index 0000000..e05910a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs @@ -0,0 +1,4 @@ +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class RestoreTestContextAfterDomainReload {} +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs.meta new file mode 100644 index 0000000..640354d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 26721f9940339264fb14bdbfe1290e21 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs new file mode 100644 index 0000000..0a0c1c3 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestTools; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal static class TestCommandBuilder + { + public static TestCommand BuildTestCommand(TestMethod test, ITestFilter filter) + { + if (test.RunState != RunState.Runnable && + !(test.RunState == RunState.Explicit && filter.IsExplicitMatch(test))) + { + return new SkipCommand(test); + } + + var testReturnsIEnumerator = test.Method.ReturnType.Type == typeof(IEnumerator); + + TestCommand command; + if (!testReturnsIEnumerator) + { + command = new TestMethodCommand(test); + } + else + { + command = new EnumerableTestMethodCommand(test); + } + + command = new UnityLogCheckDelegatingCommand(command); + foreach (var wrapper in test.Method.GetCustomAttributes(true)) + { + command = wrapper.Wrap(command); + if (command == null) + { + var message = String.Format("IWrapTestMethod implementation '{0}' returned null as command.", + wrapper.GetType().FullName); + return new FailCommand(test, ResultState.Failure, message); + } + + if (testReturnsIEnumerator && !(command is IEnumerableTestMethodCommand)) + { + command = TryReplaceWithEnumerableCommand(command); + if (command != null) + { + continue; + } + + var message = String.Format("'{0}' is not supported on {1} as it does not handle returning IEnumerator.", + wrapper.GetType().FullName, + GetTestBuilderName(test)); + return new FailCommand(test, ResultState.Failure, message); + } + } + + command = new UnityEngine.TestTools.TestActionCommand(command); + command = new UnityEngine.TestTools.SetUpTearDownCommand(command); + + if (!testReturnsIEnumerator) + { + command = new ImmediateEnumerableCommand(command); + } + + foreach (var wrapper in test.Method.GetCustomAttributes(true)) + { + command = wrapper.Wrap(command); + if (command == null) + { + var message = String.Format("IWrapSetUpTearDown implementation '{0}' returned null as command.", + wrapper.GetType().FullName); + return new FailCommand(test, ResultState.Failure, message); + } + + if (testReturnsIEnumerator && !(command is IEnumerableTestMethodCommand)) + { + command = TryReplaceWithEnumerableCommand(command); + if (command != null) + { + continue; + } + + var message = String.Format("'{0}' is not supported on {1} as it does not handle returning IEnumerator.", + wrapper.GetType().FullName, + GetTestBuilderName(test)); + return new FailCommand(test, ResultState.Failure, message); + } + } + + command = new EnumerableSetUpTearDownCommand(command); + command = new OuterUnityTestActionCommand(command); + + IApplyToContext[] changes = test.Method.GetCustomAttributes(true); + if (changes.Length > 0) + { + command = new EnumerableApplyChangesToContextCommand(command, changes); + } + + return command; + } + + private static string GetTestBuilderName(TestMethod testMethod) + { + return new[] + { + testMethod.Method.GetCustomAttributes(true).Select(attribute => attribute.GetType().Name), + testMethod.Method.GetCustomAttributes(true).Select(attribute => attribute.GetType().Name) + }.SelectMany(v => v).FirstOrDefault(); + } + + private static TestCommand TryReplaceWithEnumerableCommand(TestCommand command) + { + switch (command.GetType().Name) + { + case nameof(RepeatAttribute.RepeatedTestCommand): + return new EnumerableRepeatedTestCommand(command as RepeatAttribute.RepeatedTestCommand); + case nameof(RetryAttribute.RetryCommand): + return new EnumerableRetryTestCommand(command as RetryAttribute.RetryCommand); + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs.meta new file mode 100644 index 0000000..769bce6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f40df9c8cf926b241b093a37028d8815 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs new file mode 100644 index 0000000..05b725a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestTools; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + class UnityLogCheckDelegatingCommand : DelegatingTestCommand, IEnumerableTestMethodCommand + { + static Dictionary s_AttributeCache = new Dictionary(); + + public UnityLogCheckDelegatingCommand(TestCommand innerCommand) + : base(innerCommand) {} + + public override TestResult Execute(ITestExecutionContext context) + { + using (var logScope = new LogScope()) + { + if (ExecuteAndCheckLog(logScope, context.CurrentResult, () => innerCommand.Execute(context))) + PostTestValidation(logScope, innerCommand, context.CurrentResult); + } + + return context.CurrentResult; + } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + if (!(innerCommand is IEnumerableTestMethodCommand enumerableTestMethodCommand)) + { + Execute(context); + yield break; + } + + using (var logScope = new LogScope()) + { + IEnumerable executeEnumerable = null; + + if (!ExecuteAndCheckLog(logScope, context.CurrentResult, + () => executeEnumerable = enumerableTestMethodCommand.ExecuteEnumerable(context))) + yield break; + + foreach (var step in executeEnumerable) + { + // do not check expected logs here - we want to permit expecting and receiving messages to run + // across frames. (but we do always want to catch a fail immediately.) + if (!CheckFailingLogs(logScope, context.CurrentResult)) + yield break; + + yield return step; + } + + if (!CheckLogs(context.CurrentResult, logScope)) + yield break; + + PostTestValidation(logScope, innerCommand, context.CurrentResult); + } + } + + static bool CaptureException(TestResult result, Action action) + { + try + { + action(); + return true; + } + catch (Exception e) + { + result.RecordException(e); + return false; + } + } + + static bool ExecuteAndCheckLog(LogScope logScope, TestResult result, Action action) + => CaptureException(result, action) && CheckLogs(result, logScope); + + static void PostTestValidation(LogScope logScope, TestCommand command, TestResult result) + { + if (MustExpect(command.Test.Method.MethodInfo)) + CaptureException(result, logScope.NoUnexpectedReceived); + } + + static bool CheckLogs(TestResult result, LogScope logScope) + => CheckFailingLogs(logScope, result) && CheckExpectedLogs(logScope, result); + + static bool CheckFailingLogs(LogScope logScope, TestResult result) + { + if (!logScope.AnyFailingLogs()) + return true; + + var failingLog = logScope.FailingLogs.First(); + result.RecordException(new UnhandledLogMessageException(failingLog)); + return false; + } + + static bool CheckExpectedLogs(LogScope logScope, TestResult result) + { + if (!logScope.ExpectedLogs.Any()) + return true; + + var expectedLog = logScope.ExpectedLogs.Peek(); + result.RecordException(new UnexpectedLogMessageException(expectedLog)); + return false; + } + + static bool MustExpect(MemberInfo method) + { + // method + + var methodAttr = method.GetCustomAttributes(true).FirstOrDefault(); + if (methodAttr != null) + return methodAttr.MustExpect; + + // fixture + + var fixture = method.DeclaringType; + if (!s_AttributeCache.TryGetValue(fixture, out var mustExpect)) + { + var fixtureAttr = fixture.GetCustomAttributes(true).FirstOrDefault(); + mustExpect = s_AttributeCache[fixture] = fixtureAttr?.MustExpect; + } + + if (mustExpect != null) + return mustExpect.Value; + + // assembly + + var assembly = fixture.Assembly; + if (!s_AttributeCache.TryGetValue(assembly, out mustExpect)) + { + var assemblyAttr = assembly.GetCustomAttributes().FirstOrDefault(); + mustExpect = s_AttributeCache[assembly] = assemblyAttr?.MustExpect; + } + + return mustExpect == true; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs.meta new file mode 100644 index 0000000..86d9d9e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 48230e4e90fb4d14a9d56bddea898413 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs new file mode 100644 index 0000000..96ed23a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs @@ -0,0 +1,98 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestTools; +using UnityEngine.TestTools.NUnitExtensions; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal interface IUnityTestAssemblyRunner + { + ITest LoadedTest { get; } + ITestResult Result { get; } + bool IsTestLoaded { get; } + bool IsTestRunning { get; } + bool IsTestComplete { get; } + UnityWorkItem TopLevelWorkItem { get; set; } + UnityTestExecutionContext GetCurrentContext(); + ITest Load(Assembly[] assemblies, TestPlatform testPlatform, IDictionary settings); + IEnumerable Run(ITestListener listener, ITestFilter filter); + void StopRun(); + } + + internal class UnityTestAssemblyRunner : IUnityTestAssemblyRunner + { + private readonly UnityTestAssemblyBuilder unityBuilder; + private readonly WorkItemFactory m_Factory; + + protected UnityTestExecutionContext Context { get; set; } + + public UnityTestExecutionContext GetCurrentContext() + { + return UnityTestExecutionContext.CurrentContext; + } + + protected IDictionary Settings { get; set; } + public ITest LoadedTest { get; protected set; } + + public ITestResult Result + { + get { return TopLevelWorkItem == null ? null : TopLevelWorkItem.Result; } + } + + public bool IsTestLoaded + { + get { return LoadedTest != null; } + } + + public bool IsTestRunning + { + get { return TopLevelWorkItem != null && TopLevelWorkItem.State == NUnit.Framework.Internal.Execution.WorkItemState.Running; } + } + public bool IsTestComplete + { + get { return TopLevelWorkItem != null && TopLevelWorkItem.State == NUnit.Framework.Internal.Execution.WorkItemState.Complete; } + } + + public UnityTestAssemblyRunner(UnityTestAssemblyBuilder builder, WorkItemFactory factory) + { + unityBuilder = builder; + m_Factory = factory; + Context = new UnityTestExecutionContext(); + } + + public ITest Load(Assembly[] assemblies, TestPlatform testPlatform, IDictionary settings) + { + Settings = settings; + + if (settings.ContainsKey(FrameworkPackageSettings.RandomSeed)) + Randomizer.InitialSeed = (int)settings[FrameworkPackageSettings.RandomSeed]; + + return LoadedTest = unityBuilder.Build(assemblies, Enumerable.Repeat(testPlatform, assemblies.Length).ToArray(), settings); + } + + public IEnumerable Run(ITestListener listener, ITestFilter filter) + { + TopLevelWorkItem = m_Factory.Create(LoadedTest, filter); + TopLevelWorkItem.InitializeContext(Context); + UnityTestExecutionContext.CurrentContext = Context; + Context.Listener = listener; + + return TopLevelWorkItem.Execute(); + } + + public UnityWorkItem TopLevelWorkItem { get; set; } + + public void StopRun() + { + if (IsTestRunning) + { + TopLevelWorkItem.Cancel(false); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs.meta new file mode 100644 index 0000000..96179c5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 874e40a588dbb1e48bc128d686337d4e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs new file mode 100644 index 0000000..08bd03d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using NUnit.Framework; +using NUnit.Framework.Constraints; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestTools; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class UnityTestExecutionContext : ITestExecutionContext + { + private readonly UnityTestExecutionContext _priorContext; + private TestResult _currentResult; + private int _assertCount; + + public static UnityTestExecutionContext CurrentContext { get; set; } + + public UnityTestExecutionContext Context { get; private set; } + + public Test CurrentTest { get; set; } + public DateTime StartTime { get; set; } + public long StartTicks { get; set; } + public TestResult CurrentResult + { + get { return _currentResult; } + set + { + _currentResult = value; + if (value != null) + OutWriter = value.OutWriter; + } + } + + public object TestObject { get; set; } + public string WorkDirectory { get; set; } + + + private TestExecutionStatus _executionStatus; + public TestExecutionStatus ExecutionStatus + { + get + { + // ExecutionStatus may have been set to StopRequested or AbortRequested + // in a prior context. If so, reflect the same setting in this context. + if (_executionStatus == TestExecutionStatus.Running && _priorContext != null) + _executionStatus = _priorContext.ExecutionStatus; + + return _executionStatus; + } + set + { + _executionStatus = value; + + // Push the same setting up to all prior contexts + if (_priorContext != null) + _priorContext.ExecutionStatus = value; + } + } + + public List UpstreamActions { get; private set; } + public int TestCaseTimeout { get; set; } + public CultureInfo CurrentCulture { get; set; } + public CultureInfo CurrentUICulture { get; set; } + public ITestListener Listener { get; set; } + + public UnityTestExecutionContext() + { + UpstreamActions = new List(); + CurrentContext = this; + } + + public UnityTestExecutionContext(UnityTestExecutionContext other) + { + _priorContext = other; + + CurrentTest = other.CurrentTest; + CurrentResult = other.CurrentResult; + TestObject = other.TestObject; + WorkDirectory = other.WorkDirectory; + Listener = other.Listener; + TestCaseTimeout = other.TestCaseTimeout; + UpstreamActions = new List(other.UpstreamActions); + SetUpTearDownState = other.SetUpTearDownState; + OuterUnityTestActionState = other.OuterUnityTestActionState; + + TestContext.CurrentTestExecutionContext = this; + + CurrentCulture = other.CurrentCulture; + CurrentUICulture = other.CurrentUICulture; + CurrentContext = this; + } + + public TextWriter OutWriter { get; private set; } + public bool StopOnError { get; set; } + + public IWorkItemDispatcher Dispatcher { get; set; } + + public ParallelScope ParallelScope { get; set; } + public string WorkerId { get; private set; } + public Randomizer RandomGenerator { get; private set; } + public ValueFormatter CurrentValueFormatter { get; private set; } + public bool IsSingleThreaded { get; set; } + public BeforeAfterTestCommandState SetUpTearDownState { get; set; } + public BeforeAfterTestCommandState OuterUnityTestActionState { get; set; } + public int EnumerableRepeatedTestState { get; set; } + public int EnumerableRetryTestState { get; set; } + + internal int AssertCount + { + get + { + return _assertCount; + } + } + + public void IncrementAssertCount() + { + _assertCount += 1; + } + + public void AddFormatter(ValueFormatterFactory formatterFactory) + { + throw new NotImplementedException(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs.meta new file mode 100644 index 0000000..33d323b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 59ff995fabb3bac45afa0f96f333e5dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs new file mode 100644 index 0000000..71bddbd --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Execution; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal abstract class UnityWorkItem + { + protected readonly WorkItemFactory m_Factory; + protected bool m_ExecuteTestStartEvent; + protected bool m_DontRunRestoringResult; + public event EventHandler Completed; + + public bool ResultedInDomainReload { get; internal set; } + + public UnityTestExecutionContext Context { get; private set; } + + public Test Test { get; private set; } + + public TestResult Result { get; protected set; } + + public WorkItemState State { get; private set; } + + public List Actions { get; private set; } + + protected UnityWorkItem(Test test, WorkItemFactory factory) + { + m_Factory = factory; + Test = test; + Actions = new List(); + Result = test.MakeTestResult(); + State = WorkItemState.Ready; + m_ExecuteTestStartEvent = ShouldExecuteStartEvent(); + m_DontRunRestoringResult = ShouldRestore(test); + } + + protected static bool ShouldRestore(ITest loadedTest) + { + return UnityWorkItemDataHolder.alreadyExecutedTests != null && UnityWorkItemDataHolder.alreadyExecutedTests.Contains(loadedTest.FullName); + } + + protected bool ShouldExecuteStartEvent() + { + return UnityWorkItemDataHolder.alreadyStartedTests != null && UnityWorkItemDataHolder.alreadyStartedTests.All(x => x != Test.FullName) && !ShouldRestore(Test); + } + + protected abstract IEnumerable PerformWork(); + + public void InitializeContext(UnityTestExecutionContext context) + { + Context = context; + + if (Test is TestAssembly) + Actions.AddRange(ActionsHelper.GetActionsFromTestAssembly((TestAssembly)Test)); + else if (Test is ParameterizedMethodSuite) + Actions.AddRange(ActionsHelper.GetActionsFromTestMethodInfo(Test.Method)); + else if (Test.TypeInfo != null) + Actions.AddRange(ActionsHelper.GetActionsFromTypesAttributes(Test.TypeInfo.Type)); + } + + public virtual IEnumerable Execute() + { + Context.CurrentTest = this.Test; + Context.CurrentResult = this.Result; + + if (m_ExecuteTestStartEvent) + { + Context.Listener.TestStarted(Test); + } + + Context.StartTime = DateTime.UtcNow; + Context.StartTicks = Stopwatch.GetTimestamp(); + + State = WorkItemState.Running; + + return PerformWork(); + } + + protected void WorkItemComplete() + { + State = WorkItemState.Complete; + + Result.StartTime = Context.StartTime; + Result.EndTime = DateTime.UtcNow; + + long tickCount = Stopwatch.GetTimestamp() - Context.StartTicks; + double seconds = (double)tickCount / Stopwatch.Frequency; + Result.Duration = seconds; + + //Result.AssertCount += Context.AssertCount; + + Context.Listener.TestFinished(Result); + + if (Completed != null) + Completed(this, EventArgs.Empty); + + Context.TestObject = null; + Test.Fixture = null; + } + + public virtual void Cancel(bool force) + { + Context.Listener.TestFinished(Result); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs.meta new file mode 100644 index 0000000..48b9f92 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 79ced2556f0af814a840b86232613ff1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs new file mode 100644 index 0000000..d9fb700 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class UnityWorkItemDataHolder + { + public static List alreadyStartedTests = new List(); + public static List alreadyExecutedTests; + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs.meta new file mode 100644 index 0000000..6d90872 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b3e90046c38f1d4dad2e0d5a79e871c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs new file mode 100644 index 0000000..94d9c0f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs @@ -0,0 +1,28 @@ +using System.Collections; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal abstract class WorkItemFactory + { + public UnityWorkItem Create(ITest loadedTest, ITestFilter filter) + { + TestSuite suite = loadedTest as TestSuite; + if (suite != null) + { + return new CompositeWorkItem(suite, filter, this); + } + + var testMethod = (TestMethod)loadedTest; + if (testMethod.Method.ReturnType.Type != typeof(IEnumerator)) + { + return new DefaultTestWorkItem(testMethod, filter); + } + + return Create(testMethod, filter, loadedTest); + } + + protected abstract UnityWorkItem Create(TestMethod method, ITestFilter filter, ITest loadedTest); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs.meta new file mode 100644 index 0000000..e5f0377 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c15bf0966eb95847a4260d830a30d30 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs new file mode 100644 index 0000000..e4ea3fe --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs @@ -0,0 +1,146 @@ +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions.Filters; + +namespace UnityEngine.TestRunner.NUnitExtensions +{ + internal static class TestExtensions + { + private static IEnumerable GetTestCategories(this ITest test) + { + var categories = test.Properties[PropertyNames.Category].Cast().ToList(); + if (categories.Count == 0 && test is TestMethod) + { + // only mark tests as Uncategorized if the test fixture doesn't have a category, + // otherwise the test inherits the Fixture category + var fixtureCategories = test.Parent.Properties[PropertyNames.Category].Cast().ToList(); + if (fixtureCategories.Count == 0) + categories.Add(CategoryFilterExtended.k_DefaultCategory); + } + return categories; + } + + public static bool HasCategory(this ITest test, string[] categoryFilter) + { + var categories = test.GetAllCategoriesFromTest().Distinct(); + return categoryFilter.Any(c => categories.Any(r => r == c)); + } + + public static List GetAllCategoriesFromTest(this ITest test) + { + if (test.Parent == null) + return test.GetTestCategories().ToList(); + + var categories = GetAllCategoriesFromTest(test.Parent); + categories.AddRange(test.GetTestCategories()); + return categories; + } + + public static void ParseForNameDuplicates(this ITest test) + { + var duplicates = new Dictionary(); + for (var i = 0; i < test.Tests.Count; i++) + { + var child = test.Tests[i]; + int count; + if (duplicates.TryGetValue(child.FullName, out count)) + { + count++; + child.Properties.Add("childIndex", count); + duplicates[child.FullName] = count; + } + else + { + duplicates.Add(child.FullName, 1); + } + ParseForNameDuplicates(child); + } + } + + public static int GetChildIndex(this ITest test) + { + var index = test.Properties["childIndex"]; + return (int)index[0]; + } + + public static bool HasChildIndex(this ITest test) + { + var index = test.Properties["childIndex"]; + return index.Count > 0; + } + + static string GetAncestorPath(ITest test) + { + var path = ""; + var testParent = test.Parent; + + while (testParent != null && testParent.Parent != null && !string.IsNullOrEmpty(testParent.Name)) + { + path = testParent.Name + "/" + path; + testParent = testParent.Parent; + } + + return path; + } + + public static string GetUniqueName(this ITest test) + { + var id = GetAncestorPath(test) + GetFullName(test); + if (test.HasChildIndex()) + { + var index = test.GetChildIndex(); + if (index >= 0) + id += index; + } + if (test.IsSuite) + { + id += "[suite]"; + } + return id; + } + + public static string GetFullName(ITest test) + { + if (test.TypeInfo == null && (test.Parent == null || test.Parent.TypeInfo == null)) + { + return "[" + test.FullName + "]"; + } + var assemblyId = test.TypeInfo == null ? test.Parent.TypeInfo.Assembly.GetName().Name : test.TypeInfo.Assembly.GetName().Name; + return string.Format("[{0}][{1}]", assemblyId, test.FullName); + } + + public static string GetSkipReason(this ITest test) + { + if (test.Properties.ContainsKey(PropertyNames.SkipReason)) + return (string)test.Properties.Get(PropertyNames.SkipReason); + + return null; + } + + public static string GetParentId(this ITest test) + { + if (test.Parent != null) + return test.Parent.Id; + + return null; + } + + public static string GetParentFullName(this ITest test) + { + if (test.Parent != null) + return test.Parent.FullName; + + return null; + } + + public static string GetParentUniqueName(this ITest test) + { + if (test.Parent != null) + return GetUniqueName(test.Parent); + + return null; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs.meta new file mode 100644 index 0000000..3230eb4 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bc74398aa3944646ade4ee78cd57484 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs new file mode 100644 index 0000000..d79072b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs @@ -0,0 +1,77 @@ +using System; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestRunner.NUnitExtensions +{ + internal static class TestResultExtensions + { + public static void RecordPrefixedException(this TestResult testResult, string prefix, Exception ex, ResultState resultState = null) + + { + if (ex is NUnitException) + { + ex = ex.InnerException; + } + + if (resultState == null) + { + resultState = testResult.ResultState == ResultState.Cancelled + ? ResultState.Cancelled + : ResultState.Error; + } + + var exceptionMessage = ExceptionHelper.BuildMessage(ex); + string stackTrace = "--" + prefix + NUnit.Env.NewLine + ExceptionHelper.BuildStackTrace(ex); + if (testResult.StackTrace != null) + { + stackTrace = testResult.StackTrace + NUnit.Env.NewLine + stackTrace; + } + + if (testResult.Test.IsSuite) + { + resultState = resultState.WithSite(FailureSite.TearDown); + } + + if (ex is ResultStateException) + { + exceptionMessage = ex.Message; + resultState = ((ResultStateException)ex).ResultState; + stackTrace = StackFilter.Filter(ex.StackTrace); + } + + string message = (string.IsNullOrEmpty(prefix) ? "" : (prefix + " : ")) + exceptionMessage; + if (testResult.Message != null) + { + message = testResult.Message + NUnit.Env.NewLine + message; + } + + testResult.SetResult(resultState, message, stackTrace); + } + + public static void RecordPrefixedError(this TestResult testResult, string prefix, string error, ResultState resultState = null) + + { + if (resultState == null) + { + resultState = testResult.ResultState == ResultState.Cancelled + ? ResultState.Cancelled + : ResultState.Error; + } + + if (testResult.Test.IsSuite) + { + resultState = resultState.WithSite(FailureSite.TearDown); + } + + string message = (string.IsNullOrEmpty(prefix) ? "" : (prefix + " : ")) + error; + if (testResult.Message != null) + { + message = testResult.Message + NUnit.Env.NewLine + message; + } + + testResult.SetResult(resultState, message); + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs.meta new file mode 100644 index 0000000..ff97b17 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 65fb6da362a78334ab360a125cfafdaf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs new file mode 100644 index 0000000..3f00546 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using NUnit; +using NUnit.Framework.Api; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools.NUnitExtensions +{ + internal class UnityTestAssemblyBuilder : DefaultTestAssemblyBuilder + { + private readonly string m_ProductName; + public UnityTestAssemblyBuilder() + { + m_ProductName = Application.productName; + } + + public ITest Build(Assembly[] assemblies, TestPlatform[] testPlatforms, IDictionary options) + { + var test = BuildAsync(assemblies, testPlatforms, options); + while (test.MoveNext()) + { + } + + return test.Current; + } + + public IEnumerator BuildAsync(Assembly[] assemblies, TestPlatform[] testPlatforms, IDictionary options) + { + var productName = string.Join("_", m_ProductName.Split(Path.GetInvalidFileNameChars())); + var suite = new TestSuite(productName); + for (var index = 0; index < assemblies.Length; index++) + { + var assembly = assemblies[index]; + var platform = testPlatforms[index]; + + var assemblySuite = Build(assembly, options) as TestSuite; + if (assemblySuite != null && assemblySuite.HasChildren) + { + assemblySuite.Properties.Set("platform", platform); + suite.Add(assemblySuite); + } + + yield return null; + } + + yield return suite; + } + + public static Dictionary GetNUnitTestBuilderSettings(TestPlatform testPlatform) + { + var emptySettings = new Dictionary(); + emptySettings.Add(FrameworkPackageSettings.TestParameters, "platform=" + testPlatform); + return emptySettings; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs.meta new file mode 100644 index 0000000..f0fdf17 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 98ba0396e4b4ee8498a8f097affcfddf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner.meta new file mode 100644 index 0000000..e44f879 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ddb9e1c877ea80479d1eab4ddaa5d0d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks.meta new file mode 100644 index 0000000..899ce79 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 61e236e8570a95e4eb754fb291e102e0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs new file mode 100644 index 0000000..d792687 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs @@ -0,0 +1,47 @@ +using NUnit.Framework; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.TestRunner.Callbacks +{ + [AddComponentMenu("")] + internal class PlayModeRunnerCallback : MonoBehaviour, ITestRunnerListener + { + private TestResultRenderer m_ResultRenderer; + + public void RunFinished(ITestResult testResults) + { + Application.logMessageReceivedThreaded -= LogRecieved; + if (Camera.main == null) + { + gameObject.AddComponent(); + } + m_ResultRenderer = new TestResultRenderer(testResults); + m_ResultRenderer.ShowResults(); + } + + public void TestFinished(ITestResult result) + { + } + + public void OnGUI() + { + if (m_ResultRenderer != null) + m_ResultRenderer.Draw(); + } + + public void RunStarted(ITest testsToRun) + { + Application.logMessageReceivedThreaded += LogRecieved; + } + + public void TestStarted(ITest test) + { + } + + private void LogRecieved(string message, string stacktrace, LogType type) + { + if (TestContext.Out != null) + TestContext.Out.WriteLine(message); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs.meta new file mode 100644 index 0000000..15706d5 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3cf5cb9e1ef590c48b1f919f2a7bd895 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs new file mode 100644 index 0000000..b72947f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework.Interfaces; +using UnityEngine.Networking.PlayerConnection; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEngine.TestTools.TestRunner.Callbacks +{ + [AddComponentMenu("")] + internal class RemoteTestResultSender : MonoBehaviour, ITestRunnerListener + { + private class QueueData + { + public Guid id { get; set; } + public byte[] data { get; set; } + } + + private const int k_aliveMessageFrequency = 120; + private float m_NextliveMessage = k_aliveMessageFrequency; + private readonly Queue m_SendQueue = new Queue(); + private readonly object m_LockQueue = new object(); + private readonly IRemoteTestResultDataFactory m_TestResultDataFactory = new RemoteTestResultDataFactory(); + + public void Start() + { + PlayerConnection.instance.Register(PlayerConnectionMessageIds.quitPlayerMessageId, EditorProccessedTheResult); + StartCoroutine(SendDataRoutine()); + } + + private void EditorProccessedTheResult(MessageEventArgs arg0) + { + if (arg0.data != null) + { + return; + } + + //Some platforms don't quit, so we need to disconnect to make sure they will not connect to another editor instance automatically. + PlayerConnection.instance.DisconnectAll(); + + //XBOX has an error when quitting + if (Application.platform == RuntimePlatform.XboxOne) + { + return; + } + Application.Quit(); + } + + private byte[] SerializeObject(object objectToSerialize) + { + return Encoding.UTF8.GetBytes(JsonUtility.ToJson(objectToSerialize)); + } + + public void RunStarted(ITest testsToRun) + { + var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(testsToRun)); + lock (m_LockQueue) + { + m_SendQueue.Enqueue(new QueueData + { + id = PlayerConnectionMessageIds.runStartedMessageId, + data = data + }); + } + } + + public void RunFinished(ITestResult testResults) + { + var data = SerializeObject(m_TestResultDataFactory.CreateFromTestResult(testResults)); + lock (m_LockQueue) + { + m_SendQueue.Enqueue(new QueueData { id = PlayerConnectionMessageIds.runFinishedMessageId, data = data, }); + } + } + + public void TestStarted(ITest test) + { + var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(test)); + lock (m_LockQueue) + { + m_SendQueue.Enqueue(new QueueData + { + id = PlayerConnectionMessageIds.testStartedMessageId, + data = data + }); + } + } + + public void TestFinished(ITestResult result) + { + var testRunnerResultForApi = m_TestResultDataFactory.CreateFromTestResult(result); + var resultData = SerializeObject(testRunnerResultForApi); + lock (m_LockQueue) + { + m_SendQueue.Enqueue(new QueueData + { + id = PlayerConnectionMessageIds.testFinishedMessageId, + data = resultData, + }); + } + } + + public IEnumerator SendDataRoutine() + { + while (!PlayerConnection.instance.isConnected) + { + yield return new WaitForSeconds(1); + } + + while (true) + { + lock (m_LockQueue) + { + if (PlayerConnection.instance.isConnected && m_SendQueue.Count > 0) + { + ResetNextPlayerAliveMessageTime(); + var queueData = m_SendQueue.Dequeue(); + PlayerConnection.instance.Send(queueData.id, queueData.data); + yield return null; + } + + //This is needed so we dont stall the player totally + if (!m_SendQueue.Any()) + { + SendAliveMessageIfNeeded(); + yield return new WaitForSeconds(0.02f); + } + } + } + } + + private void SendAliveMessageIfNeeded() + { + if (Time.timeSinceLevelLoad < m_NextliveMessage) + { + return; + } + + Debug.Log("Sending player alive message back to editor."); + ResetNextPlayerAliveMessageTime(); + PlayerConnection.instance.Send(PlayerConnectionMessageIds.playerAliveHeartbeat, new byte[0]); + } + + private void ResetNextPlayerAliveMessageTime() + { + m_NextliveMessage = Time.timeSinceLevelLoad + k_aliveMessageFrequency; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs.meta new file mode 100644 index 0000000..cbb4d40 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 20793418366caf14293b29c55df5e9ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs new file mode 100644 index 0000000..3d59430 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools.TestRunner.Callbacks +{ + internal class TestResultRenderer + { + private static class Styles + { + public static readonly GUIStyle SucceedLabelStyle; + public static readonly GUIStyle FailedLabelStyle; + public static readonly GUIStyle FailedMessagesStyle; + + static Styles() + { + SucceedLabelStyle = new GUIStyle("label"); + SucceedLabelStyle.normal.textColor = Color.green; + SucceedLabelStyle.fontSize = 48; + + FailedLabelStyle = new GUIStyle("label"); + FailedLabelStyle.normal.textColor = Color.red; + FailedLabelStyle.fontSize = 32; + + FailedMessagesStyle = new GUIStyle("label"); + FailedMessagesStyle.wordWrap = false; + FailedMessagesStyle.richText = true; + } + } + + private readonly List m_FailedTestCollection; + + private bool m_ShowResults; + private Vector2 m_ScrollPosition; + + public TestResultRenderer(ITestResult testResults) + { + m_FailedTestCollection = new List(); + GetFailedTests(testResults); + } + + private void GetFailedTests(ITestResult testResults) + { + if (testResults is TestCaseResult) + { + if (testResults.ResultState.Status == TestStatus.Failed) + m_FailedTestCollection.Add(testResults); + } + else if (testResults.HasChildren) + { + foreach (var testResultsChild in testResults.Children) + { + GetFailedTests(testResultsChild); + } + } + } + + private const int k_MaxStringLength = 15000; + + public void ShowResults() + { + m_ShowResults = true; + Cursor.visible = true; + } + + public void Draw() + { + if (!m_ShowResults) return; + if (m_FailedTestCollection.Count == 0) + { + GUILayout.Label("All test(s) succeeded", Styles.SucceedLabelStyle, GUILayout.Width(600)); + } + else + { + int count = m_FailedTestCollection.Count; + GUILayout.Label(count + " tests failed!", Styles.FailedLabelStyle); + + m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition, GUILayout.ExpandWidth(true)); + var text = ""; + + text += "Code-based tests\n"; + text += string.Join("\n", m_FailedTestCollection + .Select(result => result.Name + " " + result.ResultState + "\n" + result.Message) + .ToArray()); + + if (text.Length > k_MaxStringLength) + text = text.Substring(0, k_MaxStringLength); + + GUILayout.TextArea(text, Styles.FailedMessagesStyle); + GUILayout.EndScrollView(); + } + if (GUILayout.Button("Close")) + Application.Quit(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs.meta new file mode 100644 index 0000000..02cca20 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5ebb87899ca30b743bb4274bc00c02b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs new file mode 100644 index 0000000..b5d23f7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs @@ -0,0 +1,36 @@ +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.TestRunner.Callbacks +{ + internal class TestResultRendererCallback : MonoBehaviour, ITestRunnerListener + { + private TestResultRenderer m_ResultRenderer; + public void RunStarted(ITest testsToRun) + { + } + + public void RunFinished(ITestResult testResults) + { + if (Camera.main == null) + { + gameObject.AddComponent(); + } + m_ResultRenderer = new TestResultRenderer(testResults); + m_ResultRenderer.ShowResults(); + } + + public void OnGUI() + { + if (m_ResultRenderer != null) + m_ResultRenderer.Draw(); + } + + public void TestStarted(ITest test) + { + } + + public void TestFinished(ITestResult result) + { + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs.meta new file mode 100644 index 0000000..deaa0ae --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dfc336f10b83bd74eaded16a658275c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs new file mode 100644 index 0000000..6a2fa5b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs @@ -0,0 +1,26 @@ +using System; +using NUnit.Framework.Interfaces; +using UnityEngine.Events; + +namespace UnityEngine.TestTools.TestRunner +{ + internal interface ITestRunnerListener + { + void RunStarted(ITest testsToRun); + void RunFinished(ITestResult testResults); + void TestStarted(ITest test); + void TestFinished(ITestResult result); + } + + [Serializable] + internal class TestFinishedEvent : UnityEvent {} + + [Serializable] + internal class TestStartedEvent : UnityEvent {} + + [Serializable] + internal class RunFinishedEvent : UnityEvent {} + + [Serializable] + internal class RunStartedEvent : UnityEvent {} +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs.meta new file mode 100644 index 0000000..848ab3d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d1b534518943030499685344fd1d476d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Messages.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Messages.meta new file mode 100644 index 0000000..5ab167c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Messages.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 256a0ca37fa972840bce7fca446e75e7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs new file mode 100644 index 0000000..df7acb2 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs @@ -0,0 +1,12 @@ +using System.Collections; + +namespace UnityEngine.TestTools +{ + public interface IEditModeTestYieldInstruction + { + bool ExpectDomainReload { get; } + bool ExpectedPlaymodeState { get; } + + IEnumerator Perform(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs.meta new file mode 100644 index 0000000..f61c35a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 898bc38486fc899428fbe5bd6adfe473 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs new file mode 100644 index 0000000..87091ca --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine.SceneManagement; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.NUnitExtensions; +using UnityEngine.TestTools.Utils; + +namespace UnityEngine.TestTools.TestRunner +{ + [Serializable] + [AddComponentMenu("")] + internal class PlaymodeTestsController : MonoBehaviour + { + private IEnumerator m_TestSteps; + + [SerializeField] + private List m_AssembliesWithTests; + public List AssembliesWithTests + { + get + { + return m_AssembliesWithTests; + } + set + { + m_AssembliesWithTests = value; + } + } + + [SerializeField] + internal TestStartedEvent testStartedEvent = new TestStartedEvent(); + [SerializeField] + internal TestFinishedEvent testFinishedEvent = new TestFinishedEvent(); + [SerializeField] + internal RunStartedEvent runStartedEvent = new RunStartedEvent(); + [SerializeField] + internal RunFinishedEvent runFinishedEvent = new RunFinishedEvent(); + + internal const string kPlaymodeTestControllerName = "Code-based tests runner"; + + [SerializeField] + public PlaymodeTestsControllerSettings settings = new PlaymodeTestsControllerSettings(); + + internal UnityTestAssemblyRunner m_Runner; + + public IEnumerator Start() + { + //Skip 2 frame because Unity. + yield return null; + yield return null; + StartCoroutine(Run()); + } + + internal static bool IsControllerOnScene() + { + return GameObject.Find(kPlaymodeTestControllerName) != null; + } + + internal static PlaymodeTestsController GetController() + { + return GameObject.Find(kPlaymodeTestControllerName).GetComponent(); + } + + public IEnumerator TestRunnerCoroutine() + { + while (m_TestSteps.MoveNext()) + { + yield return m_TestSteps.Current; + } + + if (m_Runner.IsTestComplete) + { + runFinishedEvent.Invoke(m_Runner.Result); + Cleanup(); + + yield return null; + } + } + + public IEnumerator Run() + { + CoroutineTestWorkItem.monoBehaviourCoroutineRunner = this; + gameObject.hideFlags |= HideFlags.DontSave; + + if (settings.sceneBased) + { + SceneManager.LoadScene(1, LoadSceneMode.Additive); + yield return null; + } + + var testListUtil = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), m_AssembliesWithTests); + m_Runner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), new PlaymodeWorkItemFactory()); + + var loadedTests = m_Runner.Load(testListUtil.GetUserAssemblies().Select(a => a.Assembly).ToArray(), TestPlatform.PlayMode, UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode)); + loadedTests.ParseForNameDuplicates(); + runStartedEvent.Invoke(m_Runner.LoadedTest); + + var testListenerWrapper = new TestListenerWrapper(testStartedEvent, testFinishedEvent); + m_TestSteps = m_Runner.Run(testListenerWrapper, settings.BuildNUnitFilter()).GetEnumerator(); + + yield return TestRunnerCoroutine(); + } + + public void Cleanup() + { + if (m_Runner != null) + { + m_Runner.StopRun(); + m_Runner = null; + } + if (Application.isEditor) + { + Destroy(gameObject); + } + } + + public static void TryCleanup() + { + var controller = GetController(); + if (controller != null) + { + controller.Cleanup(); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs.meta new file mode 100644 index 0000000..9693778 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 102e512f651ee834f951a2516c1ea3b8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs new file mode 100644 index 0000000..f40586b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs @@ -0,0 +1,36 @@ +using System; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal.Filters; +using UnityEngine.SceneManagement; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEngine.TestTools.TestRunner +{ + [Serializable] + internal class PlaymodeTestsControllerSettings + { + [SerializeField] + public TestRunnerFilter[] filters; + public bool sceneBased; + public string originalScene; + public string bootstrapScene; + + public static PlaymodeTestsControllerSettings CreateRunnerSettings(TestRunnerFilter[] filters) + { + var settings = new PlaymodeTestsControllerSettings + { + filters = filters, + sceneBased = false, + originalScene = SceneManager.GetActiveScene().path, + bootstrapScene = null + }; + return settings; + } + + internal ITestFilter BuildNUnitFilter() + { + return new OrFilter(filters.Select(f => f.BuildNUnitFilter()).ToArray()); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs.meta new file mode 100644 index 0000000..06448a7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2799eb4c84e72e54092a292cf626936b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers.meta new file mode 100644 index 0000000..d23c0a7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 91c20d2c22b8b3a4cb6c816bd225591a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs new file mode 100644 index 0000000..fffba29 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs @@ -0,0 +1,11 @@ +using System; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + internal interface IRemoteTestResultDataFactory + { + RemoteTestResultDataWithTestData CreateFromTestResult(ITestResult result); + RemoteTestResultDataWithTestData CreateFromTest(ITest test); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs.meta new file mode 100644 index 0000000..3bc8e30 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 874c0713cdc44f549b0161750b48d2c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs new file mode 100644 index 0000000..162ad0b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs @@ -0,0 +1,14 @@ +using System; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + internal static class PlayerConnectionMessageIds + { + public static Guid runStartedMessageId { get { return new Guid("6a7f53dd-4672-461d-a7b5-9467e9393fd3"); } } + public static Guid runFinishedMessageId { get { return new Guid("ffb622fc-34ad-4901-8d7b-47fb04b0bdd4"); } } + public static Guid testStartedMessageId { get { return new Guid("b54d241e-d88d-4dba-8c8f-ee415d11c030"); } } + public static Guid testFinishedMessageId { get { return new Guid("72f7b7f4-6829-4cd1-afde-78872b9d5adc"); } } + public static Guid quitPlayerMessageId { get { return new Guid("ab44bfe0-bb50-4ee6-9977-69d2ea6bb3a0"); } } + public static Guid playerAliveHeartbeat { get { return new Guid("8c0c307b-f7fd-4216-8623-35b4b3f55fb6"); } } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs.meta new file mode 100644 index 0000000..bf86f7e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 41d60936b62cc6d4ca7fe628b22b0e40 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs new file mode 100644 index 0000000..6559b45 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs @@ -0,0 +1,56 @@ +using System; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + [Serializable] + internal class RemoteTestData + { + public string id; + public string name; + public string fullName; + public int testCaseCount; + public int ChildIndex; + public bool hasChildren; + public bool isSuite; + public string[] childrenIds; + public int testCaseTimeout; + public string[] Categories; + public bool IsTestAssembly; + public RunState RunState; + public string Description; + public string SkipReason; + public string ParentId; + public string UniqueName; + public string ParentUniqueName; + public string ParentFullName; + + internal RemoteTestData(ITest test) + { + id = test.Id; + name = test.Name; + fullName = test.FullName; + testCaseCount = test.TestCaseCount; + ChildIndex = -1; + if (test.Properties["childIndex"].Count > 0) + { + ChildIndex = (int)test.Properties["childIndex"][0]; + } + hasChildren = test.HasChildren; + isSuite = test.IsSuite; + childrenIds = test.Tests.Select(t => t.Id).ToArray(); + Categories = test.GetAllCategoriesFromTest().ToArray(); + IsTestAssembly = test is TestAssembly; + RunState = (RunState)Enum.Parse(typeof(RunState), test.RunState.ToString()); + Description = (string)test.Properties.Get(PropertyNames.Description); + SkipReason = test.GetSkipReason(); + ParentId = test.GetParentId(); + UniqueName = test.GetUniqueName(); + ParentUniqueName = test.GetParentUniqueName(); + ParentFullName = test.GetParentFullName(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs.meta new file mode 100644 index 0000000..0c286dc --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b135ec222fdcd11468014c90d11d6821 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs new file mode 100644 index 0000000..90f82a4 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + [Serializable] + internal class RemoteTestResultData + { + public string testId; + public string name; + public string fullName; + public string resultState; + public TestStatus testStatus; + public double duration; + public DateTime startTime; + public DateTime endTime; + public string message; + public string stackTrace; + public int assertCount; + public int failCount; + public int passCount; + public int skipCount; + public int inconclusiveCount; + public bool hasChildren; + public string output; + public string xml; + public string[] childrenIds; + + internal RemoteTestResultData(ITestResult result) + { + testId = result.Test.Id; + name = result.Name; + fullName = result.FullName; + resultState = result.ResultState.ToString(); + testStatus = result.ResultState.Status; + duration = result.Duration; + startTime = result.StartTime; + endTime = result.EndTime; + message = result.Message; + stackTrace = result.StackTrace; + assertCount = result.AssertCount; + failCount = result.FailCount; + passCount = result.PassCount; + skipCount = result.SkipCount; + inconclusiveCount = result.InconclusiveCount; + hasChildren = result.HasChildren; + output = result.Output; + xml = result.ToXml(true).OuterXml; + childrenIds = result.Children.Select(child => child.Test.Id).ToArray(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs.meta new file mode 100644 index 0000000..a213e6b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03e4d63665d06f04c8a6cf68133c1592 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs new file mode 100644 index 0000000..0b3cd03 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + internal class RemoteTestResultDataFactory : IRemoteTestResultDataFactory + { + public RemoteTestResultDataWithTestData CreateFromTestResult(ITestResult result) + { + var tests = CreateTestDataList(result.Test); + tests.First().testCaseTimeout = UnityTestExecutionContext.CurrentContext.TestCaseTimeout; + return new RemoteTestResultDataWithTestData() + { + results = CreateTestResultDataList(result), + tests = tests + }; + } + + public RemoteTestResultDataWithTestData CreateFromTest(ITest test) + { + var tests = CreateTestDataList(test); + if (UnityTestExecutionContext.CurrentContext != null) + { + tests.First().testCaseTimeout = UnityTestExecutionContext.CurrentContext.TestCaseTimeout; + } + + return new RemoteTestResultDataWithTestData() + { + tests = tests + }; + } + + private RemoteTestData[] CreateTestDataList(ITest test) + { + var list = new List(); + list.Add(new RemoteTestData(test)); + list.AddRange(test.Tests.SelectMany(CreateTestDataList)); + return list.ToArray(); + } + + private static RemoteTestResultData[] CreateTestResultDataList(ITestResult result) + { + var list = new List(); + list.Add(new RemoteTestResultData(result)); + list.AddRange(result.Children.SelectMany(CreateTestResultDataList)); + return list.ToArray(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs.meta new file mode 100644 index 0000000..bc0dd7c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 826b6becaef90fb458eedebe4c2f3664 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs new file mode 100644 index 0000000..36124cc --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + [Serializable] + internal class RemoteTestResultDataWithTestData + { + public RemoteTestResultData[] results; + public RemoteTestData[] tests; + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs.meta new file mode 100644 index 0000000..ffab8f6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 475e3699f219c854f8581a9838135002 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs new file mode 100644 index 0000000..525da47 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs @@ -0,0 +1,51 @@ +using System.Collections; +using System.Linq; +using System.Reflection; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools.TestRunner.GUI +{ + class SynchronousFilter : ITestFilter + { + public TNode ToXml(bool recursive) + { + return new TNode("synchronousOnly"); + } + + public TNode AddToXml(TNode parentNode, bool recursive) + { + return parentNode.AddElement("synchronousOnly"); + } + + public bool Pass(ITest test) + { + if (test.Method == null) + return true; + + if (test.Method.ReturnType.Type == typeof(IEnumerator)) + return false; + + if (test.Method.GetCustomAttributes(true).Any()) + return false; + + if (test.TypeInfo?.Type != null) + { + if (Reflect.GetMethodsWithAttribute(test.TypeInfo.Type, typeof(UnitySetUpAttribute), true) + .Any(mi => mi.ReturnType == typeof(System.Collections.IEnumerator))) + return false; + + if (Reflect.GetMethodsWithAttribute(test.TypeInfo.Type, typeof(UnityTearDownAttribute), true) + .Any(mi => mi.ReturnType == typeof(System.Collections.IEnumerator))) + return false; + } + + return true; + } + + public bool IsExplicitMatch(ITest test) + { + return Pass(test); + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs.meta new file mode 100644 index 0000000..08c6010 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b9aec9d3b0a86466ab4647d01e8fc87d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs new file mode 100644 index 0000000..5ed2ec8 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class TestEnumeratorWrapper + { + private readonly TestMethod m_TestMethod; + + public TestEnumeratorWrapper(TestMethod testMethod) + { + m_TestMethod = testMethod; + } + + public IEnumerator GetEnumerator(ITestExecutionContext context) + { + if (m_TestMethod.Method.ReturnType.Type == typeof(IEnumerator)) + { + return HandleEnumerableTest(context); + } + var message = string.Format("Return type {0} of {1} in {2} is not supported.", + m_TestMethod.Method.ReturnType, m_TestMethod.Method.Name, m_TestMethod.Method.TypeInfo.FullName); + if (m_TestMethod.Method.ReturnType.Type == typeof(IEnumerable)) + { + message += "\nDid you mean IEnumerator?"; + } + throw new InvalidSignatureException(message); + } + + private IEnumerator HandleEnumerableTest(ITestExecutionContext context) + { + try + { + return m_TestMethod.Method.MethodInfo.Invoke(context.TestObject, m_TestMethod.parms != null ? m_TestMethod.parms.OriginalArguments : null) as IEnumerator; + } + catch (TargetInvocationException e) + { + if (e.InnerException is IgnoreException) + { + context.CurrentResult.SetResult(ResultState.Ignored, e.InnerException.Message); + return null; + } + throw; + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs.meta new file mode 100644 index 0000000..f19ee3e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9ad0b0c865b01af4ca1b414689e71259 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs new file mode 100644 index 0000000..ffa23de --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs @@ -0,0 +1,30 @@ +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class TestListenerWrapper : ITestListener + { + private readonly TestFinishedEvent m_TestFinishedEvent; + private readonly TestStartedEvent m_TestStartedEvent; + + public TestListenerWrapper(TestStartedEvent testStartedEvent, TestFinishedEvent testFinishedEvent) + { + m_TestStartedEvent = testStartedEvent; + m_TestFinishedEvent = testFinishedEvent; + } + + public void TestStarted(ITest test) + { + m_TestStartedEvent.Invoke(test); + } + + public void TestFinished(ITestResult result) + { + m_TestFinishedEvent.Invoke(result); + } + + public void TestOutput(TestOutput output) + { + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs.meta new file mode 100644 index 0000000..aefe039 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 73deb9b8722aa284eab27c4dc90956c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestPlatform.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestPlatform.cs new file mode 100644 index 0000000..21a6ec2 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestPlatform.cs @@ -0,0 +1,21 @@ +using System; + +namespace UnityEngine.TestTools +{ + [Flags] + [Serializable] + public enum TestPlatform : byte + { + All = 0xFF, + EditMode = 1 << 1, + PlayMode = 1 << 2 + } + + internal static class TestPlatformEnumExtensions + { + public static bool IsFlagIncluded(this TestPlatform flags, TestPlatform flag) + { + return (flags & flag) == flag; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestPlatform.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestPlatform.cs.meta new file mode 100644 index 0000000..6eb087a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestPlatform.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 743879b4db4bc1a4b829aae4386f4acf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestRunnerFilter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestRunnerFilter.cs new file mode 100644 index 0000000..f1f46a4 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestRunnerFilter.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using System.IO; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Filters; +using UnityEngine.TestRunner.NUnitExtensions.Filters; + +namespace UnityEngine.TestTools.TestRunner.GUI +{ + [Serializable] + internal class TestRunnerFilter + { +#pragma warning disable 649 + public string[] assemblyNames; + public string[] groupNames; + public string[] categoryNames; + public static TestRunnerFilter empty = new TestRunnerFilter(); + public string[] testNames; + public int testRepetitions = 1; + public bool synchronousOnly = false; + + public static string AssemblyNameFromPath(string path) + { + string output = Path.GetFileName(path); + if (output != null && output.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) + return output.Substring(0, output.Length - 4); + return output; + } + + private bool CategoryMatches(IEnumerable categories) + { + if (categoryNames == null || categoryNames.Length == 0) + return true; + + foreach (string category in categories) + { + if (categoryNames.Contains(category)) + return true; + } + + return false; + } + + private bool IDMatchesAssembly(string id) + { + if (AreOptionalFiltersEmpty()) + return true; + + if (assemblyNames == null) + return false; + + int openingBracket = id.IndexOf('['); + int closingBracket = id.IndexOf(']'); + if (openingBracket >= 0 && openingBracket < id.Length && closingBracket > openingBracket && openingBracket < id.Length) + { + //Some assemblies are absolute and explicitly part of the test ID e.g. + //"[/path/to/assembly-name.dll][rest of ID ...]" + //While some are minimal assembly names e.g. + //"[assembly-name][rest of ID ...]" + //Strip them down to just the assembly name + string assemblyNameFromID = AssemblyNameFromPath(id.Substring(openingBracket + 1, closingBracket - openingBracket - 1)); + foreach (string assemblyName in assemblyNames) + { + if (assemblyName.Equals(assemblyNameFromID, StringComparison.OrdinalIgnoreCase)) + return true; + } + } + return false; + } + + private bool NameMatches(string name) + { + if (AreOptionalFiltersEmpty()) + return true; + + if (groupNames == null) + return false; + + foreach (var nameFromFilter in groupNames) + { + //Strict regex match for test group name on its own + if (Regex.IsMatch(name, nameFromFilter)) + return true; + //Match test names that end with parametrized test values and full nunit generated test names that have . separators + var regex = nameFromFilter.TrimEnd('$') + @"[\.|\(.*\)]"; + if (Regex.IsMatch(name, regex)) + return true; + } + return false; + } + + private bool AreOptionalFiltersEmpty() + { + if (assemblyNames != null && assemblyNames.Length != 0) + return false; + if (groupNames != null && groupNames.Length != 0) + return false; + if (testNames != null && testNames.Length != 0) + return false; + return true; + } + + private bool NameMatchesExactly(string name) + { + if (AreOptionalFiltersEmpty()) + return true; + + if (testNames == null) + return false; + + foreach (var exactName in testNames) + { + if (name == exactName) + return true; + } + return false; + } + + private static void ClearAncestors(IEnumerable newResultList, string parentID) + { + if (string.IsNullOrEmpty(parentID)) + return; + foreach (var result in newResultList) + { + if (result.Id == parentID) + { + result.Clear(); + ClearAncestors(newResultList, result.ParentId); + break; + } + } + } + + public void ClearResults(List newResultList) + { + foreach (var result in newResultList) + { + if (!result.IsSuite && CategoryMatches(result.Categories)) + { + if (IDMatchesAssembly(result.Id) || NameMatches(result.FullName) || NameMatchesExactly(result.FullName)) + { + result.Clear(); + ClearAncestors(newResultList, result.ParentId); + } + } + } + } + + public ITestFilter BuildNUnitFilter() + { + var filters = new List(); + + if (testNames != null && testNames.Length != 0) + { + var nameFilter = new OrFilter(testNames.Select(n => new FullNameFilter(n)).ToArray()); + filters.Add(nameFilter); + } + + if (groupNames != null && groupNames.Length != 0) + { + var exactNamesFilter = new OrFilter(groupNames.Select(n => + { + var f = new FullNameFilter(n); + f.IsRegex = true; + return f; + }).ToArray()); + filters.Add(exactNamesFilter); + } + + if (assemblyNames != null && assemblyNames.Length != 0) + { + var assemblyFilter = new OrFilter(assemblyNames.Select(c => new AssemblyNameFilter(c)).ToArray()); + filters.Add(assemblyFilter); + } + + if (categoryNames != null && categoryNames.Length != 0) + { + var categoryFilter = new OrFilter(categoryNames.Select(c => new CategoryFilterExtended(c) {IsRegex = true}).ToArray()); + filters.Add(categoryFilter); + } + + if (synchronousOnly) + { + filters.Add(new SynchronousFilter()); + } + + return filters.Count == 0 ? TestFilter.Empty : new AndFilter(filters.ToArray()); + } + + internal interface IClearableResult + { + string Id { get; } + string FullName { get; } + string ParentId { get; } + bool IsSuite { get; } + List Categories { get; } + void Clear(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestRunnerFilter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestRunnerFilter.cs.meta new file mode 100644 index 0000000..5f9aa3b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/TestRunner/TestRunnerFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a025ba7ee40d0104db8d08b1d9eabb0d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef new file mode 100644 index 0000000..6dc17da --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef @@ -0,0 +1,13 @@ +{ + "name": "UnityEngine.TestRunner", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll" + ], + "autoReferenced": false, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef.meta new file mode 100644 index 0000000..a2002fd --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 27619889b8ba8c24980f49ee34dbb44a +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils.meta new file mode 100644 index 0000000..d9503ad --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bb32bccaf32a6db448d1c0cc99c78688 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider.meta new file mode 100644 index 0000000..a8326f0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 51557afa652635743b264a309f0a5c60 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs new file mode 100644 index 0000000..9edc517 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs @@ -0,0 +1,12 @@ +using System.Reflection; + +namespace UnityEngine.TestTools.Utils +{ + internal class AssemblyLoadProxy : IAssemblyLoadProxy + { + public IAssemblyWrapper Load(string assemblyString) + { + return new AssemblyWrapper(Assembly.Load(assemblyString)); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs.meta new file mode 100644 index 0000000..8bb527d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb593906b7b6d824087dcaebf6c082e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs new file mode 100644 index 0000000..cb46f1b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs @@ -0,0 +1,30 @@ +using System; +using System.Reflection; + +namespace UnityEngine.TestTools.Utils +{ + internal class AssemblyWrapper : IAssemblyWrapper + { + public AssemblyWrapper(Assembly assembly) + { + Assembly = assembly; + } + + public Assembly Assembly { get; } + + public virtual string Location + { + get + { + //Some platforms dont support this + throw new NotImplementedException(); + } + } + + public virtual AssemblyName[] GetReferencedAssemblies() + { + //Some platforms dont support this + throw new NotImplementedException(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs.meta new file mode 100644 index 0000000..1e4a718 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e3b9bbf2c1a3cd4f88883ca32882ec6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs new file mode 100644 index 0000000..feffa62 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools.Utils +{ + internal interface IAssemblyLoadProxy + { + IAssemblyWrapper Load(string assemblyString); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs.meta new file mode 100644 index 0000000..284d33b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 12dfd4bdbb5c8e6419432fbc54ef25d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs new file mode 100644 index 0000000..145c682 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs @@ -0,0 +1,11 @@ +using System.Reflection; + +namespace UnityEngine.TestTools.Utils +{ + internal interface IAssemblyWrapper + { + Assembly Assembly { get; } + string Location { get; } + AssemblyName[] GetReferencedAssemblies(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs.meta new file mode 100644 index 0000000..486888d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1c5afe945b715e149a70113a4be7b32a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs new file mode 100644 index 0000000..0dc2b7f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools.Utils +{ + internal interface IScriptingRuntimeProxy + { + string[] GetAllUserAssemblies(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs.meta new file mode 100644 index 0000000..85ae985 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fe4aef60e4ace544c8430da8ef8acba2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs new file mode 100644 index 0000000..74f2769 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs @@ -0,0 +1,10 @@ +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.Utils +{ + internal interface ITestAssemblyProvider + { + ITest GetTestsWithNUnit(); + IAssemblyWrapper[] GetUserAssemblies(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs.meta new file mode 100644 index 0000000..d7e856b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c5acba6181d845c4e92146009bd4480f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs new file mode 100644 index 0000000..bb0aa94 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestTools.NUnitExtensions; + +namespace UnityEngine.TestTools.Utils +{ + internal class PlayerTestAssemblyProvider + { + private IAssemblyLoadProxy m_AssemblyLoadProxy; + private readonly List m_AssembliesToLoad; + + //Cached until domain reload + private static List m_LoadedAssemblies; + + internal PlayerTestAssemblyProvider(IAssemblyLoadProxy assemblyLoadProxy, List assembliesToLoad) + { + m_AssemblyLoadProxy = assemblyLoadProxy; + m_AssembliesToLoad = assembliesToLoad; + LoadAssemblies(); + } + + public ITest GetTestsWithNUnit() + { + return BuildTests(TestPlatform.PlayMode, m_LoadedAssemblies.ToArray()); + } + + public List GetUserAssemblies() + { + return m_LoadedAssemblies; + } + + protected static ITest BuildTests(TestPlatform testPlatform, IAssemblyWrapper[] assemblies) + { + var settings = UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(testPlatform); + var builder = new UnityTestAssemblyBuilder(); + return builder.Build(assemblies.Select(a => a.Assembly).ToArray(), Enumerable.Repeat(testPlatform, assemblies.Length).ToArray(), settings); + } + + private void LoadAssemblies() + { + if (m_LoadedAssemblies != null) + { + return; + } + + m_LoadedAssemblies = new List(); + + foreach (var userAssembly in m_AssembliesToLoad) + { + IAssemblyWrapper a; + try + { + a = m_AssemblyLoadProxy.Load(userAssembly); + } + catch (FileNotFoundException) + { + continue; + } + if (a != null) + m_LoadedAssemblies.Add(a); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs.meta new file mode 100644 index 0000000..ffee12c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 43a3aec217baa9644a7cf34b5f93fed9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs new file mode 100644 index 0000000..0f1eb2b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs @@ -0,0 +1,10 @@ +namespace UnityEngine.TestTools.Utils +{ + internal class ScriptingRuntimeProxy : IScriptingRuntimeProxy + { + public string[] GetAllUserAssemblies() + { + return ScriptingRuntime.GetAllUserAssemblies(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs.meta new file mode 100644 index 0000000..7b16cb9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f3a361a6ad1aff14ba8f48976e94ad76 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AttributeHelper.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AttributeHelper.cs new file mode 100644 index 0000000..7d710cb --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AttributeHelper.cs @@ -0,0 +1,45 @@ +using System; +using System.IO; +using System.Linq; + +namespace UnityEngine.TestTools +{ + internal static class AttributeHelper + { + internal static Type GetTargetClassFromName(string targetClassName, Type attributeInterface) + { + Type targetClass = null; + foreach (var assemblyName in ScriptingRuntime.GetAllUserAssemblies()) + { + // we need to pass the assembly name without the .dll extension, so removing that first + var name = Path.GetFileNameWithoutExtension(assemblyName); + targetClass = Type.GetType(targetClassName + "," + name); + if (targetClass != null) + break; + } + + if (targetClass == null) + { + Debug.LogWarningFormat("Class type not found: " + targetClassName); + return null; + } + + ValidateTargetClass(targetClass, attributeInterface); + return targetClass; + } + + private static void ValidateTargetClass(Type targetClass, Type attributeInterface) + { + var constructorInfos = targetClass.GetConstructors(); + if (constructorInfos.All(constructor => constructor.GetParameters().Length != 0)) + { + Debug.LogWarningFormat("{0} does not implement default constructor", targetClass.Name); + } + + if (!attributeInterface.IsAssignableFrom(targetClass)) + { + Debug.LogWarningFormat("{0} does not implement {1}", targetClass.Name, attributeInterface.Name); + } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AttributeHelper.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AttributeHelper.cs.meta new file mode 100644 index 0000000..cc47e6f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/AttributeHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ae8ce3ffe04ac2c42945fd27e0291fc3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs new file mode 100644 index 0000000..073aa08 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class ColorEqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.01f; + private readonly float AllowedError; + + + private static readonly ColorEqualityComparer m_Instance = new ColorEqualityComparer(); + public static ColorEqualityComparer Instance { get { return m_Instance; } } + + private ColorEqualityComparer() : this(k_DefaultError) + { + } + + public ColorEqualityComparer(float error) + { + this.AllowedError = error; + } + + public bool Equals(Color expected, Color actual) + { + return Utils.AreFloatsEqualAbsoluteError(expected.r, actual.r, AllowedError) && + Utils.AreFloatsEqualAbsoluteError(expected.g, actual.g, AllowedError) && + Utils.AreFloatsEqualAbsoluteError(expected.b, actual.b, AllowedError) && + Utils.AreFloatsEqualAbsoluteError(expected.a, actual.a, AllowedError); + } + + public int GetHashCode(Color color) + { + return 0; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs.meta new file mode 100644 index 0000000..42da075 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d6105bc8cf5ce544487daca4cbc62583 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/CoroutineRunner.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/CoroutineRunner.cs new file mode 100644 index 0000000..db4d769 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/CoroutineRunner.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools.Utils +{ + internal class CoroutineRunner + { + private bool m_Running; + private bool m_TestFailed; + private bool m_Timeout; + private readonly MonoBehaviour m_Controller; + private readonly UnityTestExecutionContext m_Context; + private Coroutine m_TimeOutCoroutine; + private IEnumerator m_TestCoroutine; + + internal const int k_DefaultTimeout = 1000 * 180; + + public CoroutineRunner(MonoBehaviour playmodeTestsController, UnityTestExecutionContext context) + { + m_Controller = playmodeTestsController; + m_Context = context; + } + + public IEnumerator HandleEnumerableTest(IEnumerator testEnumerator) + { + if (m_Context.TestCaseTimeout == 0) + { + m_Context.TestCaseTimeout = k_DefaultTimeout; + } + do + { + if (!m_Running) + { + m_Running = true; + m_TestCoroutine = ExMethod(testEnumerator, m_Context.TestCaseTimeout); + m_Controller.StartCoroutine(m_TestCoroutine); + } + if (m_TestFailed) + { + StopAllRunningCoroutines(); + yield break; + } + + if (m_Context.ExecutionStatus == TestExecutionStatus.StopRequested || m_Context.ExecutionStatus == TestExecutionStatus.AbortRequested) + { + StopAllRunningCoroutines(); + yield break; + } + yield return null; + } + while (m_Running); + } + + private void StopAllRunningCoroutines() + { + if (m_TimeOutCoroutine != null) + { + m_Controller.StopCoroutine(m_TimeOutCoroutine); + } + + if (m_TestCoroutine != null) + { + m_Controller.StopCoroutine(m_TestCoroutine); + } + } + + private IEnumerator ExMethod(IEnumerator e, int timeout) + { + m_TimeOutCoroutine = m_Controller.StartCoroutine(StartTimer(e, timeout, + () => + { + m_TestFailed = true; + m_Timeout = true; + m_Running = false; + })); + + yield return m_Controller.StartCoroutine(e); + m_Controller.StopCoroutine(m_TimeOutCoroutine); + m_Running = false; + } + + private IEnumerator StartTimer(IEnumerator coroutineToBeKilled, int timeout, Action onTimeout) + { + yield return new WaitForSecondsRealtime(timeout / 1000f); + if (coroutineToBeKilled != null) + m_Controller.StopCoroutine(coroutineToBeKilled); + if (onTimeout != null) + onTimeout(); + } + + public bool HasFailedWithTimeout() + { + return m_Timeout; + } + + public int GetDefaultTimeout() + { + return k_DefaultTimeout; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/CoroutineRunner.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/CoroutineRunner.cs.meta new file mode 100644 index 0000000..756d54e --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/CoroutineRunner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 24a158219395ebf44a60547b97784ddc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs new file mode 100644 index 0000000..58438a7 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class FloatEqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly FloatEqualityComparer m_Instance = new FloatEqualityComparer(); + public static FloatEqualityComparer Instance { get { return m_Instance; } } + + private FloatEqualityComparer() : this(k_DefaultError) {} + + public FloatEqualityComparer(float allowedError) + { + this.AllowedError = allowedError; + } + + public bool Equals(float expected, float actual) + { + return Utils.AreFloatsEqual(expected, actual, AllowedError); + } + + public int GetHashCode(float value) + { + return 0; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs.meta new file mode 100644 index 0000000..7497131 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: af5042802f06c804c8abddd544b77a4a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs new file mode 100644 index 0000000..ff0fe77 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs @@ -0,0 +1,19 @@ +using System.Collections; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools +{ + /// + /// When implemented by an attribute, this interface implemented to provide actions to execute before setup and after teardown of tests. + /// + public interface IOuterUnityTestAction + { + /// Executed before each test is run + /// The test that is going to be run. + IEnumerator BeforeTest(ITest test); + + /// Executed after each test is run + /// The test that has just been run. + IEnumerator AfterTest(ITest test); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs.meta new file mode 100644 index 0000000..93429d4 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b9c2a6302985d3846b7b9f6fd9e2da9a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs new file mode 100644 index 0000000..489357c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools +{ + public interface IPostBuildCleanup + { + void Cleanup(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs.meta new file mode 100644 index 0000000..f1cb9a9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff67c526455160f4690a44f74dee4cbe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs new file mode 100644 index 0000000..3920b0b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools +{ + public interface IPrebuildSetup + { + void Setup(); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs.meta new file mode 100644 index 0000000..77dff87 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: acc16f0c684508f44813662a300c574b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ITestRunCallback.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ITestRunCallback.cs new file mode 100644 index 0000000..d2944fc --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ITestRunCallback.cs @@ -0,0 +1,12 @@ +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestRunner +{ + public interface ITestRunCallback + { + void RunStarted(ITest testsToRun); + void RunFinished(ITestResult testResults); + void TestStarted(ITest test); + void TestFinished(ITestResult result); + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ITestRunCallback.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ITestRunCallback.cs.meta new file mode 100644 index 0000000..09f6f53 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/ITestRunCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38d0b8a87b967304da08a2ae9b955066 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest.meta new file mode 100644 index 0000000..5da2eb9 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ce8da628f68c7594b8b9a597fa52db7b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs new file mode 100644 index 0000000..334da4c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools +{ + public interface IMonoBehaviourTest + { + bool IsTestFinished {get; } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs.meta new file mode 100644 index 0000000..9af4004 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a002d3737b873954395b7cf862873ab8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs new file mode 100644 index 0000000..e0b6372 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs @@ -0,0 +1,23 @@ +namespace UnityEngine.TestTools +{ + public class MonoBehaviourTest : CustomYieldInstruction where T : MonoBehaviour, IMonoBehaviourTest + { + public T component { get; } + public GameObject gameObject { get { return component.gameObject; } } + + public MonoBehaviourTest(bool dontDestroyOnLoad = true) + { + var go = new GameObject("MonoBehaviourTest: " + typeof(T).FullName); + component = go.AddComponent(); + if (dontDestroyOnLoad) + { + Object.DontDestroyOnLoad(go); + } + } + + public override bool keepWaiting + { + get { return !component.IsTestFinished; } + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs.meta new file mode 100644 index 0000000..c727f85 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 164c9b1458eaab743a4b45c37a4d720d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs new file mode 100644 index 0000000..2b91efb --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public class PostBuildCleanupAttribute : Attribute + { + public PostBuildCleanupAttribute(Type targetClass) + { + TargetClass = targetClass; + } + + public PostBuildCleanupAttribute(string targetClassName) + { + TargetClass = AttributeHelper.GetTargetClassFromName(targetClassName, typeof(IPostBuildCleanup)); + } + + internal Type TargetClass { get; private set; } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs.meta new file mode 100644 index 0000000..b45a7a6 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 621fd19bcb071b64aa1d68f0271aa780 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs new file mode 100644 index 0000000..86326fb --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public class PrebuildSetupAttribute : Attribute + { + public PrebuildSetupAttribute(Type targetClass) + { + TargetClass = targetClass; + } + + public PrebuildSetupAttribute(string targetClassName) + { + TargetClass = AttributeHelper.GetTargetClassFromName(targetClassName, typeof(IPrebuildSetup)); + } + + internal Type TargetClass { get; private set; } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs.meta new file mode 100644 index 0000000..7b6ae4a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d1b7ce919aa8864409412e809073cf96 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs new file mode 100644 index 0000000..220f1aa --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class QuaternionEqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.00001f; + private readonly float AllowedError; + + private static readonly QuaternionEqualityComparer m_Instance = new QuaternionEqualityComparer(); + public static QuaternionEqualityComparer Instance { get { return m_Instance; } } + + + private QuaternionEqualityComparer() : this(k_DefaultError) {} + + public QuaternionEqualityComparer(float allowedError) + { + AllowedError = allowedError; + } + + public bool Equals(Quaternion expected, Quaternion actual) + { + return Mathf.Abs(Quaternion.Dot(expected, actual)) > (1.0f - AllowedError); + } + + public int GetHashCode(Quaternion quaternion) + { + return 0; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs.meta new file mode 100644 index 0000000..31faf0c --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b28913f21577de429da928d6d05219f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/StacktraceFilter.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/StacktraceFilter.cs new file mode 100644 index 0000000..af431f3 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/StacktraceFilter.cs @@ -0,0 +1,43 @@ +using System.Linq; +using System.Text; + +namespace UnityEngine.TestTools.Utils +{ + internal static class StackTraceFilter + { + private static readonly string[] s_FilteredLogMessages = + { + @"UnityEngine.DebugLogHandler:Internal_Log", + @"UnityEngine.DebugLogHandler:Log", + @"UnityEngine.Logger:Log", + @"UnityEngine.Debug" + }; + + private static readonly string[] s_LastMessages = + { + @"System.Reflection.MonoMethod:InternalInvoke(Object, Object[], Exception&)", + @"UnityEditor.TestTools.TestRunner.EditModeRunner:InvokeDelegator" + }; + + public static string Filter(string inputStackTrace) + { + int idx; + foreach (var lastMessage in s_LastMessages) + { + idx = inputStackTrace.IndexOf(lastMessage); + if (idx != -1) + inputStackTrace = inputStackTrace.Substring(0, idx); + } + + var inputStackTraceLines = inputStackTrace.Split('\n'); + var result = new StringBuilder(); + foreach (var line in inputStackTraceLines) + { + if (s_FilteredLogMessages.Any(s => line.StartsWith(s))) + continue; + result.AppendLine(line); + } + return result.ToString(); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/StacktraceFilter.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/StacktraceFilter.cs.meta new file mode 100644 index 0000000..4f837a1 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/StacktraceFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fc748d99f1f0d484a811a566fc7915ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs new file mode 100644 index 0000000..48561ed --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs @@ -0,0 +1,24 @@ +using System; + +namespace UnityEngine.TestRunner +{ + [AttributeUsage(AttributeTargets.Assembly)] + public class TestRunCallbackAttribute : Attribute + { + private Type m_Type; + public TestRunCallbackAttribute(Type type) + { + var interfaceType = typeof(ITestRunCallback); + if (!interfaceType.IsAssignableFrom(type)) + { + throw new ArgumentException(string.Format("Type provided to {0} does not implement {1}", this.GetType().Name, interfaceType.Name)); + } + m_Type = type; + } + + internal ITestRunCallback ConstructCallback() + { + return Activator.CreateInstance(m_Type) as ITestRunCallback; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs.meta new file mode 100644 index 0000000..06b2018 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76b3a3296de548f48b0c3d088fb4b490 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs new file mode 100644 index 0000000..d4a8c40 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestRunner.Utils +{ + internal class TestRunCallbackListener : ScriptableObject, ITestRunnerListener + { + private ITestRunCallback[] m_Callbacks; + public void RunStarted(ITest testsToRun) + { + InvokeAllCallbacks(callback => callback.RunStarted(testsToRun)); + } + + private static ITestRunCallback[] GetAllCallbacks() + { + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + allAssemblies = allAssemblies.Where(x => x.GetReferencedAssemblies().Any(z => z.Name == "UnityEngine.TestRunner")).ToArray(); + var attributes = allAssemblies.SelectMany(assembly => assembly.GetCustomAttributes(typeof(TestRunCallbackAttribute), true).OfType()).ToArray(); + return attributes.Select(attribute => attribute.ConstructCallback()).ToArray(); + } + + private void InvokeAllCallbacks(Action invoker) + { + if (m_Callbacks == null) + { + m_Callbacks = GetAllCallbacks(); + } + + foreach (var testRunCallback in m_Callbacks) + { + try + { + invoker(testRunCallback); + } + catch (Exception e) + { + Debug.LogException(e); + throw; + } + } + } + + public void RunFinished(ITestResult testResults) + { + InvokeAllCallbacks(callback => callback.RunFinished(testResults)); + } + + public void TestStarted(ITest test) + { + InvokeAllCallbacks(callback => callback.TestStarted(test)); + } + + public void TestFinished(ITestResult result) + { + InvokeAllCallbacks(callback => callback.TestFinished(result)); + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs.meta new file mode 100644 index 0000000..77f82ee --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68f09f0f82599b5448579854e622a4c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Utils.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Utils.cs new file mode 100644 index 0000000..bc8b617 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Utils.cs @@ -0,0 +1,40 @@ +using System; + +namespace UnityEngine.TestTools.Utils +{ + public static class Utils + { + public static bool AreFloatsEqual(float expected, float actual, float epsilon) + { + // special case for infinity + if (expected == Mathf.Infinity || actual == Mathf.Infinity || expected == Mathf.NegativeInfinity || actual == Mathf.NegativeInfinity) + return expected == actual; + + // we cover both relative and absolute tolerance with this check + // which is better than just relative in case of small (in abs value) args + // please note that "usually" approximation is used [i.e. abs(x)+abs(y)+1] + // but we speak about test code so we dont care that much about performance + // but we do care about checks being more precise + return Math.Abs(actual - expected) <= epsilon * Mathf.Max(Mathf.Max(Mathf.Abs(actual), Mathf.Abs(expected)), 1.0f); + } + + public static bool AreFloatsEqualAbsoluteError(float expected, float actual, float allowedAbsoluteError) + { + return Math.Abs(actual - expected) <= allowedAbsoluteError; + } + + /// + /// Analogous to GameObject.CreatePrimitive, but creates a primitive mesh renderer with fast shader instead of a default builtin shader. + /// Optimized for testing performance. + /// + /// A GameObject with primitive mesh renderer and collider. + public static GameObject CreatePrimitive(PrimitiveType type) + { + var prim = GameObject.CreatePrimitive(type); + var renderer = prim.GetComponent(); + if (renderer) + renderer.sharedMaterial = new Material(Shader.Find("VertexLit")); + return prim; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Utils.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Utils.cs.meta new file mode 100644 index 0000000..63b9c66 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Utils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9502550ba4785e3499d6c9251fa2114b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs new file mode 100644 index 0000000..081a8bb --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class Vector2ComparerWithEqualsOperator : IEqualityComparer + { + private static readonly Vector2ComparerWithEqualsOperator m_Instance = new Vector2ComparerWithEqualsOperator(); + public static Vector2ComparerWithEqualsOperator Instance { get { return m_Instance; } } + + private Vector2ComparerWithEqualsOperator() {} + + public bool Equals(Vector2 expected, Vector2 actual) + { + return expected == actual; + } + + public int GetHashCode(Vector2 vec2) + { + return 0; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs.meta new file mode 100644 index 0000000..07662bb --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 65701ebe8bada6b4785e9c7afe7f5bee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs new file mode 100644 index 0000000..c0cca3f --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class Vector2EqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly Vector2EqualityComparer m_Instance = new Vector2EqualityComparer(); + public static Vector2EqualityComparer Instance { get { return m_Instance; } } + + private Vector2EqualityComparer() : this(k_DefaultError) + { + } + + public Vector2EqualityComparer(float error) + { + this.AllowedError = error; + } + + public bool Equals(Vector2 expected, Vector2 actual) + { + return Utils.AreFloatsEqual(expected.x, actual.x, AllowedError) && + Utils.AreFloatsEqual(expected.y, actual.y, AllowedError); + } + + public int GetHashCode(Vector2 vec2) + { + return 0; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs.meta new file mode 100644 index 0000000..ed2951a --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 58ad09607a0d62d458a78d7174665566 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs new file mode 100644 index 0000000..ed665c0 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class Vector3ComparerWithEqualsOperator : IEqualityComparer + { + private static readonly Vector3ComparerWithEqualsOperator m_Instance = new Vector3ComparerWithEqualsOperator(); + public static Vector3ComparerWithEqualsOperator Instance { get { return m_Instance; } } + + private Vector3ComparerWithEqualsOperator() {} + + public bool Equals(Vector3 expected, Vector3 actual) + { + return expected == actual; + } + + public int GetHashCode(Vector3 vec3) + { + return 0; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs.meta new file mode 100644 index 0000000..01662a4 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b994928117e3db418da69c821da7e19 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs new file mode 100644 index 0000000..47fac4b --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; + + +namespace UnityEngine.TestTools.Utils +{ + public class Vector3EqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly Vector3EqualityComparer m_Instance = new Vector3EqualityComparer(); + public static Vector3EqualityComparer Instance { get { return m_Instance; } } + + private Vector3EqualityComparer() : this(k_DefaultError) {} + public Vector3EqualityComparer(float allowedError) + { + this.AllowedError = allowedError; + } + + public bool Equals(Vector3 expected, Vector3 actual) + { + return Utils.AreFloatsEqual(expected.x, actual.x, AllowedError) && + Utils.AreFloatsEqual(expected.y, actual.y, AllowedError) && + Utils.AreFloatsEqual(expected.z, actual.z, AllowedError); + } + + public int GetHashCode(Vector3 vec3) + { + return 0; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs.meta new file mode 100644 index 0000000..37e0a03 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4bd2bc28ff24d5c488844851cb785db0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs new file mode 100644 index 0000000..1f8d106 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class Vector4ComparerWithEqualsOperator : IEqualityComparer + { + private static readonly Vector4ComparerWithEqualsOperator m_Instance = new Vector4ComparerWithEqualsOperator(); + public static Vector4ComparerWithEqualsOperator Instance { get { return m_Instance; } } + + private Vector4ComparerWithEqualsOperator() {} + + public bool Equals(Vector4 expected, Vector4 actual) + { + return expected == actual; + } + + public int GetHashCode(Vector4 vec4) + { + return 0; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs.meta new file mode 100644 index 0000000..a23cf66 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 44100f5f60f351348b9719b46d46cebe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs new file mode 100644 index 0000000..7047242 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class Vector4EqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly Vector4EqualityComparer m_Instance = new Vector4EqualityComparer(); + public static Vector4EqualityComparer Instance { get { return m_Instance; } } + + private Vector4EqualityComparer() : this(k_DefaultError) {} + public Vector4EqualityComparer(float allowedError) + { + this.AllowedError = allowedError; + } + + public bool Equals(Vector4 expected, Vector4 actual) + { + return Utils.AreFloatsEqual(expected.x, actual.x, AllowedError) && + Utils.AreFloatsEqual(expected.y, actual.y, AllowedError) && + Utils.AreFloatsEqual(expected.z, actual.z, AllowedError) && + Utils.AreFloatsEqual(expected.w, actual.w, AllowedError); + } + + public int GetHashCode(Vector4 vec4) + { + return 0; + } + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs.meta new file mode 100644 index 0000000..149157d --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 32da81683c22faf458026716a2b821aa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/package.json b/Library/PackageCache/com.unity.test-framework@1.1.3/package.json new file mode 100644 index 0000000..83f86b3 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/package.json @@ -0,0 +1,26 @@ +{ + "name": "com.unity.test-framework", + "displayName": "Test Framework", + "version": "1.1.3", + "unity": "2019.2", + "unityRelease": "0a10", + "description": "Test framework for running Edit mode and Play mode test in Unity.", + "keywords": [ + "Test", + "TestFramework" + ], + "category": "Unity Test Framework", + "repository": { + "type": "git", + "url": "git@github.com:Unity-Technologies/com.unity.test-framework.git", + "revision": "9b6648a22e478d196d651dc45738be75031581cd" + }, + "dependencies": { + "com.unity.ext.nunit": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "relatedPackages": { + "com.unity.test-framework.tests": "1.1.3" + } +} diff --git a/Library/PackageCache/com.unity.test-framework@1.1.3/package.json.meta b/Library/PackageCache/com.unity.test-framework@1.1.3/package.json.meta new file mode 100644 index 0000000..63170c3 --- /dev/null +++ b/Library/PackageCache/com.unity.test-framework@1.1.3/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d6a2e6e4803de7b43baacdc355fc144d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/.gitlab-ci.yml b/Library/PackageCache/com.unity.textmeshpro@2.0.1/.gitlab-ci.yml new file mode 100644 index 0000000..45a43a1 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/.gitlab-ci.yml @@ -0,0 +1,12 @@ +image: node:6.10.0 + +stages: + - push_to_packman_staging + +push_to_packman_staging: + stage: push_to_packman_staging + only: + - tags + script: + - curl -u $USER_NAME:$API_KEY https://staging-packages.unity.com/auth > .npmrc + - npm publish diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/CHANGELOG.md b/Library/PackageCache/com.unity.textmeshpro@2.0.1/CHANGELOG.md new file mode 100644 index 0000000..7b8d9d0 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/CHANGELOG.md @@ -0,0 +1,180 @@ +# Changelog +These are the release notes for the TextMesh Pro UPM package which was first introduced with Unity 2018.1. Please see the following link for the Release Notes for prior versions of TextMesh Pro. http://digitalnativestudios.com/forum/index.php?topic=1363.0 + +## [2.0.1] - 2019-05-08 +### Changes +- See Release 1.4.1 +- Requires .Net 4.x Scripting Runtime. + +## [2.0.0] - 2019-03-01 +### Changes +- Same release as 1.4.0 + +## [1.4.1] - 2019-05-08 +### Changes +- Improved handling of automatic Font Asset upgrade to version 1.1.0 which is required to support the new Dynamic SDF system. See Case #1144858 +- Made release compatible with .Net 3.5 Scripting Runtime. +- Added support for Stereo rendering to the TMP SDF Overlay shaders. +- Fixed Caret positioning issue when using IME. Case #1146626 + +## [1.4.0] - 2019-03-07 +### Changes +- Same release as 1.4.0-preview.3a. + +## [1.4.0-preview.3a] - 2019-02-28 +### Changes +- Improved performance of the Project Files GUID Remapping Tool. +- Fixed an issue with the TMP_FontAsset.TryAddCharacters() functions which was resulting in an error when added characters exceeded the capacity of the atlas texture. +- Updated TMP_FontAsset.TryAddCharacters functions to add new overloads returning list of characters that could not be added. +- Added function in OnEnable of FontAsset Editor's to clean up Fallback list to remove any null / empty entries. +- Added support for Stereo rendering to the TMP Distance Field and Mobile Distance Field shaders. + +## [1.4.0-preview.2a] - 2019-02-14 +### Changes +- Fixed an issue with SDF Scale handling where the text object would not render correctly after the object scale had been set to zero. +- Fixed an issue with the TMP_UpdateManager where text objects were not getting unregistered correctly. +- Any changes to Font Asset Creation Settings' padding, atlas width and / or atlas height will now result in all Material Presets for the given font asset to also be updated. +- Added new section in the TMP Settings related to the new Dynamic Font System. +- Added new property in the Dynamic Font System section to determine if OpenType Font Features will be retrieved from source font files at runtime as new characters are added to font assets. Glyph Adjustment Data (Kerning) is the only feature currently supported. +- Fix an issue where font assets created at runtime were not getting their asset version number set to "1.1.0". +- Improved parsing of the text file used in the Font Asset Creator and "Characters from File" option to handle UTF16 "\u" and UTF32 "\U" escape character sequences. +- Fixed a Null Reference Error (NRE) that could occur when using the <font> tag with an invalid font name followed by the <sprite> tag. +- The Glyph Adjustment Table presentation and internal data structure has been changed to facilitate the future addition of OpenType font features. See https://forum.unity.com/threads/version-1-4-0-preview-with-dynamic-sdf-for-unity-2018-3-now-available.622420/#post-4206595 for more details. +- Fixed an issue with the <rotate> tag incorrectly affecting character spacing. + +## [1.4.0-preview.1] - 2019-01-30 +### Changes +- Renamed TMPro_FontUtilities to TMP_FontAssetCommon to more accurately reflect the content of this file. +- Accessing the TextMesh Pro Settings via the new Edit - Settings menu when TMP Essential Resources have not yet been imported in the project will no longer open a new window to provide the options to import these resources. +- Fixed an issue where using int.MaxValue, int.MinValue, float.MaxValue and float.MinValue in conjunction with SetText() would display incorrect numerical values. Case #1078521. +- Added public setter to the TMP Settings' missingGlyphCharacter to allow changing which character will be used for missing characters via scripting. +- Fixed a potential Null Reference Exception related to loading the Default Style Sheet. +- Added compiler conditional to TMP_UpdateManager.cs to address changes to SRP. +- Improved the <margin> tag to make it possible to define both left and right margin values. Example: <margin left=10% right=10px>. +- Added new menu option to allow the quick creation of a UI Button using TMP. New menu option is located in Create - UI - Button (TextMeshPro). +- Renamed TMP related create menu options. +- Fixed TMP object creation handling when using Prefab isolation mode. Case #1077392 +- Fixed another issue related to Prefabs where some serialized properties of the text object would incorrectly show up in the Overrides prefab options. Case #1093101 +- Fixed issue where changing the Sorting Layer or Sorting Order of a object would not dirty the scene. Case #1069776 +- Fixed a text alignment issue when setting text alignment on disabled text objects. Case #1047771 +- Fixed an issue where text object bounds were not set correctly on newly created text objects or in some cases when setting the text to null or string.empty. Case #1093388 +- Fixed an issue in the IntToString() function that could result in Index Out Of Bounds error. Case #1102007 +- Changed the TMP_InputField IsValidChar function to protected virtual. +- The "Allow Rich Text Editing" property of the TMP_InputField is now set to false by default. +- Added new option to the Sprite Asset context menu to make it easier to update sprite glyphs edited via the Unity Sprite Editor. +- Added new Sharpness slider in the Debug section of the SDF Material inspector. +- Fixed an error that would occur when using the context menu Reset on text component. Case #1044726 +- Fixed issue where CharacterInfo.index would be incorrect as a result of using Surrogate Pairs in the text. Case #1037828 +- The TMP_EditorPanel and TMP_UiEditorPanel now have their "UseForChildren" flag set to true to enable user / custom inspectors to inherit from them. +- Fixed an issue where rich text tags using pixel (px) or font units (em) were not correctly accounting for orthographic camera mode. This change only affects the normal TMP text component. +- Fixed an inspector issue related to changes to the margin in the TMP Extra Settings panel. Case #1114253 +- Added new property to Glyph Adjustment Pairs which determines if Character Spacing Adjustments should affect the given pair. +- Updated the Glyph Adjustment Table where ID now represents the unicode (hex) value for the character instead of its decimal value. +- Added new SetValueWithoutNotify() function to TMP_DropDown and SetTextWithoutNotify() function to TMP_InputField allowing these to be set without triggering OnValueChanged event. +- Geometry buffer deallocation which normally takes place when current allocations exceed those of the new text by more than 256 characters will no longer occur if the new text is set to null or string.empty. +- Fixed a minor issue where the underline SDF scale would be incorrect when the underline text sequence contained normal size characters and ended with a subscript or superscript character. +- Fixed an error that would occur when using the Reset Context menu on a Material using the SDF Surface or Mobile SDF Surface Shaders. Case #1122279 +- Resolved a Null Reference Error that would appear when cycling through the text overflow modes. Case #1121624 + +## [1.3.0] - 2018-08-09 +### Changes +- Revamped UI to conform to Unity Human Interface Guidelines. +- Updated the title text on the Font Asset Creator window tab to "Font Asset Creator". +- Using TMP_Text.SetCharArray() with an empty char[] array will now clear the text. +- Made a small improvement to the TMP Input Field when using nested 2d RectMasks. +- Renamed symbol defines used by TMP to append TMP_ in front of the define to avoid potential conflicts with user defines. +- Improved the Project Files GUID Remapping tool to allow specifying a target folder to scan. +- Added the ability to cancel the scanning process used by the Project Files GUID Remapping tool. +- Moved TMP Settings to universal settings window in 2018.3 and above. +- Changing style sheet in the TMP Settings will now be reflected automatically on existing text objects in the editor. +- Added new function TMP_StyleSheet.UpdateStyleSheet() to update the internal reference to which style sheet text objects should be using in conjunction with the style tag. + +## [1.2.4] - 2018-06-10 +### Changes +- Fixed a minor issue when using Justified and Flush alignment in conjunction with \u00A0. +- The Font Asset creationSettings field is no longer an Editor only serialized field. + +## [1.2.3] - 2018-05-29 +### Changes +- Added new bitmap shader with support for Custom Font Atlas texture. This shader also includes a new property "Padding" to provide control over the geometry padding to closely fit a modified / custom font atlas texture. +- Fixed an issue with ForceMeshUpdate(bool ignoreActiveState) not being handled correctly. +- Cleaned up memory allocations from repeated use of the Font Asset Creator. +- Sprites are now scaled based on the current font instead of the primary font asset assigned to the text object. +- It is now possible to recall the most recent settings used when creating a font asset in the Font Asset Creator. +- Newly created font assets now contain the settings used when they were last created. This will make the process of updating / regenerating font assets much easier. +- New context menu "Update Font Asset" was added to the Font Asset inspector which will open the Font Asset Creator with the most recently used settings for that font asset. +- New Context Menu "Create Font Asset" was added to the Font inspector panel which will open the Font Asset Creator with this source font file already selected. +- Fixed 3 compiler warnings that would appear when using .Net 4.x. +- Modified the TMP Settings to place the Missing Glyph options in their own section. +- Renamed a symbol used for internal debugging to avoid potential conflicts with other user project defines. +- TMP Sprite Importer "Create Sprite Asset" and "Save Sprite Asset" options are disabled unless a Sprite Data Source, Import Format and Sprite Texture Atlas are provided. +- Improved the performance of the Project Files GUID Remapping tool. +- Users will now be prompted to import the TMP Essential Resources when using the Font Asset Creator if such resources have not already been imported. + +## [1.2.2] - 2018-03-28 +### Changes +- Calling SetAllDirty() on a TMP text component will now force a regeneration of the text object including re-parsing of the text. +- Fixed potential Null Reference Exception that could occur when assigning a new fallback font asset. +- Removed public from test classes. +- Fixed an issue where using nested links (which doesn't make sense conceptually) would result in an error. Should accidental use of nested links occurs, the last / most nested ends up being used. +- Fixed a potential text alignment issue where an hyphen at the end of a line followed by a new line containing a single word too long to fit the text container would result in miss alignment of the hyphen. +- Updated package license. +- Non-Breaking Space character (0xA0) will now be excluded from word spacing adjustments when using Justified or Flush text alignment. +- Improved handling of Underline, Strikethrough and Mark tag with regards to vertex color and Color tag alpha. +- Improved TMP_FontAsset.HasCharacter(char character, bool searchFallbacks) to include a recursive search of fallbacks as well as TMP Settings fallback list and default font asset. +- The <gradient> tag will now also apply to sprites provided the sprite tint attribute is set to a value of 1. Ex. <sprite="Sprite Asset" index=0 tint=1>. +- Updated Font Asset Creator Plugin to allow for cancellation of the font asset generation process. +- Added callback to support the Scriptable Render Pipeline (SRP) with the normal TextMeshPro component. +- Improved handling of some non-breaking space characters which should not be ignored at the end of a line. +- Sprite Asset fallbacks will now be searched when using the <sprite> tag and referencing a sprite by Unicode or by Name. +- Updated EmojiOne samples from https://www.emojione.com/ and added attribution. +- Removed the 32bit versions of the TMP Plugins used by the Font Asset Creator since the Unity Editor is now only available as 64bit. +- The isTextTruncated property is now serialized. +- Added new event handler to the TMP_TextEventHandler.cs script included in Example 12a to allow tracking of interactions with Sprites. + +## [1.2.1] - 2018-02-14 +### Changes +- Package is now backwards compatible with Unity 2018.1. +- Renamed Assembly Definitions (.asmdef) to new UPM package conventions. +- Added DisplayName for TMP UPM package. +- Revised Editor and Playmode tests to ignore / skip over the tests if the required resources are not present in the project. +- Revised implementation of Font Asset Creator progress bar to use Unity's EditorGUI.ProgressBar instead of custom texture. +- Fixed an issue where using the material tag in conjunction with fallback font assets was not handled correctly. +- Fixed an issue where changing the fontStyle property in conjunction with using alternative typefaces / font weights would not correctly trigger a regeneration of the text object. + +## [1.2.0] - 2018-01-23 +### Changes +- Package version # increased to 1.2.0 which is the first release for Unity 2018.2. + +## [1.1.0] - 2018-01-23 +### Changes +- Package version # increased to 1.1.0 which is the first release for Unity 2018.1. + +## [1.0.27] - 2018-01-16 +### Changes +- Fixed an issue where setting the TMP_InputField.text property to null would result in an error. +- Fixed issue with Raycast Target state not getting serialized properly when saving / reloading a scene. +- Changed reference to PrefabUtility.GetPrefabParent() to PrefabUtility.GetCorrespondingObjectFromSource() to reflect public API change in 2018.2 +- Option to import package essential resources will only be presented to users when accessing a TMP component or the TMP Settings file via the project menu. + +## [1.0.26] - 2018-01-10 +### Added +- Removed Tizen player references in the TMP_InputField as the Tizen player is no longer supported as of Unity 2018.1. + +## [1.0.25] - 2018-01-05 +### Added +- Fixed a minor issue with PreferredValues calculation in conjunction with using text auto-sizing. +- Improved Kerning handling where it is now possible to define positional adjustments for the first and second glyph in the pair. +- Renamed Kerning Info Table to Glyph Adjustment Table to better reflect the added functionality of this table. +- Added Search toolbar to the Glyph Adjustment Table. +- Fixed incorrect detection / handling of Asset Serialization mode in the Project Conversion Utility. +- Removed SelectionBase attribute from TMP components. +- Revised TMP Shaders to support the new UNITY_UI_CLIP_RECT shader keyword which can provide a performance improvement of up to 30% on some devices. +- Added TMP_PRESENT define as per the request of several third party asset publishers. + +## [1.0.23] - 2017-11-14 +### Added +- New menu option added to Import Examples and additional content like Font Assets, Materials Presets, etc for TextMesh Pro. This new menu option is located in "Window -> TextMeshPro -> Import Examples and Extra Content". +- New menu option added to Convert existing project files and assets created with either the Source Code or DLL only version of TextMesh Pro. Please be sure to backup your project before using this option. The new menu option is located in "Window -> TextMeshPro -> Project Files GUID Remapping Tool". +- Added Assembly Definitions for the TMP Runtime and Editor scripts. +- Added support for the UI DirtyLayoutCallback, DirtyVerticesCallback and DirtyMaterialCallback. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/CHANGELOG.md.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/CHANGELOG.md.meta new file mode 100644 index 0000000..edf5c32 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 22464cf7ab0243a6bf9c79851183b002 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Documentation~/TextMeshPro.md b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Documentation~/TextMeshPro.md new file mode 100644 index 0000000..8f8c092 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Documentation~/TextMeshPro.md @@ -0,0 +1,35 @@ +# **_TextMesh Pro User Guide_** + +#### **Overview** +This User Guide was designed to provide first time users of TextMesh Pro with a basic overview of the features and functionality of the tool. + +#### **Installation** +The TextMesh Pro UPM package is already included with the Unity Editor and as such does not require installation. TextMesh Pro "TMP" does however require adding resources to your project which are essential for using TextMesh Pro. + +To import the "*TMP Essential Resources*", please use the "*Window -> TextMeshPro -> Import TMP Essential Resources*" menu option. These resources will be added at the root of your project in the "*TextMesh Pro*" folder. + +The TextMesh Pro package also includes additional resources and examples that will make discovering and learning about TextMesh Pro's powerful features easier. It is strongly recommended that first time users import these additional resources. + +To import the "*TMP Examples & Extras*", please use the "*Window -> TextMeshPro -> Import TMP Examples & Extras*" menu option. These resources will also be added in the same "*TextMesh Pro*" folder inside your project. + + +#### **Quick Start** +There are two TextMesh Pro components available. The first TMP text component is of type <TextMeshPro> and designed to work with the MeshRenderer. This component is an ideal replacement for the legacy TextMesh component. + +To add a new <TextMeshPro> text object, go to: *GameObject->3D Object->TextMeshPro Text*. + +The second TMP text component is of type <TextMeshProUGUI> and designed to work with the CanvasRenderer and Canvas system. This component is an ideal replacement for the UI.Text component. + +To add a new <TextMeshProUGUI> text object, go to: *GameObject->UI->TextMeshPro Text*. + +You may also wish to watch this [Getting Started](https://youtu.be/olnxlo-Wri4) short video which covers this topic. + +We strongly recommend that you also watch the [Font Asset Creation](https://youtu.be/qzJNIGCFFtY) video as well as the [Working with Material Presets](https://youtu.be/d2MARbDNeaA) as these two topics is also key to working and getting the most out of TextMesh Pro. + +As mentionned in the Installation section of this guide, it is recommended that you import the "*TMP Examples & Extras*" and take the time to explore each of the examples as they provide a great overview of the functionality of the tool and the many text layout and [rich text tags](http://digitalnativestudios.com/textmeshpro/docs/rich-text/) available in TextMesh Pro. + +#### **Support & API Documentation** +Should you have questions or require assistance, please visit the [Unity UI & TextMesh Pro](https://forum.unity.com/forums/unity-ui-textmesh-pro.60/) section of the Unity forum as well as the [TextMesh Pro User Forum](http://digitalnativestudios.com/forum/index.php) where you will find additional information, [Video Tutorials](http://digitalnativestudios.com/forum/index.php?board=4.0) and [FAQ](http://digitalnativestudios.com/forum/index.php?topic=890.0). In the event you are unable to find the information you seek, always feel free to post on the [Unity UI & TextMesh Pro](https://forum.unity.com/forums/unity-ui-textmesh-pro.60/) section user forum. + +[Online Documentation](http://digitalnativestudios.com/textmeshpro/docs/) is also available on TextMesh Pro including Rich Text tags, Shaders, Scripting API and more. + diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Documentation~/TextMeshPro.md.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Documentation~/TextMeshPro.md.meta new file mode 100644 index 0000000..8c72f72 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Documentation~/TextMeshPro.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ca77d26d10b9455ca5a4b22c93be2a31 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources.meta new file mode 100644 index 0000000..7c07b00 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1a0a27327b54c3bac52a08929c33f81 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos.meta new file mode 100644 index 0000000..f2596c7 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e93ec7eb6de342aabd156833e253f838 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd new file mode 100644 index 0000000..93f5a2c Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd.meta new file mode 100644 index 0000000..7bdb473 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: a7ec9e7ad8b847b7ae4510af83c5d868 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 7 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -2 + maxTextureSize: 128 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: iPhone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: 2 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Windows Store Apps + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 1 + pSDShowRemoveMatteOption: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd new file mode 100644 index 0000000..2fb1164 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd.meta new file mode 100644 index 0000000..bd64ad7 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: ee148e281f3c41c5b4ff5f8a5afe5a6c +timeCreated: 1463559213 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 128 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd new file mode 100644 index 0000000..f0360d3 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd.meta new file mode 100644 index 0000000..eb2e1ce --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 3ee40aa79cd242a5b53b0b0ca4f13f0f +timeCreated: 1457860876 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 128 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd new file mode 100644 index 0000000..7036296 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd.meta new file mode 100644 index 0000000..a22cdf1 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: ec7c645d93308c04d8840982af12101e +timeCreated: 1463559213 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 128 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd new file mode 100644 index 0000000..3cc4163 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta new file mode 100644 index 0000000..623993d --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 2fd6421f253b4ef1a19526541f9ffc0c +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 128 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders.meta new file mode 100644 index 0000000..95efe2b --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2da27f5fe80a3a549ac7331d9f52f5f0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_Properties.cginc b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_Properties.cginc new file mode 100644 index 0000000..2e96258 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_Properties.cginc @@ -0,0 +1,85 @@ +// UI Editable properties +uniform sampler2D _FaceTex; // Alpha : Signed Distance +uniform float _FaceUVSpeedX; +uniform float _FaceUVSpeedY; +uniform fixed4 _FaceColor; // RGBA : Color + Opacity +uniform float _FaceDilate; // v[ 0, 1] +uniform float _OutlineSoftness; // v[ 0, 1] + +uniform sampler2D _OutlineTex; // RGBA : Color + Opacity +uniform float _OutlineUVSpeedX; +uniform float _OutlineUVSpeedY; +uniform fixed4 _OutlineColor; // RGBA : Color + Opacity +uniform float _OutlineWidth; // v[ 0, 1] + +uniform float _Bevel; // v[ 0, 1] +uniform float _BevelOffset; // v[-1, 1] +uniform float _BevelWidth; // v[-1, 1] +uniform float _BevelClamp; // v[ 0, 1] +uniform float _BevelRoundness; // v[ 0, 1] + +uniform sampler2D _BumpMap; // Normal map +uniform float _BumpOutline; // v[ 0, 1] +uniform float _BumpFace; // v[ 0, 1] + +uniform samplerCUBE _Cube; // Cube / sphere map +uniform fixed4 _ReflectFaceColor; // RGB intensity +uniform fixed4 _ReflectOutlineColor; +//uniform float _EnvTiltX; // v[-1, 1] +//uniform float _EnvTiltY; // v[-1, 1] +uniform float3 _EnvMatrixRotation; +uniform float4x4 _EnvMatrix; + +uniform fixed4 _SpecularColor; // RGB intensity +uniform float _LightAngle; // v[ 0,Tau] +uniform float _SpecularPower; // v[ 0, 1] +uniform float _Reflectivity; // v[ 5, 15] +uniform float _Diffuse; // v[ 0, 1] +uniform float _Ambient; // v[ 0, 1] + +uniform fixed4 _UnderlayColor; // RGBA : Color + Opacity +uniform float _UnderlayOffsetX; // v[-1, 1] +uniform float _UnderlayOffsetY; // v[-1, 1] +uniform float _UnderlayDilate; // v[-1, 1] +uniform float _UnderlaySoftness; // v[ 0, 1] + +uniform fixed4 _GlowColor; // RGBA : Color + Intesity +uniform float _GlowOffset; // v[-1, 1] +uniform float _GlowOuter; // v[ 0, 1] +uniform float _GlowInner; // v[ 0, 1] +uniform float _GlowPower; // v[ 1, 1/(1+4*4)] + +// API Editable properties +uniform float _ShaderFlags; +uniform float _WeightNormal; +uniform float _WeightBold; + +uniform float _ScaleRatioA; +uniform float _ScaleRatioB; +uniform float _ScaleRatioC; + +uniform float _VertexOffsetX; +uniform float _VertexOffsetY; + +//uniform float _UseClipRect; +uniform float _MaskID; +uniform sampler2D _MaskTex; +uniform float4 _MaskCoord; +uniform float4 _ClipRect; // bottom left(x,y) : top right(z,w) +//uniform float _MaskWipeControl; +//uniform float _MaskEdgeSoftness; +//uniform fixed4 _MaskEdgeColor; +//uniform bool _MaskInverse; + +uniform float _MaskSoftnessX; +uniform float _MaskSoftnessY; + +// Font Atlas properties +uniform sampler2D _MainTex; +uniform float _TextureWidth; +uniform float _TextureHeight; +uniform float _GradientScale; +uniform float _ScaleX; +uniform float _ScaleY; +uniform float _PerspectiveFilter; +uniform float _Sharpness; diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_Properties.cginc.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_Properties.cginc.meta new file mode 100644 index 0000000..e6dcc0a --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_Properties.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3c6c403084eacec478a1129ce20061ea +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_SDF Internal SSD.shader b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_SDF Internal SSD.shader new file mode 100644 index 0000000..7e28d74 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_SDF Internal SSD.shader @@ -0,0 +1,126 @@ +// Simplified SDF shader: +// - No Shading Option (bevel / bump / env map) +// - No Glow Option +// - Softness is applied on both side of the outline + +Shader "Hidden/TextMeshPro/Internal/Distance Field SSD" { + +Properties { + _FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceDilate ("Face Dilate", Range(-1,1)) = 0 + + _OutlineSoftness ("Outline Softness", Range(0,1)) = 0.02 + + _WeightNormal ("Weight Normal", float) = 0 + _WeightBold ("Weight Bold", float) = .5 + + _MainTex ("Font Atlas", 2D) = "white" {} + _TextureWidth ("Texture Width", float) = 512 + _TextureHeight ("Texture Height", float) = 512 + _GradientScale ("Gradient Scale", float) = 5 + _ScaleX ("Scale X", float) = 1 + _ScaleY ("Scale Y", float) = 1 + _Sharpness ("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + + _ColorMask ("Color Mask", Float) = 15 +} + +SubShader { + Tags + { + "ForceSupported" = "True" + } + + Lighting Off + Blend One OneMinusSrcAlpha + Cull Off + ZWrite Off + ZTest Always + + Pass { + CGPROGRAM + #pragma vertex VertShader + #pragma fragment PixShader + + #include "UnityCG.cginc" + #include "TMP_Properties.cginc" + + sampler2D _GUIClipTexture; + uniform float4x4 unity_GUIClipTextureMatrix; + + struct vertex_t { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + struct pixel_t { + float4 vertex : SV_POSITION; + fixed4 faceColor : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 clipUV : TEXCOORD1; + }; + + + pixel_t VertShader(vertex_t input) + { + // Does not handle simulated bold correctly. + + float4 vert = input.vertex; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + float4 vPosition = UnityObjectToClipPos(vert); + + float opacity = input.color.a; + + fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor; + faceColor.rgb *= faceColor.a; + + // Generate UV for the Clip Texture + float3 eyePos = UnityObjectToViewPos(input.vertex); + float2 clipUV = mul(unity_GUIClipTextureMatrix, float4(eyePos.xy, 0, 1.0)); + + // Structure for pixel shader + pixel_t output = { + vPosition, + faceColor, + float2(input.texcoord0.x, input.texcoord0.y), + clipUV, + }; + + return output; + } + + half transition(half2 range, half distance) + { + return smoothstep(range.x, range.y, distance); + } + + // PIXEL SHADER + fixed4 PixShader(pixel_t input) : SV_Target + { + half distanceSample = tex2D(_MainTex, input.texcoord0).a; + half smoothing = fwidth(distanceSample) * (1 - _Sharpness) + _OutlineSoftness; + half contour = 0.5 - _FaceDilate * 0.5; + half2 edgeRange = half2(contour - smoothing, contour + smoothing); + + half4 c = input.faceColor; + + half edgeTransition = transition(edgeRange, distanceSample); + c *= edgeTransition; + + c *= tex2D(_GUIClipTexture, input.clipUV).a; + + return c; + } + ENDCG + } +} + +CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_SDF Internal SSD.shader.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_SDF Internal SSD.shader.meta new file mode 100644 index 0000000..7845e11 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_SDF Internal SSD.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ce4ec0f498d1b1a4f90fe94e115b6f9a +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures.meta new file mode 100644 index 0000000..d6754b0 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f8e6a2d47aba4c6c9b3c5a72d9f48da5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Dark.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Dark.psd new file mode 100644 index 0000000..8ebaa27 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Dark.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Dark.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Dark.psd.meta new file mode 100644 index 0000000..ed7250a --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Dark.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: fb5730e24283d0c489e5c7d0bee023d9 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Light.psd new file mode 100644 index 0000000..e598e6d Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Light.psd.meta new file mode 100644 index 0000000..1e747b2 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: e3b0f810fdea84e40ab4ba20f256f7e8 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine.psd new file mode 100644 index 0000000..3da358a Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine.psd.meta new file mode 100644 index 0000000..09deb3c --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 8bc445bb79654bf496c92d0407840a92 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd new file mode 100644 index 0000000..cf49b6c Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd.meta new file mode 100644 index 0000000..78e14cb --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 18775b51e3bd42299fd30bd036ea982f +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom.psd new file mode 100644 index 0000000..1f35779 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom.psd.meta new file mode 100644 index 0000000..8e79b48 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: ca51b19024094d1b87f3e07edb0a75fb +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom_Light.psd new file mode 100644 index 0000000..d8af55b Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom_Light.psd.meta new file mode 100644 index 0000000..9c9a6fc --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 585b70cb75dd43efbfead809c30a1731 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine.psd new file mode 100644 index 0000000..7eefe6b Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine.psd.meta new file mode 100644 index 0000000..0455a2f --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine.psd.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 0d9a36012a224080966c7b55896aa0f9 +timeCreated: 1467964791 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd new file mode 100644 index 0000000..f08bb6c Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd.meta new file mode 100644 index 0000000..dfd05a1 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 49679f302ac6408697f6b9314a38985c +timeCreated: 1467964413 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter.psd new file mode 100644 index 0000000..939bc6d Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter.psd.meta new file mode 100644 index 0000000..d189fc2 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 81ed8c76d2bc4a4c95d092c98af4e58f +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo.psd new file mode 100644 index 0000000..f9ce9a8 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo.psd.meta new file mode 100644 index 0000000..555bb1b --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo.psd.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: c76700ea0062413d9f69409b4e9e151b +timeCreated: 1484171296 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd new file mode 100644 index 0000000..e37b2e2 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd.meta new file mode 100644 index 0000000..044d0c2 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 35ff0937876540d3bd4b6a941df62a92 +timeCreated: 1484171296 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter_Light.psd new file mode 100644 index 0000000..7274887 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter_Light.psd.meta new file mode 100644 index 0000000..d98d377 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 6ace62d30f494c948b71d5594afce11d +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush.psd new file mode 100644 index 0000000..eeeea67 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush.psd.meta new file mode 100644 index 0000000..84ed28c --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 691475c57a824010be0c6f474caeb7e1 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush_Light.psd new file mode 100644 index 0000000..b69f6a2 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush_Light.psd.meta new file mode 100644 index 0000000..b9e6124 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 64b9fad609434c489c32b1cdf2004a1c +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified.psd new file mode 100644 index 0000000..3ce55c4 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified.psd.meta new file mode 100644 index 0000000..f8a90b4 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified.psd.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 92027f7f8cfc4feaa477da0dc38d3d46 +timeCreated: 1472535271 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified_Light.psd new file mode 100644 index 0000000..d7fd5c8 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified_Light.psd.meta new file mode 100644 index 0000000..e5b5aa8 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified_Light.psd.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: fa6bd40a216346b783a4cce741d277a5 +timeCreated: 1472535778 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft.psd new file mode 100644 index 0000000..fc7e10b Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft.psd.meta new file mode 100644 index 0000000..8023379 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 9288066c33474b94b6ee5465f4df1cc0 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft_Light.psd new file mode 100644 index 0000000..5522c37 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft_Light.psd.meta new file mode 100644 index 0000000..aaa8b81 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 12736c98af174f91827a26b66d2b01b9 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidLine.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidLine.psd new file mode 100644 index 0000000..14d28a2 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidLine.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidLine.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidLine.psd.meta new file mode 100644 index 0000000..e481463 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidLine.psd.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: c2f7f6a88b4c4f20a53deb72f3d9144c +timeCreated: 1426240649 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle.psd new file mode 100644 index 0000000..c4483db Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle.psd.meta new file mode 100644 index 0000000..d1ec528 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 41b96614b2e6494ba995ddcd252d11ae +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd new file mode 100644 index 0000000..4263bf9 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd.meta new file mode 100644 index 0000000..7cda20b --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 066619c9c9c84f89acb1b48c11a7efe2 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidline_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidline_Light.psd new file mode 100644 index 0000000..a5bed37 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidline_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidline_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidline_Light.psd.meta new file mode 100644 index 0000000..6fabec5 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidline_Light.psd.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: bb42b2d967d6427983c901a4ffc8ecd9 +timeCreated: 1426240650 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight.psd new file mode 100644 index 0000000..4ef1998 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight.psd.meta new file mode 100644 index 0000000..cf5c764 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 342a0f8aca7f4f0691338912faec0494 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight_Light.psd new file mode 100644 index 0000000..bdeff41 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight_Light.psd.meta new file mode 100644 index 0000000..dab7997 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: e05ace3bd15740cda0bad60d89092a5b +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop.psd new file mode 100644 index 0000000..b00d458 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop.psd.meta new file mode 100644 index 0000000..74931bf --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 48d034c499ee4697af9dd6e327110249 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop_Light.psd b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop_Light.psd new file mode 100644 index 0000000..84f0e61 Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop_Light.psd differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop_Light.psd.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop_Light.psd.meta new file mode 100644 index 0000000..bbd509d --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: ed041e68439749a69d0efa0e3d896c2e +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/LICENSE.md b/Library/PackageCache/com.unity.textmeshpro@2.0.1/LICENSE.md new file mode 100644 index 0000000..37d0615 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/LICENSE.md @@ -0,0 +1,5 @@ +TextMesh Pro copyright © 2014-2019 Unity Technologies ApS + +Licensed under the Unity Companion License for Unity-dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). + +Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. Please review the license for details on these and other terms and conditions. \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/LICENSE.md.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/LICENSE.md.meta new file mode 100644 index 0000000..1df9555 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0d2d0f36e67d4518a07df76235e91f9a +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources.meta new file mode 100644 index 0000000..e8a96b8 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5ec95f4d5b2d1f14e9ff8682562553f9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Essential Resources.unitypackage b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Essential Resources.unitypackage new file mode 100644 index 0000000..6c1904f Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Essential Resources.unitypackage differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Essential Resources.unitypackage.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Essential Resources.unitypackage.meta new file mode 100644 index 0000000..bc49ab3 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Essential Resources.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ce4ff17ca867d2b48b5c8a4181611901 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Examples & Extras.unitypackage b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Examples & Extras.unitypackage new file mode 100644 index 0000000..975bf1b Binary files /dev/null and b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Examples & Extras.unitypackage differ diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Examples & Extras.unitypackage.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Examples & Extras.unitypackage.meta new file mode 100644 index 0000000..aaf21f7 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Examples & Extras.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bc00e25696e4132499f56528d3fed2e3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData.json b/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData.json new file mode 100644 index 0000000..05c193e --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData.json @@ -0,0 +1,654 @@ +{ + "assetRecords": [ + { + "referencedResource": "Blue to Purple - Vertical.asset", + "target": "guid: 1e643bbd7e13d46418da3774e72bef60", + "replacement": "guid: 479a66fa4b094512a62b0a8e553ad95a" + }, + { + "referencedResource": "Dark to Light Green - Vertical.asset", + "target": "guid: 90c9133b254e2184b8084dea4f392337", + "replacement": "guid: 4c86a3366cd840348ebe8dc438570ee4" + }, + { + "referencedResource": "Light to Dark Green - Vertical.asset", + "target": "guid: 33c745f0979f3984182a138bcc6e57ec", + "replacement": "guid: 5cf8ae092ca54931b443bec5148f3c59" + }, + { + "referencedResource": "Yellow to Orange - Vertical.asset", + "target": "guid: e002cb2a36d9e4a439a062867fa24e1e", + "replacement": "guid: 69a525efa7e6472eab268f6ea605f06e" + }, + { + "referencedResource": "Crate - Surface Shader Scene.mat", + "target": "guid: e177c46c2a091564d88df2c2ca9dcf97", + "replacement": "guid: e6b9b44320f4448d9d5e0ee634259966" + }, + { + "referencedResource": "Ground - Logo Scene.mat", + "target": "guid: 504ae362e57fc464b847f1e9fd0e4035", + "replacement": "guid: c719e38f25a9480abd2480ab621a2949" + }, + { + "referencedResource": "Ground - Surface Shader Scene.mat", + "target": "guid: 9ed9aa864ec2d7f4dad266b9534c6d85", + "replacement": "guid: aadd5a709a48466c887296bb5b1b8110" + }, + { + "referencedResource": "Small Crate_diffuse.mat", + "target": "guid: 92f161029a6d3c54a92d9d283352a135", + "replacement": "guid: 22262639920f43d6be32430e4e58350d" + }, + { + "referencedResource": "Text Popup.prefab", + "target": "guid: c879e892866c8db4f8930b25672233ac", + "replacement": "guid: b06f0e6c1dfa4356ac918da1bb32c603" + }, + { + "referencedResource": "TextMeshPro - Prefab 1.prefab", + "target": "guid: a6a60659abb4d9d4b934feebd3dcc952", + "replacement": "guid: a6e39ced0ea046bcb636c3f0b2e2a745" + }, + { + "referencedResource": "TextMeshPro - Prefab 2.prefab", + "target": "guid: 1b190e3e0ab4c8e4881656b9160c59c2", + "replacement": "guid: fdad9d952ae84cafb74c63f2e694d042" + }, + { + "referencedResource": "Anton SDF.asset", + "target": "guid: f76ef802b8b940c46a31f9027f2b0158", + "replacement": "guid: 8a89fa14b10d46a99122fd4f73fca9a2" + }, + { + "referencedResource": "Anton SDF - Drop Shadow.mat", + "target": "guid: 250a1a103b3b4914c9707e6a423446d6", + "replacement": "guid: 749b9069dc4742c5bfa5c74644049926" + }, + { + "referencedResource": "Anton SDF - Outline.mat", + "target": "guid: e077dc203e948b740859c1c0ca8b9691", + "replacement": "guid: a00013af81304728b2be1f4309ee2433" + }, + { + "referencedResource": "Bangers SDF.asset", + "target": "guid: 808aa8f1ab804104aa7d0c337a6c1481", + "replacement": "guid: 125cb55b44b24c4393181402bc6200e6" + }, + { + "referencedResource": "Bangers SDF - Drop Shadow.mat", + "target": "guid: c26f698d4eee19e4a8b8f42cd299bab5", + "replacement": "guid: f2dcf029949142e28b974630369c8b4e" + }, + { + "referencedResource": "Bangers SDF - Outline.mat", + "target": "guid: db7f2cfbf23d6d54ca4e74a9abd55326", + "replacement": "guid: f629c6e43dba4bf38cb74d8860150664" + }, + { + "referencedResource": "Bangers SDF Glow.mat", + "target": "guid: 7dd7006c58d8a3148a73aa211d8c13d0", + "replacement": "guid: d75b8f41e959450c84ac6e967084d3e1" + }, + { + "referencedResource": "Bangers SDF Logo.mat", + "target": "guid: 4fb51aa7001a2244395ddf6a15d37389", + "replacement": "guid: f4e195ac1e204eff960149d1cb34e18c" + }, + { + "referencedResource": "Electronic Highway Sign SDF.asset", + "target": "guid: 163292f6f226d954593d45b079f8aae0", + "replacement": "guid: dc36b3fdc14f47ebb36fd484a67e268a" + }, + { + "referencedResource": "LiberationSans SDF - Drop Shadow.mat", + "target": "guid: 33db60c37b63f08448ded4b385e74e38", + "replacement": "guid: e73a58f6e2794ae7b1b7e50b7fb811b0" + }, + { + "referencedResource": "LiberationSans SDF - Metalic Green.mat", + "target": "guid: 4f9843c79516ed1468b9b5a4f32e67e3", + "replacement": "guid: 8b29aaa3eec7468097ff07adfcf29ac9" + }, + { + "referencedResource": "LiberationSans SDF - Outline.mat", + "target": "guid: 83a1b0fe6c3dbac44b66f09c82e1d509", + "replacement": "guid: 79459efec17a4d00a321bdcc27bbc385" + }, + { + "referencedResource": "LiberationSans SDF - Overlay.mat", + "target": "guid: 55eb086ae18c76e4bb6cc7106d0dd6e2", + "replacement": "guid: 9ad269c99dcf42b7aedefd83dd5a7b9d" + }, + { + "referencedResource": "LiberationSans SDF - Soft Mask.mat", + "target": "guid: 74e06d99c1657fc4abd33f20685ea9ff", + "replacement": "guid: 42df1c7856584b6b8db9a509b6b10074" + }, + { + "referencedResource": "Oswald Bold SDF.asset", + "target": "guid: 09641b029dfa78843902b548a9de7553", + "replacement": "guid: 0161d805a3764c089bef00bfe00793f5" + }, + { + "referencedResource": "Roboto-Bold SDF.asset", + "target": "guid: d62a573c923f5cb47b8ff65261033b90", + "replacement": "guid: 5302535af1044152a457ed104f1f4b91" + }, + { + "referencedResource": "Roboto-Bold SDF - Drop Shadow.mat", + "target": "guid: 102e7c5c5e3b1f3468518cb166967d77", + "replacement": "guid: b246c4190f4e46ec9352fe15a7b09ce0" + }, + { + "referencedResource": "Roboto-Bold SDF - Surface.mat", + "target": "guid: e2da38ead8f8238449c54a1ef49e080f", + "replacement": "guid: e6b276ec991f467aa14ef1f3cc665993" + }, + { + "referencedResource": "DropCap Numbers.asset", + "target": "guid: c4fd2a959a50b584b92dedfefec1ffda", + "replacement": "guid: 14aa93acbb234d16aaef0e8b46814db6" + }, + { + "referencedResource": "Benchmark01.cs", + "target": "guid: c5fb1b5c24460f745be29cc0eb06a58c", + "replacement": "guid: f970ea55f9f84bf79b05dab180b8c125" + }, + { + "referencedResource": "Benchmark01_UGUI.cs", + "target": "guid: 5e6abf300e36c0a4eb43969c3f2172f8", + "replacement": "guid: 8ef7be1c625941f7ba8ed7cc71718c0d" + }, + { + "referencedResource": "Benchmark02.cs", + "target": "guid: 3467f4170568a484d8b57e2051a27363", + "replacement": "guid: e8538afcddc14efbb5d9e94b7ae50197" + }, + { + "referencedResource": "Benchmark03.cs", + "target": "guid: e6e9d20624a23da4c8b2b6fb7608bb9a", + "replacement": "guid: a73109742c8d47ac822895a473300c29" + }, + { + "referencedResource": "Benchmark04.cs", + "target": "guid: 481dd67bdedc3104ea2156ed49f3acd5", + "replacement": "guid: dc20866c0d5e413ab7559440e15333ae" + }, + { + "referencedResource": "CameraController.cs", + "target": "guid: a9f0e07aefca0cc459134ff9df622278", + "replacement": "guid: 2d687537154440a3913a9a3c7977978c" + }, + { + "referencedResource": "ChatController.cs", + "target": "guid: eba5a4db2591a5844aea5f6f3ad8548e", + "replacement": "guid: 53d91f98a2664f5cb9af11de72ac54ec" + }, + { + "referencedResource": "EnvMapAnimator.cs", + "target": "guid: 7e69f3f28c520ce4d9ab9964b2895b1a", + "replacement": "guid: a4b6f99e8bc54541bbd149b014ff441c" + }, + { + "referencedResource": "ObjectSpin.cs", + "target": "guid: 5e7872ff51989434dabf7807265ada3c", + "replacement": "guid: 4f19c7f94c794c5097d8bd11e39c750d" + }, + { + "referencedResource": "ShaderPropAnimator.cs", + "target": "guid: c56cf968fb6a5b6488e709242718845d", + "replacement": "guid: 2787a46a4dc848c1b4b7b9307b614bfd" + }, + { + "referencedResource": "SimpleScript.cs", + "target": "guid: c64808ff5137c9044a583750e5b0468a", + "replacement": "guid: 9eff140b25d64601aabc6ba32245d099" + }, + { + "referencedResource": "SkewTextExample.cs", + "target": "guid: 48d40dfeb33b717488f55ddbf676643a", + "replacement": "guid: d412675cfb3441efa3bf8dcd9b7624dc" + }, + { + "referencedResource": "TeleType.cs", + "target": "guid: 9094c5c777af3f14489e8947748e86e6", + "replacement": "guid: e32c266ee6204b21a427753cb0694c81" + }, + { + "referencedResource": "TextConsoleSimulator.cs", + "target": "guid: 45757dcc8f119454dac6365e8fd15e8b", + "replacement": "guid: 43bcd35a1c0c40ccb6d472893fe2093f" + }, + { + "referencedResource": "TextMeshProFloatingText.cs", + "target": "guid: dd0e4b969aa70504382a89d2f208ae6c", + "replacement": "guid: a4d4c76e63944cba8c7d00f56334b98c" + }, + { + "referencedResource": "TextMeshSpawner.cs", + "target": "guid: 385939aed18e82d41894437798c30ed8", + "replacement": "guid: 76c11bbcfddf44e0ba17d6c2751c8d84" + }, + { + "referencedResource": "TMP_ExampleScript_01.cs", + "target": "guid: 36bafabb5572c6347923b971425ab3be", + "replacement": "guid: 6f2c5b59b6874405865e2616e4ec276a" + }, + { + "referencedResource": "TMP_FrameRateCounter.cs", + "target": "guid: c0357609254b68d4881cab18f04dd4dc", + "replacement": "guid: 686ec78b56aa445795335fbadafcfaa4" + }, + { + "referencedResource": "TMP_TextEventCheck.cs", + "target": "guid: ba181bda76b7f6047ba2188e94bf0894", + "replacement": "guid: d736ce056cf444ca96e424f4d9c42b76" + }, + { + "referencedResource": "TMP_TextEventHandler.cs", + "target": "guid: 48a2fdbd95acd794caf78a85a0b6926a", + "replacement": "guid: 1312ae25639a4bae8e25ae223209cc50" + }, + { + "referencedResource": "TMP_TextInfoDebugTool.cs", + "target": "guid: 5eeee4467ee5b6a4884a1ec94812d93e", + "replacement": "guid: 21256c5b62f346f18640dad779911e20" + }, + { + "referencedResource": "TMP_TextSelector_A.cs", + "target": "guid: 68baf2864c88f4a43a50f16709de8717", + "replacement": "guid: 103e0a6a1d404693b9fb1a5173e0e979" + }, + { + "referencedResource": "TMP_TextSelector_B.cs", + "target": "guid: f499ff45b9a3d0840a0df48d01b2877b", + "replacement": "guid: a05dcd8be7ec4ccbb35c26219884aa37" + }, + { + "referencedResource": "TMP_UiFrameRateCounter.cs", + "target": "guid: dc33b7a34d20d5e4e8d54b6867ce81e3", + "replacement": "guid: 24b0dc2d1d494adbbec1f4db26b4cf83" + }, + { + "referencedResource": "TMPro_InstructionOverlay.cs", + "target": "guid: 53b866620ba77504eaf52cab7dbd95c9", + "replacement": "guid: c3c1afeda5e545e0b19add5373896d2e" + }, + { + "referencedResource": "VertexColorCycler.cs", + "target": "guid: c8d54cdd5913d4e4bb7b655d7d16835b", + "replacement": "guid: 91b8ba3d52e041fab2d0e0f169855539" + }, + { + "referencedResource": "VertexJitter.cs", + "target": "guid: e4769cb37968ea948a763a9a89f9e583", + "replacement": "guid: 2ed57967c52645d390a89dcf8f61ba73" + }, + { + "referencedResource": "VertexShakeA.cs", + "target": "guid: eaa12d191e718c945ac55da73fa469db", + "replacement": "guid: f7cfa58e417a46ea8889989684c2522e" + }, + { + "referencedResource": "VertexShakeB.cs", + "target": "guid: 32c83a5d3ba42b84aa26386eac47566b", + "replacement": "guid: e4e0d9ccee5f4950be8979268c9014e0" + }, + { + "referencedResource": "VertexZoom.cs", + "target": "guid: 5305493000edc7d4ea4302757dc19a99", + "replacement": "guid: 52ec835d14bd486f900952b77698b7eb" + }, + { + "referencedResource": "WarpTextExample.cs", + "target": "guid: f3eef864a10f51045a7530e2afe7c179", + "replacement": "guid: 790744c462254b7ba8038e6ed28b3db2" + }, + { + "referencedResource": "DropCap Numbers.psd", + "target": "guid: 28b41fef228d6814f90e541deaf9f262", + "replacement": "guid: fd09957580ac4326916010f1f260975b" + }, + { + "referencedResource": "Brushed Metal 3.jpg", + "target": "guid: c30270e41dccf9441ab56d94261bdcfa", + "replacement": "guid: f88677df267a41d6be1e7a6133e7d227" + }, + { + "referencedResource": "Engraved Wall.jpg", + "target": "guid: 93d6f74f2ef358e41989d4152b195f88", + "replacement": "guid: e0f91e6569da4934a48d85bf8d3063f0" + }, + { + "referencedResource": "Engraved Wall Normal.jpg", + "target": "guid: 1edd0950293e8664094053a041548c23", + "replacement": "guid: 20f91c93e7fb490f9496609c52ef3904" + }, + { + "referencedResource": "Floor Cement.jpg", + "target": "guid: ac5a0a5373b36e049bb7f98f88dbc244", + "replacement": "guid: 283f897e4925411ebbaa758b4cb13fc2" + }, + { + "referencedResource": "Floor Tiles 1 - diffuse.jpg", + "target": "guid: 7bbfb8818476e4641ba3e75f5225eb69", + "replacement": "guid: 85ac55597b97403c82fc6601a93cf241" + }, + { + "referencedResource": "Floor Tiles 1 - normal.jpg", + "target": "guid: e00d5a9a0944134448432ccacf221b95", + "replacement": "guid: c45cd05946364f32aba704f0853a975b" + }, + { + "referencedResource": "Fruit Jelly (B&W).jpg", + "target": "guid: 74d8c208a0193e14ca6916bea88a2c52", + "replacement": "guid: 1cdc5b506b1a4a33a53c30669ced1f51" + }, + { + "referencedResource": "Gradient Diagonal (Color).jpg", + "target": "guid: 2421a4955e71725448211e6bfbc7d7fb", + "replacement": "guid: 2ce5c55e85304b819a1826ecbc839aa5" + }, + { + "referencedResource": "Gradient Horizontal (Color).jpg", + "target": "guid: 0bbb43aff4f7811419ffceb1b16cf3d6", + "replacement": "guid: 6eb184de103d4b3f812b38561065192f" + }, + { + "referencedResource": "Gradient Vertical (Color).jpg", + "target": "guid: 3359915af07779e4e9a966df9eed764f", + "replacement": "guid: 03d0538de6e24c0f819bfc9ce084dfa9" + }, + { + "referencedResource": "Mask Zig-n-Zag.psd", + "target": "guid: 04eb87e72b3c1c648ba47a869ee00505", + "replacement": "guid: bb8dfcd263ad4eb383a33d74a720be6f" + }, + { + "referencedResource": "Sand Normal Map.jpg", + "target": "guid: 89e1b1c005d29cf4598ea861deb35a80", + "replacement": "guid: 8b8c8a10edf94ddc8cc4cc4fcd5696a9" + }, + { + "referencedResource": "Small Crate_diffuse.jpg", + "target": "guid: 64734c9bc6df32149a0c9cb0b18693e1", + "replacement": "guid: 602cb87b6a29443b8636370ea0751574" + }, + { + "referencedResource": "Small Crate_normal.jpg", + "target": "guid: 81b50d9cb6f3104448ec54c00a80101a", + "replacement": "guid: 8878a782f4334ecbbcf683b3ac780966" + }, + { + "referencedResource": "Stainless 03.png", + "target": "guid: 40d7f27f614cc1043a1f7e19074f461c", + "replacement": "guid: 83cb272f9ee046f6ab6636ca38af8db4" + }, + { + "referencedResource": "Text Overflow - Linked Text Image 1.png", + "target": "guid: 1fd8c568b1fcdbe43be65c1619cf3293", + "replacement": "guid: 4ccf43d26c4748c792174516f4a8fcef" + }, + { + "referencedResource": "Text Overflow - Linked Text UI Screenshot.png", + "target": "guid: 7983d2ec0427c114a916ae3c4769dc10", + "replacement": "guid: c76d18757a194d618355f05f815cb0a1" + }, + { + "referencedResource": "Wipe Pattern - Circle.psd", + "target": "guid: 6f5e9497d22a7a84193ec825e2eb41ac", + "replacement": "guid: 10c49fcd9c64421db7c0133e61e55f97" + }, + { + "referencedResource": "Wipe Pattern - Diagonal.psd", + "target": "guid: 8ee4d366b96418044aa9f94b3e2de645", + "replacement": "guid: ed5290d8df18488780e2996b9b882f01" + }, + { + "referencedResource": "Wipe Pattern - Radial Double.psd", + "target": "guid: 3e0e22da7c9570b498205179ef58ef38", + "replacement": "guid: 7631f4eff8f74ed38eb3eb9db17134e1" + }, + { + "referencedResource": "Wipe Pattern - Radial Quad.psd", + "target": "guid: 05ffd580f33f74644a6025ec196860af", + "replacement": "guid: 2b5e9ae96c5644d8bae932f8b4ca68a2" + }, + { + "referencedResource": "LiberationSans SDF.asset", + "target": "guid: 715b80e429c437e40867928a4e1fc975", + "replacement": "guid: 8f586378b4e144a9851e7b34d9b748ee" + }, + { + "referencedResource": "LineBreaking Following Characters.txt", + "target": "guid: 312ba5b9e90627940866e19549a788cf", + "replacement": "guid: fade42e8bc714b018fac513c043d323b" + }, + { + "referencedResource": "LineBreaking Leading Characters.txt", + "target": "guid: 8d713940fcbede142ae4a33ea0062b33", + "replacement": "guid: d82c1b31c7e74239bff1220585707d2b" + }, + { + "referencedResource": "TMP_Bitmap.shader", + "target": "guid: edfcf888cd11d9245b91d2883049a57e", + "replacement": "guid: 128e987d567d4e2c824d754223b3f3b0" + }, + { + "referencedResource": "TMP_Bitmap-Mobile.shader", + "target": "guid: d1cf17907700cb647aa3ea423ba38f2e", + "replacement": "guid: 1e3b057af24249748ff873be7fafee47" + }, + { + "referencedResource": "TMP_SDF.shader", + "target": "guid: dca26082f9cb439469295791d9f76fe5", + "replacement": "guid: 68e6db2ebdc24f95958faec2be5558d6" + }, + { + "referencedResource": "TMP_SDF Overlay.shader", + "target": "guid: 4a7755d6b5b67874f89c85f56f95fe97", + "replacement": "guid: dd89cf5b9246416f84610a006f916af7" + }, + { + "referencedResource": "TMP_SDF-Mobile.shader", + "target": "guid: cafd18099dfc0114896e0a8b277b81b6", + "replacement": "guid: fe393ace9b354375a9cb14cdbbc28be4" + }, + { + "referencedResource": "TMP_SDF-Mobile Masking.shader", + "target": "guid: afc255f7c2be52e41973a3d10a2e632d", + "replacement": "guid: bc1ede39bf3643ee8e493720e4259791" + }, + { + "referencedResource": "TMP_SDF-Mobile Overlay.shader", + "target": "guid: 9ecb3fe313cb5f7478141eba4a2d54ed", + "replacement": "guid: a02a7d8c237544f1962732b55a9aebf1" + }, + { + "referencedResource": "TMP_SDF-Surface.shader", + "target": "guid: 8e6b9842dbb1a5a4887378afab854e63", + "replacement": "guid: f7ada0af4f174f0694ca6a487b8f543d" + }, + { + "referencedResource": "TMP_SDF-Surface-Mobile.shader", + "target": "guid: 3c2ea7753c1425145a74d106ec1cd852", + "replacement": "guid: 85187c2149c549c5b33f0cdb02836b17" + }, + { + "referencedResource": "TMP_Sprite.shader", + "target": "guid: 3a1c68c8292caf046bd21158886c5e40", + "replacement": "guid: cf81c85f95fe47e1a27f6ae460cf182c" + }, + { + "referencedResource": "Default Sprite Asset.asset", + "target": "guid: 273ca6c80b4b5d746b5e548f532bffd8", + "replacement": "guid: fbef3c704dce48f08a44612d6c856c8d" + }, + { + "referencedResource": "EmojiOne.asset", + "target": "guid: 9a952e2781ef26940ae089f1053ef4ef", + "replacement": "guid: c41005c129ba4d66911b75229fd70b45" + }, + { + "referencedResource": "TMP Default Style Sheet.asset", + "target": "guid: 54d1085f9a2fdea4587fcfc7dddcd4bc", + "replacement": "guid: f952c082cb03451daed3ee968ac6c63e" + }, + { + "referencedResource": "TMP Settings.asset", + "target": "guid: 69ed5bac41eebaa4c97e9d2a4168c54f", + "replacement": "guid: 3f5b5dff67a942289a9defa416b206f3" + }, + { + "referencedResource": "TextContainer.cs", + "target": "guid: 3b34fc186f40e8043b977d4fa70db8c5", + "replacement": "guid: 32d40088a6124c578ad6b428df586e2e" + }, + { + "referencedResource": "TextContainer.cs", + "target": "fileID: 311004786, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 32d40088a6124c578ad6b428df586e2e" + }, + { + "referencedResource": "TextMeshPro.cs", + "target": "guid: 1a1578b9753d2604f98d608cb4239e2f", + "replacement": "guid: 9541d86e2fd84c1d9990edf0852d74ab" + }, + { + "referencedResource": "TextMeshPro.cs", + "target": "fileID: -806885394, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab" + }, + { + "referencedResource": "TextMeshProUGUI.cs", + "target": "guid: 496f2e385b0c62542b5c739ccfafd8da", + "replacement": "guid: f4688fdb7df04437aeb418b961361dc5" + }, + { + "referencedResource": "TextMeshProUGUI.cs", + "target": "fileID: 1453722849, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5" + }, + { + "referencedResource": "TMP_Asset.cs", + "target": "guid: e2c4405608b405a4680436e183e53c45", + "replacement": "guid: 3bda1886f58f4e0ab1139400b160c3ee" + }, + { + "referencedResource": "TMP_Asset.cs", + "target": "fileID: -659140726, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 3bda1886f58f4e0ab1139400b160c3ee" + }, + { + "referencedResource": "TMP_ColorGradient.cs", + "target": "guid: e90e18dd4a044ff4394833216e6bf4d2", + "replacement": "guid: 54d21f6ece3b46479f0c328f8c6007e0" + }, + { + "referencedResource": "TMP_ColorGradient.cs", + "target": "fileID: 2108210716, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 54d21f6ece3b46479f0c328f8c6007e0" + }, + { + "referencedResource": "TMP_Dropdown.cs", + "target": "guid: 44cb1d34ddab9d449a05fc3747876be1", + "replacement": "guid: 7b743370ac3e4ec2a1668f5455a8ef8a" + }, + { + "referencedResource": "TMP_Dropdown.cs", + "target": "fileID: 1148083418, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a" + }, + { + "referencedResource": "TMP_FontAsset.cs", + "target": "guid: 74dfce233ddb29b4294c3e23c1d3650d", + "replacement": "guid: 71c1514a6bd24e1e882cebbe1904ce04" + }, + { + "referencedResource": "TMP_FontAsset.cs", + "target": "fileID: -667331979, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04" + }, + { + "referencedResource": "TMP_InputField.cs", + "target": "guid: 7b85855a3deaa2e44ac6741a6bbc85f6", + "replacement": "guid: 2da0c512f12947e489f739169773d7ca" + }, + { + "referencedResource": "TMP_InputField.cs", + "target": "fileID: -1620774994, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca" + }, + { + "referencedResource": "TMP_Settings.cs", + "target": "guid: aafc3c7b9e915d64e8ec3d2c88b3a231", + "replacement": "guid: 2705215ac5b84b70bacc50632be6e391" + }, + { + "referencedResource": "TMP_Settings.cs", + "target": "fileID: -395462249, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 2705215ac5b84b70bacc50632be6e391" + }, + { + "referencedResource": "TMP_SpriteAsset.cs", + "target": "guid: 90940d439ca0ef746af0b48419b92d2e", + "replacement": "guid: 84a92b25f83d49b9bc132d206b370281" + }, + { + "referencedResource": "TMP_SpriteAsset.cs", + "target": "fileID: 2019389346, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 84a92b25f83d49b9bc132d206b370281" + }, + { + "referencedResource": "TMP_StyleSheet.cs", + "target": "guid: 13259b4ce497b194eb52a33d8eda0bdc", + "replacement": "guid: ab2114bdc8544297b417dfefe9f1e410" + }, + { + "referencedResource": "TMP_StyleSheet.cs", + "target": "fileID: -1936749209, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: ab2114bdc8544297b417dfefe9f1e410" + }, + { + "referencedResource": "TMP_SubMesh.cs", + "target": "guid: bd950677b2d06c74494b1c1118584fff", + "replacement": "guid: 07994bfe8b0e4adb97d706de5dea48d5" + }, + { + "referencedResource": "TMP_SubMesh.cs", + "target": "fileID: 1330537494, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 07994bfe8b0e4adb97d706de5dea48d5" + }, + { + "referencedResource": "TMP_SubMeshUI.cs", + "target": "guid: a5378e1f14d974d419f811d6b0861f20", + "replacement": "guid: 058cba836c1846c3aa1c5fd2e28aea77" + }, + { + "referencedResource": "TMP_SubMeshUI.cs", + "target": "fileID: 1908110080, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 058cba836c1846c3aa1c5fd2e28aea77" + }, + { + "referencedResource": "TMP_Text.cs", + "target": "guid: 9ec8dc9c3fa2e5d41b939b5888d2f1e8", + "replacement": "guid: 5143f58107604835ab1a5efa2d8818fd" + }, + { + "referencedResource": "TMP_Text.cs", + "target": "fileID: -1385168320, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 5143f58107604835ab1a5efa2d8818fd" + }, + { + "referencedResource": "Default Sprite Asset.png", + "target": "guid: 5b32c2d36abe44540bed74c1f787033b", + "replacement": "guid: a0fc465d6cf04254a2938578735e2383" + }, + { + "referencedResource": "EmojiOne.png", + "target": "guid: 6ec706981a919c3489f0b061a40054e2", + "replacement": "guid: dffef66376be4fa480fb02b19edbe903" + } + ] +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData.json.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData.json.meta new file mode 100644 index 0000000..a7a2790 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 05f5bfd584002f948982a1498890f9a9 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData_Assets.json b/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData_Assets.json new file mode 100644 index 0000000..f07aa23 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData_Assets.json @@ -0,0 +1,184 @@ +{ + "assetRecords": [ + { + "referencedResource": "TMP_FontAsset.cs", + "target": "guid: 74dfce233ddb29b4294c3e23c1d3650d", + "replacement": "guid: 71c1514a6bd24e1e882cebbe1904ce04" + }, + { + "referencedResource": "TMP_FontAsset.cs", + "target": "fileID: -667331979, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04" + }, + { + "referencedResource": "Anton SDF.asset", + "target": "guid: f76ef802b8b940c46a31f9027f2b0158", + "replacement": "guid: 8a89fa14b10d46a99122fd4f73fca9a2" + }, + { + "referencedResource": "Bangers SDF.asset", + "target": "guid: 808aa8f1ab804104aa7d0c337a6c1481", + "replacement": "guid: 125cb55b44b24c4393181402bc6200e6" + }, + { + "referencedResource": "Electronic Highway Sign SDF.asset", + "target": "guid: 163292f6f226d954593d45b079f8aae0", + "replacement": "guid: dc36b3fdc14f47ebb36fd484a67e268a" + }, + { + "referencedResource": "Oswald Bold SDF.asset", + "target": "guid: 09641b029dfa78843902b548a9de7553", + "replacement": "guid: 0161d805a3764c089bef00bfe00793f5" + }, + { + "referencedResource": "Roboto-Bold SDF.asset", + "target": "guid: d62a573c923f5cb47b8ff65261033b90", + "replacement": "guid: 5302535af1044152a457ed104f1f4b91" + }, + { + "referencedResource": "LiberationSans SDF.asset", + "target": "guid: 715b80e429c437e40867928a4e1fc975", + "replacement": "guid: 8f586378b4e144a9851e7b34d9b748ee" + }, + { + "referencedResource": "TMP_Bitmap.shader", + "target": "guid: edfcf888cd11d9245b91d2883049a57e", + "replacement": "guid: 128e987d567d4e2c824d754223b3f3b0" + }, + { + "referencedResource": "TMP_Bitmap-Mobile.shader", + "target": "guid: d1cf17907700cb647aa3ea423ba38f2e", + "replacement": "guid: 1e3b057af24249748ff873be7fafee47" + }, + { + "referencedResource": "TMP_SDF.shader", + "target": "guid: dca26082f9cb439469295791d9f76fe5", + "replacement": "guid: 68e6db2ebdc24f95958faec2be5558d6" + }, + { + "referencedResource": "TMP_SDF Overlay.shader", + "target": "guid: 4a7755d6b5b67874f89c85f56f95fe97", + "replacement": "guid: dd89cf5b9246416f84610a006f916af7" + }, + { + "referencedResource": "TMP_SDF-Mobile.shader", + "target": "guid: cafd18099dfc0114896e0a8b277b81b6", + "replacement": "guid: fe393ace9b354375a9cb14cdbbc28be4" + }, + { + "referencedResource": "TMP_SDF-Mobile Masking.shader", + "target": "guid: afc255f7c2be52e41973a3d10a2e632d", + "replacement": "guid: bc1ede39bf3643ee8e493720e4259791" + }, + { + "referencedResource": "TMP_SDF-Mobile Overlay.shader", + "target": "guid: 9ecb3fe313cb5f7478141eba4a2d54ed", + "replacement": "guid: a02a7d8c237544f1962732b55a9aebf1" + }, + { + "referencedResource": "TMP_SDF-Surface.shader", + "target": "guid: 8e6b9842dbb1a5a4887378afab854e63", + "replacement": "guid: f7ada0af4f174f0694ca6a487b8f543d" + }, + { + "referencedResource": "TMP_SDF-Surface-Mobile.shader", + "target": "guid: 3c2ea7753c1425145a74d106ec1cd852", + "replacement": "guid: 85187c2149c549c5b33f0cdb02836b17" + }, + { + "referencedResource": "TMP_Sprite.shader", + "target": "guid: 3a1c68c8292caf046bd21158886c5e40", + "replacement": "guid: cf81c85f95fe47e1a27f6ae460cf182c" + }, + { + "referencedResource": "TMP_ColorGradient.cs", + "target": "guid: e90e18dd4a044ff4394833216e6bf4d2", + "replacement": "guid: 54d21f6ece3b46479f0c328f8c6007e0" + }, + { + "referencedResource": "TMP_ColorGradient.cs", + "target": "fileID: 2108210716, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 54d21f6ece3b46479f0c328f8c6007e0" + }, + { + "referencedResource": "TMP_Settings.cs", + "target": "guid: aafc3c7b9e915d64e8ec3d2c88b3a231", + "replacement": "guid: 2705215ac5b84b70bacc50632be6e391" + }, + { + "referencedResource": "TMP_Settings.cs", + "target": "fileID: -395462249, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 2705215ac5b84b70bacc50632be6e391" + }, + { + "referencedResource": "TMP Settings.asset", + "target": "guid: 69ed5bac41eebaa4c97e9d2a4168c54f", + "replacement": "guid: 3f5b5dff67a942289a9defa416b206f3" + }, + { + "referencedResource": "LineBreaking Following Characters.txt", + "target": "guid: 312ba5b9e90627940866e19549a788cf", + "replacement": "guid: fade42e8bc714b018fac513c043d323b" + }, + { + "referencedResource": "LineBreaking Leading Characters.txt", + "target": "guid: 8d713940fcbede142ae4a33ea0062b33", + "replacement": "guid: d82c1b31c7e74239bff1220585707d2b" + }, + { + "referencedResource": "TMP_StyleSheet.cs", + "target": "guid: 13259b4ce497b194eb52a33d8eda0bdc", + "replacement": "guid: ab2114bdc8544297b417dfefe9f1e410" + }, + { + "referencedResource": "TMP_StyleSheet.cs", + "target": "fileID: -1936749209, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: ab2114bdc8544297b417dfefe9f1e410" + }, + { + "referencedResource": "TMP Default Style Sheet.asset", + "target": "guid: 54d1085f9a2fdea4587fcfc7dddcd4bc", + "replacement": "guid: f952c082cb03451daed3ee968ac6c63e" + }, + { + "referencedResource": "TMP_SpriteAsset.cs", + "target": "guid: 90940d439ca0ef746af0b48419b92d2e", + "replacement": "guid: 84a92b25f83d49b9bc132d206b370281" + }, + { + "referencedResource": "TMP_SpriteAsset.cs", + "target": "fileID: 2019389346, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 84a92b25f83d49b9bc132d206b370281" + }, + { + "referencedResource": "Default Sprite Asset.asset", + "target": "guid: 273ca6c80b4b5d746b5e548f532bffd8", + "replacement": "guid: fbef3c704dce48f08a44612d6c856c8d" + }, + { + "referencedResource": "Default Sprite Asset.png", + "target": "guid: 5b32c2d36abe44540bed74c1f787033b", + "replacement": "guid: a0fc465d6cf04254a2938578735e2383" + }, + { + "referencedResource": "EmojiOne.asset", + "target": "guid: 9a952e2781ef26940ae089f1053ef4ef", + "replacement": "guid: c41005c129ba4d66911b75229fd70b45" + }, + { + "referencedResource": "EmojiOne.png", + "target": "guid: 6ec706981a919c3489f0b061a40054e2", + "replacement": "guid: dffef66376be4fa480fb02b19edbe903" + }, + { + "referencedResource": "DropCap Numbers.asset", + "target": "guid: c4fd2a959a50b584b92dedfefec1ffda", + "replacement": "guid: 14aa93acbb234d16aaef0e8b46814db6" + }, + { + "referencedResource": "DropCap Numbers.psd", + "target": "guid: 28b41fef228d6814f90e541deaf9f262", + "replacement": "guid: fd09957580ac4326916010f1f260975b" + } + ] +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData_Assets.json.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData_Assets.json.meta new file mode 100644 index 0000000..f534ac1 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData_Assets.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0e0afa652c0031c48896a97b424d027b +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts.meta new file mode 100644 index 0000000..3c2e4cf --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e6a1d1e3d2384453a7371b4a07a41ca4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor.meta new file mode 100644 index 0000000..af509a3 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b5d6c28ed7b94775be9e2560f300247c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/DropdownOptionListDrawer.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/DropdownOptionListDrawer.cs new file mode 100644 index 0000000..2b7dc85 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/DropdownOptionListDrawer.cs @@ -0,0 +1,60 @@ +using UnityEditorInternal; +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + [CustomPropertyDrawer(typeof(TMP_Dropdown.OptionDataList), true)] + class DropdownOptionListDrawer : PropertyDrawer + { + private ReorderableList m_ReorderableList; + + private void Init(SerializedProperty property) + { + if (m_ReorderableList != null) + return; + + SerializedProperty array = property.FindPropertyRelative("m_Options"); + + m_ReorderableList = new ReorderableList(property.serializedObject, array); + m_ReorderableList.drawElementCallback = DrawOptionData; + m_ReorderableList.drawHeaderCallback = DrawHeader; + m_ReorderableList.elementHeight += 16; + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + Init(property); + + m_ReorderableList.DoList(position); + } + + private void DrawHeader(Rect rect) + { + GUI.Label(rect, "Options"); + } + + private void DrawOptionData(Rect rect, int index, bool isActive, bool isFocused) + { + SerializedProperty itemData = m_ReorderableList.serializedProperty.GetArrayElementAtIndex(index); + SerializedProperty itemText = itemData.FindPropertyRelative("m_Text"); + SerializedProperty itemImage = itemData.FindPropertyRelative("m_Image"); + + RectOffset offset = new RectOffset(0, 0, -1, -3); + rect = offset.Add(rect); + rect.height = EditorGUIUtility.singleLineHeight; + + EditorGUI.PropertyField(rect, itemText, GUIContent.none); + rect.y += EditorGUIUtility.singleLineHeight; + EditorGUI.PropertyField(rect, itemImage, GUIContent.none); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + Init(property); + + return m_ReorderableList.GetHeight(); + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/DropdownOptionListDrawer.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/DropdownOptionListDrawer.cs.meta new file mode 100644 index 0000000..f7f4c56 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/DropdownOptionListDrawer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9545c9eb3bf94265810463794fec8334 +timeCreated: 1464818008 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphInfoDrawer.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphInfoDrawer.cs new file mode 100644 index 0000000..0936dc7 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphInfoDrawer.cs @@ -0,0 +1,61 @@ +/* +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_Glyph))] + public class GlyphInfoDrawer : PropertyDrawer + { + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_id = property.FindPropertyRelative("id"); + SerializedProperty prop_x = property.FindPropertyRelative("x"); + SerializedProperty prop_y = property.FindPropertyRelative("y"); + SerializedProperty prop_width = property.FindPropertyRelative("width"); + SerializedProperty prop_height = property.FindPropertyRelative("height"); + SerializedProperty prop_xOffset = property.FindPropertyRelative("xOffset"); + SerializedProperty prop_yOffset = property.FindPropertyRelative("yOffset"); + SerializedProperty prop_xAdvance = property.FindPropertyRelative("xAdvance"); + SerializedProperty prop_scale = property.FindPropertyRelative("scale"); + + + // We get Rect since a valid position may not be provided by the caller. + Rect rect = GUILayoutUtility.GetRect(position.width, 48); + rect.y -= 15; + + //GUI.enabled = false; + EditorGUIUtility.labelWidth = 40f; + EditorGUIUtility.fieldWidth = 45f; + + bool prevGuiState = GUI.enabled; + GUI.enabled = true; + EditorGUI.LabelField(new Rect(rect.x + 5f, rect.y, 80f, 18), new GUIContent("Ascii: " + prop_id.intValue + ""), TMP_UIStyleManager.label); + EditorGUI.LabelField(new Rect(rect.x + 90f, rect.y, 80f, 18), new GUIContent("Hex: " + prop_id.intValue.ToString("X") + ""), TMP_UIStyleManager.label); + EditorGUI.LabelField(new Rect(rect.x + 170f, rect.y, 80, 18), "Char: [ " + (char)prop_id.intValue + " ]", TMP_UIStyleManager.label); + GUI.enabled = prevGuiState; + + EditorGUIUtility.labelWidth = 35f; + EditorGUIUtility.fieldWidth = 10f; + + float width = (rect.width - 5f) / 4; + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 0, rect.y + 22, width - 5f, 18), prop_x, new GUIContent("X:")); + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 1, rect.y + 22, width - 5f, 18), prop_y, new GUIContent("Y:")); + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 2, rect.y + 22, width - 5f, 18), prop_width, new GUIContent("W:")); + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 3, rect.y + 22, width - 5f, 18), prop_height, new GUIContent("H:")); + + //GUI.enabled = true; + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 0, rect.y + 44, width - 5f, 18), prop_xOffset, new GUIContent("OX:")); + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 1, rect.y + 44, width - 5f, 18), prop_yOffset, new GUIContent("OY:")); + //GUI.enabled = true; + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 2, rect.y + 44, width - 5f, 18), prop_xAdvance, new GUIContent("ADV:")); + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 3, rect.y + 44, width - 5f, 18), prop_scale, new GUIContent("SF:")); + } + + } +} +*/ \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphInfoDrawer.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphInfoDrawer.cs.meta new file mode 100644 index 0000000..10ed151 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphInfoDrawer.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 900f1a451c764dc3bdcc0de815a15935 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs new file mode 100644 index 0000000..1e1f4d1 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs @@ -0,0 +1,53 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(GlyphMetrics))] + public class GlyphMetricsPropertyDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_Width = property.FindPropertyRelative("m_Width"); + SerializedProperty prop_Height = property.FindPropertyRelative("m_Height"); + SerializedProperty prop_HoriBearingX = property.FindPropertyRelative("m_HorizontalBearingX"); + SerializedProperty prop_HoriBearingY = property.FindPropertyRelative("m_HorizontalBearingY"); + SerializedProperty prop_HoriAdvance = property.FindPropertyRelative("m_HorizontalAdvance"); + + // We get Rect since a valid position may not be provided by the caller. + Rect rect = new Rect(position.x, position.y, position.width, 49); + + EditorGUI.LabelField(rect, new GUIContent("Glyph Metrics")); + + EditorGUIUtility.labelWidth = 30f; + EditorGUIUtility.fieldWidth = 10f; + + //GUI.enabled = false; + float width = (rect.width - 75f) / 2; + EditorGUI.PropertyField(new Rect(rect.x + width * 0, rect.y + 20, width - 5f, 18), prop_Width, new GUIContent("W:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 1, rect.y + 20, width - 5f, 18), prop_Height, new GUIContent("H:")); + + //GUI.enabled = true; + + width = (rect.width - 75f) / 3; + EditorGUI.BeginChangeCheck(); + EditorGUI.PropertyField(new Rect(rect.x + width * 0, rect.y + 40, width - 5f, 18), prop_HoriBearingX, new GUIContent("BX:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 1, rect.y + 40, width - 5f, 18), prop_HoriBearingY, new GUIContent("BY:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 2, rect.y + 40, width - 5f, 18), prop_HoriAdvance, new GUIContent("AD:")); + if (EditorGUI.EndChangeCheck()) + { + + } + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 65f; + } + + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs.meta new file mode 100644 index 0000000..d91f579 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e3882522a08b6f5459b4dea6f8791278 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphRectPropertyDrawer.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphRectPropertyDrawer.cs new file mode 100644 index 0000000..87ecf0c --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphRectPropertyDrawer.cs @@ -0,0 +1,44 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(GlyphRect))] + public class GlyphRectPropertyDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + //EditorGUI.BeginProperty(position, label, property); + + SerializedProperty prop_X = property.FindPropertyRelative("m_X"); + SerializedProperty prop_Y = property.FindPropertyRelative("m_Y"); + SerializedProperty prop_Width = property.FindPropertyRelative("m_Width"); + SerializedProperty prop_Height = property.FindPropertyRelative("m_Height"); + + // We get Rect since a valid position may not be provided by the caller. + Rect rect = new Rect(position.x, position.y, position.width, 49); + EditorGUI.LabelField(rect, new GUIContent("Glyph Rect")); + + EditorGUIUtility.labelWidth = 30f; + EditorGUIUtility.fieldWidth = 10f; + + //GUI.enabled = false; + float width = (rect.width - 75f) / 4; + EditorGUI.PropertyField(new Rect(rect.x + width * 0, rect.y + 20, width - 5f, 18), prop_X, new GUIContent("X:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 1, rect.y + 20, width - 5f, 18), prop_Y, new GUIContent("Y:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 2, rect.y + 20, width - 5f, 18), prop_Width, new GUIContent("W:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 3, rect.y + 20, width - 5f, 18), prop_Height, new GUIContent("H:")); + + //EditorGUI.EndProperty(); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 45f; + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphRectPropertyDrawer.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphRectPropertyDrawer.cs.meta new file mode 100644 index 0000000..9323279 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphRectPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bc2b083b068f3546a9509c805e0541c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseEditorPanel.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseEditorPanel.cs new file mode 100644 index 0000000..c4a55ba --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseEditorPanel.cs @@ -0,0 +1,1116 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + public abstract class TMP_BaseEditorPanel : Editor + { + //Labels and Tooltips + static readonly GUIContent k_RtlToggleLabel = new GUIContent("Enable RTL Editor", "Reverses text direction and allows right to left editing."); + static readonly GUIContent k_MainSettingsLabel = new GUIContent("Main Settings"); + static readonly GUIContent k_FontAssetLabel = new GUIContent("Font Asset", "The Font Asset containing the glyphs that can be rendered for this text."); + static readonly GUIContent k_MaterialPresetLabel = new GUIContent("Material Preset", "The material used for rendering. Only materials created from the Font Asset can be used."); + static readonly GUIContent k_AutoSizeLabel = new GUIContent("Auto Size", "Auto sizes the text to fit the available space."); + static readonly GUIContent k_FontSizeLabel = new GUIContent("Font Size", "The size the text will be rendered at in points."); + static readonly GUIContent k_AutoSizeOptionsLabel = new GUIContent("Auto Size Options"); + static readonly GUIContent k_MinLabel = new GUIContent("Min", "The minimum font size."); + static readonly GUIContent k_MaxLabel = new GUIContent("Max", "The maximum font size."); + static readonly GUIContent k_WdLabel = new GUIContent("WD%", "Compresses character width up to this value before reducing font size."); + static readonly GUIContent k_LineLabel = new GUIContent("Line", "Negative value only. Compresses line height down to this value before reducing font size."); + static readonly GUIContent k_FontStyleLabel = new GUIContent("Font Style", "Styles to apply to the text such as Bold or Italic."); + + static readonly GUIContent k_BoldLabel = new GUIContent("B", "Bold"); + static readonly GUIContent k_ItalicLabel = new GUIContent("I", "Italic"); + static readonly GUIContent k_UnderlineLabel = new GUIContent("U", "Underline"); + static readonly GUIContent k_StrikethroughLabel = new GUIContent("S", "Strikethrough"); + static readonly GUIContent k_LowercaseLabel = new GUIContent("ab", "Lowercase"); + static readonly GUIContent k_UppercaseLabel = new GUIContent("AB", "Uppercase"); + static readonly GUIContent k_SmallcapsLabel = new GUIContent("SC", "Smallcaps"); + + static readonly GUIContent k_ColorModeLabel = new GUIContent("Color Mode", "The type of gradient to use."); + static readonly GUIContent k_BaseColorLabel = new GUIContent("Vertex Color", "The base color of the text vertices."); + static readonly GUIContent k_ColorPresetLabel = new GUIContent("Color Preset", "A Color Preset which override the local color settings."); + static readonly GUIContent k_ColorGradientLabel = new GUIContent("Color Gradient", "The gradient color applied over the Vertex Color. Can be locally set or driven by a Gradient Asset."); + static readonly GUIContent k_CorenerColorsLabel = new GUIContent("Colors", "The color composition of the gradient."); + static readonly GUIContent k_OverrideTagsLabel = new GUIContent("Override Tags", "Whether the color settings override the tag."); + + static readonly GUIContent k_SpacingOptionsLabel = new GUIContent("Spacing Options", "Spacing adjustments between different elements of the text."); + static readonly GUIContent k_CharacterSpacingLabel = new GUIContent("Character"); + static readonly GUIContent k_WordSpacingLabel = new GUIContent("Word"); + static readonly GUIContent k_LineSpacingLabel = new GUIContent("Line"); + static readonly GUIContent k_ParagraphSpacingLabel = new GUIContent("Paragraph"); + + static readonly GUIContent k_AlignmentLabel = new GUIContent("Alignment", "Horizontal and vertical aligment of the text within its container."); + static readonly GUIContent k_WrapMixLabel = new GUIContent("Wrap Mix (W <-> C)", "How much to favor words versus characters when distributing the text."); + + static readonly GUIContent k_WrappingLabel = new GUIContent("Wrapping", "Wraps text to the next line when reaching the edge of the container."); + static readonly GUIContent[] k_WrappingOptions = { new GUIContent("Disabled"), new GUIContent("Enabled") }; + static readonly GUIContent k_OverflowLabel = new GUIContent("Overflow", "How to display text which goes past the edge of the container."); + + static readonly GUIContent k_MarginsLabel = new GUIContent("Margins", "The space between the text and the edge of its container."); + static readonly GUIContent k_GeometrySortingLabel = new GUIContent("Geometry Sorting", "The order in which text geometry is sorted. Used to adjust the way overlapping characters are displayed."); + static readonly GUIContent k_RichTextLabel = new GUIContent("Rich Text", "Enables the use of rich text tags such as and ."); + static readonly GUIContent k_EscapeCharactersLabel = new GUIContent("Parse Escape Characters", "Whether to display strings such as \"\\n\" as is or replace them by the character they represent."); + static readonly GUIContent k_VisibleDescenderLabel = new GUIContent("Visible Descender", "Compute descender values from visible characters only. Used to adjust layout behavior when hiding and revealing characters dynamically."); + static readonly GUIContent k_SpriteAssetLabel = new GUIContent("Sprite Asset", "The Sprite Asset used when NOT specifically referencing one using ."); + + static readonly GUIContent k_HorizontalMappingLabel = new GUIContent("Horizontal Mapping", "Horizontal UV mapping when using a shader with a texture face option."); + static readonly GUIContent k_VerticalMappingLabel = new GUIContent("Vertical Mapping", "Vertical UV mapping when using a shader with a texture face option."); + static readonly GUIContent k_LineOffsetLabel = new GUIContent("Line Offset", "Adds an horizontal offset to each successive line. Used for slanted texturing."); + + static readonly GUIContent k_KerningLabel = new GUIContent("Kerning", "Enables character specific spacing between pairs of characters."); + static readonly GUIContent k_PaddingLabel = new GUIContent("Extra Padding", "Adds some padding between the characters and the edge of the text mesh. Can reduce graphical errors when displaying small text."); + + static readonly GUIContent k_LeftLabel = new GUIContent("Left"); + static readonly GUIContent k_TopLabel = new GUIContent("Top"); + static readonly GUIContent k_RightLabel = new GUIContent("Right"); + static readonly GUIContent k_BottomLabel = new GUIContent("Bottom"); + + protected static readonly GUIContent k_ExtraSettingsLabel = new GUIContent("Extra Settings"); + + protected struct Foldout + { + // Track Inspector foldout panel states, globally. + public static bool extraSettings = false; + public static bool materialInspector = true; + } + + protected static int s_EventId; + + public int selAlignGridA; + public int selAlignGridB; + + protected SerializedProperty m_TextProp; + + protected SerializedProperty m_IsRightToLeftProp; + protected string m_RtlText; + + protected SerializedProperty m_FontAssetProp; + + protected SerializedProperty m_FontSharedMaterialProp; + protected Material[] m_MaterialPresets; + protected GUIContent[] m_MaterialPresetNames; + protected int m_MaterialPresetSelectionIndex; + protected bool m_IsPresetListDirty; + + protected SerializedProperty m_FontStyleProp; + + protected SerializedProperty m_FontColorProp; + protected SerializedProperty m_EnableVertexGradientProp; + protected SerializedProperty m_FontColorGradientProp; + protected SerializedProperty m_FontColorGradientPresetProp; + protected SerializedProperty m_OverrideHtmlColorProp; + + protected SerializedProperty m_FontSizeProp; + protected SerializedProperty m_FontSizeBaseProp; + + protected SerializedProperty m_AutoSizingProp; + protected SerializedProperty m_FontSizeMinProp; + protected SerializedProperty m_FontSizeMaxProp; + + protected SerializedProperty m_LineSpacingMaxProp; + protected SerializedProperty m_CharWidthMaxAdjProp; + + protected SerializedProperty m_CharacterSpacingProp; + protected SerializedProperty m_WordSpacingProp; + protected SerializedProperty m_LineSpacingProp; + protected SerializedProperty m_ParagraphSpacingProp; + + protected SerializedProperty m_TextAlignmentProp; + + protected SerializedProperty m_HorizontalMappingProp; + protected SerializedProperty m_VerticalMappingProp; + protected SerializedProperty m_UvLineOffsetProp; + + protected SerializedProperty m_EnableWordWrappingProp; + protected SerializedProperty m_WordWrappingRatiosProp; + protected SerializedProperty m_TextOverflowModeProp; + protected SerializedProperty m_PageToDisplayProp; + protected SerializedProperty m_LinkedTextComponentProp; + protected SerializedProperty m_IsLinkedTextComponentProp; + + protected SerializedProperty m_EnableKerningProp; + + protected SerializedProperty m_IsRichTextProp; + + protected SerializedProperty m_HasFontAssetChangedProp; + + protected SerializedProperty m_EnableExtraPaddingProp; + protected SerializedProperty m_CheckPaddingRequiredProp; + protected SerializedProperty m_EnableEscapeCharacterParsingProp; + protected SerializedProperty m_UseMaxVisibleDescenderProp; + protected SerializedProperty m_GeometrySortingOrderProp; + + protected SerializedProperty m_SpriteAssetProp; + + protected SerializedProperty m_MarginProp; + + protected SerializedProperty m_ColorModeProp; + + protected bool m_HavePropertiesChanged; + + protected TMP_Text m_TextComponent; + protected RectTransform m_RectTransform; + + protected Material m_TargetMaterial; + + protected Vector3[] m_RectCorners = new Vector3[4]; + protected Vector3[] m_HandlePoints = new Vector3[4]; + + protected virtual void OnEnable() + { + m_TextProp = serializedObject.FindProperty("m_text"); + m_IsRightToLeftProp = serializedObject.FindProperty("m_isRightToLeft"); + m_FontAssetProp = serializedObject.FindProperty("m_fontAsset"); + m_FontSharedMaterialProp = serializedObject.FindProperty("m_sharedMaterial"); + + m_FontStyleProp = serializedObject.FindProperty("m_fontStyle"); + + m_FontSizeProp = serializedObject.FindProperty("m_fontSize"); + m_FontSizeBaseProp = serializedObject.FindProperty("m_fontSizeBase"); + + m_AutoSizingProp = serializedObject.FindProperty("m_enableAutoSizing"); + m_FontSizeMinProp = serializedObject.FindProperty("m_fontSizeMin"); + m_FontSizeMaxProp = serializedObject.FindProperty("m_fontSizeMax"); + + m_LineSpacingMaxProp = serializedObject.FindProperty("m_lineSpacingMax"); + m_CharWidthMaxAdjProp = serializedObject.FindProperty("m_charWidthMaxAdj"); + + // Colors & Gradient + m_FontColorProp = serializedObject.FindProperty("m_fontColor"); + m_EnableVertexGradientProp = serializedObject.FindProperty("m_enableVertexGradient"); + m_FontColorGradientProp = serializedObject.FindProperty("m_fontColorGradient"); + m_FontColorGradientPresetProp = serializedObject.FindProperty("m_fontColorGradientPreset"); + m_OverrideHtmlColorProp = serializedObject.FindProperty("m_overrideHtmlColors"); + + m_CharacterSpacingProp = serializedObject.FindProperty("m_characterSpacing"); + m_WordSpacingProp = serializedObject.FindProperty("m_wordSpacing"); + m_LineSpacingProp = serializedObject.FindProperty("m_lineSpacing"); + m_ParagraphSpacingProp = serializedObject.FindProperty("m_paragraphSpacing"); + + m_TextAlignmentProp = serializedObject.FindProperty("m_textAlignment"); + + m_HorizontalMappingProp = serializedObject.FindProperty("m_horizontalMapping"); + m_VerticalMappingProp = serializedObject.FindProperty("m_verticalMapping"); + m_UvLineOffsetProp = serializedObject.FindProperty("m_uvLineOffset"); + + m_EnableWordWrappingProp = serializedObject.FindProperty("m_enableWordWrapping"); + m_WordWrappingRatiosProp = serializedObject.FindProperty("m_wordWrappingRatios"); + m_TextOverflowModeProp = serializedObject.FindProperty("m_overflowMode"); + m_PageToDisplayProp = serializedObject.FindProperty("m_pageToDisplay"); + m_LinkedTextComponentProp = serializedObject.FindProperty("m_linkedTextComponent"); + m_IsLinkedTextComponentProp = serializedObject.FindProperty("m_isLinkedTextComponent"); + + m_EnableKerningProp = serializedObject.FindProperty("m_enableKerning"); + + m_EnableExtraPaddingProp = serializedObject.FindProperty("m_enableExtraPadding"); + m_IsRichTextProp = serializedObject.FindProperty("m_isRichText"); + m_CheckPaddingRequiredProp = serializedObject.FindProperty("checkPaddingRequired"); + m_EnableEscapeCharacterParsingProp = serializedObject.FindProperty("m_parseCtrlCharacters"); + m_UseMaxVisibleDescenderProp = serializedObject.FindProperty("m_useMaxVisibleDescender"); + + m_GeometrySortingOrderProp = serializedObject.FindProperty("m_geometrySortingOrder"); + + m_SpriteAssetProp = serializedObject.FindProperty("m_spriteAsset"); + + m_MarginProp = serializedObject.FindProperty("m_margin"); + + m_HasFontAssetChangedProp = serializedObject.FindProperty("m_hasFontAssetChanged"); + + m_ColorModeProp = serializedObject.FindProperty("m_colorMode"); + + m_TextComponent = (TMP_Text)target; + m_RectTransform = m_TextComponent.rectTransform; + + // Create new Material Editor if one does not exists + m_TargetMaterial = m_TextComponent.fontSharedMaterial; + + // Set material inspector visibility + if (m_TargetMaterial != null) + UnityEditorInternal.InternalEditorUtility.SetIsInspectorExpanded(m_TargetMaterial, Foldout.materialInspector); + + // Find all Material Presets matching the current Font Asset Material + m_MaterialPresetNames = GetMaterialPresets(); + + // Initialize the Event Listener for Undo Events. + Undo.undoRedoPerformed += OnUndoRedo; + } + + protected virtual void OnDisable() + { + // Set material inspector visibility + if (m_TargetMaterial != null) + Foldout.materialInspector = UnityEditorInternal.InternalEditorUtility.GetIsInspectorExpanded(m_TargetMaterial); + + if (Undo.undoRedoPerformed != null) + Undo.undoRedoPerformed -= OnUndoRedo; + } + + public override void OnInspectorGUI() + { + // Make sure Multi selection only includes TMP Text objects. + if (IsMixSelectionTypes()) return; + + serializedObject.Update(); + + DrawTextInput(); + + DrawMainSettings(); + + DrawExtraSettings(); + + EditorGUILayout.Space(); + + if (m_HavePropertiesChanged) + { + m_HavePropertiesChanged = false; + m_TextComponent.havePropertiesChanged = true; + m_TextComponent.ComputeMarginSize(); + EditorUtility.SetDirty(target); + } + + serializedObject.ApplyModifiedProperties(); + } + + public void OnSceneGUI() + { + if (IsMixSelectionTypes()) return; + + // Margin Frame & Handles + m_RectTransform.GetWorldCorners(m_RectCorners); + Vector4 marginOffset = m_TextComponent.margin; + Vector3 lossyScale = m_RectTransform.lossyScale; + + m_HandlePoints[0] = m_RectCorners[0] + m_RectTransform.TransformDirection(new Vector3(marginOffset.x * lossyScale.x, marginOffset.w * lossyScale.y, 0)); + m_HandlePoints[1] = m_RectCorners[1] + m_RectTransform.TransformDirection(new Vector3(marginOffset.x * lossyScale.x, -marginOffset.y * lossyScale.y, 0)); + m_HandlePoints[2] = m_RectCorners[2] + m_RectTransform.TransformDirection(new Vector3(-marginOffset.z * lossyScale.x, -marginOffset.y * lossyScale.y, 0)); + m_HandlePoints[3] = m_RectCorners[3] + m_RectTransform.TransformDirection(new Vector3(-marginOffset.z * lossyScale.x, marginOffset.w * lossyScale.y, 0)); + + Handles.DrawSolidRectangleWithOutline(m_HandlePoints, new Color32(255, 255, 255, 0), new Color32(255, 255, 0, 255)); + + // Draw & process FreeMoveHandles + + // LEFT HANDLE + Vector3 oldLeft = (m_HandlePoints[0] + m_HandlePoints[1]) * 0.5f; + Vector3 newLeft = Handles.FreeMoveHandle(oldLeft, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap); + bool hasChanged = false; + if (oldLeft != newLeft) + { + float delta = oldLeft.x - newLeft.x; + marginOffset.x += -delta / lossyScale.x; + //Debug.Log("Left Margin H0:" + handlePoints[0] + " H1:" + handlePoints[1]); + hasChanged = true; + } + + // TOP HANDLE + Vector3 oldTop = (m_HandlePoints[1] + m_HandlePoints[2]) * 0.5f; + Vector3 newTop = Handles.FreeMoveHandle(oldTop, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap); + if (oldTop != newTop) + { + float delta = oldTop.y - newTop.y; + marginOffset.y += delta / lossyScale.y; + //Debug.Log("Top Margin H1:" + handlePoints[1] + " H2:" + handlePoints[2]); + hasChanged = true; + } + + // RIGHT HANDLE + Vector3 oldRight = (m_HandlePoints[2] + m_HandlePoints[3]) * 0.5f; + Vector3 newRight = Handles.FreeMoveHandle(oldRight, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap); + if (oldRight != newRight) + { + float delta = oldRight.x - newRight.x; + marginOffset.z += delta / lossyScale.x; + hasChanged = true; + //Debug.Log("Right Margin H2:" + handlePoints[2] + " H3:" + handlePoints[3]); + } + + // BOTTOM HANDLE + Vector3 oldBottom = (m_HandlePoints[3] + m_HandlePoints[0]) * 0.5f; + Vector3 newBottom = Handles.FreeMoveHandle(oldBottom, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap); + if (oldBottom != newBottom) + { + float delta = oldBottom.y - newBottom.y; + marginOffset.w += -delta / lossyScale.y; + hasChanged = true; + //Debug.Log("Bottom Margin H0:" + handlePoints[0] + " H3:" + handlePoints[3]); + } + + if (hasChanged) + { + Undo.RecordObjects(new Object[] {m_RectTransform, m_TextComponent }, "Margin Changes"); + m_TextComponent.margin = marginOffset; + EditorUtility.SetDirty(target); + } + } + + protected void DrawTextInput() + { + EditorGUILayout.Space(); + + // If the text component is linked, disable the text input box. + if (m_IsLinkedTextComponentProp.boolValue) + { + EditorGUILayout.HelpBox("The Text Input Box is disabled due to this text component being linked to another.", MessageType.Info); + } + else + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_TextProp); + + if (EditorGUI.EndChangeCheck() || (m_IsRightToLeftProp.boolValue && string.IsNullOrEmpty(m_RtlText))) + { + m_TextComponent.m_inputSource = TMP_Text.TextInputSources.Text; + m_TextComponent.m_isInputParsingRequired = true; + m_HavePropertiesChanged = true; + + // Handle Left to Right or Right to Left Editor + if (m_IsRightToLeftProp.boolValue) + { + m_RtlText = string.Empty; + string sourceText = m_TextProp.stringValue; + + // Reverse Text displayed in Text Input Box + for (int i = 0; i < sourceText.Length; i++) + { + m_RtlText += sourceText[sourceText.Length - i - 1]; + } + } + } + + // Toggle showing Rich Tags + m_IsRightToLeftProp.boolValue = EditorGUILayout.Toggle(k_RtlToggleLabel, m_IsRightToLeftProp.boolValue); + + if (m_IsRightToLeftProp.boolValue) + { + EditorGUI.BeginChangeCheck(); + m_RtlText = EditorGUILayout.TextArea(m_RtlText, TMP_UIStyleManager.wrappingTextArea, GUILayout.Height(EditorGUI.GetPropertyHeight(m_TextProp) - EditorGUIUtility.singleLineHeight), GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + // Convert RTL input + string sourceText = string.Empty; + + // Reverse Text displayed in Text Input Box + for (int i = 0; i < m_RtlText.Length; i++) + { + sourceText += m_RtlText[m_RtlText.Length - i - 1]; + } + + m_TextProp.stringValue = sourceText; + } + } + } + } + + protected void DrawMainSettings() + { + // MAIN SETTINGS SECTION + GUILayout.Label(k_MainSettingsLabel, EditorStyles.boldLabel); + + EditorGUI.indentLevel += 1; + + DrawFont(); + + DrawColor(); + + DrawSpacing(); + + DrawAlignment(); + + DrawWrappingOverflow(); + + DrawTextureMapping(); + + EditorGUI.indentLevel -= 1; + } + + void DrawFont() + { + // Update list of material presets if needed. + if (m_IsPresetListDirty) + m_MaterialPresetNames = GetMaterialPresets(); + + // FONT ASSET + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_FontAssetProp, k_FontAssetLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + m_HasFontAssetChangedProp.boolValue = true; + + m_IsPresetListDirty = true; + m_MaterialPresetSelectionIndex = 0; + } + + Rect rect; + + // MATERIAL PRESET + if (m_MaterialPresetNames != null) + { + EditorGUI.BeginChangeCheck(); + rect = EditorGUILayout.GetControlRect(false, 17); + + float oldHeight = EditorStyles.popup.fixedHeight; + EditorStyles.popup.fixedHeight = rect.height; + + int oldSize = EditorStyles.popup.fontSize; + EditorStyles.popup.fontSize = 11; + + m_MaterialPresetSelectionIndex = EditorGUI.Popup(rect, k_MaterialPresetLabel, m_MaterialPresetSelectionIndex, m_MaterialPresetNames); + if (EditorGUI.EndChangeCheck()) + { + m_FontSharedMaterialProp.objectReferenceValue = m_MaterialPresets[m_MaterialPresetSelectionIndex]; + m_HavePropertiesChanged = true; + } + + //Make sure material preset selection index matches the selection + if (m_MaterialPresetSelectionIndex < m_MaterialPresetNames.Length && m_TargetMaterial != m_MaterialPresets[m_MaterialPresetSelectionIndex] && !m_HavePropertiesChanged) + m_IsPresetListDirty = true; + + EditorStyles.popup.fixedHeight = oldHeight; + EditorStyles.popup.fontSize = oldSize; + } + + // FONT STYLE + EditorGUI.BeginChangeCheck(); + + int v1, v2, v3, v4, v5, v6, v7; + + if (EditorGUIUtility.wideMode) + { + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight + 2f); + + EditorGUI.PrefixLabel(rect, k_FontStyleLabel); + + int styleValue = m_FontStyleProp.intValue; + + rect.x += EditorGUIUtility.labelWidth; + rect.width -= EditorGUIUtility.labelWidth; + + rect.width = Mathf.Max(25f, rect.width / 7f); + + v1 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 1) == 1, k_BoldLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 1 : 0; // Bold + rect.x += rect.width; + v2 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 2) == 2, k_ItalicLabel, TMP_UIStyleManager.alignmentButtonMid) ? 2 : 0; // Italics + rect.x += rect.width; + v3 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 4) == 4, k_UnderlineLabel, TMP_UIStyleManager.alignmentButtonMid) ? 4 : 0; // Underline + rect.x += rect.width; + v7 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 64) == 64, k_StrikethroughLabel, TMP_UIStyleManager.alignmentButtonRight) ? 64 : 0; // Strikethrough + rect.x += rect.width; + + int selected = 0; + + EditorGUI.BeginChangeCheck(); + v4 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 8) == 8, k_LowercaseLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 8 : 0; // Lowercase + if (EditorGUI.EndChangeCheck() && v4 > 0) + { + selected = v4; + } + rect.x += rect.width; + EditorGUI.BeginChangeCheck(); + v5 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 16) == 16, k_UppercaseLabel, TMP_UIStyleManager.alignmentButtonMid) ? 16 : 0; // Uppercase + if (EditorGUI.EndChangeCheck() && v5 > 0) + { + selected = v5; + } + rect.x += rect.width; + EditorGUI.BeginChangeCheck(); + v6 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 32) == 32, k_SmallcapsLabel, TMP_UIStyleManager.alignmentButtonRight) ? 32 : 0; // Smallcaps + if (EditorGUI.EndChangeCheck() && v6 > 0) + { + selected = v6; + } + + if (selected > 0) + { + v4 = selected == 8 ? 8 : 0; + v5 = selected == 16 ? 16 : 0; + v6 = selected == 32 ? 32 : 0; + } + } + else + { + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight + 2f); + + EditorGUI.PrefixLabel(rect, k_FontStyleLabel); + + int styleValue = m_FontStyleProp.intValue; + + rect.x += EditorGUIUtility.labelWidth; + rect.width -= EditorGUIUtility.labelWidth; + rect.width = Mathf.Max(25f, rect.width / 4f); + + v1 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 1) == 1, k_BoldLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 1 : 0; // Bold + rect.x += rect.width; + v2 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 2) == 2, k_ItalicLabel, TMP_UIStyleManager.alignmentButtonMid) ? 2 : 0; // Italics + rect.x += rect.width; + v3 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 4) == 4, k_UnderlineLabel, TMP_UIStyleManager.alignmentButtonMid) ? 4 : 0; // Underline + rect.x += rect.width; + v7 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 64) == 64, k_StrikethroughLabel, TMP_UIStyleManager.alignmentButtonRight) ? 64 : 0; // Strikethrough + + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight + 2f); + + rect.x += EditorGUIUtility.labelWidth; + rect.width -= EditorGUIUtility.labelWidth; + + rect.width = Mathf.Max(25f, rect.width / 4f); + + int selected = 0; + + EditorGUI.BeginChangeCheck(); + v4 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 8) == 8, k_LowercaseLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 8 : 0; // Lowercase + if (EditorGUI.EndChangeCheck() && v4 > 0) + { + selected = v4; + } + rect.x += rect.width; + EditorGUI.BeginChangeCheck(); + v5 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 16) == 16, k_UppercaseLabel, TMP_UIStyleManager.alignmentButtonMid) ? 16 : 0; // Uppercase + if (EditorGUI.EndChangeCheck() && v5 > 0) + { + selected = v5; + } + rect.x += rect.width; + EditorGUI.BeginChangeCheck(); + v6 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 32) == 32, k_SmallcapsLabel, TMP_UIStyleManager.alignmentButtonRight) ? 32 : 0; // Smallcaps + if (EditorGUI.EndChangeCheck() && v6 > 0) + { + selected = v6; + } + + if (selected > 0) + { + v4 = selected == 8 ? 8 : 0; + v5 = selected == 16 ? 16 : 0; + v6 = selected == 32 ? 32 : 0; + } + } + + if (EditorGUI.EndChangeCheck()) + { + m_FontStyleProp.intValue = v1 + v2 + v3 + v4 + v5 + v6 + v7; + m_HavePropertiesChanged = true; + } + + // FONT SIZE + EditorGUI.BeginChangeCheck(); + + EditorGUI.BeginDisabledGroup(m_AutoSizingProp.boolValue); + EditorGUILayout.PropertyField(m_FontSizeProp, k_FontSizeLabel, GUILayout.MaxWidth(EditorGUIUtility.labelWidth + 50f)); + EditorGUI.EndDisabledGroup(); + + if (EditorGUI.EndChangeCheck()) + { + m_FontSizeBaseProp.floatValue = m_FontSizeProp.floatValue; + m_HavePropertiesChanged = true; + } + + EditorGUI.indentLevel += 1; + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_AutoSizingProp, k_AutoSizeLabel); + if (EditorGUI.EndChangeCheck()) + { + if (m_AutoSizingProp.boolValue == false) + m_FontSizeProp.floatValue = m_FontSizeBaseProp.floatValue; + + m_HavePropertiesChanged = true; + } + + // Show auto sizing options + if (m_AutoSizingProp.boolValue) + { + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight); + + EditorGUI.PrefixLabel(rect, k_AutoSizeOptionsLabel); + + int previousIndent = EditorGUI.indentLevel; + + EditorGUI.indentLevel = 0; + + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 4f; + rect.x += EditorGUIUtility.labelWidth; + + EditorGUIUtility.labelWidth = 24; + EditorGUI.BeginChangeCheck(); + EditorGUI.PropertyField(rect, m_FontSizeMinProp, k_MinLabel); + if (EditorGUI.EndChangeCheck()) + { + m_FontSizeMinProp.floatValue = Mathf.Min(m_FontSizeMinProp.floatValue, m_FontSizeMaxProp.floatValue); + m_HavePropertiesChanged = true; + } + rect.x += rect.width; + + EditorGUIUtility.labelWidth = 27; + EditorGUI.BeginChangeCheck(); + EditorGUI.PropertyField(rect, m_FontSizeMaxProp, k_MaxLabel); + if (EditorGUI.EndChangeCheck()) + { + m_FontSizeMaxProp.floatValue = Mathf.Max(m_FontSizeMinProp.floatValue, m_FontSizeMaxProp.floatValue); + m_HavePropertiesChanged = true; + } + rect.x += rect.width; + + EditorGUI.BeginChangeCheck(); + EditorGUIUtility.labelWidth = 36; + EditorGUI.PropertyField(rect, m_CharWidthMaxAdjProp, k_WdLabel); + rect.x += rect.width; + EditorGUIUtility.labelWidth = 28; + EditorGUI.PropertyField(rect, m_LineSpacingMaxProp, k_LineLabel); + + EditorGUIUtility.labelWidth = 0; + + if (EditorGUI.EndChangeCheck()) + { + m_CharWidthMaxAdjProp.floatValue = Mathf.Clamp(m_CharWidthMaxAdjProp.floatValue, 0, 50); + m_LineSpacingMaxProp.floatValue = Mathf.Min(0, m_LineSpacingMaxProp.floatValue); + m_HavePropertiesChanged = true; + } + + EditorGUI.indentLevel = previousIndent; + } + + EditorGUI.indentLevel -= 1; + + + + EditorGUILayout.Space(); + } + + void DrawColor() + { + // FACE VERTEX COLOR + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_FontColorProp, k_BaseColorLabel); + + EditorGUILayout.PropertyField(m_EnableVertexGradientProp, k_ColorGradientLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + + EditorGUIUtility.fieldWidth = 0; + + if (m_EnableVertexGradientProp.boolValue) + { + EditorGUI.indentLevel += 1; + + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(m_FontColorGradientPresetProp, k_ColorPresetLabel); + + SerializedObject obj = null; + + SerializedProperty colorMode; + + SerializedProperty topLeft; + SerializedProperty topRight; + SerializedProperty bottomLeft; + SerializedProperty bottomRight; + + if (m_FontColorGradientPresetProp.objectReferenceValue == null) + { + colorMode = m_ColorModeProp; + topLeft = m_FontColorGradientProp.FindPropertyRelative("topLeft"); + topRight = m_FontColorGradientProp.FindPropertyRelative("topRight"); + bottomLeft = m_FontColorGradientProp.FindPropertyRelative("bottomLeft"); + bottomRight = m_FontColorGradientProp.FindPropertyRelative("bottomRight"); + } + else + { + obj = new SerializedObject(m_FontColorGradientPresetProp.objectReferenceValue); + colorMode = obj.FindProperty("colorMode"); + topLeft = obj.FindProperty("topLeft"); + topRight = obj.FindProperty("topRight"); + bottomLeft = obj.FindProperty("bottomLeft"); + bottomRight = obj.FindProperty("bottomRight"); + } + + EditorGUILayout.PropertyField(colorMode, k_ColorModeLabel); + + var rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + + EditorGUI.PrefixLabel(rect, k_CorenerColorsLabel); + + rect.x += EditorGUIUtility.labelWidth; + rect.width = rect.width - EditorGUIUtility.labelWidth; + + switch ((ColorMode)colorMode.enumValueIndex) + { + case ColorMode.Single: + TMP_EditorUtility.DrawColorProperty(rect, topLeft); + + topRight.colorValue = topLeft.colorValue; + bottomLeft.colorValue = topLeft.colorValue; + bottomRight.colorValue = topLeft.colorValue; + break; + case ColorMode.HorizontalGradient: + rect.width /= 2f; + + TMP_EditorUtility.DrawColorProperty(rect, topLeft); + + rect.x += rect.width; + + TMP_EditorUtility.DrawColorProperty(rect, topRight); + + bottomLeft.colorValue = topLeft.colorValue; + bottomRight.colorValue = topRight.colorValue; + break; + case ColorMode.VerticalGradient: + TMP_EditorUtility.DrawColorProperty(rect, topLeft); + + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + rect.x += EditorGUIUtility.labelWidth; + + TMP_EditorUtility.DrawColorProperty(rect, bottomLeft); + + topRight.colorValue = topLeft.colorValue; + bottomRight.colorValue = bottomLeft.colorValue; + break; + case ColorMode.FourCornersGradient: + rect.width /= 2f; + + TMP_EditorUtility.DrawColorProperty(rect, topLeft); + + rect.x += rect.width; + + TMP_EditorUtility.DrawColorProperty(rect, topRight); + + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f; + + TMP_EditorUtility.DrawColorProperty(rect, bottomLeft); + + rect.x += rect.width; + + TMP_EditorUtility.DrawColorProperty(rect, bottomRight); + break; + } + + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + if (obj != null) + { + obj.ApplyModifiedProperties(); + TMPro_EventManager.ON_COLOR_GRAIDENT_PROPERTY_CHANGED(m_FontColorGradientPresetProp.objectReferenceValue as TMP_ColorGradient); + } + } + + EditorGUI.indentLevel -= 1; + } + + EditorGUILayout.PropertyField(m_OverrideHtmlColorProp, k_OverrideTagsLabel); + + EditorGUILayout.Space(); + } + + void DrawSpacing() + { + // CHARACTER, LINE & PARAGRAPH SPACING + EditorGUI.BeginChangeCheck(); + + Rect rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight); + + EditorGUI.PrefixLabel(rect, k_SpacingOptionsLabel); + + int oldIndent = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth - 3f) / 2f; + + EditorGUIUtility.labelWidth = Mathf.Min(rect.width * 0.55f, 80f); + + EditorGUI.PropertyField(rect, m_CharacterSpacingProp, k_CharacterSpacingLabel); + rect.x += rect.width + 3f; + EditorGUI.PropertyField(rect, m_WordSpacingProp, k_WordSpacingLabel); + + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight); + EditorGUIUtility.labelWidth = 0; + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth -3f) / 2f; + EditorGUIUtility.labelWidth = Mathf.Min(rect.width * 0.55f, 80f); + + EditorGUI.PropertyField(rect, m_LineSpacingProp, k_LineSpacingLabel); + rect.x += rect.width + 3f; + EditorGUI.PropertyField(rect, m_ParagraphSpacingProp, k_ParagraphSpacingLabel); + + EditorGUIUtility.labelWidth = 0; + EditorGUI.indentLevel = oldIndent; + + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + } + + void DrawAlignment() + { + // TEXT ALIGNMENT + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(m_TextAlignmentProp, k_AlignmentLabel); + + // WRAPPING RATIOS shown if Justified mode is selected. + if (((_HorizontalAlignmentOptions)m_TextAlignmentProp.intValue & _HorizontalAlignmentOptions.Justified) == _HorizontalAlignmentOptions.Justified || ((_HorizontalAlignmentOptions)m_TextAlignmentProp.intValue & _HorizontalAlignmentOptions.Flush) == _HorizontalAlignmentOptions.Flush) + DrawPropertySlider(k_WrapMixLabel, m_WordWrappingRatiosProp); + + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + + EditorGUILayout.Space(); + } + + void DrawWrappingOverflow() + { + // TEXT WRAPPING + EditorGUI.BeginChangeCheck(); + int wrapSelection = EditorGUILayout.Popup(k_WrappingLabel, m_EnableWordWrappingProp.boolValue ? 1 : 0, k_WrappingOptions); + if (EditorGUI.EndChangeCheck()) + { + m_EnableWordWrappingProp.boolValue = wrapSelection == 1; + m_HavePropertiesChanged = true; + m_TextComponent.m_isInputParsingRequired = true; + } + + // TEXT OVERFLOW + EditorGUI.BeginChangeCheck(); + + // Cache Reference to Linked Text Component + TMP_Text oldLinkedComponent = m_LinkedTextComponentProp.objectReferenceValue as TMP_Text; + + if ((TextOverflowModes)m_TextOverflowModeProp.enumValueIndex == TextOverflowModes.Linked) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(m_TextOverflowModeProp, k_OverflowLabel); + + EditorGUILayout.PropertyField(m_LinkedTextComponentProp, GUIContent.none); + + EditorGUILayout.EndHorizontal(); + + if (GUI.changed) + { + TMP_Text linkedComponent = m_LinkedTextComponentProp.objectReferenceValue as TMP_Text; + + if (linkedComponent) + m_TextComponent.linkedTextComponent = linkedComponent; + + } + } + else if ((TextOverflowModes)m_TextOverflowModeProp.enumValueIndex == TextOverflowModes.Page) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(m_TextOverflowModeProp, k_OverflowLabel); + EditorGUILayout.PropertyField(m_PageToDisplayProp, GUIContent.none); + EditorGUILayout.EndHorizontal(); + + if (oldLinkedComponent) + m_TextComponent.linkedTextComponent = null; + } + else + { + EditorGUILayout.PropertyField(m_TextOverflowModeProp, k_OverflowLabel); + + if (oldLinkedComponent) + m_TextComponent.linkedTextComponent = null; + } + + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + m_TextComponent.m_isInputParsingRequired = true; + } + + EditorGUILayout.Space(); + } + + protected abstract void DrawExtraSettings(); + + protected void DrawMargins() + { + EditorGUI.BeginChangeCheck(); + DrawMarginProperty(m_MarginProp, k_MarginsLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + + EditorGUILayout.Space(); + } + + protected void DrawGeometrySorting() + { + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(m_GeometrySortingOrderProp, k_GeometrySortingLabel); + + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + + EditorGUILayout.Space(); + } + + protected void DrawRichText() + { + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(m_IsRichTextProp, k_RichTextLabel); + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + } + + protected void DrawParsing() + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_EnableEscapeCharacterParsingProp, k_EscapeCharactersLabel); + EditorGUILayout.PropertyField(m_UseMaxVisibleDescenderProp, k_VisibleDescenderLabel); + + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(m_SpriteAssetProp, k_SpriteAssetLabel, true); + + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + + EditorGUILayout.Space(); + } + + protected void DrawTextureMapping() + { + // TEXTURE MAPPING OPTIONS + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_HorizontalMappingProp, k_HorizontalMappingLabel); + EditorGUILayout.PropertyField(m_VerticalMappingProp, k_VerticalMappingLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + + // UV OPTIONS + if (m_HorizontalMappingProp.enumValueIndex > 0) + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_UvLineOffsetProp, k_LineOffsetLabel, GUILayout.MinWidth(70f)); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + } + + EditorGUILayout.Space(); + } + + protected void DrawKerning() + { + // KERNING + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_EnableKerningProp, k_KerningLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + } + + protected void DrawPadding() + { + // EXTRA PADDING + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_EnableExtraPaddingProp, k_PaddingLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + m_CheckPaddingRequiredProp.boolValue = true; + } + } + + /// + /// Method to retrieve the material presets that match the currently selected font asset. + /// + protected GUIContent[] GetMaterialPresets() + { + TMP_FontAsset fontAsset = m_FontAssetProp.objectReferenceValue as TMP_FontAsset; + if (fontAsset == null) return null; + + m_MaterialPresets = TMP_EditorUtility.FindMaterialReferences(fontAsset); + m_MaterialPresetNames = new GUIContent[m_MaterialPresets.Length]; + + for (int i = 0; i < m_MaterialPresetNames.Length; i++) + { + m_MaterialPresetNames[i] = new GUIContent(m_MaterialPresets[i].name); + + if (m_TargetMaterial.GetInstanceID() == m_MaterialPresets[i].GetInstanceID()) + m_MaterialPresetSelectionIndex = i; + } + + m_IsPresetListDirty = false; + + return m_MaterialPresetNames; + } + + // DRAW MARGIN PROPERTY + protected void DrawMarginProperty(SerializedProperty property, GUIContent label) + { + Rect rect = EditorGUILayout.GetControlRect(false, 2 * 18); + + EditorGUI.BeginProperty(rect, label, property); + + Rect pos0 = new Rect(rect.x + 15, rect.y + 2, rect.width - 15, 18); + + float width = rect.width + 3; + pos0.width = EditorGUIUtility.labelWidth; + GUI.Label(pos0, label); + + var vec = property.vector4Value; + + float widthB = width - EditorGUIUtility.labelWidth; + float fieldWidth = widthB / 4; + pos0.width = Mathf.Max(fieldWidth - 5, 45f); + + // Labels + pos0.x = EditorGUIUtility.labelWidth + 15; + GUI.Label(pos0, k_LeftLabel); + + pos0.x += fieldWidth; + GUI.Label(pos0, k_TopLabel); + + pos0.x += fieldWidth; + GUI.Label(pos0, k_RightLabel); + + pos0.x += fieldWidth; + GUI.Label(pos0, k_BottomLabel); + + pos0.y += 18; + + pos0.x = EditorGUIUtility.labelWidth; + vec.x = EditorGUI.FloatField(pos0, GUIContent.none, vec.x); + + pos0.x += fieldWidth; + vec.y = EditorGUI.FloatField(pos0, GUIContent.none, vec.y); + + pos0.x += fieldWidth; + vec.z = EditorGUI.FloatField(pos0, GUIContent.none, vec.z); + + pos0.x += fieldWidth; + vec.w = EditorGUI.FloatField(pos0, GUIContent.none, vec.w); + + property.vector4Value = vec; + + EditorGUI.EndProperty(); + } + + protected void DrawPropertySlider(GUIContent label, SerializedProperty property) + { + Rect rect = EditorGUILayout.GetControlRect(false, 17); + + GUIContent content = label ?? GUIContent.none; + EditorGUI.Slider(new Rect(rect.x, rect.y, rect.width, rect.height), property, 0.0f, 1.0f, content); + } + + protected abstract bool IsMixSelectionTypes(); + + // Special Handling of Undo / Redo Events. + protected abstract void OnUndoRedo(); + + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseEditorPanel.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseEditorPanel.cs.meta new file mode 100644 index 0000000..87bd739 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseEditorPanel.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 91950f78729ab144aa36e94690b28fad +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseShaderGUI.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseShaderGUI.cs new file mode 100644 index 0000000..ed87b50 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseShaderGUI.cs @@ -0,0 +1,534 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + /// Base class for TextMesh Pro shader GUIs. + public abstract class TMP_BaseShaderGUI : ShaderGUI + { + /// Representation of a #pragma shader_feature. + /// It is assumed that the first feature option is for no keyword (underscores). + protected class ShaderFeature + { + public string undoLabel; + + public GUIContent label; + + /// The keyword labels, for display. Include the no-keyword as the first option. + public GUIContent[] keywordLabels; + + /// The shader keywords. Exclude the no-keyword option. + public string[] keywords; + + int m_State; + + public bool Active + { + get { return m_State >= 0; } + } + + public int State + { + get { return m_State; } + } + + public void ReadState(Material material) + { + for (int i = 0; i < keywords.Length; i++) + { + if (material.IsKeywordEnabled(keywords[i])) + { + m_State = i; + return; + } + } + + m_State = -1; + } + + public void SetActive(bool active, Material material) + { + m_State = active ? 0 : -1; + SetStateKeywords(material); + } + + public void DoPopup(MaterialEditor editor, Material material) + { + EditorGUI.BeginChangeCheck(); + int selection = EditorGUILayout.Popup(label, m_State + 1, keywordLabels); + if (EditorGUI.EndChangeCheck()) + { + m_State = selection - 1; + editor.RegisterPropertyChangeUndo(undoLabel); + SetStateKeywords(material); + } + } + + void SetStateKeywords(Material material) + { + for (int i = 0; i < keywords.Length; i++) + { + if (i == m_State) + { + material.EnableKeyword(keywords[i]); + } + else + { + material.DisableKeyword(keywords[i]); + } + } + } + } + + static GUIContent s_TempLabel = new GUIContent(); + + protected static bool s_DebugExtended; + + static int s_UndoRedoCount, s_LastSeenUndoRedoCount; + + static float[][] s_TempFloats = + { + null, new float[1], new float[2], new float[3], new float[4] + }; + + protected static GUIContent[] s_XywhVectorLabels = + { + new GUIContent("X"), + new GUIContent("Y"), + new GUIContent("W", "Width"), + new GUIContent("H", "Height") + }; + + protected static GUIContent[] s_LbrtVectorLabels = + { + new GUIContent("L", "Left"), + new GUIContent("B", "Bottom"), + new GUIContent("R", "Right"), + new GUIContent("T", "Top") + }; + + static TMP_BaseShaderGUI() + { + // Keep track of how many undo/redo events happened. + Undo.undoRedoPerformed += () => s_UndoRedoCount += 1; + } + + bool m_IsNewGUI = true; + + float m_DragAndDropMinY; + + protected MaterialEditor m_Editor; + + protected Material m_Material; + + protected MaterialProperty[] m_Properties; + + void PrepareGUI() + { + m_IsNewGUI = false; + ShaderUtilities.GetShaderPropertyIDs(); + + // New GUI just got constructed. This happens in response to a selection, + // but also after undo/redo events. + if (s_LastSeenUndoRedoCount != s_UndoRedoCount) + { + // There's been at least one undo/redo since the last time this GUI got constructed. + // Maybe the undo/redo was for this material? Assume that is was. + TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, m_Material as Material); + } + + s_LastSeenUndoRedoCount = s_UndoRedoCount; + } + + public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties) + { + m_Editor = materialEditor; + m_Material = materialEditor.target as Material; + this.m_Properties = properties; + + if (m_IsNewGUI) + { + PrepareGUI(); + } + + DoDragAndDropBegin(); + EditorGUI.BeginChangeCheck(); + DoGUI(); + if (EditorGUI.EndChangeCheck()) + { + TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, m_Material); + } + + DoDragAndDropEnd(); + } + + /// Override this method to create the specific shader GUI. + protected abstract void DoGUI(); + + static string[] s_PanelStateLabel = new string[] { "\t- Click to collapse -", "\t- Click to expand -" }; + + protected bool BeginPanel(string panel, bool expanded) + { + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + Rect r = EditorGUI.IndentedRect(GUILayoutUtility.GetRect(20, 18)); + r.x += 20; + r.width += 6; + + bool enabled = GUI.enabled; + GUI.enabled = true; + expanded = TMP_EditorUtility.EditorToggle(r, expanded, new GUIContent(panel), TMP_UIStyleManager.panelTitle); + r.width -= 30; + EditorGUI.LabelField(r, new GUIContent(expanded ? s_PanelStateLabel[0] : s_PanelStateLabel[1]), TMP_UIStyleManager.rightLabel); + GUI.enabled = enabled; + + EditorGUI.indentLevel += 1; + EditorGUI.BeginDisabledGroup(false); + + return expanded; + } + + protected bool BeginPanel(string panel, ShaderFeature feature, bool expanded, bool readState = true) + { + if (readState) + { + feature.ReadState(m_Material); + } + + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.BeginHorizontal(); + + Rect r = EditorGUI.IndentedRect(GUILayoutUtility.GetRect(20, 20, GUILayout.Width(20f))); + bool active = EditorGUI.Toggle(r, feature.Active); + + if (EditorGUI.EndChangeCheck()) + { + m_Editor.RegisterPropertyChangeUndo(feature.undoLabel); + feature.SetActive(active, m_Material); + } + + r = EditorGUI.IndentedRect(GUILayoutUtility.GetRect(20, 18)); + r.width += 6; + + bool enabled = GUI.enabled; + GUI.enabled = true; + expanded = TMP_EditorUtility.EditorToggle(r, expanded, new GUIContent(panel), TMP_UIStyleManager.panelTitle); + r.width -= 10; + EditorGUI.LabelField(r, new GUIContent(expanded ? s_PanelStateLabel[0] : s_PanelStateLabel[1]), TMP_UIStyleManager.rightLabel); + GUI.enabled = enabled; + + GUILayout.EndHorizontal(); + + EditorGUI.indentLevel += 1; + EditorGUI.BeginDisabledGroup(!active); + + return expanded; + } + + public void EndPanel() + { + EditorGUI.EndDisabledGroup(); + EditorGUI.indentLevel -= 1; + EditorGUILayout.EndVertical(); + } + + MaterialProperty BeginProperty(string name) + { + MaterialProperty property = FindProperty(name, m_Properties); + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = property.hasMixedValue; + m_Editor.BeginAnimatedCheck(Rect.zero, property); + + return property; + } + + bool EndProperty() + { + m_Editor.EndAnimatedCheck(); + EditorGUI.showMixedValue = false; + return EditorGUI.EndChangeCheck(); + } + + protected void DoPopup(string name, string label, GUIContent[] options) + { + MaterialProperty property = BeginProperty(name); + s_TempLabel.text = label; + int index = EditorGUILayout.Popup(s_TempLabel, (int)property.floatValue, options); + if (EndProperty()) + { + property.floatValue = index; + } + } + + protected void DoCubeMap(string name, string label) + { + DoTexture(name, label, typeof(Cubemap)); + } + + protected void DoTexture2D(string name, string label, bool withTilingOffset = false, string[] speedNames = null) + { + DoTexture(name, label, typeof(Texture2D), withTilingOffset, speedNames); + } + + void DoTexture(string name, string label, System.Type type, bool withTilingOffset = false, string[] speedNames = null) + { + MaterialProperty property = BeginProperty(name); + Rect rect = EditorGUILayout.GetControlRect(true, 60f); + float totalWidth = rect.width; + rect.width = EditorGUIUtility.labelWidth + 60f; + s_TempLabel.text = label; + Object tex = EditorGUI.ObjectField(rect, s_TempLabel, property.textureValue, type, false); + + if (EndProperty()) + { + property.textureValue = tex as Texture; + } + + rect.x += rect.width + 4f; + rect.width = totalWidth - rect.width - 4f; + rect.height = EditorGUIUtility.singleLineHeight; + + if (withTilingOffset) + { + DoTilingOffset(rect, property); + rect.y += (rect.height + 2f) * 2f; + } + + if (speedNames != null) + { + DoUVSpeed(rect, speedNames); + } + } + + void DoTilingOffset(Rect rect, MaterialProperty property) + { + float labelWidth = EditorGUIUtility.labelWidth; + int indentLevel = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + EditorGUIUtility.labelWidth = Mathf.Min(40f, rect.width * 0.20f); + + Vector4 vector = property.textureScaleAndOffset; + + bool changed = false; + float[] values = s_TempFloats[2]; + + s_TempLabel.text = "Tiling"; + Rect vectorRect = EditorGUI.PrefixLabel(rect, s_TempLabel); + values[0] = vector.x; + values[1] = vector.y; + EditorGUI.BeginChangeCheck(); + EditorGUI.MultiFloatField(vectorRect, s_XywhVectorLabels, values); + if (EndProperty()) + { + vector.x = values[0]; + vector.y = values[1]; + changed = true; + } + + rect.y += rect.height + 2f; + s_TempLabel.text = "Offset"; + vectorRect = EditorGUI.PrefixLabel(rect, s_TempLabel); + values[0] = vector.z; + values[1] = vector.w; + EditorGUI.BeginChangeCheck(); + EditorGUI.MultiFloatField(vectorRect, s_XywhVectorLabels, values); + if (EndProperty()) + { + vector.z = values[0]; + vector.w = values[1]; + changed = true; + } + + if (changed) + { + property.textureScaleAndOffset = vector; + } + + EditorGUIUtility.labelWidth = labelWidth; + EditorGUI.indentLevel = indentLevel; + } + + protected void DoUVSpeed(Rect rect, string[] names) + { + float labelWidth = EditorGUIUtility.labelWidth; + int indentLevel = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + EditorGUIUtility.labelWidth = Mathf.Min(40f, rect.width * 0.20f); + + s_TempLabel.text = "Speed"; + rect = EditorGUI.PrefixLabel(rect, s_TempLabel); + + EditorGUIUtility.labelWidth = 13f; + rect.width = rect.width * 0.5f - 1f; + DoFloat(rect, names[0], "X"); + rect.x += rect.width + 2f; + DoFloat(rect, names[1], "Y"); + EditorGUIUtility.labelWidth = labelWidth; + EditorGUI.indentLevel = indentLevel; + } + + protected void DoToggle(string name, string label) + { + MaterialProperty property = BeginProperty(name); + s_TempLabel.text = label; + bool value = EditorGUILayout.Toggle(s_TempLabel, property.floatValue == 1f); + if (EndProperty()) + { + property.floatValue = value ? 1f : 0f; + } + } + + protected void DoFloat(string name, string label) + { + MaterialProperty property = BeginProperty(name); + Rect rect = EditorGUILayout.GetControlRect(); + rect.width = EditorGUIUtility.labelWidth + 55f; + s_TempLabel.text = label; + float value = EditorGUI.FloatField(rect, s_TempLabel, property.floatValue); + if (EndProperty()) + { + property.floatValue = value; + } + } + + protected void DoColor(string name, string label) + { + MaterialProperty property = BeginProperty(name); + s_TempLabel.text = label; + Color value = EditorGUI.ColorField(EditorGUILayout.GetControlRect(), s_TempLabel, property.colorValue); + if (EndProperty()) + { + property.colorValue = value; + } + } + + void DoFloat(Rect rect, string name, string label) + { + MaterialProperty property = BeginProperty(name); + s_TempLabel.text = label; + float value = EditorGUI.FloatField(rect, s_TempLabel, property.floatValue); + if (EndProperty()) + { + property.floatValue = value; + } + } + + protected void DoSlider(string name, string label) + { + MaterialProperty property = BeginProperty(name); + Vector2 range = property.rangeLimits; + s_TempLabel.text = label; + float value = EditorGUI.Slider( + EditorGUILayout.GetControlRect(), s_TempLabel, property.floatValue, range.x, range.y + ); + if (EndProperty()) + { + property.floatValue = value; + } + } + + protected void DoVector3(string name, string label) + { + MaterialProperty property = BeginProperty(name); + s_TempLabel.text = label; + Vector4 value = EditorGUILayout.Vector3Field(s_TempLabel, property.vectorValue); + if (EndProperty()) + { + property.vectorValue = value; + } + } + + protected void DoVector(string name, string label, GUIContent[] subLabels) + { + MaterialProperty property = BeginProperty(name); + Rect rect = EditorGUILayout.GetControlRect(); + s_TempLabel.text = label; + rect = EditorGUI.PrefixLabel(rect, s_TempLabel); + Vector4 vector = property.vectorValue; + + float[] values = s_TempFloats[subLabels.Length]; + for (int i = 0; i < subLabels.Length; i++) + { + values[i] = vector[i]; + } + + EditorGUI.MultiFloatField(rect, subLabels, values); + if (EndProperty()) + { + for (int i = 0; i < subLabels.Length; i++) + { + vector[i] = values[i]; + } + + property.vectorValue = vector; + } + } + + void DoDragAndDropBegin() + { + m_DragAndDropMinY = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)).y; + } + + void DoDragAndDropEnd() + { + Rect rect = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + Event evt = Event.current; + if (evt.type == EventType.DragUpdated) + { + DragAndDrop.visualMode = DragAndDropVisualMode.Generic; + evt.Use(); + } + else if ( + evt.type == EventType.DragPerform && + Rect.MinMaxRect(rect.xMin, m_DragAndDropMinY, rect.xMax, rect.yMax).Contains(evt.mousePosition) + ) + { + DragAndDrop.AcceptDrag(); + evt.Use(); + Material droppedMaterial = DragAndDrop.objectReferences[0] as Material; + if (droppedMaterial && droppedMaterial != m_Material) + { + PerformDrop(droppedMaterial); + } + } + } + + void PerformDrop(Material droppedMaterial) + { + Texture droppedTex = droppedMaterial.GetTexture(ShaderUtilities.ID_MainTex); + if (!droppedTex) + { + return; + } + + Texture currentTex = m_Material.GetTexture(ShaderUtilities.ID_MainTex); + TMP_FontAsset requiredFontAsset = null; + if (droppedTex != currentTex) + { + requiredFontAsset = TMP_EditorUtility.FindMatchingFontAsset(droppedMaterial); + if (!requiredFontAsset) + { + return; + } + } + + foreach (GameObject o in Selection.gameObjects) + { + if (requiredFontAsset) + { + TMP_Text textComponent = o.GetComponent(); + if (textComponent) + { + Undo.RecordObject(textComponent, "Font Asset Change"); + textComponent.font = requiredFontAsset; + } + } + + TMPro_EventManager.ON_DRAG_AND_DROP_MATERIAL_CHANGED(o, m_Material, droppedMaterial); + EditorUtility.SetDirty(o); + } + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseShaderGUI.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseShaderGUI.cs.meta new file mode 100644 index 0000000..f07bd85 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseShaderGUI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 438efd46088d408d8a53f707fa68d976 +timeCreated: 1469844810 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BitmapShaderGUI.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BitmapShaderGUI.cs new file mode 100644 index 0000000..d35d539 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BitmapShaderGUI.cs @@ -0,0 +1,85 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + public class TMP_BitmapShaderGUI : TMP_BaseShaderGUI + { + static bool s_Face = true; + + protected override void DoGUI() + { + s_Face = BeginPanel("Face", s_Face); + if (s_Face) + { + DoFacePanel(); + } + + EndPanel(); + + s_DebugExtended = BeginPanel("Debug Settings", s_DebugExtended); + if (s_DebugExtended) + { + DoDebugPanel(); + } + + EndPanel(); + } + + void DoFacePanel() + { + EditorGUI.indentLevel += 1; + if (m_Material.HasProperty(ShaderUtilities.ID_FaceTex)) + { + DoColor("_FaceColor", "Color"); + DoTexture2D("_FaceTex", "Texture", true); + } + else + { + DoColor("_Color", "Color"); + DoSlider("_DiffusePower", "Diffuse Power"); + } + + EditorGUI.indentLevel -= 1; + + EditorGUILayout.Space(); + } + + void DoDebugPanel() + { + EditorGUI.indentLevel += 1; + DoTexture2D("_MainTex", "Font Atlas"); + if (m_Material.HasProperty(ShaderUtilities.ID_VertexOffsetX)) + { + if (m_Material.HasProperty(ShaderUtilities.ID_Padding)) + { + EditorGUILayout.Space(); + DoFloat("_Padding", "Padding"); + } + + EditorGUILayout.Space(); + DoFloat("_VertexOffsetX", "Offset X"); + DoFloat("_VertexOffsetY", "Offset Y"); + } + + if (m_Material.HasProperty(ShaderUtilities.ID_MaskSoftnessX)) + { + EditorGUILayout.Space(); + DoFloat("_MaskSoftnessX", "Softness X"); + DoFloat("_MaskSoftnessY", "Softness Y"); + DoVector("_ClipRect", "Clip Rect", s_LbrtVectorLabels); + } + + if (m_Material.HasProperty(ShaderUtilities.ID_StencilID)) + { + EditorGUILayout.Space(); + DoFloat("_Stencil", "Stencil ID"); + DoFloat("_StencilComp", "Stencil Comp"); + } + + EditorGUI.indentLevel -= 1; + + EditorGUILayout.Space(); + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BitmapShaderGUI.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BitmapShaderGUI.cs.meta new file mode 100644 index 0000000..6d0e052 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BitmapShaderGUI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 806de5a9211448c8b65c8435ebb48dd4 +timeCreated: 1469998850 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs new file mode 100644 index 0000000..c1f5fb9 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs @@ -0,0 +1,237 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + [CustomPropertyDrawer(typeof(TMP_Character))] + public class TMP_CharacterPropertyDrawer : PropertyDrawer + { + //[SerializeField] + //static Material s_InternalSDFMaterial; + + //[SerializeField] + //static Material s_InternalBitmapMaterial; + + int m_GlyphSelectedForEditing = -1; + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_Unicode = property.FindPropertyRelative("m_Unicode"); + SerializedProperty prop_GlyphIndex = property.FindPropertyRelative("m_GlyphIndex"); + SerializedProperty prop_Scale = property.FindPropertyRelative("m_Scale"); + + + GUIStyle style = new GUIStyle(EditorStyles.label); + style.richText = true; + + EditorGUIUtility.labelWidth = 40f; + EditorGUIUtility.fieldWidth = 50; + + Rect rect = new Rect(position.x + 50, position.y, position.width, 49); + + // Display non-editable fields + if (GUI.enabled == false) + { + int unicode = prop_Unicode.intValue; + EditorGUI.LabelField(new Rect(rect.x, rect.y, 120f, 18), new GUIContent("Unicode: 0x" + unicode.ToString("X") + ""), style); + EditorGUI.LabelField(new Rect(rect.x + 115, rect.y, 120f, 18), unicode <= 0xFFFF ? new GUIContent("UTF16: \\u" + unicode.ToString("X4") + "") : new GUIContent("UTF32: \\U" + unicode.ToString("X8") + ""), style); + EditorGUI.LabelField(new Rect(rect.x, rect.y + 18, 120, 18), new GUIContent("Glyph ID: " + prop_GlyphIndex.intValue + ""), style); + EditorGUI.LabelField(new Rect(rect.x, rect.y + 36, 80, 18), new GUIContent("Scale: " + prop_Scale.floatValue + ""), style); + + // Draw Glyph (if exists) + DrawGlyph(position, property); + } + else // Display editable fields + { + EditorGUIUtility.labelWidth = 55f; + GUI.SetNextControlName("Unicode Input"); + EditorGUI.BeginChangeCheck(); + string unicode = EditorGUI.TextField(new Rect(rect.x, rect.y, 120, 18), "Unicode:", prop_Unicode.intValue.ToString("X")); + + if (GUI.GetNameOfFocusedControl() == "Unicode Input") + { + //Filter out unwanted characters. + char chr = Event.current.character; + if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F')) + { + Event.current.character = '\0'; + } + } + + if (EditorGUI.EndChangeCheck()) + { + // Update Unicode value + prop_Unicode.intValue = TMP_TextUtilities.StringHexToInt(unicode); + } + + // Cache current glyph index in case it needs to be restored if the new glyph index is invalid. + int currentGlyphIndex = prop_GlyphIndex.intValue; + + EditorGUIUtility.labelWidth = 59f; + EditorGUI.BeginChangeCheck(); + EditorGUI.DelayedIntField(new Rect(rect.x, rect.y + 18, 100, 18), prop_GlyphIndex, new GUIContent("Glyph ID:")); + if (EditorGUI.EndChangeCheck()) + { + // Get a reference to the font asset + TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset; + + // Make sure new glyph index is valid. + int elementIndex = fontAsset.glyphTable.FindIndex(item => item.index == prop_GlyphIndex.intValue); + + if (elementIndex == -1) + prop_GlyphIndex.intValue = currentGlyphIndex; + else + fontAsset.m_IsFontAssetLookupTablesDirty = true; + } + + int glyphIndex = prop_GlyphIndex.intValue; + + // Reset glyph selection if new character has been selected. + if (GUI.enabled && m_GlyphSelectedForEditing != glyphIndex) + m_GlyphSelectedForEditing = -1; + + // Display button to edit the glyph data. + if (GUI.Button(new Rect(rect.x + 120, rect.y + 18, 75, 18), new GUIContent("Edit Glyph"))) + { + if (m_GlyphSelectedForEditing == -1) + m_GlyphSelectedForEditing = glyphIndex; + else + m_GlyphSelectedForEditing = -1; + + // Button clicks should not result in potential change. + GUI.changed = false; + } + + // Show the glyph property drawer if selected + if (glyphIndex == m_GlyphSelectedForEditing && GUI.enabled) + { + // Get a reference to the font asset + TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset; + + if (fontAsset != null) + { + // Get the index of the glyph in the font asset glyph table. + int elementIndex = fontAsset.glyphTable.FindIndex(item => item.index == glyphIndex); + + if (elementIndex != -1) + { + SerializedProperty prop_GlyphTable = property.serializedObject.FindProperty("m_GlyphTable"); + SerializedProperty prop_Glyph = prop_GlyphTable.GetArrayElementAtIndex(elementIndex); + + SerializedProperty prop_GlyphMetrics = prop_Glyph.FindPropertyRelative("m_Metrics"); + SerializedProperty prop_GlyphRect = prop_Glyph.FindPropertyRelative("m_GlyphRect"); + + Rect newRect = EditorGUILayout.GetControlRect(false, 115); + EditorGUI.DrawRect(new Rect(newRect.x + 52, newRect.y - 20, newRect.width - 52, newRect.height - 5), new Color(0.1f, 0.1f, 0.1f, 0.45f)); + EditorGUI.DrawRect(new Rect(newRect.x + 53, newRect.y - 19, newRect.width - 54, newRect.height - 7), new Color(0.3f, 0.3f, 0.3f, 0.8f)); + + // Display GlyphRect + newRect.x += 55; + newRect.y -= 18; + newRect.width += 5; + EditorGUI.PropertyField(newRect, prop_GlyphRect); + + // Display GlyphMetrics + newRect.y += 45; + EditorGUI.PropertyField(newRect, prop_GlyphMetrics); + + rect.y += 120; + } + } + } + + EditorGUIUtility.labelWidth = 39f; + EditorGUI.PropertyField(new Rect(rect.x, rect.y + 36, 80, 18), prop_Scale, new GUIContent("Scale:")); + + // Draw Glyph (if exists) + DrawGlyph(position, property); + } + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 58; + } + + void DrawGlyph(Rect position, SerializedProperty property) + { + // Get a reference to the atlas texture + TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset; + + if (fontAsset == null) + return; + + // Get a reference to the Glyph Table + SerializedProperty prop_GlyphTable = property.serializedObject.FindProperty("m_GlyphTable"); + int glyphIndex = property.FindPropertyRelative("m_GlyphIndex").intValue; + int elementIndex = fontAsset.glyphTable.FindIndex(item => item.index == glyphIndex); + + // Return if we can't find the glyph + if (elementIndex == -1) + return; + + SerializedProperty prop_Glyph = prop_GlyphTable.GetArrayElementAtIndex(elementIndex); + + // Get reference to atlas texture. + int atlasIndex = prop_Glyph.FindPropertyRelative("m_AtlasIndex").intValue; + Texture2D atlasTexture = fontAsset.atlasTextures.Length > atlasIndex ? fontAsset.atlasTextures[atlasIndex] : null; + + if (atlasTexture == null) + return; + + Material mat; + if (((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + { + mat = TMP_FontAssetEditor.internalBitmapMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + mat.SetColor("_Color", Color.white); + } + else + { + mat = TMP_FontAssetEditor.internalSDFMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + mat.SetFloat(ShaderUtilities.ID_GradientScale, fontAsset.atlasPadding + 1); + } + + // Draw glyph + Rect glyphDrawPosition = new Rect(position.x, position.y, 48, 58); + + SerializedProperty prop_GlyphRect = prop_Glyph.FindPropertyRelative("m_GlyphRect"); + + int glyphOriginX = prop_GlyphRect.FindPropertyRelative("m_X").intValue; + int glyphOriginY = prop_GlyphRect.FindPropertyRelative("m_Y").intValue; + int glyphWidth = prop_GlyphRect.FindPropertyRelative("m_Width").intValue; + int glyphHeight = prop_GlyphRect.FindPropertyRelative("m_Height").intValue; + + float normalizedHeight = fontAsset.faceInfo.ascentLine - fontAsset.faceInfo.descentLine; + float scale = glyphDrawPosition.width / normalizedHeight; + + // Compute the normalized texture coordinates + Rect texCoords = new Rect((float)glyphOriginX / atlasTexture.width, (float)glyphOriginY / atlasTexture.height, (float)glyphWidth / atlasTexture.width, (float)glyphHeight / atlasTexture.height); + + if (Event.current.type == EventType.Repaint) + { + glyphDrawPosition.x += (glyphDrawPosition.width - glyphWidth * scale) / 2; + glyphDrawPosition.y += (glyphDrawPosition.height - glyphHeight * scale) / 2; + glyphDrawPosition.width = glyphWidth * scale; + glyphDrawPosition.height = glyphHeight * scale; + + // Could switch to using the default material of the font asset which would require passing scale to the shader. + Graphics.DrawTexture(glyphDrawPosition, atlasTexture, texCoords, 0, 0, 0, 0, new Color(1f, 1f, 1f), mat); + } + } + + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs.meta new file mode 100644 index 0000000..3bf7892 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 01ada73c4792aba4c937ff5d92cce866 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs new file mode 100644 index 0000000..ccfd367 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs @@ -0,0 +1,51 @@ +using UnityEditor; +using UnityEngine; +using System.IO; +using System.Collections; + + + +namespace TMPro.EditorUtilities +{ + + public static class TMP_ColorGradientAssetMenu + { + [MenuItem("Assets/Create/TextMeshPro/Color Gradient", false, 115)] + public static void CreateColorGradient(MenuCommand context) + { + string filePath; + + if (Selection.assetGUIDs.Length == 0) + filePath = "Assets/New TMP Color Gradient.asset"; + else + filePath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]); + + if (Directory.Exists(filePath)) + { + filePath += "/New TMP Color Gradient.asset"; + } + else + { + filePath = Path.GetDirectoryName(filePath) + "/New TMP Color Gradient.asset"; + } + + filePath = AssetDatabase.GenerateUniqueAssetPath(filePath); + + // Create new Color Gradient Asset. + TMP_ColorGradient colorGradient = ScriptableObject.CreateInstance(); + + // Create Asset + AssetDatabase.CreateAsset(colorGradient, filePath); + + //EditorUtility.SetDirty(colorGradient); + + AssetDatabase.SaveAssets(); + + AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(colorGradient)); + + EditorUtility.FocusProjectWindow(); + Selection.activeObject = colorGradient; + + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs.meta new file mode 100644 index 0000000..a2201ee --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d9647b571c5e44729b71d756b3d55317 +timeCreated: 1468187791 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientEditor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientEditor.cs new file mode 100644 index 0000000..4dddbfb --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientEditor.cs @@ -0,0 +1,146 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TMP_ColorGradient))] + public class TMP_ColorGradientEditor : Editor + { + SerializedProperty m_ColorMode; + SerializedProperty m_TopLeftColor; + SerializedProperty m_TopRightColor; + SerializedProperty m_BottomLeftColor; + SerializedProperty m_BottomRightColor; + + void OnEnable() + { + m_ColorMode = serializedObject.FindProperty("colorMode"); + m_TopLeftColor = serializedObject.FindProperty("topLeft"); + m_TopRightColor = serializedObject.FindProperty("topRight"); + m_BottomLeftColor = serializedObject.FindProperty("bottomLeft"); + m_BottomRightColor = serializedObject.FindProperty("bottomRight"); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_ColorMode, new GUIContent("Color Mode")); + if (EditorGUI.EndChangeCheck()) + { + switch ((ColorMode)m_ColorMode.enumValueIndex) + { + case ColorMode.Single: + m_TopRightColor.colorValue = m_TopLeftColor.colorValue; + m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue; + m_BottomRightColor.colorValue = m_TopLeftColor.colorValue; + break; + case ColorMode.HorizontalGradient: + m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue; + m_BottomRightColor.colorValue = m_TopRightColor.colorValue; + break; + case ColorMode.VerticalGradient: + m_TopRightColor.colorValue = m_TopLeftColor.colorValue; + m_BottomRightColor.colorValue = m_BottomLeftColor.colorValue; + break; + } + } + Rect rect; + switch ((ColorMode)m_ColorMode.enumValueIndex) + { + case ColorMode.Single: + EditorGUI.BeginChangeCheck(); + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + EditorGUI.PrefixLabel(rect, new GUIContent("Colors")); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / (EditorGUIUtility.wideMode ? 1f : 2f); + TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor); + if (EditorGUI.EndChangeCheck()) + { + m_TopRightColor.colorValue = m_TopLeftColor.colorValue; + m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue; + m_BottomRightColor.colorValue = m_TopLeftColor.colorValue; + } + break; + + case ColorMode.HorizontalGradient: + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + EditorGUI.PrefixLabel(rect, new GUIContent("Colors")); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f; + + EditorGUI.BeginChangeCheck(); + TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor); + if (EditorGUI.EndChangeCheck()) + { + m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue; + } + + rect.x += rect.width; + + EditorGUI.BeginChangeCheck(); + TMP_EditorUtility.DrawColorProperty(rect, m_TopRightColor); + if (EditorGUI.EndChangeCheck()) + { + m_BottomRightColor.colorValue = m_TopRightColor.colorValue; + } + break; + + case ColorMode.VerticalGradient: + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + EditorGUI.PrefixLabel(rect, new GUIContent("Colors")); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / (EditorGUIUtility.wideMode ? 1f : 2f); + rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2); + + EditorGUI.BeginChangeCheck(); + TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor); + if (EditorGUI.EndChangeCheck()) + { + m_TopRightColor.colorValue = m_TopLeftColor.colorValue; + } + + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / (EditorGUIUtility.wideMode ? 1f : 2f); + rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2); + + EditorGUI.BeginChangeCheck(); + TMP_EditorUtility.DrawColorProperty(rect, m_BottomLeftColor); + if (EditorGUI.EndChangeCheck()) + { + m_BottomRightColor.colorValue = m_BottomLeftColor.colorValue; + } + break; + + case ColorMode.FourCornersGradient: + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + EditorGUI.PrefixLabel(rect, new GUIContent("Colors")); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f; + rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2); + + TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor); + rect.x += rect.width; + TMP_EditorUtility.DrawColorProperty(rect, m_TopRightColor); + + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f; + rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2); + + TMP_EditorUtility.DrawColorProperty(rect, m_BottomLeftColor); + rect.x += rect.width; + TMP_EditorUtility.DrawColorProperty(rect, m_BottomRightColor); + break; + } + + if (serializedObject.ApplyModifiedProperties()) + TMPro_EventManager.ON_COLOR_GRAIDENT_PROPERTY_CHANGED(target as TMP_ColorGradient); + + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientEditor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientEditor.cs.meta new file mode 100644 index 0000000..dc58116 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fcc60c1d6bb544d9b712b652f418ff3a +timeCreated: 1468400050 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_DropdownEditor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_DropdownEditor.cs new file mode 100644 index 0000000..b8e9613 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_DropdownEditor.cs @@ -0,0 +1,51 @@ +using UnityEngine; +using UnityEditor; +using UnityEditor.UI; +using UnityEngine.UI; + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TMP_Dropdown), true)] + [CanEditMultipleObjects] + public class DropdownEditor : SelectableEditor + { + SerializedProperty m_Template; + SerializedProperty m_CaptionText; + SerializedProperty m_CaptionImage; + SerializedProperty m_ItemText; + SerializedProperty m_ItemImage; + SerializedProperty m_OnSelectionChanged; + SerializedProperty m_Value; + SerializedProperty m_Options; + + protected override void OnEnable() + { + base.OnEnable(); + m_Template = serializedObject.FindProperty("m_Template"); + m_CaptionText = serializedObject.FindProperty("m_CaptionText"); + m_CaptionImage = serializedObject.FindProperty("m_CaptionImage"); + m_ItemText = serializedObject.FindProperty("m_ItemText"); + m_ItemImage = serializedObject.FindProperty("m_ItemImage"); + m_OnSelectionChanged = serializedObject.FindProperty("m_OnValueChanged"); + m_Value = serializedObject.FindProperty("m_Value"); + m_Options = serializedObject.FindProperty("m_Options"); + } + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + EditorGUILayout.Space(); + + serializedObject.Update(); + EditorGUILayout.PropertyField(m_Template); + EditorGUILayout.PropertyField(m_CaptionText); + EditorGUILayout.PropertyField(m_CaptionImage); + EditorGUILayout.PropertyField(m_ItemText); + EditorGUILayout.PropertyField(m_ItemImage); + EditorGUILayout.PropertyField(m_Value); + EditorGUILayout.PropertyField(m_Options); + EditorGUILayout.PropertyField(m_OnSelectionChanged); + serializedObject.ApplyModifiedProperties(); + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_DropdownEditor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_DropdownEditor.cs.meta new file mode 100644 index 0000000..75030cf --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_DropdownEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6dbcf248c987476181a37f01a1814975 +timeCreated: 1446377461 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorCoroutine.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorCoroutine.cs new file mode 100644 index 0000000..e005603 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorCoroutine.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + + +namespace TMPro.EditorUtilities +{ + /// + /// Simple implementation of coroutine working in the Unity Editor. + /// + public class TMP_EditorCoroutine + { + //private static Dictionary s_ActiveCoroutines; + + readonly IEnumerator coroutine; + + /// + /// Constructor + /// + /// + TMP_EditorCoroutine(IEnumerator routine) + { + this.coroutine = routine; + } + + + /// + /// Starts a new EditorCoroutine. + /// + /// Coroutine + /// new EditorCoroutine + public static TMP_EditorCoroutine StartCoroutine(IEnumerator routine) + { + TMP_EditorCoroutine coroutine = new TMP_EditorCoroutine(routine); + coroutine.Start(); + + // Add coroutine to tracking list + //if (s_ActiveCoroutines == null) + // s_ActiveCoroutines = new Dictionary(); + + // Add new instance of editor coroutine to dictionary. + //s_ActiveCoroutines.Add(coroutine.GetHashCode(), coroutine); + + return coroutine; + } + + + /// + /// Clear delegate list + /// + //public static void StopAllEditorCoroutines() + //{ + // EditorApplication.update = null; + //} + + + /// + /// Register callback for editor updates + /// + void Start() + { + EditorApplication.update += EditorUpdate; + } + + + /// + /// Unregister callback for editor updates. + /// + public void Stop() + { + if (EditorApplication.update != null) + EditorApplication.update -= EditorUpdate; + + //s_ActiveCoroutines.Remove(this.GetHashCode()); + } + + + /// + /// Delegate function called on editor updates. + /// + void EditorUpdate() + { + // Stop editor coroutine if it does not continue. + if (coroutine.MoveNext() == false) + Stop(); + + // Process the different types of EditorCoroutines. + if (coroutine.Current != null) + { + + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorCoroutine.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorCoroutine.cs.meta new file mode 100644 index 0000000..16e03fa --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorCoroutine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27a0335dab59ec542aadd6636a5b4ebd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorPanel.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorPanel.cs new file mode 100644 index 0000000..bf961c6 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorPanel.cs @@ -0,0 +1,153 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + + [CustomEditor(typeof(TextMeshPro), true), CanEditMultipleObjects] + public class TMP_EditorPanel : TMP_BaseEditorPanel + { + static readonly GUIContent k_SortingLayerLabel = new GUIContent("Sorting Layer", "Name of the Renderer's sorting layer."); + static readonly GUIContent k_OrderInLayerLabel = new GUIContent("Order in Layer", "Renderer's order within a sorting layer."); + static readonly GUIContent k_OrthographicLabel = new GUIContent("Orthographic Mode", "Should be enabled when using an orthographic camera. Instructs the shader to not perform any perspective correction."); + static readonly GUIContent k_VolumetricLabel = new GUIContent("Volumetric Setup", "Use cubes rather than quads to render the text. Allows for volumetric rendering when combined with a compatible shader."); + + SerializedProperty m_IsVolumetricTextProp; + + SerializedProperty m_IsOrthographicProp; + + Renderer m_Renderer; + + protected override void OnEnable() + { + base.OnEnable(); + + m_IsOrthographicProp = serializedObject.FindProperty("m_isOrthographic"); + + m_IsVolumetricTextProp = serializedObject.FindProperty("m_isVolumetricText"); + + m_Renderer = m_TextComponent.GetComponent(); + } + + protected override void DrawExtraSettings() + { + Foldout.extraSettings = EditorGUILayout.Foldout(Foldout.extraSettings, k_ExtraSettingsLabel, true, TMP_UIStyleManager.boldFoldout); + if (Foldout.extraSettings) + { + EditorGUI.indentLevel += 1; + + DrawMargins(); + + DrawSortingLayer(); + + DrawGeometrySorting(); + + DrawOrthographicMode(); + + DrawRichText(); + + DrawParsing(); + + DrawVolumetricSetup(); + + DrawKerning(); + + DrawPadding(); + + EditorGUI.indentLevel -= 1; + } + } + + protected void DrawSortingLayer() + { + Undo.RecordObject(m_Renderer, "Sorting Layer Change"); + + EditorGUI.BeginChangeCheck(); + + // SORTING LAYERS + var sortingLayerNames = SortingLayerHelper.sortingLayerNames; + + var textComponent = (TextMeshPro)m_TextComponent; + + // Look up the layer name using the current layer ID + string oldName = SortingLayerHelper.GetSortingLayerNameFromID(textComponent.sortingLayerID); + + // Use the name to look up our array index into the names list + int oldLayerIndex = System.Array.IndexOf(sortingLayerNames, oldName); + + // Show the pop-up for the names + EditorGUIUtility.fieldWidth = 0f; + int newLayerIndex = EditorGUILayout.Popup(k_SortingLayerLabel, oldLayerIndex, sortingLayerNames); + + // If the index changes, look up the ID for the new index to store as the new ID + if (newLayerIndex != oldLayerIndex) + { + textComponent.sortingLayerID = SortingLayerHelper.GetSortingLayerIDForIndex(newLayerIndex); + } + + // Expose the manual sorting order + int newSortingLayerOrder = EditorGUILayout.IntField(k_OrderInLayerLabel, textComponent.sortingOrder); + if (newSortingLayerOrder != textComponent.sortingOrder) + { + textComponent.sortingOrder = newSortingLayerOrder; + } + + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + + EditorGUILayout.Space(); + } + + protected void DrawOrthographicMode() + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_IsOrthographicProp, k_OrthographicLabel); + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + } + + protected void DrawVolumetricSetup() + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_IsVolumetricTextProp, k_VolumetricLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + m_TextComponent.textInfo.ResetVertexLayout(m_IsVolumetricTextProp.boolValue); + } + + EditorGUILayout.Space(); + } + + // Method to handle multi object selection + protected override bool IsMixSelectionTypes() + { + GameObject[] objects = Selection.gameObjects; + if (objects.Length > 1) + { + for (int i = 0; i < objects.Length; i++) + { + if (objects[i].GetComponent() == null) + return true; + } + } + return false; + } + + protected override void OnUndoRedo() + { + int undoEventId = Undo.GetCurrentGroup(); + int lastUndoEventId = s_EventId; + + if (undoEventId != lastUndoEventId) + { + for (int i = 0; i < targets.Length; i++) + { + //Debug.Log("Undo & Redo Performed detected in Editor Panel. Event ID:" + Undo.GetCurrentGroup()); + TMPro_EventManager.ON_TEXTMESHPRO_PROPERTY_CHANGED(true, targets[i] as TextMeshPro); + s_EventId = undoEventId; + } + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorPanel.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorPanel.cs.meta new file mode 100644 index 0000000..54fd804 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorPanel.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 34f6695d37a94370a3697f6b068f5d5e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorUtility.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorUtility.cs new file mode 100644 index 0000000..d9ccd86 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorUtility.cs @@ -0,0 +1,450 @@ +using UnityEngine; +using UnityEditor; +using System.Text; +using System.IO; +using System.Collections; +using System.Collections.Generic; + + +namespace TMPro.EditorUtilities +{ + + public static class TMP_EditorUtility + { + /// + /// Returns the relative path of the package. + /// + public static string packageRelativePath + { + get + { + if (string.IsNullOrEmpty(m_PackagePath)) + m_PackagePath = GetPackageRelativePath(); + + return m_PackagePath; + } + } + [SerializeField] + private static string m_PackagePath; + + /// + /// Returns the fully qualified path of the package. + /// + public static string packageFullPath + { + get + { + if (string.IsNullOrEmpty(m_PackageFullPath)) + m_PackageFullPath = GetPackageFullPath(); + + return m_PackageFullPath; + } + } + [SerializeField] + private static string m_PackageFullPath; + + + // Static Fields Related to locating the TextMesh Pro Asset + private static string folderPath = "Not Found"; + + private static EditorWindow Gameview; + private static bool isInitialized = false; + + private static void GetGameview() + { + System.Reflection.Assembly assembly = typeof(UnityEditor.EditorWindow).Assembly; + System.Type type = assembly.GetType("UnityEditor.GameView"); + Gameview = EditorWindow.GetWindow(type); + } + + + public static void RepaintAll() + { + if (isInitialized == false) + { + GetGameview(); + isInitialized = true; + } + + SceneView.RepaintAll(); + Gameview.Repaint(); + } + + + /// + /// Create and return a new asset in a smart location based on the current selection and then select it. + /// + /// + /// Name of the new asset. Do not include the .asset extension. + /// + /// + /// The new asset. + /// + public static T CreateAsset(string name) where T : ScriptableObject + { + string path = AssetDatabase.GetAssetPath(Selection.activeObject); + if (path.Length == 0) + { + // no asset selected, place in asset root + path = "Assets/" + name + ".asset"; + } + else if (Directory.Exists(path)) + { + // place in currently selected directory + path += "/" + name + ".asset"; + } + else { + // place in current selection's containing directory + path = Path.GetDirectoryName(path) + "/" + name + ".asset"; + } + T asset = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(asset, AssetDatabase.GenerateUniqueAssetPath(path)); + EditorUtility.FocusProjectWindow(); + Selection.activeObject = asset; + return asset; + } + + + + // Function used to find all materials which reference a font atlas so we can update all their references. + public static Material[] FindMaterialReferences(TMP_FontAsset fontAsset) + { + List refs = new List(); + Material mat = fontAsset.material; + refs.Add(mat); + + // Get materials matching the search pattern. + string searchPattern = "t:Material" + " " + fontAsset.name.Split(new char[] { ' ' })[0]; + string[] materialAssetGUIDs = AssetDatabase.FindAssets(searchPattern); + + for (int i = 0; i < materialAssetGUIDs.Length; i++) + { + string materialPath = AssetDatabase.GUIDToAssetPath(materialAssetGUIDs[i]); + Material targetMaterial = AssetDatabase.LoadAssetAtPath(materialPath); + + if (targetMaterial.HasProperty(ShaderUtilities.ID_MainTex) && targetMaterial.GetTexture(ShaderUtilities.ID_MainTex) != null && mat.GetTexture(ShaderUtilities.ID_MainTex) != null && targetMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID() == mat.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID()) + { + if (!refs.Contains(targetMaterial)) + refs.Add(targetMaterial); + } + else + { + // TODO: Find a more efficient method to unload resources. + //Resources.UnloadAsset(targetMaterial.GetTexture(ShaderUtilities.ID_MainTex)); + } + } + + return refs.ToArray(); + } + + + // Function used to find the Font Asset which matches the given Material Preset and Font Atlas Texture. + public static TMP_FontAsset FindMatchingFontAsset(Material mat) + { + if (mat.GetTexture(ShaderUtilities.ID_MainTex) == null) return null; + + // Find the dependent assets of this material. + string[] dependentAssets = AssetDatabase.GetDependencies(AssetDatabase.GetAssetPath(mat), false); + + for (int i = 0; i < dependentAssets.Length; i++) + { + TMP_FontAsset fontAsset = AssetDatabase.LoadAssetAtPath(dependentAssets[i]); + if (fontAsset != null) + return fontAsset; + } + + return null; + } + + + private static string GetPackageRelativePath() + { + // Check for potential UPM package + string packagePath = Path.GetFullPath("Packages/com.unity.textmeshpro"); + if (Directory.Exists(packagePath)) + { + return "Packages/com.unity.textmeshpro"; + } + + packagePath = Path.GetFullPath("Assets/.."); + if (Directory.Exists(packagePath)) + { + // Search default location for development package + if (Directory.Exists(packagePath + "/Assets/Packages/com.unity.TextMeshPro/Editor Resources")) + { + return "Assets/Packages/com.unity.TextMeshPro"; + } + + // Search for default location of normal TextMesh Pro AssetStore package + if (Directory.Exists(packagePath + "/Assets/TextMesh Pro/Editor Resources")) + { + return "Assets/TextMesh Pro"; + } + + // Search for potential alternative locations in the user project + string[] matchingPaths = Directory.GetDirectories(packagePath, "TextMesh Pro", SearchOption.AllDirectories); + packagePath = ValidateLocation(matchingPaths, packagePath); + if (packagePath != null) return packagePath; + } + + return null; + } + + private static string GetPackageFullPath() + { + // Check for potential UPM package + string packagePath = Path.GetFullPath("Packages/com.unity.textmeshpro"); + if (Directory.Exists(packagePath)) + { + return packagePath; + } + + packagePath = Path.GetFullPath("Assets/.."); + if (Directory.Exists(packagePath)) + { + // Search default location for development package + if (Directory.Exists(packagePath + "/Assets/Packages/com.unity.TextMeshPro/Editor Resources")) + { + return packagePath + "/Assets/Packages/com.unity.TextMeshPro"; + } + + // Search for default location of normal TextMesh Pro AssetStore package + if (Directory.Exists(packagePath + "/Assets/TextMesh Pro/Editor Resources")) + { + return packagePath + "/Assets/TextMesh Pro"; + } + + // Search for potential alternative locations in the user project + string[] matchingPaths = Directory.GetDirectories(packagePath, "TextMesh Pro", SearchOption.AllDirectories); + string path = ValidateLocation(matchingPaths, packagePath); + if (path != null) return packagePath + path; + } + + return null; + } + + + /// + /// Method to validate the location of the asset folder by making sure the GUISkins folder exists. + /// + /// + /// + private static string ValidateLocation(string[] paths, string projectPath) + { + for (int i = 0; i < paths.Length; i++) + { + // Check if any of the matching directories contain a GUISkins directory. + if (Directory.Exists(paths[i] + "/Editor Resources")) + { + folderPath = paths[i].Replace(projectPath, ""); + folderPath = folderPath.TrimStart('\\', '/'); + return folderPath; + } + } + + return null; + } + + + /// + /// Function which returns a string containing a sequence of Decimal character ranges. + /// + /// + /// + public static string GetDecimalCharacterSequence(int[] characterSet) + { + if (characterSet == null || characterSet.Length == 0) + return string.Empty; + + string characterSequence = string.Empty; + int count = characterSet.Length; + int first = characterSet[0]; + int last = first; + + for (int i = 1; i < count; i++) + { + if (characterSet[i - 1] + 1 == characterSet[i]) + { + last = characterSet[i]; + } + else + { + if (first == last) + characterSequence += first + ","; + else + characterSequence += first + "-" + last + ","; + + first = last = characterSet[i]; + } + + } + + // handle the final group + if (first == last) + characterSequence += first; + else + characterSequence += first + "-" + last; + + return characterSequence; + } + + + /// + /// Function which returns a string containing a sequence of Unicode (Hex) character ranges. + /// + /// + /// + public static string GetUnicodeCharacterSequence(int[] characterSet) + { + if (characterSet == null || characterSet.Length == 0) + return string.Empty; + + string characterSequence = string.Empty; + int count = characterSet.Length; + int first = characterSet[0]; + int last = first; + + for (int i = 1; i < count; i++) + { + if (characterSet[i - 1] + 1 == characterSet[i]) + { + last = characterSet[i]; + } + else + { + if (first == last) + characterSequence += first.ToString("X2") + ","; + else + characterSequence += first.ToString("X2") + "-" + last.ToString("X2") + ","; + + first = last = characterSet[i]; + } + + } + + // handle the final group + if (first == last) + characterSequence += first.ToString("X2"); + else + characterSequence += first.ToString("X2") + "-" + last.ToString("X2"); + + return characterSequence; + } + + + /// + /// + /// + /// + /// + /// + public static void DrawBox(Rect rect, float thickness, Color color) + { + EditorGUI.DrawRect(new Rect(rect.x - thickness, rect.y + thickness, rect.width + thickness * 2, thickness), color); + EditorGUI.DrawRect(new Rect(rect.x - thickness, rect.y + thickness, thickness, rect.height - thickness * 2), color); + EditorGUI.DrawRect(new Rect(rect.x - thickness, rect.y + rect.height - thickness * 2, rect.width + thickness * 2, thickness), color); + EditorGUI.DrawRect(new Rect(rect.x + rect.width, rect.y + thickness, thickness, rect.height - thickness * 2), color); + } + + + /// + /// Function to return the horizontal alignment grid value. + /// + /// + /// + public static int GetHorizontalAlignmentGridValue(int value) + { + if ((value & 0x1) == 0x1) + return 0; + else if ((value & 0x2) == 0x2) + return 1; + else if ((value & 0x4) == 0x4) + return 2; + else if ((value & 0x8) == 0x8) + return 3; + else if ((value & 0x10) == 0x10) + return 4; + else if ((value & 0x20) == 0x20) + return 5; + + return 0; + } + + /// + /// Function to return the vertical alignment grid value. + /// + /// + /// + public static int GetVerticalAlignmentGridValue(int value) + { + if ((value & 0x100) == 0x100) + return 0; + if ((value & 0x200) == 0x200) + return 1; + if ((value & 0x400) == 0x400) + return 2; + if ((value & 0x800) == 0x800) + return 3; + if ((value & 0x1000) == 0x1000) + return 4; + if ((value & 0x2000) == 0x2000) + return 5; + + return 0; + } + + public static void DrawColorProperty(Rect rect, SerializedProperty property) + { + int oldIndent = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + if (EditorGUIUtility.wideMode) + { + EditorGUI.PropertyField(new Rect(rect.x, rect.y, 50f, rect.height), property, GUIContent.none); + rect.x += 50f; + rect.width = Mathf.Min(100f, rect.width - 55f); + } + else + { + rect.height /= 2f; + rect.width = Mathf.Min(100f, rect.width - 5f); + EditorGUI.PropertyField(rect, property, GUIContent.none); + rect.y += rect.height; + } + + EditorGUI.BeginChangeCheck(); + string colorString = EditorGUI.TextField(rect, string.Format("#{0}", ColorUtility.ToHtmlStringRGBA(property.colorValue))); + if (EditorGUI.EndChangeCheck()) + { + if (ColorUtility.TryParseHtmlString(colorString, out Color color)) + { + property.colorValue = color; + } + } + EditorGUI.indentLevel = oldIndent; + } + + public static bool EditorToggle(Rect position, bool value, GUIContent content, GUIStyle style) + { + var id = GUIUtility.GetControlID(content, FocusType.Keyboard, position); + var evt = Event.current; + + // Toggle selected toggle on space or return key + if (GUIUtility.keyboardControl == id && evt.type == EventType.KeyDown && (evt.keyCode == KeyCode.Space || evt.keyCode == KeyCode.Return || evt.keyCode == KeyCode.KeypadEnter)) + { + value = !value; + evt.Use(); + GUI.changed = true; + } + + if (evt.type == EventType.MouseDown && position.Contains(Event.current.mousePosition)) + { + GUIUtility.keyboardControl = id; + EditorGUIUtility.editingTextField = false; + HandleUtility.Repaint(); + } + + return GUI.Toggle(position, id, value, content, style); + } + + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorUtility.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorUtility.cs.meta new file mode 100644 index 0000000..5088b1b --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorUtility.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2300e75732d74890b38a8ff257a3ae15 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAssetEditor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAssetEditor.cs new file mode 100644 index 0000000..0e44526 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAssetEditor.cs @@ -0,0 +1,1711 @@ +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using System.Collections; +using System.Collections.Generic; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_FontWeightPair))] + public class FontWeightDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_regular = property.FindPropertyRelative("regularTypeface"); + SerializedProperty prop_italic = property.FindPropertyRelative("italicTypeface"); + + float width = position.width; + + position.width = EditorGUIUtility.labelWidth; + EditorGUI.LabelField(position, label); + + int oldIndent = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + + // NORMAL TYPEFACE + if (label.text[0] == '4') GUI.enabled = false; + position.x += position.width; position.width = (width - position.width) / 2; + EditorGUI.PropertyField(position, prop_regular, GUIContent.none); + + // ITALIC TYPEFACE + GUI.enabled = true; + position.x += position.width; + EditorGUI.PropertyField(position, prop_italic, GUIContent.none); + + EditorGUI.indentLevel = oldIndent; + } + } + + [CustomEditor(typeof(TMP_FontAsset))] + public class TMP_FontAssetEditor : Editor + { + private struct UI_PanelState + { + public static bool faceInfoPanel = true; + public static bool generationSettingsPanel = true; + public static bool fontAtlasInfoPanel = true; + public static bool fontWeightPanel = true; + public static bool fallbackFontAssetPanel = true; + public static bool glyphTablePanel = false; + public static bool characterTablePanel = false; + public static bool fontFeatureTablePanel = false; + } + + private struct AtlasSettings + { + public GlyphRenderMode glyphRenderMode; + public int pointSize; + public int padding; + public int atlasWidth; + public int atlasHeight; + } + + /// + /// Material used to display SDF glyphs in the Character and Glyph tables. + /// + internal static Material internalSDFMaterial + { + get + { + if (s_InternalSDFMaterial == null) + { + Shader shader = Shader.Find("Hidden/TextMeshPro/Internal/Distance Field SSD"); + + if (shader != null) + s_InternalSDFMaterial = new Material(shader); + } + + return s_InternalSDFMaterial; + } + } + static Material s_InternalSDFMaterial; + + /// + /// Material used to display Bitmap glyphs in the Character and Glyph tables. + /// + internal static Material internalBitmapMaterial + { + get + { + if (s_InternalBitmapMaterial == null) + { + Shader shader = Shader.Find("Hidden/Internal-GUITextureClipText"); + + if (shader != null) + s_InternalBitmapMaterial = new Material(shader); + } + + return s_InternalBitmapMaterial; + } + } + static Material s_InternalBitmapMaterial; + + private static string[] s_UiStateLabel = new string[] { "(Click to collapse) ", "(Click to expand) " }; + private GUIContent[] m_AtlasResolutionLabels = { new GUIContent("8"), new GUIContent("16"), new GUIContent("32"), new GUIContent("64"), new GUIContent("128"), new GUIContent("256"), new GUIContent("512"), new GUIContent("1024"), new GUIContent("2048"), new GUIContent("4096"), new GUIContent("8192") }; + private int[] m_AtlasResolutions = { 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 }; + + private struct Warning + { + public bool isEnabled; + public double expirationTime; + } + + private int m_CurrentGlyphPage = 0; + private int m_CurrentCharacterPage = 0; + private int m_CurrentKerningPage = 0; + + private int m_SelectedGlyphRecord = -1; + private int m_SelectedCharacterRecord = -1; + private int m_SelectedAdjustmentRecord = -1; + + private string m_dstGlyphID; + private string m_dstUnicode; + private const string k_placeholderUnicodeHex = "New Unicode (Hex)"; + private string m_unicodeHexLabel = k_placeholderUnicodeHex; + private const string k_placeholderGlyphID = "New Glyph ID"; + private string m_GlyphIDLabel = k_placeholderGlyphID; + + private Warning m_AddGlyphWarning; + private Warning m_AddCharacterWarning; + private bool m_DisplayDestructiveChangeWarning; + private AtlasSettings m_AtlasSettings; + private bool m_MaterialPresetsRequireUpdate; + + private string m_GlyphSearchPattern; + private List m_GlyphSearchList; + + private string m_CharacterSearchPattern; + private List m_CharacterSearchList; + + private string m_KerningTableSearchPattern; + private List m_KerningTableSearchList; + + private bool m_isSearchDirty; + + private const string k_UndoRedo = "UndoRedoPerformed"; + + private SerializedProperty m_AtlasPopulationMode_prop; + private SerializedProperty font_atlas_prop; + private SerializedProperty font_material_prop; + + private SerializedProperty m_AtlasRenderMode_prop; + private SerializedProperty m_SamplingPointSize_prop; + private SerializedProperty m_AtlasPadding_prop; + private SerializedProperty m_AtlasWidth_prop; + private SerializedProperty m_AtlasHeight_prop; + + private SerializedProperty fontWeights_prop; + + //private SerializedProperty fallbackFontAssets_prop; + private ReorderableList m_list; + + private SerializedProperty font_normalStyle_prop; + private SerializedProperty font_normalSpacing_prop; + + private SerializedProperty font_boldStyle_prop; + private SerializedProperty font_boldSpacing_prop; + + private SerializedProperty font_italicStyle_prop; + private SerializedProperty font_tabSize_prop; + + private SerializedProperty m_FaceInfo_prop; + private SerializedProperty m_GlyphTable_prop; + private SerializedProperty m_CharacterTable_prop; + + private TMP_FontFeatureTable m_FontFeatureTable; + private SerializedProperty m_FontFeatureTable_prop; + private SerializedProperty m_GlyphPairAdjustmentRecords_prop; + + private TMP_SerializedPropertyHolder m_SerializedPropertyHolder; + private SerializedProperty m_EmptyGlyphPairAdjustmentRecord_prop; + + private TMP_FontAsset m_fontAsset; + + private Material[] m_materialPresets; + + private bool isAssetDirty = false; + + private int errorCode; + + private System.DateTime timeStamp; + + + public void OnEnable() + { + m_FaceInfo_prop = serializedObject.FindProperty("m_FaceInfo"); + + font_atlas_prop = serializedObject.FindProperty("m_AtlasTextures").GetArrayElementAtIndex(0); + font_material_prop = serializedObject.FindProperty("material"); + + m_AtlasPopulationMode_prop = serializedObject.FindProperty("m_AtlasPopulationMode"); + m_AtlasRenderMode_prop = serializedObject.FindProperty("m_AtlasRenderMode"); + m_SamplingPointSize_prop = m_FaceInfo_prop.FindPropertyRelative("m_PointSize"); + m_AtlasPadding_prop = serializedObject.FindProperty("m_AtlasPadding"); + m_AtlasWidth_prop = serializedObject.FindProperty("m_AtlasWidth"); + m_AtlasHeight_prop = serializedObject.FindProperty("m_AtlasHeight"); + + fontWeights_prop = serializedObject.FindProperty("m_FontWeightTable"); + + m_list = new ReorderableList(serializedObject, serializedObject.FindProperty("m_FallbackFontAssetTable"), true, true, true, true); + + m_list.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + var element = m_list.serializedProperty.GetArrayElementAtIndex(index); + rect.y += 2; + EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, GUIContent.none); + }; + + m_list.drawHeaderCallback = rect => + { + EditorGUI.LabelField(rect, "Fallback List"); + }; + + // Clean up fallback list in the event if contains null elements. + CleanFallbackFontAssetTable(); + + font_normalStyle_prop = serializedObject.FindProperty("normalStyle"); + font_normalSpacing_prop = serializedObject.FindProperty("normalSpacingOffset"); + + font_boldStyle_prop = serializedObject.FindProperty("boldStyle"); + font_boldSpacing_prop = serializedObject.FindProperty("boldSpacing"); + + font_italicStyle_prop = serializedObject.FindProperty("italicStyle"); + font_tabSize_prop = serializedObject.FindProperty("tabSize"); + + m_CharacterTable_prop = serializedObject.FindProperty("m_CharacterTable"); + m_GlyphTable_prop = serializedObject.FindProperty("m_GlyphTable"); + + m_FontFeatureTable_prop = serializedObject.FindProperty("m_FontFeatureTable"); + m_GlyphPairAdjustmentRecords_prop = m_FontFeatureTable_prop.FindPropertyRelative("m_GlyphPairAdjustmentRecords"); + + m_fontAsset = target as TMP_FontAsset; + m_FontFeatureTable = m_fontAsset.fontFeatureTable; + + // Upgrade Font Feature Table if necessary + if (m_fontAsset.m_KerningTable != null && m_fontAsset.m_KerningTable.kerningPairs != null && m_fontAsset.m_KerningTable.kerningPairs.Count > 0) + m_fontAsset.ReadFontAssetDefinition(); + + // Create serialized object to allow us to use a serialized property of an empty kerning pair. + m_SerializedPropertyHolder = CreateInstance(); + m_SerializedPropertyHolder.fontAsset = m_fontAsset; + SerializedObject internalSerializedObject = new SerializedObject(m_SerializedPropertyHolder); + m_EmptyGlyphPairAdjustmentRecord_prop = internalSerializedObject.FindProperty("glyphPairAdjustmentRecord"); + + m_materialPresets = TMP_EditorUtility.FindMaterialReferences(m_fontAsset); + + m_GlyphSearchList = new List(); + m_KerningTableSearchList = new List(); + } + + + public void OnDisable() + { + // Revert changes if user closes or changes selection without having made a choice. + if (m_DisplayDestructiveChangeWarning) + { + m_DisplayDestructiveChangeWarning = false; + RestoreAtlasGenerationSettings(); + GUIUtility.keyboardControl = 0; + + serializedObject.ApplyModifiedProperties(); + } + } + + + public override void OnInspectorGUI() + { + //Debug.Log("OnInspectorGUI Called."); + + Event currentEvent = Event.current; + + serializedObject.Update(); + + Rect rect = EditorGUILayout.GetControlRect(false, 24); + float labelWidth = EditorGUIUtility.labelWidth; + float fieldWidth = EditorGUIUtility.fieldWidth; + + // FACE INFO PANEL + #region Face info + GUI.Label(rect, new GUIContent("Face Info - v" + m_fontAsset.version), TMP_UIStyleManager.sectionHeader); + + rect.x += rect.width - 132f; + rect.y += 2; + rect.width = 130f; + rect.height = 18f; + if (GUI.Button(rect, new GUIContent("Update Atlas Texture"))) + { + TMPro_FontAssetCreatorWindow.ShowFontAtlasCreatorWindow(target as TMP_FontAsset); + } + + EditorGUI.indentLevel = 1; + GUI.enabled = false; // Lock UI + + // TODO : Consider creating a property drawer for these. + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_FamilyName")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_StyleName")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_PointSize")); + + GUI.enabled = true; + + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_Scale")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_LineHeight")); + + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_AscentLine")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_CapLine")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_MeanLine")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_Baseline")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_DescentLine")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_UnderlineOffset")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_UnderlineThickness")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_StrikethroughOffset")); + //EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("strikethroughThickness")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_SuperscriptOffset")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_SuperscriptSize")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_SubscriptOffset")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_SubscriptSize")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_TabWidth")); + // TODO : Add clamping for some of these values. + //subSize_prop.floatValue = Mathf.Clamp(subSize_prop.floatValue, 0.25f, 1f); + + EditorGUILayout.Space(); + #endregion + + // GENERATION SETTINGS + #region Generation Settings + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Generation Settings"), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.generationSettingsPanel = !UI_PanelState.generationSettingsPanel; + + GUI.Label(rect, (UI_PanelState.generationSettingsPanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.generationSettingsPanel) + { + EditorGUI.indentLevel = 1; + + EditorGUI.BeginChangeCheck(); + Font sourceFont = (Font)EditorGUILayout.ObjectField("Source Font File", m_fontAsset.m_SourceFontFile_EditorRef, typeof(Font), false); + if (EditorGUI.EndChangeCheck()) + { + string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(sourceFont)); + m_fontAsset.m_SourceFontFileGUID = guid; + m_fontAsset.m_SourceFontFile_EditorRef = sourceFont; + } + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_AtlasPopulationMode_prop, new GUIContent("Atlas Population Mode")); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + + bool isDatabaseRefreshRequired = false; + + if (m_AtlasPopulationMode_prop.intValue == 0) + { + m_fontAsset.sourceFontFile = null; + + // Set atlas textures to non readable. + //for (int i = 0; i < m_fontAsset.atlasTextures.Length; i++) + //{ + // Texture2D tex = m_fontAsset.atlasTextures[i]; + + // if (tex != null && tex.isReadable) + // { + // string texPath = AssetDatabase.GetAssetPath(tex); + // var texImporter = AssetImporter.GetAtPath(texPath) as TextureImporter; + // if (texImporter != null) + // { + // texImporter.isReadable = false; + // AssetDatabase.ImportAsset(texPath); + // isDatabaseRefreshRequired = true; + // } + // } + //} + + Debug.Log("Atlas Population mode set to [Static]."); + } + else if (m_AtlasPopulationMode_prop.intValue == 1) + { + if (m_fontAsset.m_SourceFontFile_EditorRef.dynamic == false) + { + Debug.LogWarning("Please set the [" + m_fontAsset.name + "] font to dynamic mode as this is required for Dynamic SDF support.", m_fontAsset.m_SourceFontFile_EditorRef); + m_AtlasPopulationMode_prop.intValue = 0; + + serializedObject.ApplyModifiedProperties(); + } + else + { + m_fontAsset.sourceFontFile = m_fontAsset.m_SourceFontFile_EditorRef; + + /* + // Set atlas textures to non readable. + for (int i = 0; i < m_fontAsset.atlasTextures.Length; i++) + { + Texture2D tex = m_fontAsset.atlasTextures[i]; + + if (tex != null && tex.isReadable == false) + { + string texPath = AssetDatabase.GetAssetPath(tex.GetInstanceID()); + Object[] paths = AssetDatabase.LoadAllAssetsAtPath(texPath); + var texImporter = AssetImporter.GetAtPath(texPath) as TextureImporter; + if (texImporter != null) + { + texImporter.isReadable = true; + AssetDatabase.ImportAsset(texPath); + isDatabaseRefreshRequired = true; + } + } + } + */ + Debug.Log("Atlas Population mode set to [Dynamic]."); + } + } + + if (isDatabaseRefreshRequired) + AssetDatabase.Refresh(); + + serializedObject.Update(); + isAssetDirty = true; + } + + GUI.enabled = true; + // Save state of atlas settings + if (m_DisplayDestructiveChangeWarning == false) + { + SavedAtlasGenerationSettings(); + //Undo.RegisterCompleteObjectUndo(m_fontAsset, "Font Asset Changes"); + } + + EditorGUI.BeginChangeCheck(); + // TODO: Switch shaders depending on GlyphRenderMode. + EditorGUILayout.PropertyField(m_AtlasRenderMode_prop); + EditorGUILayout.PropertyField(m_SamplingPointSize_prop, new GUIContent("Sampling Point Size")); + if (EditorGUI.EndChangeCheck()) + { + m_DisplayDestructiveChangeWarning = true; + } + + // Changes to these properties require updating Material Presets for this font asset. + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_AtlasPadding_prop, new GUIContent("Padding")); + EditorGUILayout.IntPopup(m_AtlasWidth_prop, m_AtlasResolutionLabels, m_AtlasResolutions, new GUIContent("Atlas Width")); + EditorGUILayout.IntPopup(m_AtlasHeight_prop, m_AtlasResolutionLabels, m_AtlasResolutions, new GUIContent("Atlas Height")); + if (EditorGUI.EndChangeCheck()) + { + m_MaterialPresetsRequireUpdate = true; + m_DisplayDestructiveChangeWarning = true; + } + + if (m_DisplayDestructiveChangeWarning) + { + // These changes are destructive on the font asset + rect = EditorGUILayout.GetControlRect(false, 60); + rect.x += 15; + rect.width -= 15; + EditorGUI.HelpBox(rect, "Changing these settings will clear the font asset's character, glyph and texture data.", MessageType.Warning); + + if (GUI.Button(new Rect(rect.width - 140, rect.y + 36, 80, 18), new GUIContent("Apply"))) + { + m_DisplayDestructiveChangeWarning = false; + + // Update face info is sampling point size was changed. + if (m_AtlasSettings.pointSize != m_SamplingPointSize_prop.intValue) + { + FontEngine.LoadFontFace(m_fontAsset.sourceFontFile, m_SamplingPointSize_prop.intValue); + m_fontAsset.faceInfo = FontEngine.GetFaceInfo(); + } + + // Update material + m_fontAsset.material.SetFloat(ShaderUtilities.ID_TextureWidth, m_AtlasWidth_prop.intValue); + m_fontAsset.material.SetFloat(ShaderUtilities.ID_TextureHeight, m_AtlasHeight_prop.intValue); + m_fontAsset.material.SetFloat(ShaderUtilities.ID_GradientScale, m_AtlasPadding_prop.intValue + 1); + + // Update material presets if any of the relevant properties have been changed. + if (m_MaterialPresetsRequireUpdate) + { + m_MaterialPresetsRequireUpdate = false; + + Material[] materialPresets = TMP_EditorUtility.FindMaterialReferences(m_fontAsset); + for (int i = 0; i < materialPresets.Length; i++) + { + Material mat = materialPresets[i]; + + mat.SetFloat(ShaderUtilities.ID_TextureWidth, m_AtlasWidth_prop.intValue); + mat.SetFloat(ShaderUtilities.ID_TextureHeight, m_AtlasHeight_prop.intValue); + mat.SetFloat(ShaderUtilities.ID_GradientScale, m_AtlasPadding_prop.intValue + 1); + } + } + + m_fontAsset.ClearFontAssetData(); + GUIUtility.keyboardControl = 0; + isAssetDirty = true; + + // Update Font Asset Creation Settings to reflect new changes. + UpdateFontAssetCreationSettings(); + + // TODO: Clear undo buffers. + //Undo.ClearUndo(m_fontAsset); + } + + if (GUI.Button(new Rect(rect.width - 56, rect.y + 36, 80, 18), new GUIContent("Revert"))) + { + m_DisplayDestructiveChangeWarning = false; + RestoreAtlasGenerationSettings(); + GUIUtility.keyboardControl = 0; + + // TODO: Clear undo buffers. + //Undo.ClearUndo(m_fontAsset); + } + } + EditorGUILayout.Space(); + } + #endregion + + // ATLAS & MATERIAL PANEL + #region Atlas & Material + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Atlas & Material"), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.fontAtlasInfoPanel = !UI_PanelState.fontAtlasInfoPanel; + + GUI.Label(rect, (UI_PanelState.fontAtlasInfoPanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.fontAtlasInfoPanel) + { + EditorGUI.indentLevel = 1; + + GUI.enabled = false; + EditorGUILayout.PropertyField(font_atlas_prop, new GUIContent("Font Atlas")); + EditorGUILayout.PropertyField(font_material_prop, new GUIContent("Font Material")); + GUI.enabled = true; + EditorGUILayout.Space(); + } + #endregion + + string evt_cmd = Event.current.commandName; // Get Current Event CommandName to check for Undo Events + + // FONT WEIGHT PANEL + #region Font Weights + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Font Weights", "The Font Assets that will be used for different font weights and the settings used to simulate a typeface when no asset is available."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.fontWeightPanel = !UI_PanelState.fontWeightPanel; + + GUI.Label(rect, (UI_PanelState.fontWeightPanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.fontWeightPanel) + { + EditorGUIUtility.labelWidth *= 0.75f; + EditorGUIUtility.fieldWidth *= 0.25f; + + EditorGUILayout.BeginVertical(); + EditorGUI.indentLevel = 1; + rect = EditorGUILayout.GetControlRect(true); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f; + GUI.Label(rect, "Regular Tyepface", EditorStyles.label); + rect.x += rect.width; + GUI.Label(rect, "Italic Typeface", EditorStyles.label); + + EditorGUI.indentLevel = 1; + + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(1), new GUIContent("100 - Thin")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(2), new GUIContent("200 - Extra-Light")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(3), new GUIContent("300 - Light")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(4), new GUIContent("400 - Regular")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(5), new GUIContent("500 - Medium")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(6), new GUIContent("600 - Semi-Bold")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(7), new GUIContent("700 - Bold")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(8), new GUIContent("800 - Heavy")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(9), new GUIContent("900 - Black")); + + EditorGUILayout.EndVertical(); + + EditorGUILayout.Space(); + + EditorGUILayout.BeginVertical(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(font_normalStyle_prop, new GUIContent("Normal Weight")); + font_normalStyle_prop.floatValue = Mathf.Clamp(font_normalStyle_prop.floatValue, -3.0f, 3.0f); + if (GUI.changed || evt_cmd == k_UndoRedo) + { + GUI.changed = false; + + // Modify the material property on matching material presets. + for (int i = 0; i < m_materialPresets.Length; i++) + m_materialPresets[i].SetFloat("_WeightNormal", font_normalStyle_prop.floatValue); + } + + EditorGUILayout.PropertyField(font_boldStyle_prop, new GUIContent("Bold Weight")); + font_boldStyle_prop.floatValue = Mathf.Clamp(font_boldStyle_prop.floatValue, -3.0f, 3.0f); + if (GUI.changed || evt_cmd == k_UndoRedo) + { + GUI.changed = false; + + // Modify the material property on matching material presets. + for (int i = 0; i < m_materialPresets.Length; i++) + m_materialPresets[i].SetFloat("_WeightBold", font_boldStyle_prop.floatValue); + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(font_normalSpacing_prop, new GUIContent("Spacing Offset")); + font_normalSpacing_prop.floatValue = Mathf.Clamp(font_normalSpacing_prop.floatValue, -100, 100); + if (GUI.changed || evt_cmd == k_UndoRedo) + { + GUI.changed = false; + } + + EditorGUILayout.PropertyField(font_boldSpacing_prop, new GUIContent("Bold Spacing")); + font_boldSpacing_prop.floatValue = Mathf.Clamp(font_boldSpacing_prop.floatValue, 0, 100); + if (GUI.changed || evt_cmd == k_UndoRedo) + { + GUI.changed = false; + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(font_italicStyle_prop, new GUIContent("Italic Style")); + font_italicStyle_prop.intValue = Mathf.Clamp(font_italicStyle_prop.intValue, 15, 60); + + EditorGUILayout.PropertyField(font_tabSize_prop, new GUIContent("Tab Multiple")); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.EndVertical(); + EditorGUILayout.Space(); + } + + EditorGUIUtility.labelWidth = 0; + EditorGUIUtility.fieldWidth = 0; + #endregion + + // FALLBACK FONT ASSETS + #region Fallback Font Asset + rect = EditorGUILayout.GetControlRect(false, 24); + EditorGUI.indentLevel = 0; + if (GUI.Button(rect, new GUIContent("Fallback Font Assets", "Select the Font Assets that will be searched and used as fallback when characters are missing from this font asset."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.fallbackFontAssetPanel = !UI_PanelState.fallbackFontAssetPanel; + + GUI.Label(rect, (UI_PanelState.fallbackFontAssetPanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.fallbackFontAssetPanel) + { + EditorGUIUtility.labelWidth = 120; + EditorGUI.indentLevel = 0; + + m_list.DoLayoutList(); + EditorGUILayout.Space(); + } + #endregion + + // CHARACTER TABLE TABLE + #region Character Table + EditorGUIUtility.labelWidth = labelWidth; + EditorGUIUtility.fieldWidth = fieldWidth; + EditorGUI.indentLevel = 0; + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Character Table", "List of characters contained in this font asset."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.characterTablePanel = !UI_PanelState.characterTablePanel; + + GUI.Label(rect, (UI_PanelState.characterTablePanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.characterTablePanel) + { + int arraySize = m_CharacterTable_prop.arraySize; + int itemsPerPage = 15; + + // Display Glyph Management Tools + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + // Search Bar implementation + #region DISPLAY SEARCH BAR + EditorGUILayout.BeginHorizontal(); + { + EditorGUIUtility.labelWidth = 130f; + EditorGUI.BeginChangeCheck(); + string searchPattern = EditorGUILayout.TextField("Character Search", m_CharacterSearchPattern, "SearchTextField"); + if (EditorGUI.EndChangeCheck() || m_isSearchDirty) + { + if (string.IsNullOrEmpty(searchPattern) == false) + { + m_CharacterSearchPattern = searchPattern; + + // Search Character Table for potential matches + SearchCharacterTable (m_CharacterSearchPattern, ref m_CharacterSearchList); + } + else + m_CharacterSearchPattern = null; + + m_isSearchDirty = false; + } + + string styleName = string.IsNullOrEmpty(m_CharacterSearchPattern) ? "SearchCancelButtonEmpty" : "SearchCancelButton"; + if (GUILayout.Button(GUIContent.none, styleName)) + { + GUIUtility.keyboardControl = 0; + m_CharacterSearchPattern = string.Empty; + } + } + EditorGUILayout.EndHorizontal(); + #endregion + + // Display Page Navigation + if (!string.IsNullOrEmpty(m_CharacterSearchPattern)) + arraySize = m_CharacterSearchList.Count; + + DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage); + } + EditorGUILayout.EndVertical(); + + // Display Character Table Elements + if (arraySize > 0) + { + // Display each character entry using the CharacterPropertyDrawer. + for (int i = itemsPerPage * m_CurrentCharacterPage; i < arraySize && i < itemsPerPage * (m_CurrentCharacterPage + 1); i++) + { + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + int elementIndex = i; + if (!string.IsNullOrEmpty(m_CharacterSearchPattern)) + elementIndex = m_CharacterSearchList[i]; + + SerializedProperty characterProperty = m_CharacterTable_prop.GetArrayElementAtIndex(elementIndex); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + EditorGUI.BeginDisabledGroup(i != m_SelectedCharacterRecord); + { + EditorGUILayout.PropertyField(characterProperty); + } + EditorGUI.EndDisabledGroup(); + + EditorGUILayout.EndVertical(); + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_SelectedCharacterRecord == i) + m_SelectedCharacterRecord = -1; + else + { + m_SelectedCharacterRecord = i; + m_AddCharacterWarning.isEnabled = false; + m_unicodeHexLabel = k_placeholderUnicodeHex; + GUIUtility.keyboardControl = 0; + } + } + + // Draw Selection Highlight and Glyph Options + if (m_SelectedCharacterRecord == i) + { + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + + // Draw Glyph management options + Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f); + float optionAreaWidth = controlRect.width * 0.6f; + float btnWidth = optionAreaWidth / 3; + + Rect position = new Rect(controlRect.x + controlRect.width * .4f, controlRect.y, btnWidth, controlRect.height); + + // Copy Selected Glyph to Target Glyph ID + GUI.enabled = !string.IsNullOrEmpty(m_dstUnicode); + if (GUI.Button(position, new GUIContent("Copy to"))) + { + GUIUtility.keyboardControl = 0; + + // Convert Hex Value to Decimal + int dstGlyphID = TMP_TextUtilities.StringHexToInt(m_dstUnicode); + + //Add new glyph at target Unicode hex id. + if (!AddNewCharacter(elementIndex, dstGlyphID)) + { + m_AddCharacterWarning.isEnabled = true; + m_AddCharacterWarning.expirationTime = EditorApplication.timeSinceStartup + 1; + } + + m_dstUnicode = string.Empty; + m_isSearchDirty = true; + + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, m_fontAsset); + } + + // Target Glyph ID + GUI.enabled = true; + position.x += btnWidth; + + GUI.SetNextControlName("CharacterID_Input"); + m_dstUnicode = EditorGUI.TextField(position, m_dstUnicode); + + // Placeholder text + EditorGUI.LabelField(position, new GUIContent(m_unicodeHexLabel, "The Unicode (Hex) ID of the duplicated Character"), TMP_UIStyleManager.label); + + // Only filter the input when the destination glyph ID text field has focus. + if (GUI.GetNameOfFocusedControl() == "CharacterID_Input") + { + m_unicodeHexLabel = string.Empty; + + //Filter out unwanted characters. + char chr = Event.current.character; + if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F')) + { + Event.current.character = '\0'; + } + } + else + { + m_unicodeHexLabel = k_placeholderUnicodeHex; + //m_dstUnicode = string.Empty; + } + + + // Remove Glyph + position.x += btnWidth; + if (GUI.Button(position, "Remove")) + { + GUIUtility.keyboardControl = 0; + + RemoveCharacterFromList(elementIndex); + + isAssetDirty = true; + m_SelectedCharacterRecord = -1; + m_isSearchDirty = true; + break; + } + + if (m_AddCharacterWarning.isEnabled && EditorApplication.timeSinceStartup < m_AddCharacterWarning.expirationTime) + { + EditorGUILayout.HelpBox("The Destination Character ID already exists", MessageType.Warning); + } + + } + } + } + + DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage); + + EditorGUILayout.Space(); + } + #endregion + + // GLYPH TABLE + #region Glyph Table + EditorGUIUtility.labelWidth = labelWidth; + EditorGUIUtility.fieldWidth = fieldWidth; + EditorGUI.indentLevel = 0; + rect = EditorGUILayout.GetControlRect(false, 24); + + GUIStyle glyphPanelStyle = new GUIStyle(EditorStyles.helpBox); + + if (GUI.Button(rect, new GUIContent("Glyph Table", "List of glyphs contained in this font asset."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.glyphTablePanel = !UI_PanelState.glyphTablePanel; + + GUI.Label(rect, (UI_PanelState.glyphTablePanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.glyphTablePanel) + { + int arraySize = m_GlyphTable_prop.arraySize; + int itemsPerPage = 15; + + // Display Glyph Management Tools + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + // Search Bar implementation + #region DISPLAY SEARCH BAR + EditorGUILayout.BeginHorizontal(); + { + EditorGUIUtility.labelWidth = 130f; + EditorGUI.BeginChangeCheck(); + string searchPattern = EditorGUILayout.TextField("Glyph Search", m_GlyphSearchPattern, "SearchTextField"); + if (EditorGUI.EndChangeCheck() || m_isSearchDirty) + { + if (string.IsNullOrEmpty(searchPattern) == false) + { + m_GlyphSearchPattern = searchPattern; + + // Search Glyph Table for potential matches + SearchGlyphTable(m_GlyphSearchPattern, ref m_GlyphSearchList); + } + else + m_GlyphSearchPattern = null; + + m_isSearchDirty = false; + } + + string styleName = string.IsNullOrEmpty(m_GlyphSearchPattern) ? "SearchCancelButtonEmpty" : "SearchCancelButton"; + if (GUILayout.Button(GUIContent.none, styleName)) + { + GUIUtility.keyboardControl = 0; + m_GlyphSearchPattern = string.Empty; + } + } + EditorGUILayout.EndHorizontal(); + #endregion + + // Display Page Navigation + if (!string.IsNullOrEmpty(m_GlyphSearchPattern)) + arraySize = m_GlyphSearchList.Count; + + DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage); + } + EditorGUILayout.EndVertical(); + + // Display Glyph Table Elements + + if (arraySize > 0) + { + // Display each GlyphInfo entry using the GlyphInfo property drawer. + for (int i = itemsPerPage * m_CurrentGlyphPage; i < arraySize && i < itemsPerPage * (m_CurrentGlyphPage + 1); i++) + { + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + int elementIndex = i; + if (!string.IsNullOrEmpty(m_GlyphSearchPattern)) + elementIndex = m_GlyphSearchList[i]; + + SerializedProperty glyphProperty = m_GlyphTable_prop.GetArrayElementAtIndex(elementIndex); + + EditorGUILayout.BeginVertical(glyphPanelStyle); + + using (new EditorGUI.DisabledScope(i != m_SelectedGlyphRecord)) + { + EditorGUILayout.PropertyField(glyphProperty); + } + + EditorGUILayout.EndVertical(); + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_SelectedGlyphRecord == i) + m_SelectedGlyphRecord = -1; + else + { + m_SelectedGlyphRecord = i; + m_AddGlyphWarning.isEnabled = false; + m_unicodeHexLabel = k_placeholderUnicodeHex; + GUIUtility.keyboardControl = 0; + } + } + + // Draw Selection Highlight and Glyph Options + if (m_SelectedGlyphRecord == i) + { + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + + // Draw Glyph management options + Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f); + float optionAreaWidth = controlRect.width * 0.6f; + float btnWidth = optionAreaWidth / 3; + + Rect position = new Rect(controlRect.x + controlRect.width * .4f, controlRect.y, btnWidth, controlRect.height); + + // Copy Selected Glyph to Target Glyph ID + GUI.enabled = !string.IsNullOrEmpty(m_dstGlyphID); + if (GUI.Button(position, new GUIContent("Copy to"))) + { + GUIUtility.keyboardControl = 0; + + // Convert Hex Value to Decimal + int.TryParse(m_dstGlyphID, out int dstGlyphID); + + //Add new glyph at target Unicode hex id. + if (!AddNewGlyph(elementIndex, dstGlyphID)) + { + m_AddGlyphWarning.isEnabled = true; + m_AddGlyphWarning.expirationTime = EditorApplication.timeSinceStartup + 1; + } + + m_dstGlyphID = string.Empty; + m_isSearchDirty = true; + + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, m_fontAsset); + } + + // Target Glyph ID + GUI.enabled = true; + position.x += btnWidth; + + GUI.SetNextControlName("GlyphID_Input"); + m_dstGlyphID = EditorGUI.TextField(position, m_dstGlyphID); + + // Placeholder text + EditorGUI.LabelField(position, new GUIContent(m_GlyphIDLabel, "The Glyph ID of the duplicated Glyph"), TMP_UIStyleManager.label); + + // Only filter the input when the destination glyph ID text field has focus. + if (GUI.GetNameOfFocusedControl() == "GlyphID_Input") + { + m_GlyphIDLabel = string.Empty; + + //Filter out unwanted characters. + char chr = Event.current.character; + if ((chr < '0' || chr > '9')) + { + Event.current.character = '\0'; + } + } + else + { + m_GlyphIDLabel = k_placeholderGlyphID; + //m_dstGlyphID = string.Empty; + } + + // Remove Glyph + position.x += btnWidth; + if (GUI.Button(position, "Remove")) + { + GUIUtility.keyboardControl = 0; + + RemoveGlyphFromList(elementIndex); + + isAssetDirty = true; + m_SelectedGlyphRecord = -1; + m_isSearchDirty = true; + break; + } + + if (m_AddGlyphWarning.isEnabled && EditorApplication.timeSinceStartup < m_AddGlyphWarning.expirationTime) + { + EditorGUILayout.HelpBox("The Destination Glyph ID already exists", MessageType.Warning); + } + + } + } + } + + DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage); + + EditorGUILayout.Space(); + } + #endregion + + // FONT FEATURE TABLE + #region Font Feature Table + EditorGUIUtility.labelWidth = labelWidth; + EditorGUIUtility.fieldWidth = fieldWidth; + EditorGUI.indentLevel = 0; + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Glyph Adjustment Table", "List of glyph adjustment / advanced kerning pairs."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.fontFeatureTablePanel = !UI_PanelState.fontFeatureTablePanel; + + GUI.Label(rect, (UI_PanelState.fontFeatureTablePanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.fontFeatureTablePanel) + { + int arraySize = m_GlyphPairAdjustmentRecords_prop.arraySize; + int itemsPerPage = 20; + + // Display Kerning Pair Management Tools + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + // Search Bar implementation + #region DISPLAY SEARCH BAR + EditorGUILayout.BeginHorizontal(); + { + EditorGUIUtility.labelWidth = 150f; + EditorGUI.BeginChangeCheck(); + string searchPattern = EditorGUILayout.TextField("Adjustment Pair Search", m_KerningTableSearchPattern, "SearchTextField"); + if (EditorGUI.EndChangeCheck() || m_isSearchDirty) + { + if (string.IsNullOrEmpty(searchPattern) == false) + { + m_KerningTableSearchPattern = searchPattern; + + // Search Glyph Table for potential matches + SearchKerningTable(m_KerningTableSearchPattern, ref m_KerningTableSearchList); + } + else + m_KerningTableSearchPattern = null; + + m_isSearchDirty = false; + } + + string styleName = string.IsNullOrEmpty(m_KerningTableSearchPattern) ? "SearchCancelButtonEmpty" : "SearchCancelButton"; + if (GUILayout.Button(GUIContent.none, styleName)) + { + GUIUtility.keyboardControl = 0; + m_KerningTableSearchPattern = string.Empty; + } + } + EditorGUILayout.EndHorizontal(); + #endregion + + // Display Page Navigation + if (!string.IsNullOrEmpty(m_KerningTableSearchPattern)) + arraySize = m_KerningTableSearchList.Count; + + DisplayPageNavigation(ref m_CurrentKerningPage, arraySize, itemsPerPage); + } + EditorGUILayout.EndVertical(); + + if (arraySize > 0) + { + // Display each GlyphInfo entry using the GlyphInfo property drawer. + for (int i = itemsPerPage * m_CurrentKerningPage; i < arraySize && i < itemsPerPage * (m_CurrentKerningPage + 1); i++) + { + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + int elementIndex = i; + if (!string.IsNullOrEmpty(m_KerningTableSearchPattern)) + elementIndex = m_KerningTableSearchList[i]; + + SerializedProperty pairAdjustmentRecordProperty = m_GlyphPairAdjustmentRecords_prop.GetArrayElementAtIndex(elementIndex); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + using (new EditorGUI.DisabledScope(i != m_SelectedAdjustmentRecord)) + { + EditorGUILayout.PropertyField(pairAdjustmentRecordProperty, new GUIContent("Selectable")); + } + + EditorGUILayout.EndVertical(); + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_SelectedAdjustmentRecord == i) + { + m_SelectedAdjustmentRecord = -1; + } + else + { + m_SelectedAdjustmentRecord = i; + GUIUtility.keyboardControl = 0; + } + } + + // Draw Selection Highlight and Kerning Pair Options + if (m_SelectedAdjustmentRecord == i) + { + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + + // Draw Glyph management options + Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f); + float optionAreaWidth = controlRect.width; + float btnWidth = optionAreaWidth / 4; + + Rect position = new Rect(controlRect.x + controlRect.width - btnWidth, controlRect.y, btnWidth, controlRect.height); + + // Remove Kerning pair + GUI.enabled = true; + if (GUI.Button(position, "Remove")) + { + GUIUtility.keyboardControl = 0; + + RemoveAdjustmentPairFromList(i); + + isAssetDirty = true; + m_SelectedAdjustmentRecord = -1; + m_isSearchDirty = true; + break; + } + } + } + } + + DisplayPageNavigation(ref m_CurrentKerningPage, arraySize, itemsPerPage); + + GUILayout.Space(5); + + // Add new kerning pair + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + EditorGUILayout.PropertyField(m_EmptyGlyphPairAdjustmentRecord_prop); + } + EditorGUILayout.EndVertical(); + + if (GUILayout.Button("Add New Glyph Adjustment Record")) + { + SerializedProperty firstAdjustmentRecordProperty = m_EmptyGlyphPairAdjustmentRecord_prop.FindPropertyRelative("m_FirstAdjustmentRecord"); + SerializedProperty secondAdjustmentRecordProperty = m_EmptyGlyphPairAdjustmentRecord_prop.FindPropertyRelative("m_SecondAdjustmentRecord"); + + uint firstGlyphIndex = (uint)firstAdjustmentRecordProperty.FindPropertyRelative("m_GlyphIndex").intValue; + uint secondGlyphIndex = (uint)secondAdjustmentRecordProperty.FindPropertyRelative("m_GlyphIndex").intValue; + + TMP_GlyphValueRecord firstValueRecord = GetValueRecord(firstAdjustmentRecordProperty.FindPropertyRelative("m_GlyphValueRecord")); + TMP_GlyphValueRecord secondValueRecord = GetValueRecord(secondAdjustmentRecordProperty.FindPropertyRelative("m_GlyphValueRecord")); + + errorCode = -1; + long pairKey = (long)secondGlyphIndex << 32 | firstGlyphIndex; + if (m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.ContainsKey(pairKey) == false) + { + TMP_GlyphPairAdjustmentRecord adjustmentRecord = new TMP_GlyphPairAdjustmentRecord(new TMP_GlyphAdjustmentRecord(firstGlyphIndex, firstValueRecord), new TMP_GlyphAdjustmentRecord(secondGlyphIndex, secondValueRecord)); + m_FontFeatureTable.m_GlyphPairAdjustmentRecords.Add(adjustmentRecord); + m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.Add(pairKey, adjustmentRecord); + errorCode = 0; + } + + // Add glyphs and characters + uint firstCharacter = m_SerializedPropertyHolder.firstCharacter; + if (!m_fontAsset.characterLookupTable.ContainsKey(firstCharacter)) + m_fontAsset.TryAddCharacterInternal(firstCharacter, out TMP_Character character); + + uint secondCharacter = m_SerializedPropertyHolder.secondCharacter; + if (!m_fontAsset.characterLookupTable.ContainsKey(secondCharacter)) + m_fontAsset.TryAddCharacterInternal(secondCharacter, out TMP_Character character); + + // Sort Kerning Pairs & Reload Font Asset if new kerning pair was added. + if (errorCode != -1) + { + m_FontFeatureTable.SortGlyphPairAdjustmentRecords(); + serializedObject.ApplyModifiedProperties(); + isAssetDirty = true; + m_isSearchDirty = true; + } + else + { + timeStamp = System.DateTime.Now.AddSeconds(5); + } + + // Clear Add Kerning Pair Panel + // TODO + } + + if (errorCode == -1) + { + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.Label("Kerning Pair already exists!", TMP_UIStyleManager.label); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + if (System.DateTime.Now > timeStamp) + errorCode = 0; + } + } + #endregion + + if (serializedObject.ApplyModifiedProperties() || evt_cmd == k_UndoRedo || isAssetDirty) + { + // Delay callback until user has decided to Apply or Revert the changes. + if (m_DisplayDestructiveChangeWarning == false) + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, m_fontAsset); + + if (m_fontAsset.m_IsFontAssetLookupTablesDirty || evt_cmd == k_UndoRedo) + m_fontAsset.ReadFontAssetDefinition(); + + isAssetDirty = false; + EditorUtility.SetDirty(target); + } + + + // Clear selection if mouse event was not consumed. + GUI.enabled = true; + if (currentEvent.type == EventType.MouseDown && currentEvent.button == 0) + m_SelectedAdjustmentRecord = -1; + + } + + void CleanFallbackFontAssetTable() + { + SerializedProperty m_FallbackFontAsseTable = serializedObject.FindProperty("m_FallbackFontAssetTable"); + + bool isListDirty = false; + + int elementCount = m_FallbackFontAsseTable.arraySize; + + for (int i = 0; i < elementCount; i++) + { + SerializedProperty element = m_FallbackFontAsseTable.GetArrayElementAtIndex(i); + if (element.objectReferenceValue == null) + { + m_FallbackFontAsseTable.DeleteArrayElementAtIndex(i); + elementCount -= 1; + i -= 1; + + isListDirty = true; + } + } + + if (isListDirty) + { + serializedObject.ApplyModifiedProperties(); + serializedObject.Update(); + } + } + + void SavedAtlasGenerationSettings() + { + m_AtlasSettings.glyphRenderMode = (GlyphRenderMode)m_AtlasRenderMode_prop.intValue; + m_AtlasSettings.pointSize = m_SamplingPointSize_prop.intValue; + m_AtlasSettings.padding = m_AtlasPadding_prop.intValue; + m_AtlasSettings.atlasWidth = m_AtlasWidth_prop.intValue; + m_AtlasSettings.atlasHeight = m_AtlasHeight_prop.intValue; + } + + void RestoreAtlasGenerationSettings() + { + m_AtlasRenderMode_prop.intValue = (int)m_AtlasSettings.glyphRenderMode; + m_SamplingPointSize_prop.intValue = m_AtlasSettings.pointSize; + m_AtlasPadding_prop.intValue = m_AtlasSettings.padding; + m_AtlasWidth_prop.intValue = m_AtlasSettings.atlasWidth; + m_AtlasHeight_prop.intValue = m_AtlasSettings.atlasHeight; + } + + + void UpdateFontAssetCreationSettings() + { + m_fontAsset.m_CreationSettings.pointSize = m_SamplingPointSize_prop.intValue; + m_fontAsset.m_CreationSettings.renderMode = m_AtlasRenderMode_prop.intValue; + m_fontAsset.m_CreationSettings.padding = m_AtlasPadding_prop.intValue; + m_fontAsset.m_CreationSettings.atlasWidth = m_AtlasWidth_prop.intValue; + m_fontAsset.m_CreationSettings.atlasHeight = m_AtlasHeight_prop.intValue; + } + + + void UpdateCharacterData(SerializedProperty property, int index) + { + TMP_Character character = m_fontAsset.characterTable[index]; + + character.unicode = (uint)property.FindPropertyRelative("m_Unicode").intValue; + character.scale = property.FindPropertyRelative("m_Scale").floatValue; + + SerializedProperty glyphProperty = property.FindPropertyRelative("m_Glyph"); + character.glyph.index = (uint)glyphProperty.FindPropertyRelative("m_Index").intValue; + + SerializedProperty glyphRectProperty = glyphProperty.FindPropertyRelative("m_GlyphRect"); + character.glyph.glyphRect = new GlyphRect(glyphRectProperty.FindPropertyRelative("m_X").intValue, glyphRectProperty.FindPropertyRelative("m_Y").intValue, glyphRectProperty.FindPropertyRelative("m_Width").intValue, glyphRectProperty.FindPropertyRelative("m_Height").intValue); + + SerializedProperty glyphMetricsProperty = glyphProperty.FindPropertyRelative("m_Metrics"); + character.glyph.metrics = new GlyphMetrics(glyphMetricsProperty.FindPropertyRelative("m_Width").floatValue, glyphMetricsProperty.FindPropertyRelative("m_Height").floatValue, glyphMetricsProperty.FindPropertyRelative("m_HorizontalBearingX").floatValue, glyphMetricsProperty.FindPropertyRelative("m_HorizontalBearingY").floatValue, glyphMetricsProperty.FindPropertyRelative("m_HorizontalAdvance").floatValue); + + character.glyph.scale = glyphProperty.FindPropertyRelative("m_Scale").floatValue; + + character.glyph.atlasIndex = glyphProperty.FindPropertyRelative("m_AtlasIndex").intValue; + } + + + void UpdateGlyphData(SerializedProperty property, int index) + { + Glyph glyph = m_fontAsset.glyphTable[index]; + + glyph.index = (uint)property.FindPropertyRelative("m_Index").intValue; + + SerializedProperty glyphRect = property.FindPropertyRelative("m_GlyphRect"); + glyph.glyphRect = new GlyphRect(glyphRect.FindPropertyRelative("m_X").intValue, glyphRect.FindPropertyRelative("m_Y").intValue, glyphRect.FindPropertyRelative("m_Width").intValue, glyphRect.FindPropertyRelative("m_Height").intValue); + + SerializedProperty glyphMetrics = property.FindPropertyRelative("m_Metrics"); + glyph.metrics = new GlyphMetrics(glyphMetrics.FindPropertyRelative("m_Width").floatValue, glyphMetrics.FindPropertyRelative("m_Height").floatValue, glyphMetrics.FindPropertyRelative("m_HorizontalBearingX").floatValue, glyphMetrics.FindPropertyRelative("m_HorizontalBearingY").floatValue, glyphMetrics.FindPropertyRelative("m_HorizontalAdvance").floatValue); + + glyph.scale = property.FindPropertyRelative("m_Scale").floatValue; + } + + + void DisplayPageNavigation(ref int currentPage, int arraySize, int itemsPerPage) + { + Rect pagePos = EditorGUILayout.GetControlRect(false, 20); + pagePos.width /= 3; + + int shiftMultiplier = Event.current.shift ? 10 : 1; // Page + Shift goes 10 page forward + + // Previous Page + GUI.enabled = currentPage > 0; + + if (GUI.Button(pagePos, "Previous Page")) + currentPage -= 1 * shiftMultiplier; + + + // Page Counter + GUI.enabled = true; + pagePos.x += pagePos.width; + int totalPages = (int)(arraySize / (float)itemsPerPage + 0.999f); + GUI.Label(pagePos, "Page " + (currentPage + 1) + " / " + totalPages, TMP_UIStyleManager.centeredLabel); + + // Next Page + pagePos.x += pagePos.width; + GUI.enabled = itemsPerPage * (currentPage + 1) < arraySize; + + if (GUI.Button(pagePos, "Next Page")) + currentPage += 1 * shiftMultiplier; + + // Clamp page range + currentPage = Mathf.Clamp(currentPage, 0, arraySize / itemsPerPage); + + GUI.enabled = true; + } + + + /// + /// + /// + /// + /// + bool AddNewGlyph(int srcIndex, int dstGlyphID) + { + // Make sure Destination Glyph ID doesn't already contain a Glyph + if (m_fontAsset.glyphLookupTable.ContainsKey((uint)dstGlyphID)) + return false; + + // Add new element to glyph list. + m_GlyphTable_prop.arraySize += 1; + + // Get a reference to the source glyph. + SerializedProperty sourceGlyph = m_GlyphTable_prop.GetArrayElementAtIndex(srcIndex); + + int dstIndex = m_GlyphTable_prop.arraySize - 1; + + // Get a reference to the target / destination glyph. + SerializedProperty targetGlyph = m_GlyphTable_prop.GetArrayElementAtIndex(dstIndex); + + CopyGlyphSerializedProperty(sourceGlyph, ref targetGlyph); + + // Update the ID of the glyph + targetGlyph.FindPropertyRelative("m_Index").intValue = dstGlyphID; + + serializedObject.ApplyModifiedProperties(); + + m_fontAsset.SortGlyphTable(); + + m_fontAsset.ReadFontAssetDefinition(); + + return true; + } + + /// + /// + /// + /// + void RemoveGlyphFromList(int index) + { + if (index > m_GlyphTable_prop.arraySize) + return; + + int targetGlyphIndex = m_GlyphTable_prop.GetArrayElementAtIndex(index).FindPropertyRelative("m_Index").intValue; + + m_GlyphTable_prop.DeleteArrayElementAtIndex(index); + + // Remove all characters referencing this glyph. + for (int i = 0; i < m_CharacterTable_prop.arraySize; i++) + { + int glyphIndex = m_CharacterTable_prop.GetArrayElementAtIndex(i).FindPropertyRelative("m_GlyphIndex").intValue; + + if (glyphIndex == targetGlyphIndex) + { + // Remove character + m_CharacterTable_prop.DeleteArrayElementAtIndex(i); + } + } + + serializedObject.ApplyModifiedProperties(); + + m_fontAsset.ReadFontAssetDefinition(); + } + + bool AddNewCharacter(int srcIndex, int dstGlyphID) + { + // Make sure Destination Glyph ID doesn't already contain a Glyph + if (m_fontAsset.characterLookupTable.ContainsKey((uint)dstGlyphID)) + return false; + + // Add new element to glyph list. + m_CharacterTable_prop.arraySize += 1; + + // Get a reference to the source glyph. + SerializedProperty sourceCharacter = m_CharacterTable_prop.GetArrayElementAtIndex(srcIndex); + + int dstIndex = m_CharacterTable_prop.arraySize - 1; + + // Get a reference to the target / destination glyph. + SerializedProperty targetCharacter = m_CharacterTable_prop.GetArrayElementAtIndex(dstIndex); + + CopyCharacterSerializedProperty(sourceCharacter, ref targetCharacter); + + // Update the ID of the glyph + targetCharacter.FindPropertyRelative("m_Unicode").intValue = dstGlyphID; + + serializedObject.ApplyModifiedProperties(); + + m_fontAsset.SortCharacterTable(); + + m_fontAsset.ReadFontAssetDefinition(); + + return true; + } + + void RemoveCharacterFromList(int index) + { + if (index > m_CharacterTable_prop.arraySize) + return; + + m_CharacterTable_prop.DeleteArrayElementAtIndex(index); + + serializedObject.ApplyModifiedProperties(); + + m_fontAsset.ReadFontAssetDefinition(); + } + + + // Check if any of the Style elements were clicked on. + private bool DoSelectionCheck(Rect selectionArea) + { + Event currentEvent = Event.current; + + switch (currentEvent.type) + { + case EventType.MouseDown: + if (selectionArea.Contains(currentEvent.mousePosition) && currentEvent.button == 0) + { + currentEvent.Use(); + return true; + } + + break; + } + + return false; + } + + TMP_GlyphValueRecord GetValueRecord(SerializedProperty property) + { + TMP_GlyphValueRecord record = new TMP_GlyphValueRecord(); + record.xPlacement = property.FindPropertyRelative("m_XPlacement").floatValue; + record.yPlacement = property.FindPropertyRelative("m_YPlacement").floatValue; + record.xAdvance = property.FindPropertyRelative("m_XAdvance").floatValue; + record.yAdvance = property.FindPropertyRelative("m_YAdvance").floatValue; + + return record; + } + + void RemoveAdjustmentPairFromList(int index) + { + if (index > m_GlyphPairAdjustmentRecords_prop.arraySize) + return; + + m_GlyphPairAdjustmentRecords_prop.DeleteArrayElementAtIndex(index); + + serializedObject.ApplyModifiedProperties(); + + m_fontAsset.ReadFontAssetDefinition(); + } + + /// + /// + /// + /// + /// + void CopyGlyphSerializedProperty(SerializedProperty srcGlyph, ref SerializedProperty dstGlyph) + { + // TODO : Should make a generic function which copies each of the properties. + dstGlyph.FindPropertyRelative("m_Index").intValue = srcGlyph.FindPropertyRelative("m_Index").intValue; + + // Glyph -> GlyphMetrics + SerializedProperty srcGlyphMetrics = srcGlyph.FindPropertyRelative("m_Metrics"); + SerializedProperty dstGlyphMetrics = dstGlyph.FindPropertyRelative("m_Metrics"); + + dstGlyphMetrics.FindPropertyRelative("m_Width").floatValue = srcGlyphMetrics.FindPropertyRelative("m_Width").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_Height").floatValue = srcGlyphMetrics.FindPropertyRelative("m_Height").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalBearingX").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalBearingX").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalBearingY").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalBearingY").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalAdvance").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalAdvance").floatValue; + + // Glyph -> GlyphRect + SerializedProperty srcGlyphRect = srcGlyph.FindPropertyRelative("m_GlyphRect"); + SerializedProperty dstGlyphRect = dstGlyph.FindPropertyRelative("m_GlyphRect"); + + dstGlyphRect.FindPropertyRelative("m_X").intValue = srcGlyphRect.FindPropertyRelative("m_X").intValue; + dstGlyphRect.FindPropertyRelative("m_Y").intValue = srcGlyphRect.FindPropertyRelative("m_Y").intValue; + dstGlyphRect.FindPropertyRelative("m_Width").intValue = srcGlyphRect.FindPropertyRelative("m_Width").intValue; + dstGlyphRect.FindPropertyRelative("m_Height").intValue = srcGlyphRect.FindPropertyRelative("m_Height").intValue; + + dstGlyph.FindPropertyRelative("m_Scale").floatValue = srcGlyph.FindPropertyRelative("m_Scale").floatValue; + dstGlyph.FindPropertyRelative("m_AtlasIndex").intValue = srcGlyph.FindPropertyRelative("m_AtlasIndex").intValue; + } + + + void CopyCharacterSerializedProperty(SerializedProperty source, ref SerializedProperty target) + { + // TODO : Should make a generic function which copies each of the properties. + int unicode = source.FindPropertyRelative("m_Unicode").intValue; + target.FindPropertyRelative("m_Unicode").intValue = unicode; + + int srcGlyphIndex = source.FindPropertyRelative("m_GlyphIndex").intValue; + target.FindPropertyRelative("m_GlyphIndex").intValue = srcGlyphIndex; + + target.FindPropertyRelative("m_Scale").floatValue = source.FindPropertyRelative("m_Scale").floatValue; + } + + + /// + /// + /// + /// + /// + void SearchGlyphTable (string searchPattern, ref List searchResults) + { + if (searchResults == null) searchResults = new List(); + + searchResults.Clear(); + + int arraySize = m_GlyphTable_prop.arraySize; + + for (int i = 0; i < arraySize; i++) + { + SerializedProperty sourceGlyph = m_GlyphTable_prop.GetArrayElementAtIndex(i); + + int id = sourceGlyph.FindPropertyRelative("m_Index").intValue; + + // Check for potential match against a character. + //if (searchPattern.Length == 1 && id == searchPattern[0]) + // searchResults.Add(i); + + // Check for potential match against decimal id + if (id.ToString().Contains(searchPattern)) + searchResults.Add(i); + + //if (id.ToString("x").Contains(searchPattern)) + // searchResults.Add(i); + + //if (id.ToString("X").Contains(searchPattern)) + // searchResults.Add(i); + } + } + + + void SearchCharacterTable(string searchPattern, ref List searchResults) + { + if (searchResults == null) searchResults = new List(); + + searchResults.Clear(); + + int arraySize = m_CharacterTable_prop.arraySize; + + for (int i = 0; i < arraySize; i++) + { + SerializedProperty sourceCharacter = m_CharacterTable_prop.GetArrayElementAtIndex(i); + + int id = sourceCharacter.FindPropertyRelative("m_Unicode").intValue; + + // Check for potential match against a character. + if (searchPattern.Length == 1 && id == searchPattern[0]) + searchResults.Add(i); + else if (id.ToString("x").Contains(searchPattern)) + searchResults.Add(i); + else if (id.ToString("X").Contains(searchPattern)) + searchResults.Add(i); + + // Check for potential match against decimal id + //if (id.ToString().Contains(searchPattern)) + // searchResults.Add(i); + } + } + + + void SearchKerningTable(string searchPattern, ref List searchResults) + { + if (searchResults == null) searchResults = new List(); + + searchResults.Clear(); + + // Lookup glyph index of potential characters contained in the search pattern. + uint firstGlyphIndex = 0; + if (searchPattern.Length > 0 && m_fontAsset.characterLookupTable.TryGetValue(searchPattern[0], out TMP_Character firstCharacterSearch)) + firstGlyphIndex = firstCharacterSearch.glyphIndex; + + uint secondGlyphIndex = 0; + if (searchPattern.Length > 1 && m_fontAsset.characterLookupTable.TryGetValue(searchPattern[1], out TMP_Character secondCharacterSearch)) + secondGlyphIndex = secondCharacterSearch.glyphIndex; + + int arraySize = m_GlyphPairAdjustmentRecords_prop.arraySize; + + for (int i = 0; i < arraySize; i++) + { + SerializedProperty record = m_GlyphPairAdjustmentRecords_prop.GetArrayElementAtIndex(i); + + SerializedProperty firstAdjustmentRecord = record.FindPropertyRelative("m_FirstAdjustmentRecord"); + SerializedProperty secondAdjustmentRecord = record.FindPropertyRelative("m_SecondAdjustmentRecord"); + + int firstGlyph = firstAdjustmentRecord.FindPropertyRelative("m_GlyphIndex").intValue; + int secondGlyph = secondAdjustmentRecord.FindPropertyRelative("m_GlyphIndex").intValue; + + if (firstGlyphIndex == firstGlyph && secondGlyphIndex == secondGlyph) + searchResults.Add(i); + else if (searchPattern.Length == 1 && (firstGlyphIndex == firstGlyph || firstGlyphIndex == secondGlyph)) + searchResults.Add(i); + else if (firstGlyph.ToString().Contains(searchPattern)) + searchResults.Add(i); + else if (secondGlyph.ToString().Contains(searchPattern)) + searchResults.Add(i); + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAssetEditor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAssetEditor.cs.meta new file mode 100644 index 0000000..9b26bae --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAssetEditor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 96b44f7d98314b139324a8a87eb66067 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs new file mode 100644 index 0000000..1e43233 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs @@ -0,0 +1,190 @@ +using UnityEngine; +using UnityEditor; +using System.Linq; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; +using TMPro; + + +namespace TMPro +{ + public static class TMP_FontAsset_CreationMenu + { + /* + [MenuItem("Assets/Create/TextMeshPro/Font Asset Fallback", false, 105)] + public static void CreateFallbackFontAsset() + { + Object target = Selection.activeObject; + + // Make sure the selection is a font file + if (target == null || target.GetType() != typeof(TMP_FontAsset)) + { + Debug.LogWarning("A Font file must first be selected in order to create a Font Asset."); + return; + } + + TMP_FontAsset sourceFontAsset = (TMP_FontAsset)target; + + string sourceFontFilePath = AssetDatabase.GetAssetPath(target); + + string folderPath = Path.GetDirectoryName(sourceFontFilePath); + string assetName = Path.GetFileNameWithoutExtension(sourceFontFilePath); + + string newAssetFilePathWithName = AssetDatabase.GenerateUniqueAssetPath(folderPath + "/" + assetName + " - Fallback.asset"); + + //// Create new TM Font Asset. + TMP_FontAsset fontAsset = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(fontAsset, newAssetFilePathWithName); + + fontAsset.version = "1.1.0"; + + fontAsset.faceInfo = sourceFontAsset.faceInfo; + + fontAsset.m_SourceFontFileGUID = sourceFontAsset.m_SourceFontFileGUID; + fontAsset.m_SourceFontFile_EditorRef = sourceFontAsset.m_SourceFontFile_EditorRef; + fontAsset.atlasPopulationMode = TMP_FontAsset.AtlasPopulationMode.Dynamic; + + int atlasWidth = fontAsset.atlasWidth = sourceFontAsset.atlasWidth; + int atlasHeight = fontAsset.atlasHeight = sourceFontAsset.atlasHeight; + int atlasPadding = fontAsset.atlasPadding = sourceFontAsset.atlasPadding; + fontAsset.atlasRenderMode = sourceFontAsset.atlasRenderMode; + + // Initialize array for the font atlas textures. + fontAsset.atlasTextures = new Texture2D[1]; + + // Create and add font atlas texture + Texture2D texture = new Texture2D(atlasWidth, atlasHeight, TextureFormat.Alpha8, false); + Color32[] colors = new Color32[atlasWidth * atlasHeight]; + texture.SetPixels32(colors); + + texture.name = assetName + " Atlas"; + fontAsset.atlasTextures[0] = texture; + AssetDatabase.AddObjectToAsset(texture, fontAsset); + + // Add free rectangle of the size of the texture. + int packingModifier = ((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1; + fontAsset.m_FreeGlyphRects = new List() { new GlyphRect(0, 0, atlasWidth - packingModifier, atlasHeight - packingModifier) }; + fontAsset.m_UsedGlyphRects = new List(); + + // Create new Material and Add it as Sub-Asset + Material tmp_material = new Material(sourceFontAsset.material); + + tmp_material.name = texture.name + " Material"; + tmp_material.SetTexture(ShaderUtilities.ID_MainTex, texture); + tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, atlasWidth); + tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, atlasHeight); + + tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, atlasPadding + packingModifier); + + tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle); + tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle); + + fontAsset.material = tmp_material; + + AssetDatabase.AddObjectToAsset(tmp_material, fontAsset); + + // Add Font Asset Creation Settings + // TODO + + // Not sure if this is still necessary in newer versions of Unity. + EditorUtility.SetDirty(fontAsset); + + AssetDatabase.SaveAssets(); + } + */ + + //[MenuItem("Assets/Create/TextMeshPro/Font Asset #%F12", true)] + //public static bool CreateFontAssetMenuValidation() + //{ + // return false; + //} + + [MenuItem("Assets/Create/TextMeshPro/Font Asset #%F12", false, 100)] + public static void CreateFontAsset() + { + Object target = Selection.activeObject; + + // Make sure the selection is a font file + if (target == null || target.GetType() != typeof(Font)) + { + Debug.LogWarning("A Font file must first be selected in order to create a Font Asset."); + return; + } + + Font sourceFont = (Font)target; + + string sourceFontFilePath = AssetDatabase.GetAssetPath(target); + + string folderPath = Path.GetDirectoryName(sourceFontFilePath); + string assetName = Path.GetFileNameWithoutExtension(sourceFontFilePath); + + string newAssetFilePathWithName = AssetDatabase.GenerateUniqueAssetPath(folderPath + "/" + assetName + " SDF.asset"); + + //// Create new TM Font Asset. + TMP_FontAsset fontAsset = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(fontAsset, newAssetFilePathWithName); + + fontAsset.version = "1.1.0"; + + // Set face information + FontEngine.InitializeFontEngine(); + FontEngine.LoadFontFace(sourceFont, 90); + fontAsset.faceInfo = FontEngine.GetFaceInfo(); + + // Set font reference and GUID + fontAsset.m_SourceFontFileGUID = AssetDatabase.AssetPathToGUID(sourceFontFilePath); + fontAsset.m_SourceFontFile_EditorRef = sourceFont; + fontAsset.atlasPopulationMode = AtlasPopulationMode.Dynamic; + + // Default atlas resolution is 1024 x 1024. + int atlasWidth = fontAsset.atlasWidth = 1024; + int atlasHeight = fontAsset.atlasHeight = 1024; + int atlasPadding = fontAsset.atlasPadding = 9; + fontAsset.atlasRenderMode = GlyphRenderMode.SDFAA; + + // Initialize array for the font atlas textures. + fontAsset.atlasTextures = new Texture2D[1]; + + // Create atlas texture of size zero. + Texture2D texture = new Texture2D(0, 0, TextureFormat.Alpha8, false); + + texture.name = assetName + " Atlas"; + fontAsset.atlasTextures[0] = texture; + AssetDatabase.AddObjectToAsset(texture, fontAsset); + + // Add free rectangle of the size of the texture. + int packingModifier = ((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1; + fontAsset.freeGlyphRects = new List() { new GlyphRect(0, 0, atlasWidth - packingModifier, atlasHeight - packingModifier) }; + fontAsset.usedGlyphRects = new List(); + + // Create new Material and Add it as Sub-Asset + Shader default_Shader = Shader.Find("TextMeshPro/Distance Field"); + Material tmp_material = new Material(default_Shader); + + tmp_material.name = texture.name + " Material"; + tmp_material.SetTexture(ShaderUtilities.ID_MainTex, texture); + tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, atlasWidth); + tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, atlasHeight); + + tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, atlasPadding + packingModifier); + + tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle); + tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle); + + fontAsset.material = tmp_material; + + AssetDatabase.AddObjectToAsset(tmp_material, fontAsset); + + // Add Font Asset Creation Settings + fontAsset.creationSettings = new FontAssetCreationSettings(fontAsset.m_SourceFontFileGUID, fontAsset.faceInfo.pointSize, 0, atlasPadding, 0, 1024, 1024, 7, string.Empty, (int)GlyphRenderMode.SDFAA); + + // Not sure if this is still necessary in newer versions of Unity. + EditorUtility.SetDirty(fontAsset); + + AssetDatabase.SaveAssets(); + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs.meta new file mode 100644 index 0000000..57a3fce --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7496af95dfe67cf429ac65edaaf99106 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs new file mode 100644 index 0000000..77268ba --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs @@ -0,0 +1,382 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; +using UnityEditor; +using System.Collections; +using System.Text.RegularExpressions; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_GlyphPairAdjustmentRecord))] + public class TMP_GlyphPairAdjustmentRecordPropertyDrawer : PropertyDrawer + { + private bool isEditingEnabled = false; + private bool isSelectable = false; + + private string m_FirstCharacter = string.Empty; + private string m_SecondCharacter = string.Empty; + private string m_PreviousInput; + + static GUIContent s_CharacterTextFieldLabel = new GUIContent("Char:", "Enter the character or its UTF16 or UTF32 Unicode character escape sequence. For UTF16 use \"\\uFF00\" and for UTF32 use \"\\UFF00FF00\" representation."); + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_FirstAdjustmentRecord = property.FindPropertyRelative("m_FirstAdjustmentRecord"); + SerializedProperty prop_SecondAdjustmentRecord = property.FindPropertyRelative("m_SecondAdjustmentRecord"); + + SerializedProperty prop_FirstGlyphIndex = prop_FirstAdjustmentRecord.FindPropertyRelative("m_GlyphIndex"); + SerializedProperty prop_FirstGlyphValueRecord = prop_FirstAdjustmentRecord.FindPropertyRelative("m_GlyphValueRecord"); + + SerializedProperty prop_SecondGlyphIndex = prop_SecondAdjustmentRecord.FindPropertyRelative("m_GlyphIndex"); + SerializedProperty prop_SecondGlyphValueRecord = prop_SecondAdjustmentRecord.FindPropertyRelative("m_GlyphValueRecord"); + + SerializedProperty prop_FontFeatureLookupFlags = property.FindPropertyRelative("m_FeatureLookupFlags"); + + position.yMin += 2; + + float width = position.width / 2; + float padding = 5.0f; + + Rect rect; + + isEditingEnabled = GUI.enabled; + isSelectable = label.text == "Selectable" ? true : false; + + if (isSelectable) + GUILayoutUtility.GetRect(position.width, 75); + else + GUILayoutUtility.GetRect(position.width, 55); + + GUIStyle style = new GUIStyle(EditorStyles.label); + style.richText = true; + + // First Glyph + GUI.enabled = isEditingEnabled; + if (isSelectable) + { + rect = new Rect(position.x + 70, position.y, position.width, 49); + + float labelWidth = GUI.skin.label.CalcSize(new GUIContent("ID: " + prop_FirstGlyphIndex.intValue)).x; + EditorGUI.LabelField(new Rect(position.x + (64 - labelWidth) / 2, position.y + 60, 64f, 18f), new GUIContent("ID: " + prop_FirstGlyphIndex.intValue + ""), style); + + GUI.enabled = isEditingEnabled; + EditorGUIUtility.labelWidth = 30f; + + rect = new Rect(position.x + 70, position.y + 10, (width - 70) - padding, 18); + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_XPlacement"), new GUIContent("OX:")); + + rect.y += 20; + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_YPlacement"), new GUIContent("OY:")); + + rect.y += 20; + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_XAdvance"), new GUIContent("AX:")); + + //rect.y += 20; + //EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_YAdvance"), new GUIContent("AY:")); + + DrawGlyph((uint)prop_FirstGlyphIndex.intValue, new Rect(position.x, position.y, position.width, position.height), property); + } + else + { + rect = new Rect(position.x, position.y, width / 2 * 0.8f - padding, 18); + EditorGUIUtility.labelWidth = 40f; + + // First Character Lookup + GUI.SetNextControlName("FirstCharacterField"); + EditorGUI.BeginChangeCheck(); + string firstCharacter = EditorGUI.TextField(rect, s_CharacterTextFieldLabel, m_FirstCharacter); + + if (GUI.GetNameOfFocusedControl() == "FirstCharacterField") + { + if (ValidateInput(firstCharacter)) + { + //Debug.Log("1st Unicode value: [" + firstCharacter + "]"); + + uint unicode = GetUnicodeCharacter(firstCharacter); + + // Lookup glyph index + TMP_SerializedPropertyHolder propertyHolder = property.serializedObject.targetObject as TMP_SerializedPropertyHolder; + TMP_FontAsset fontAsset = propertyHolder.fontAsset; + if (fontAsset != null) + { + prop_FirstGlyphIndex.intValue = (int)fontAsset.GetGlyphIndex(unicode); + propertyHolder.firstCharacter = unicode; + } + } + } + + if (EditorGUI.EndChangeCheck()) + m_FirstCharacter = firstCharacter; + + // First Glyph Index + rect.x += width / 2 * 0.8f; + + EditorGUIUtility.labelWidth = 25f; + EditorGUI.BeginChangeCheck(); + EditorGUI.PropertyField(rect, prop_FirstGlyphIndex, new GUIContent("ID:")); + if (EditorGUI.EndChangeCheck()) + { + + } + + GUI.enabled = isEditingEnabled; + EditorGUIUtility.labelWidth = 25f; + + rect = new Rect(position.x, position.y + 20, width * 0.5f - padding, 18); + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_XPlacement"), new GUIContent("OX")); + + rect.x += width * 0.5f; + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_YPlacement"), new GUIContent("OY")); + + rect.x = position.x; + rect.y += 20; + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_XAdvance"), new GUIContent("AX")); + + //rect.x += width * 0.5f; + //EditorGUI.PropertyField(rect, prop_FirstGlyphAdjustment.FindPropertyRelative("m_YAdvance"), new GUIContent("AY")); + + } + + + // Second Glyph + GUI.enabled = isEditingEnabled; + if (isSelectable) + { + float labelWidth = GUI.skin.label.CalcSize(new GUIContent("ID: " + prop_SecondGlyphIndex.intValue)).x; + EditorGUI.LabelField(new Rect(position.width / 2 + 20 + (64 - labelWidth) / 2, position.y + 60, 64f, 18f), new GUIContent("ID: " + prop_SecondGlyphIndex.intValue + ""), style); + + GUI.enabled = isEditingEnabled; + EditorGUIUtility.labelWidth = 30f; + + rect = new Rect(position.width / 2 + 20 + 70, position.y + 10, (width - 70) - padding, 18); + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_XPlacement"), new GUIContent("OX:")); + + rect.y += 20; + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_YPlacement"), new GUIContent("OY:")); + + rect.y += 20; + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_XAdvance"), new GUIContent("AX:")); + + //rect.y += 20; + //EditorGUI.PropertyField(rect, prop_SecondGlyphAdjustment.FindPropertyRelative("m_YAdvance"), new GUIContent("AY")); + + DrawGlyph((uint)prop_SecondGlyphIndex.intValue, new Rect(position.width / 2 + 20, position.y, position.width, position.height), property); + } + else + { + rect = new Rect(position.width / 2 + 20, position.y, width / 2 * 0.8f - padding, 18); + EditorGUIUtility.labelWidth = 40f; + + // Second Character Lookup + GUI.SetNextControlName("SecondCharacterField"); + EditorGUI.BeginChangeCheck(); + string secondCharacter = EditorGUI.TextField(rect, s_CharacterTextFieldLabel, m_SecondCharacter); + + if (GUI.GetNameOfFocusedControl() == "SecondCharacterField") + { + if (ValidateInput(secondCharacter)) + { + //Debug.Log("2nd Unicode value: [" + secondCharacter + "]"); + + uint unicode = GetUnicodeCharacter(secondCharacter); + + // Lookup glyph index + TMP_SerializedPropertyHolder propertyHolder = property.serializedObject.targetObject as TMP_SerializedPropertyHolder; + TMP_FontAsset fontAsset = propertyHolder.fontAsset; + if (fontAsset != null) + { + prop_SecondGlyphIndex.intValue = (int)fontAsset.GetGlyphIndex(unicode); + propertyHolder.secondCharacter = unicode; + } + } + } + + if (EditorGUI.EndChangeCheck()) + m_SecondCharacter = secondCharacter; + + // Second Glyph Index + rect.x += width / 2 * 0.8f; + + EditorGUIUtility.labelWidth = 25f; + EditorGUI.BeginChangeCheck(); + EditorGUI.PropertyField(rect, prop_SecondGlyphIndex, new GUIContent("ID:")); + if (EditorGUI.EndChangeCheck()) + { + + } + + GUI.enabled = isEditingEnabled; + EditorGUIUtility.labelWidth = 25f; + + rect = new Rect(position.width / 2 + 20, position.y + 20, width * 0.5f - padding, 18); + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_XPlacement"), new GUIContent("OX")); + + rect.x += width * 0.5f; + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_YPlacement"), new GUIContent("OY")); + + rect.x = position.width / 2 + 20; + rect.y += 20; + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_XAdvance"), new GUIContent("AX")); + + //rect.x += width * 0.5f; + //EditorGUI.PropertyField(rect, prop_SecondGlyphAdjustment.FindPropertyRelative("m_YAdvance"), new GUIContent("AY")); + } + + // Font Feature Lookup Flags + if (isSelectable) + { + EditorGUIUtility.labelWidth = 55f; + + rect.x = position.width - 255; + rect.y += 23; + rect.width = 270; // width - 70 - padding; + + FontFeatureLookupFlags flags = (FontFeatureLookupFlags)prop_FontFeatureLookupFlags.intValue; + + EditorGUI.BeginChangeCheck(); + flags = (FontFeatureLookupFlags)EditorGUI.EnumFlagsField(rect, new GUIContent("Options:"), flags); + if (EditorGUI.EndChangeCheck()) + { + prop_FontFeatureLookupFlags.intValue = (int)flags; + } + } + + } + + bool ValidateInput(string source) + { + int length = string.IsNullOrEmpty(source) ? 0 : source.Length; + + ////Filter out unwanted characters. + Event evt = Event.current; + + char c = evt.character; + + if (c != '\0') + { + switch (length) + { + case 0: + break; + case 1: + if (source != m_PreviousInput) + return true; + + if ((source[0] == '\\' && (c == 'u' || c == 'U')) == false) + evt.character = '\0'; + + break; + case 2: + case 3: + case 4: + case 5: + if ((c < '0' || c > '9') && (c < 'a' || c > 'f') && (c < 'A' || c > 'F')) + evt.character = '\0'; + break; + case 6: + case 7: + case 8: + case 9: + if (source[1] == 'u' || (c < '0' || c > '9') && (c < 'a' || c > 'f') && (c < 'A' || c > 'F')) + evt.character = '\0'; + + // Validate input + if (length == 6 && source[1] == 'u' && source != m_PreviousInput) + return true; + break; + case 10: + if (source != m_PreviousInput) + return true; + + evt.character = '\0'; + break; + } + } + + m_PreviousInput = source; + + return false; + } + + uint GetUnicodeCharacter (string source) + { + uint unicode; + + if (source.Length == 1) + unicode = source[0]; + else if (source.Length == 6) + unicode = (uint)TMP_TextUtilities.StringHexToInt(source.Replace("\\u", "")); + else + unicode = (uint)TMP_TextUtilities.StringHexToInt(source.Replace("\\U", "")); + + return unicode; + } + + void DrawGlyph(uint glyphIndex, Rect position, SerializedProperty property) + { + // Get a reference to the sprite texture + TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset; + + if (fontAsset == null) + return; + + // Check if glyph currently exists in the atlas texture. + if (!fontAsset.glyphLookupTable.TryGetValue(glyphIndex, out Glyph glyph)) + return; + + // Get reference to atlas texture. + int atlasIndex = fontAsset.m_AtlasTextureIndex; + Texture2D atlasTexture = fontAsset.atlasTextures.Length > atlasIndex ? fontAsset.atlasTextures[atlasIndex] : null; + + if (atlasTexture == null) + return; + + Material mat; + if (((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + { + mat = TMP_FontAssetEditor.internalBitmapMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + } + else + { + mat = TMP_FontAssetEditor.internalSDFMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + mat.SetFloat(ShaderUtilities.ID_GradientScale, fontAsset.atlasPadding + 1); + } + + // Draw glyph from atlas texture. + Rect glyphDrawPosition = new Rect(position.x, position.y + 2, 64, 60); + + GlyphRect glyphRect = glyph.glyphRect; + + float normalizedHeight = fontAsset.faceInfo.ascentLine - fontAsset.faceInfo.descentLine; + float scale = glyphDrawPosition.width / normalizedHeight; + + // Compute the normalized texture coordinates + Rect texCoords = new Rect((float)glyphRect.x / atlasTexture.width, (float)glyphRect.y / atlasTexture.height, (float)glyphRect.width / atlasTexture.width, (float)glyphRect.height / atlasTexture.height); + + if (Event.current.type == EventType.Repaint) + { + glyphDrawPosition.x += (glyphDrawPosition.width - glyphRect.width * scale) / 2; + glyphDrawPosition.y += (glyphDrawPosition.height - glyphRect.height * scale) / 2; + glyphDrawPosition.width = glyphRect.width * scale; + glyphDrawPosition.height = glyphRect.height * scale; + + // Could switch to using the default material of the font asset which would require passing scale to the shader. + Graphics.DrawTexture(glyphDrawPosition, atlasTexture, texCoords, 0, 0, 0, 0, new Color(1f, 1f, 1f), mat); + } + } + + + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs.meta new file mode 100644 index 0000000..b95203f --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d256fa541faf5d4409992c631adb98a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs new file mode 100644 index 0000000..b92dfd6 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs @@ -0,0 +1,118 @@ + using UnityEngine; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(Glyph))] + public class TMP_GlyphPropertyDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_GlyphIndex = property.FindPropertyRelative("m_Index"); + SerializedProperty prop_GlyphMetrics = property.FindPropertyRelative("m_Metrics"); + SerializedProperty prop_GlyphRect = property.FindPropertyRelative("m_GlyphRect"); + SerializedProperty prop_Scale = property.FindPropertyRelative("m_Scale"); + SerializedProperty prop_AtlasIndex = property.FindPropertyRelative("m_AtlasIndex"); + + GUIStyle style = new GUIStyle(EditorStyles.label); + style.richText = true; + + Rect rect = new Rect(position.x + 70, position.y, position.width, 49); + + float labelWidth = GUI.skin.label.CalcSize(new GUIContent("ID: " + prop_GlyphIndex.intValue)).x; + EditorGUI.LabelField(new Rect(position.x + (64 - labelWidth) / 2, position.y + 85, 64f, 18f), new GUIContent("ID: " + prop_GlyphIndex.intValue + ""), style); + //EditorGUIUtility.labelWidth = 22f; + //EditorGUI.DelayedIntField(new Rect(position.x + (64 - labelWidth) / 2, position.y + 89, 58f, 18f), prop_GlyphIndex, new GUIContent("ID:")); + + // We get Rect since a valid position may not be provided by the caller. + EditorGUI.PropertyField(new Rect(rect.x, rect.y, position.width, 49), prop_GlyphRect); + + rect.y += 45; + EditorGUI.PropertyField(rect, prop_GlyphMetrics); + + EditorGUIUtility.labelWidth = 40f; + EditorGUI.PropertyField(new Rect(rect.x, rect.y + 65, 75, 18), prop_Scale, new GUIContent("Scale:")); // new GUIContent("Scale: " + prop_Scale.floatValue + ""), style); + + EditorGUIUtility.labelWidth = 74f; + EditorGUI.PropertyField(new Rect(rect.x + 85, rect.y + 65, 95, 18), prop_AtlasIndex, new GUIContent("Atlas Index:")); // new GUIContent("Atlas Index: " + prop_AtlasIndex.intValue + ""), style); + + DrawGlyph(position, property); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 130f; + } + + void DrawGlyph(Rect position, SerializedProperty property) + { + // Get a reference to the sprite texture + TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset; + + if (fontAsset == null) + return; + + // Get reference to atlas texture. + int atlasIndex = property.FindPropertyRelative("m_AtlasIndex").intValue; + Texture2D atlasTexture = fontAsset.atlasTextures.Length > atlasIndex ? fontAsset.atlasTextures[atlasIndex] : null; + + if (atlasTexture == null) + return; + + Material mat; + if (((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + { + mat = TMP_FontAssetEditor.internalBitmapMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + mat.SetColor("_Color", Color.white); + } + else + { + mat = TMP_FontAssetEditor.internalSDFMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + mat.SetFloat(ShaderUtilities.ID_GradientScale, fontAsset.atlasPadding + 1); + } + + // Draw glyph from atlas texture. + Rect glyphDrawPosition = new Rect(position.x, position.y + 2, 64, 80); + + SerializedProperty prop_GlyphRect = property.FindPropertyRelative("m_GlyphRect"); + + int glyphOriginX = prop_GlyphRect.FindPropertyRelative("m_X").intValue; + int glyphOriginY = prop_GlyphRect.FindPropertyRelative("m_Y").intValue; + int glyphWidth = prop_GlyphRect.FindPropertyRelative("m_Width").intValue; + int glyphHeight = prop_GlyphRect.FindPropertyRelative("m_Height").intValue; + + float normalizedHeight = fontAsset.faceInfo.ascentLine - fontAsset.faceInfo.descentLine; + float scale = glyphDrawPosition.width / normalizedHeight; + + // Compute the normalized texture coordinates + Rect texCoords = new Rect((float)glyphOriginX / atlasTexture.width, (float)glyphOriginY / atlasTexture.height, (float)glyphWidth / atlasTexture.width, (float)glyphHeight / atlasTexture.height); + + if (Event.current.type == EventType.Repaint) + { + glyphDrawPosition.x += (glyphDrawPosition.width - glyphWidth * scale) / 2; + glyphDrawPosition.y += (glyphDrawPosition.height - glyphHeight * scale) / 2; + glyphDrawPosition.width = glyphWidth * scale; + glyphDrawPosition.height = glyphHeight * scale; + + // Could switch to using the default material of the font asset which would require passing scale to the shader. + Graphics.DrawTexture(glyphDrawPosition, atlasTexture, texCoords, 0, 0, 0, 0, new Color(1f, 1f, 1f), mat); + } + } + + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs.meta new file mode 100644 index 0000000..ce08447 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c4777500b5da6094e956c3d4f04de4db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_InputFieldEditor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_InputFieldEditor.cs new file mode 100644 index 0000000..d50dc58 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_InputFieldEditor.cs @@ -0,0 +1,283 @@ +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; +using UnityEditor.UI; +using UnityEditor.AnimatedValues; + + +namespace TMPro.EditorUtilities +{ + [CanEditMultipleObjects] + [CustomEditor(typeof(TMP_InputField), true)] + public class TMP_InputFieldEditor : SelectableEditor + { + private struct m_foldout + { // Track Inspector foldout panel states, globally. + public static bool textInput = true; + public static bool fontSettings = true; + public static bool extraSettings = true; + //public static bool shadowSetting = false; + //public static bool materialEditor = true; + } + + SerializedProperty m_TextViewport; + SerializedProperty m_TextComponent; + SerializedProperty m_Text; + SerializedProperty m_ContentType; + SerializedProperty m_LineType; + SerializedProperty m_LineLimit; + SerializedProperty m_InputType; + SerializedProperty m_CharacterValidation; + SerializedProperty m_InputValidator; + SerializedProperty m_RegexValue; + SerializedProperty m_KeyboardType; + SerializedProperty m_CharacterLimit; + SerializedProperty m_CaretBlinkRate; + SerializedProperty m_CaretWidth; + SerializedProperty m_CaretColor; + SerializedProperty m_CustomCaretColor; + SerializedProperty m_SelectionColor; + SerializedProperty m_HideMobileKeyboard; + SerializedProperty m_HideMobileInput; + SerializedProperty m_Placeholder; + SerializedProperty m_VerticalScrollbar; + SerializedProperty m_ScrollbarScrollSensitivity; + SerializedProperty m_OnValueChanged; + SerializedProperty m_OnEndEdit; + SerializedProperty m_OnSelect; + SerializedProperty m_OnDeselect; + SerializedProperty m_ReadOnly; + SerializedProperty m_RichText; + SerializedProperty m_RichTextEditingAllowed; + SerializedProperty m_ResetOnDeActivation; + SerializedProperty m_RestoreOriginalTextOnEscape; + + SerializedProperty m_OnFocusSelectAll; + SerializedProperty m_GlobalPointSize; + SerializedProperty m_GlobalFontAsset; + + AnimBool m_CustomColor; + + //TMP_InputValidator m_ValidationScript; + + protected override void OnEnable() + { + base.OnEnable(); + + m_TextViewport = serializedObject.FindProperty("m_TextViewport"); + m_TextComponent = serializedObject.FindProperty("m_TextComponent"); + m_Text = serializedObject.FindProperty("m_Text"); + m_ContentType = serializedObject.FindProperty("m_ContentType"); + m_LineType = serializedObject.FindProperty("m_LineType"); + m_LineLimit = serializedObject.FindProperty("m_LineLimit"); + m_InputType = serializedObject.FindProperty("m_InputType"); + m_CharacterValidation = serializedObject.FindProperty("m_CharacterValidation"); + m_InputValidator = serializedObject.FindProperty("m_InputValidator"); + m_RegexValue = serializedObject.FindProperty("m_RegexValue"); + m_KeyboardType = serializedObject.FindProperty("m_KeyboardType"); + m_CharacterLimit = serializedObject.FindProperty("m_CharacterLimit"); + m_CaretBlinkRate = serializedObject.FindProperty("m_CaretBlinkRate"); + m_CaretWidth = serializedObject.FindProperty("m_CaretWidth"); + m_CaretColor = serializedObject.FindProperty("m_CaretColor"); + m_CustomCaretColor = serializedObject.FindProperty("m_CustomCaretColor"); + m_SelectionColor = serializedObject.FindProperty("m_SelectionColor"); + + m_HideMobileKeyboard = serializedObject.FindProperty("m_HideSoftKeyboard"); + m_HideMobileInput = serializedObject.FindProperty("m_HideMobileInput"); + + m_Placeholder = serializedObject.FindProperty("m_Placeholder"); + m_VerticalScrollbar = serializedObject.FindProperty("m_VerticalScrollbar"); + m_ScrollbarScrollSensitivity = serializedObject.FindProperty("m_ScrollSensitivity"); + + m_OnValueChanged = serializedObject.FindProperty("m_OnValueChanged"); + m_OnEndEdit = serializedObject.FindProperty("m_OnEndEdit"); + m_OnSelect = serializedObject.FindProperty("m_OnSelect"); + m_OnDeselect = serializedObject.FindProperty("m_OnDeselect"); + m_ReadOnly = serializedObject.FindProperty("m_ReadOnly"); + m_RichText = serializedObject.FindProperty("m_RichText"); + m_RichTextEditingAllowed = serializedObject.FindProperty("m_isRichTextEditingAllowed"); + m_ResetOnDeActivation = serializedObject.FindProperty("m_ResetOnDeActivation"); + m_RestoreOriginalTextOnEscape = serializedObject.FindProperty("m_RestoreOriginalTextOnEscape"); + + m_OnFocusSelectAll = serializedObject.FindProperty("m_OnFocusSelectAll"); + m_GlobalPointSize = serializedObject.FindProperty("m_GlobalPointSize"); + m_GlobalFontAsset = serializedObject.FindProperty("m_GlobalFontAsset"); + + m_CustomColor = new AnimBool(m_CustomCaretColor.boolValue); + m_CustomColor.valueChanged.AddListener(Repaint); + } + + protected override void OnDisable() + { + base.OnDisable(); + m_CustomColor.valueChanged.RemoveListener(Repaint); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + base.OnInspectorGUI(); + + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(m_TextViewport); + + EditorGUILayout.PropertyField(m_TextComponent); + + TextMeshProUGUI text = null; + if (m_TextComponent != null && m_TextComponent.objectReferenceValue != null) + { + text = m_TextComponent.objectReferenceValue as TextMeshProUGUI; + //if (text.supportRichText) + //{ + // EditorGUILayout.HelpBox("Using Rich Text with input is unsupported.", MessageType.Warning); + //} + } + + EditorGUI.BeginDisabledGroup(m_TextComponent == null || m_TextComponent.objectReferenceValue == null); + + // TEXT INPUT BOX + EditorGUILayout.PropertyField(m_Text); + + // INPUT FIELD SETTINGS + #region INPUT FIELD SETTINGS + + m_foldout.fontSettings = EditorGUILayout.Foldout(m_foldout.fontSettings, "Input Field Settings", true, TMP_UIStyleManager.boldFoldout); + + if (m_foldout.fontSettings) + { + EditorGUI.indentLevel++; + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_GlobalFontAsset, new GUIContent("Font Asset", "Set the Font Asset for both Placeholder and Input Field text object.")); + if (EditorGUI.EndChangeCheck()) + { + TMP_InputField inputField = target as TMP_InputField; + inputField.SetGlobalFontAsset(m_GlobalFontAsset.objectReferenceValue as TMP_FontAsset); + } + + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_GlobalPointSize, new GUIContent("Point Size", "Set the point size of both Placeholder and Input Field text object.")); + if (EditorGUI.EndChangeCheck()) + { + TMP_InputField inputField = target as TMP_InputField; + inputField.SetGlobalPointSize(m_GlobalPointSize.floatValue); + } + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_CharacterLimit); + + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(m_ContentType); + if (!m_ContentType.hasMultipleDifferentValues) + { + EditorGUI.indentLevel++; + + if (m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Standard || + m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Autocorrected || + m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Custom) + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_LineType); + if (EditorGUI.EndChangeCheck()) + { + if (text != null) + { + if (m_LineType.enumValueIndex == (int)TMP_InputField.LineType.SingleLine) + text.enableWordWrapping = false; + else + { + text.enableWordWrapping = true; + } + } + } + + if (m_LineType.enumValueIndex != (int)TMP_InputField.LineType.SingleLine) + { + EditorGUILayout.PropertyField(m_LineLimit); + } + } + + if (m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Custom) + { + EditorGUILayout.PropertyField(m_InputType); + EditorGUILayout.PropertyField(m_KeyboardType); + EditorGUILayout.PropertyField(m_CharacterValidation); + if (m_CharacterValidation.enumValueIndex == (int)TMP_InputField.CharacterValidation.Regex) + { + EditorGUILayout.PropertyField(m_RegexValue); + } + else if (m_CharacterValidation.enumValueIndex == (int)TMP_InputField.CharacterValidation.CustomValidator) + { + EditorGUILayout.PropertyField(m_InputValidator); + } + } + + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(m_Placeholder); + EditorGUILayout.PropertyField(m_VerticalScrollbar); + + if (m_VerticalScrollbar.objectReferenceValue != null) + EditorGUILayout.PropertyField(m_ScrollbarScrollSensitivity); + + EditorGUILayout.PropertyField(m_CaretBlinkRate); + EditorGUILayout.PropertyField(m_CaretWidth); + + EditorGUILayout.PropertyField(m_CustomCaretColor); + + m_CustomColor.target = m_CustomCaretColor.boolValue; + + if (EditorGUILayout.BeginFadeGroup(m_CustomColor.faded)) + { + EditorGUILayout.PropertyField(m_CaretColor); + } + EditorGUILayout.EndFadeGroup(); + + EditorGUILayout.PropertyField(m_SelectionColor); + + EditorGUI.indentLevel--; + } + #endregion + + + // CONTROL SETTINGS + #region CONTROL SETTINGS + m_foldout.extraSettings = EditorGUILayout.Foldout(m_foldout.extraSettings, "Control Settings", true, TMP_UIStyleManager.boldFoldout); + + if (m_foldout.extraSettings) + { + EditorGUI.indentLevel++; + + EditorGUILayout.PropertyField(m_OnFocusSelectAll, new GUIContent("OnFocus - Select All", "Should all the text be selected when the Input Field is selected.")); + EditorGUILayout.PropertyField(m_ResetOnDeActivation, new GUIContent("Reset On DeActivation", "Should the Text and Caret position be reset when Input Field is DeActivated.")); + EditorGUILayout.PropertyField(m_RestoreOriginalTextOnEscape, new GUIContent("Restore On ESC Key", "Should the original text be restored when pressing ESC.")); + EditorGUILayout.PropertyField(m_HideMobileKeyboard, new GUIContent("Hide Soft Keyboard", "Controls the visibility of the mobile virtual keyboard.")); + EditorGUILayout.PropertyField(m_HideMobileInput, new GUIContent("Hide Mobile Input", "Controls the visibility of the editable text field above the mobile virtual keyboard. Not supported on all mobile platforms.")); + EditorGUILayout.PropertyField(m_ReadOnly); + EditorGUILayout.PropertyField(m_RichText); + EditorGUILayout.PropertyField(m_RichTextEditingAllowed, new GUIContent("Allow Rich Text Editing")); + + EditorGUI.indentLevel--; + } + #endregion + + + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(m_OnValueChanged); + EditorGUILayout.PropertyField(m_OnEndEdit); + EditorGUILayout.PropertyField(m_OnSelect); + EditorGUILayout.PropertyField(m_OnDeselect); + + EditorGUI.EndDisabledGroup(); + + serializedObject.ApplyModifiedProperties(); + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_InputFieldEditor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_InputFieldEditor.cs.meta new file mode 100644 index 0000000..eeb62d8 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_InputFieldEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aa160f27c3fe4052a5850e21108811b6 +timeCreated: 1457861621 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_MeshRendererEditor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_MeshRendererEditor.cs new file mode 100644 index 0000000..83d19f8 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_MeshRendererEditor.cs @@ -0,0 +1,76 @@ +// When enabled, allows setting the material by dropping a material onto the MeshRenderer inspector component. +// The drawback is that the MeshRenderer inspector will not have properties for light probes, so if you need light probe support, do not enable this. +//#define ALLOW_MESHRENDERER_MATERIAL_DRAG_N_DROP + +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + // Disabled for compatibility reason as lightprobe setup isn't supported due to inability to inherit from MeshRendererEditor class +#if ALLOW_MESHRENDERER_MATERIAL_DRAG_N_DROP + [CanEditMultipleObjects] + [CustomEditor(typeof(MeshRenderer))] + public class TMP_MeshRendererEditor : Editor + { + private SerializedProperty m_Materials; + + void OnEnable() + { + m_Materials = serializedObject.FindProperty("m_Materials"); + } + + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + // Get a reference to the current material. + SerializedProperty material_prop = m_Materials.GetArrayElementAtIndex(0); + Material currentMaterial = material_prop.objectReferenceValue as Material; + + EditorGUI.BeginChangeCheck(); + base.OnInspectorGUI(); + if (EditorGUI.EndChangeCheck()) + { + material_prop = m_Materials.GetArrayElementAtIndex(0); + + TMP_FontAsset newFontAsset = null; + Material newMaterial = null; + + if (material_prop != null) + newMaterial = material_prop.objectReferenceValue as Material; + + // Check if the new material is referencing a different font atlas texture. + if (newMaterial != null && currentMaterial.GetInstanceID() != newMaterial.GetInstanceID()) + { + // Search for the Font Asset matching the new font atlas texture. + newFontAsset = TMP_EditorUtility.FindMatchingFontAsset(newMaterial); + } + + + GameObject[] objects = Selection.gameObjects; + + for (int i = 0; i < objects.Length; i++) + { + // Assign new font asset + if (newFontAsset != null) + { + TMP_Text textComponent = objects[i].GetComponent(); + + if (textComponent != null) + { + Undo.RecordObject(textComponent, "Font Asset Change"); + textComponent.font = newFontAsset; + } + } + + TMPro_EventManager.ON_DRAG_AND_DROP_MATERIAL_CHANGED(objects[i], currentMaterial, newMaterial); + } + } + } + } +#endif +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_MeshRendererEditor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_MeshRendererEditor.cs.meta new file mode 100644 index 0000000..d6b133f --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_MeshRendererEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6d437b997e074079b4b2f6e395394f4b +timeCreated: 1462864011 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PackageUtilities.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PackageUtilities.cs new file mode 100644 index 0000000..5e50d76 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PackageUtilities.cs @@ -0,0 +1,920 @@ +using UnityEngine; +using UnityEditor; +using System; +using System.IO; +using System.Linq; +using System.Collections; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using TMPro.EditorUtilities; + + +namespace TMPro +{ + /// + /// Data structure containing the target and replacement fileIDs and GUIDs which will require remapping from previous version of TextMesh Pro to the new TextMesh Pro UPM package. + /// + [System.Serializable] + struct AssetConversionRecord + { + public string referencedResource; + public string target; + public string replacement; + } + + + /// + /// Data structure containing a list of target and replacement fileID and GUID requiring remapping from previous versions of TextMesh Pro to the new TextMesh Pro UPM package. + /// This data structure is populated with the data contained in the PackageConversionData.json file included in the package. + /// + [System.Serializable] + class AssetConversionData + { + public List assetRecords; + } + + + public class TMP_ProjectConversionUtility : EditorWindow + { + // Create Sprite Asset Editor Window + [MenuItem("Window/TextMeshPro/Project Files GUID Remapping Tool", false, 2100)] + static void ShowConverterWindow() + { + var window = GetWindow(); + window.titleContent = new GUIContent("Conversion Tool"); + window.Focus(); + } + + private static HashSet m_IgnoreAssetTypes = new HashSet() + { + typeof(AnimatorOverrideController), + typeof(AudioClip), + typeof(AvatarMask), + typeof(ComputeShader), + typeof(Cubemap), + typeof(DefaultAsset), + typeof(Flare), + typeof(Font), + typeof(GUISkin), + typeof(HumanTemplate), + typeof(LightingDataAsset), + typeof(Mesh), + typeof(MonoScript), + typeof(PhysicMaterial), + typeof(PhysicsMaterial2D), + typeof(RenderTexture), + typeof(Shader), + typeof(TerrainData), + typeof(TextAsset), + typeof(Texture2D), + typeof(Texture2DArray), + typeof(Texture3D), + typeof(UnityEditor.Animations.AnimatorController), + typeof(UnityEditorInternal.AssemblyDefinitionAsset), + typeof(UnityEngine.AI.NavMeshData), + typeof(UnityEngine.Tilemaps.Tile), + typeof(UnityEngine.U2D.SpriteAtlas), + typeof(UnityEngine.Video.VideoClip), + }; + + /// + /// + /// + struct AssetModificationRecord + { + public string assetFilePath; + public string assetDataFile; + } + + struct AssetFileRecord + { + public string assetFilePath; + public string assetMetaFilePath; + + public AssetFileRecord(string filePath, string metaFilePath) + { + this.assetFilePath = filePath; + this.assetMetaFilePath = metaFilePath; + } + } + + private static string m_ProjectPath; + private static string m_ProjectFolderToScan; + private static bool m_IsAlreadyScanningProject; + private static bool m_CancelScanProcess; + private static string k_ProjectScanReportDefaultText = "Project Scan Results\n"; + private static string k_ProjectScanLabelPrefix = "Scanning: "; + private static string m_ProjectScanResults = string.Empty; + private static Vector2 m_ProjectScanResultScrollPosition; + private static float m_ProgressPercentage = 0; + + private static int m_ScanningTotalFiles; + private static int m_RemainingFilesToScan; + private static int m_ScanningCurrentFileIndex; + private static string m_ScanningCurrentFileName; + + private static AssetConversionData m_ConversionData; + + private static List m_ModifiedAssetList = new List(); + + + void OnEnable() + { + // Set Editor Window Size + SetEditorWindowSize(); + + m_ProjectScanResults = k_ProjectScanReportDefaultText; + } + + + void OnGUI() + { + GUILayout.BeginVertical(); + { + // Scan project files and resources + GUILayout.BeginVertical(EditorStyles.helpBox); + { + GUILayout.Label("Scan Project Files", EditorStyles.boldLabel); + GUILayout.Label("Press the Scan Project Files button to begin scanning your project for files & resources that were created with a previous version of TextMesh Pro.", TMP_UIStyleManager.label); + GUILayout.Space(10f); + GUILayout.Label("Project folder to be scanned. Example \"Assets/TextMesh Pro\""); + m_ProjectFolderToScan = EditorGUILayout.TextField("Folder Path: Assets/", m_ProjectFolderToScan); + GUILayout.Space(5f); + + GUI.enabled = m_IsAlreadyScanningProject == false ? true : false; + if (GUILayout.Button("Scan Project Files")) + { + m_CancelScanProcess = false; + + // Make sure Asset Serialization mode is set to ForceText and Version Control mode to Visible Meta Files. + if (CheckProjectSerializationAndSourceControlModes() == true) + { + m_ProjectPath = Path.GetFullPath("Assets/.."); + TMP_EditorCoroutine.StartCoroutine(ScanProjectFiles()); + } + else + { + EditorUtility.DisplayDialog("Project Settings Change Required", "In menu options \"Edit - Project Settings - Editor\", please change Asset Serialization Mode to ForceText and Source Control Mode to Visible Meta Files.", "OK", string.Empty); + } + } + GUI.enabled = true; + + // Display progress bar + Rect rect = GUILayoutUtility.GetRect(0f, 20f, GUILayout.ExpandWidth(true)); + EditorGUI.ProgressBar(rect, m_ProgressPercentage, "Scan Progress (" + m_ScanningCurrentFileIndex + "/" + m_ScanningTotalFiles + ")"); + + // Display cancel button and name of file currently being scanned. + if (m_IsAlreadyScanningProject) + { + Rect cancelRect = new Rect(rect.width - 20, rect.y + 2, 20, 16); + if (GUI.Button(cancelRect, "X")) + { + m_CancelScanProcess = true; + } + GUILayout.Label(k_ProjectScanLabelPrefix + m_ScanningCurrentFileName, TMP_UIStyleManager.label); + } + else + GUILayout.Label(string.Empty); + + GUILayout.Space(5); + + // Creation Feedback + GUILayout.BeginVertical(TMP_UIStyleManager.textAreaBoxWindow, GUILayout.ExpandHeight(true)); + { + m_ProjectScanResultScrollPosition = EditorGUILayout.BeginScrollView(m_ProjectScanResultScrollPosition, GUILayout.ExpandHeight(true)); + EditorGUILayout.LabelField(m_ProjectScanResults, TMP_UIStyleManager.label); + EditorGUILayout.EndScrollView(); + } + GUILayout.EndVertical(); + GUILayout.Space(5f); + } + GUILayout.EndVertical(); + + // Scan project files and resources + GUILayout.BeginVertical(EditorStyles.helpBox); + { + GUILayout.Label("Save Modified Project Files", EditorStyles.boldLabel); + GUILayout.Label("Pressing the Save Modified Project Files button will update the files in the Project Scan Results listed above. Please make sure that you have created a backup of your project first as these file modifications are permanent and cannot be undone.", TMP_UIStyleManager.label); + GUILayout.Space(5f); + + GUI.enabled = m_IsAlreadyScanningProject == false && m_ModifiedAssetList.Count > 0 ? true : false; + if (GUILayout.Button("Save Modified Project Files")) + { + UpdateProjectFiles(); + } + GUILayout.Space(10f); + } + GUILayout.EndVertical(); + + } + GUILayout.EndVertical(); + GUILayout.Space(5f); + } + + void OnInspectorUpdate() + { + Repaint(); + } + + + /// + /// Limits the minimum size of the editor window. + /// + void SetEditorWindowSize() + { + EditorWindow editorWindow = this; + + Vector2 currentWindowSize = editorWindow.minSize; + + editorWindow.minSize = new Vector2(Mathf.Max(640, currentWindowSize.x), Mathf.Max(420, currentWindowSize.y)); + } + + + /// + /// + /// + /// + /// + private static bool ShouldIgnoreFile(string filePath) + { + string fileExtension = Path.GetExtension(filePath); + Type fileType = AssetDatabase.GetMainAssetTypeAtPath(filePath); + + if (m_IgnoreAssetTypes.Contains(fileType)) + return true; + + // Exclude FBX + if (fileType == typeof(GameObject) && fileExtension.ToLower() == ".fbx") { return true; } + return false; + } + + + private IEnumerator ScanProjectFiles() + { + m_IsAlreadyScanningProject = true; + string packageFullPath = EditorUtilities.TMP_EditorUtility.packageFullPath; + + // List containing assets that have been modified. + m_ProjectScanResults = k_ProjectScanReportDefaultText; + m_ModifiedAssetList.Clear(); + m_ProgressPercentage = 0; + + // Read Conversion Data from Json file. + if (m_ConversionData == null) + m_ConversionData = JsonUtility.FromJson(File.ReadAllText(packageFullPath + "/PackageConversionData.json")); + + // Get list of GUIDs for assets that might contain references to previous GUIDs that require updating. + string searchFolder = string.IsNullOrEmpty(m_ProjectFolderToScan) ? "Assets" : ("Assets/" + m_ProjectFolderToScan); + string[] guids = AssetDatabase.FindAssets("t:Object", new string[] { searchFolder }).Distinct().ToArray(); + + k_ProjectScanLabelPrefix = "Phase 1 - Filtering: "; + m_ScanningTotalFiles = guids.Length; + m_ScanningCurrentFileIndex = 0; + + List projectFilesToScan = new List(); + + foreach (var guid in guids) + { + if (m_CancelScanProcess) + break; + + string assetFilePath = AssetDatabase.GUIDToAssetPath(guid); + + m_ScanningCurrentFileIndex += 1; + m_ScanningCurrentFileName = assetFilePath; + m_ProgressPercentage = (float)m_ScanningCurrentFileIndex / m_ScanningTotalFiles; + + // Filter out file types we have no interest in searching + if (ShouldIgnoreFile(assetFilePath)) + continue; + + string assetMetaFilePath = AssetDatabase.GetTextMetaFilePathFromAssetPath(assetFilePath); + + projectFilesToScan.Add(new AssetFileRecord(assetFilePath, assetMetaFilePath)); + + yield return null; + } + + m_RemainingFilesToScan = m_ScanningTotalFiles = projectFilesToScan.Count; + + k_ProjectScanLabelPrefix = "Phase 2 - Scanning: "; + + for (int i = 0; i < m_ScanningTotalFiles; i++) + { + if (m_CancelScanProcess) + break; + + AssetFileRecord fileRecord = projectFilesToScan[i]; + + Task.Run(() => + { + ScanProjectFileAsync(fileRecord); + + m_ScanningCurrentFileName = fileRecord.assetFilePath; + + int completedScans = m_ScanningTotalFiles - Interlocked.Decrement(ref m_RemainingFilesToScan); + + m_ScanningCurrentFileIndex = completedScans; + m_ProgressPercentage = (float)completedScans / m_ScanningTotalFiles; + }); + + if (i % 64 == 0) + yield return new WaitForSeconds(2.0f); + + } + + while (m_RemainingFilesToScan > 0 && !m_CancelScanProcess) + yield return null; + + m_IsAlreadyScanningProject = false; + m_ScanningCurrentFileName = string.Empty; + } + + + static void ScanProjectFileAsync(AssetFileRecord fileRecord) + { + if (m_CancelScanProcess) + return; + + // Read the asset data file + string assetDataFile = string.Empty; + bool hasFileChanged = false; + + try + { + assetDataFile = File.ReadAllText(m_ProjectPath + "/" + fileRecord.assetFilePath); + } + catch + { + // Continue to the next asset if we can't read the current one. + return; + } + + // Read the asset meta data file + string assetMetaFile = File.ReadAllText(m_ProjectPath + "/" + fileRecord.assetMetaFilePath); + bool hasMetaFileChanges = false; + + foreach (AssetConversionRecord record in m_ConversionData.assetRecords) + { + if (assetDataFile.Contains(record.target)) + { + hasFileChanged = true; + + assetDataFile = assetDataFile.Replace(record.target, record.replacement); + } + + //// Check meta file + if (assetMetaFile.Contains(record.target)) + { + hasMetaFileChanges = true; + + assetMetaFile = assetMetaFile.Replace(record.target, record.replacement); + } + } + + if (hasFileChanged) + { + AssetModificationRecord modifiedAsset; + modifiedAsset.assetFilePath = fileRecord.assetFilePath; + modifiedAsset.assetDataFile = assetDataFile; + + m_ModifiedAssetList.Add(modifiedAsset); + + m_ProjectScanResults += fileRecord.assetFilePath + "\n"; + } + + if (hasMetaFileChanges) + { + AssetModificationRecord modifiedAsset; + modifiedAsset.assetFilePath = fileRecord.assetMetaFilePath; + modifiedAsset.assetDataFile = assetMetaFile; + + m_ModifiedAssetList.Add(modifiedAsset); + + m_ProjectScanResults += fileRecord.assetMetaFilePath + "\n"; + } + } + + + /// + /// + /// + private static void ResetScanProcess() + { + m_IsAlreadyScanningProject = false; + m_ScanningCurrentFileName = string.Empty; + m_ProgressPercentage = 0; + m_ScanningCurrentFileIndex = 0; + m_ScanningTotalFiles = 0; + } + + + /// + /// + /// + private static void UpdateProjectFiles() + { + // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files. + CheckProjectSerializationAndSourceControlModes(); + + string projectPath = Path.GetFullPath("Assets/.."); + + // Display dialogue to show user a list of project files that will be modified upon their consent. + if (EditorUtility.DisplayDialog("Save Modified Asset(s)?", "Are you sure you want to save all modified assets?", "YES", "NO")) + { + for (int i = 0; i < m_ModifiedAssetList.Count; i++) + { + // Make sure all file streams that might have been opened by Unity are closed. + //AssetDatabase.ReleaseCachedFileHandles(); + + //Debug.Log("Writing asset file [" + m_ModifiedAssetList[i].assetFilePath + "]."); + + File.WriteAllText(projectPath + "/" + m_ModifiedAssetList[i].assetFilePath, m_ModifiedAssetList[i].assetDataFile); + } + } + + AssetDatabase.Refresh(); + + m_ProgressPercentage = 0; + m_ProjectScanResults = k_ProjectScanReportDefaultText; + } + + + /// + /// Check project Asset Serialization and Source Control modes + /// + private static bool CheckProjectSerializationAndSourceControlModes() + { + // Check Project Asset Serialization and Visible Meta Files mode. + if (EditorSettings.serializationMode != SerializationMode.ForceText || EditorSettings.externalVersionControl != "Visible Meta Files") + { + return false; + } + + return true; + } + } + + + + public class TMP_PackageUtilities : Editor + { + + enum SaveAssetDialogueOptions { Unset = 0, Save = 1, SaveAll = 2, DoNotSave = 3 }; + + private static SerializationMode m_ProjectAssetSerializationMode; + private static string m_ProjectExternalVersionControl; + + struct AssetRemappingRecord + { + public string oldGuid; + public string newGuid; + public string assetPath; + } + + struct AssetModificationRecord + { + public string assetFilePath; + public string assetDataFile; + } + + // Create Sprite Asset Editor Window + //[MenuItem("Window/TextMeshPro/Generate New Package GUIDs", false, 1500)] + public static void GenerateNewPackageGUIDs_Menu() + { + GenerateNewPackageGUIDs(); + } + + + /// + /// + /// + [MenuItem("Window/TextMeshPro/Import TMP Essential Resources", false, 2050)] + public static void ImportProjectResourcesMenu() + { + ImportProjectResources(); + } + + + /// + /// + /// + [MenuItem("Window/TextMeshPro/Import TMP Examples and Extras", false, 2051)] + public static void ImportExamplesContentMenu() + { + ImportExtraContent(); + } + + + // Create Sprite Asset Editor Window + //[MenuItem("Window/TextMeshPro/Convert TMP Project Files to UPM", false, 1510)] + public static void ConvertProjectGUIDsMenu() + { + ConvertProjectGUIDsToUPM(); + + //GetVersionInfo(); + } + + + // Create Sprite Asset Editor Window + //[MenuItem("Window/TextMeshPro/Convert GUID (Source to DLL)", false, 2010)] + public static void ConvertGUIDFromSourceToDLLMenu() + { + //ConvertGUIDFromSourceToDLL(); + + //GetVersionInfo(); + } + + + // Create Sprite Asset Editor Window + //[MenuItem("Window/TextMeshPro/Convert GUID (DLL to Source)", false, 2020)] + public static void ConvertGUIDFromDllToSourceMenu() + { + //ConvertGUIDFromDLLToSource(); + + //GetVersionInfo(); + } + + + // Create Sprite Asset Editor Window + //[MenuItem("Window/TextMeshPro/Extract Package GUIDs", false, 1530)] + public static void ExtractPackageGUIDMenu() + { + ExtractPackageGUIDs(); + } + + + private static void GetVersionInfo() + { + string version = TMP_Settings.version; + Debug.Log("The version of this TextMesh Pro UPM package is (" + version + ")."); + } + + + /// + /// + /// + private static void ImportExtraContent() + { + string packageFullPath = EditorUtilities.TMP_EditorUtility.packageFullPath; + + AssetDatabase.ImportPackage(packageFullPath + "/Package Resources/TMP Examples & Extras.unitypackage", true); + } + + + /// + /// + /// + private static void ImportProjectResources() + { + string packageFullPath = EditorUtilities.TMP_EditorUtility.packageFullPath; + + AssetDatabase.ImportPackage(packageFullPath + "/Package Resources/TMP Essential Resources.unitypackage", true); + } + + + /// + /// + /// + private static void GenerateNewPackageGUIDs() + { + // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files. + SetProjectSerializationAndSourceControlModes(); + + string projectPath = Path.GetFullPath("Assets/.."); + + // Clear existing dictionary of AssetRecords + List assetRecords = new List(); + + // Get full list of GUIDs used in the package which including folders. + string[] packageGUIDs = AssetDatabase.FindAssets("t:Object", new string[] { "Assets/Packages/com.unity.TextMeshPro" }); + + for (int i = 0; i < packageGUIDs.Length; i++) + { + // Could add a progress bar for this process (if needed) + + string guid = packageGUIDs[i]; + string assetFilePath = AssetDatabase.GUIDToAssetPath(guid); + string assetMetaFilePath = AssetDatabase.GetTextMetaFilePathFromAssetPath(assetFilePath); + //System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetFilePath); + + AssetRemappingRecord assetRecord; + assetRecord.oldGuid = guid; + assetRecord.assetPath = assetFilePath; + + string newGUID = GenerateUniqueGUID(); + + assetRecord.newGuid = newGUID; + + if (assetRecords.FindIndex(item => item.oldGuid == guid) != -1) + continue; + + assetRecords.Add(assetRecord); + + // Read the meta file for the given asset. + string assetMetaFile = File.ReadAllText(projectPath + "/" + assetMetaFilePath); + + assetMetaFile = assetMetaFile.Replace("guid: " + guid, "guid: " + newGUID); + + File.WriteAllText(projectPath + "/" + assetMetaFilePath, assetMetaFile); + + //Debug.Log("Asset: [" + assetFilePath + "] Type: " + assetType + " Current GUID: [" + guid + "] New GUID: [" + newGUID + "]"); + } + + AssetDatabase.Refresh(); + + // Get list of GUIDs for assets that might need references to previous GUIDs which need to be updated. + packageGUIDs = AssetDatabase.FindAssets("t:Object"); // ("t:Object", new string[] { "Assets/Asset Importer" }); + + for (int i = 0; i < packageGUIDs.Length; i++) + { + // Could add a progress bar for this process + + string guid = packageGUIDs[i]; + string assetFilePath = AssetDatabase.GUIDToAssetPath(guid); + System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetFilePath); + + // Filter out file types we are not interested in + if (assetType == typeof(DefaultAsset) || assetType == typeof(MonoScript) || assetType == typeof(Texture2D) || assetType == typeof(TextAsset) || assetType == typeof(Shader)) + continue; + + // Read the asset data file + string assetDataFile = File.ReadAllText(projectPath + "/" + assetFilePath); + + //Debug.Log("Searching Asset: [" + assetFilePath + "] of type: " + assetType); + + bool hasFileChanged = false; + + foreach (AssetRemappingRecord record in assetRecords) + { + if (assetDataFile.Contains(record.oldGuid)) + { + hasFileChanged = true; + + assetDataFile = assetDataFile.Replace(record.oldGuid, record.newGuid); + + Debug.Log("Replacing old GUID: [" + record.oldGuid + "] by new GUID: [" + record.newGuid + "] in asset file: [" + assetFilePath + "]."); + } + } + + if (hasFileChanged) + { + // Add file to list of changed files + File.WriteAllText(projectPath + "/" + assetFilePath, assetDataFile); + } + + } + + AssetDatabase.Refresh(); + + // Restore project Asset Serialization and Source Control modes. + RestoreProjectSerializationAndSourceControlModes(); + } + + + private static void ExtractPackageGUIDs() + { + // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files. + SetProjectSerializationAndSourceControlModes(); + + string projectPath = Path.GetFullPath("Assets/.."); + + // Create new instance of AssetConversionData file + AssetConversionData data = new AssetConversionData(); + data.assetRecords = new List(); + + // Get full list of GUIDs used in the package which including folders. + string[] packageGUIDs = AssetDatabase.FindAssets("t:Object", new string[] { "Assets/Packages/com.unity.TextMeshPro" }); + + for (int i = 0; i < packageGUIDs.Length; i++) + { + // Could add a progress bar for this process (if needed) + + string guid = packageGUIDs[i]; + string assetFilePath = AssetDatabase.GUIDToAssetPath(guid); + //string assetMetaFilePath = AssetDatabase.GetTextMetaFilePathFromAssetPath(assetFilePath); + + //ObjectIdentifier[] localIdentifider = BundleBuildInterface.GetPlayerObjectIdentifiersInAsset(new GUID(guid), BuildTarget.NoTarget); + //System.Type[] types = BundleBuildInterface.GetTypeForObjects(localIdentifider); + + System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetFilePath); + + // Filter out file types we are not interested in + if (assetType == typeof(DefaultAsset)) + continue; + + string newGuid = GenerateUniqueGUID(); + + AssetConversionRecord record; + record.referencedResource = Path.GetFileName(assetFilePath); + record.target = "fileID: 2108210716, guid: " + newGuid; + + record.replacement = "fileID: 11500000, guid: " + guid; + + //if (m_AssetRecords.FindIndex(item => item.oldGuid == guid) != -1) + // continue; + + data.assetRecords.Add(record); + + // Read the meta file for the given asset. + //string assetMetaFile = File.ReadAllText(projectPath + "/" + assetMetaFilePath); + + //assetMetaFile = assetMetaFile.Replace("guid: " + guid, "guid: " + newGUID); + + //File.WriteAllText(projectPath + "/" + assetMetaFilePath, assetMetaFile); + + Debug.Log("Asset: [" + Path.GetFileName(assetFilePath) + "] Type: " + assetType + " Current GUID: [" + guid + "] New GUID: [" + newGuid + "]"); + } + + // Write new information into JSON file + string dataFile = JsonUtility.ToJson(data, true); + + File.WriteAllText(projectPath + "/Assets/Packages/com.unity.TextMeshPro/PackageConversionData.json", dataFile); + + // Restore project Asset Serialization and Source Control modes. + RestoreProjectSerializationAndSourceControlModes(); + } + + + /// + /// + /// + private static void ConvertProjectGUIDsToUPM() + { + // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files. + SetProjectSerializationAndSourceControlModes(); + + string projectPath = Path.GetFullPath("Assets/.."); + string packageFullPath = EditorUtilities.TMP_EditorUtility.packageFullPath; + + // List containing assets that have been modified. + List modifiedAssetList = new List(); + + // Read Conversion Data from Json file. + AssetConversionData conversionData = JsonUtility.FromJson(File.ReadAllText(packageFullPath + "/PackageConversionData.json")); + + // Get list of GUIDs for assets that might contain references to previous GUIDs that require updating. + string[] projectGUIDs = AssetDatabase.FindAssets("t:Object"); + + for (int i = 0; i < projectGUIDs.Length; i++) + { + // Could add a progress bar for this process + + string guid = projectGUIDs[i]; + string assetFilePath = AssetDatabase.GUIDToAssetPath(guid); + System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetFilePath); + + // Filter out file types we are not interested in + if (assetType == typeof(DefaultAsset) || assetType == typeof(MonoScript) || assetType == typeof(Texture2D) || assetType == typeof(TextAsset) || assetType == typeof(Shader)) + continue; + + // Read the asset data file + string assetDataFile = File.ReadAllText(projectPath + "/" + assetFilePath); + + //Debug.Log("Searching Asset: [" + assetFilePath + "] of type: " + assetType); + + bool hasFileChanged = false; + + foreach (AssetConversionRecord record in conversionData.assetRecords) + { + if (assetDataFile.Contains(record.target)) + { + hasFileChanged = true; + + assetDataFile = assetDataFile.Replace(record.target, record.replacement); + + Debug.Log("Replacing Reference to [" + record.referencedResource + "] using [" + record.target + "] with [" + record.replacement + "] in asset file: [" + assetFilePath + "]."); + } + } + + if (hasFileChanged) + { + Debug.Log("Adding [" + assetFilePath + "] to list of assets to be modified."); + + AssetModificationRecord modifiedAsset; + modifiedAsset.assetFilePath = assetFilePath; + modifiedAsset.assetDataFile = assetDataFile; + + modifiedAssetList.Add(modifiedAsset); + } + + } + + // Scan project meta files to update GUIDs of assets whose GUID has changed. + projectGUIDs = AssetDatabase.FindAssets("t:Object"); + + for (int i = 0; i < projectGUIDs.Length; i++) + { + string guid = projectGUIDs[i]; + string assetFilePath = AssetDatabase.GUIDToAssetPath(guid); + string assetMetaFilePath = AssetDatabase.GetTextMetaFilePathFromAssetPath(assetFilePath); + + // Read the asset meta data file + string assetMetaFile = File.ReadAllText(projectPath + "/" + assetMetaFilePath); + + bool hasFileChanged = false; + + foreach (AssetConversionRecord record in conversionData.assetRecords) + { + if (assetMetaFile.Contains(record.target)) + { + hasFileChanged = true; + + assetMetaFile = assetMetaFile.Replace(record.target, record.replacement); + + Debug.Log("Replacing Reference to [" + record.referencedResource + "] using [" + record.target + "] with [" + record.replacement + "] in asset file: [" + assetMetaFilePath + "]."); + } + } + + if (hasFileChanged) + { + Debug.Log("Adding [" + assetMetaFilePath + "] to list of meta files to be modified."); + + AssetModificationRecord modifiedAsset; + modifiedAsset.assetFilePath = assetMetaFilePath; + modifiedAsset.assetDataFile = assetMetaFile; + + modifiedAssetList.Add(modifiedAsset); + } + } + + // Display dialogue to show user a list of project files that will be modified upon their consent. + if (EditorUtility.DisplayDialog("Save Modified Asset(s)?", "Are you sure you want to save all modified assets?", "YES", "NO")) + { + for (int i = 0; i < modifiedAssetList.Count; i++) + { + // Make sure all file streams that might have been opened by Unity are closed. + //AssetDatabase.ReleaseCachedFileHandles(); + + Debug.Log("Writing asset file [" + modifiedAssetList[i].assetFilePath + "]."); + + //File.WriteAllText(projectPath + "/" + modifiedAssetList[i].assetFilePath, modifiedAssetList[i].assetDataFile); + } + + } + + AssetDatabase.Refresh(); + + // Restore project Asset Serialization and Source Control modes. + RestoreProjectSerializationAndSourceControlModes(); + } + + + /// + /// + /// + /// + private static string GenerateUniqueGUID() + { + string monoGuid = System.Guid.NewGuid().ToString(); + + char[] charGuid = new char[32]; + int index = 0; + for (int i = 0; i < monoGuid.Length; i++) + { + if (monoGuid[i] != '-') + charGuid[index++] = monoGuid[i]; + } + + string guid = new string(charGuid); + + // Make sure new GUID is not already used by some other asset. + if (AssetDatabase.GUIDToAssetPath(guid) != string.Empty) + guid = GenerateUniqueGUID(); + + return guid; + } + + + /// + /// Change project asset serialization mode to ForceText (if necessary) + /// + private static void SetProjectSerializationAndSourceControlModes() + { + // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files. + m_ProjectAssetSerializationMode = EditorSettings.serializationMode; + if (m_ProjectAssetSerializationMode != SerializationMode.ForceText) + UnityEditor.EditorSettings.serializationMode = SerializationMode.ForceText; + + m_ProjectExternalVersionControl = EditorSettings.externalVersionControl; + if (m_ProjectExternalVersionControl != "Visible Meta Files") + UnityEditor.EditorSettings.externalVersionControl = "Visible Meta Files"; + } + + + /// + /// Revert potential change to asset serialization mode (if necessary) + /// + private static void RestoreProjectSerializationAndSourceControlModes() + { + // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files. + if (m_ProjectAssetSerializationMode != EditorSettings.serializationMode) + EditorSettings.serializationMode = m_ProjectAssetSerializationMode; + + if (m_ProjectExternalVersionControl != EditorSettings.externalVersionControl) + EditorSettings.externalVersionControl = m_ProjectExternalVersionControl; + } + + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PackageUtilities.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PackageUtilities.cs.meta new file mode 100644 index 0000000..e03778c --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PackageUtilities.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68eedd4e5b33b37429c02c4add0036fe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs new file mode 100644 index 0000000..a8b800a --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs @@ -0,0 +1,63 @@ +using UnityEngine; +using UnityEditor; +using UnityEditor.Callbacks; +using System.IO; + + +namespace TMPro +{ + public class TMP_PostBuildProcessHandler + { + [PostProcessBuildAttribute(10000)] + public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) + { + // Check if TMP Essential Resource are present in user project. + if (target == BuildTarget.iOS && File.Exists(GetEssentialProjectResourcesPath() + "/Resources/TMP Settings.asset") && TMP_Settings.enableEmojiSupport) + { + string file = Path.Combine(pathToBuiltProject, "Classes/UI/Keyboard.mm"); + string content = File.ReadAllText(file); + content = content.Replace("FILTER_EMOJIS_IOS_KEYBOARD 1", "FILTER_EMOJIS_IOS_KEYBOARD 0"); + File.WriteAllText(file, content); + } + } + + + private static string GetEssentialProjectResourcesPath() + { + // Find the potential location of the TextMesh Pro folder in the user project. + string projectPath = Path.GetFullPath("Assets/.."); + if (Directory.Exists(projectPath)) + { + // Search for default location of TMP Essential Resources + if (Directory.Exists(projectPath + "/Assets/TextMesh Pro/Resources")) + { + return "Assets/TextMesh Pro"; + } + + // Search for potential alternative locations in the user project + string[] matchingPaths = Directory.GetDirectories(projectPath, "TextMesh Pro", SearchOption.AllDirectories); + projectPath = ValidateLocation(matchingPaths, projectPath); + if (projectPath != null) return projectPath; + } + + return null; + } + + + private static string ValidateLocation(string[] paths, string projectPath) + { + for (int i = 0; i < paths.Length; i++) + { + // Check if any of the matching directories contain a GUISkins directory. + if (Directory.Exists(paths[i] + "/Resources")) + { + string folderPath = paths[i].Replace(projectPath, ""); + folderPath = folderPath.TrimStart('\\', '/'); + return folderPath; + } + } + + return null; + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs.meta new file mode 100644 index 0000000..af212b8 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6fdea2af3daa40fe8f88e5e9cfc17abb +timeCreated: 1479886230 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ProjectTextSettings.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ProjectTextSettings.cs new file mode 100644 index 0000000..b8695be --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ProjectTextSettings.cs @@ -0,0 +1,43 @@ +#if !UNITY_2018_3_OR_NEWER +using UnityEditor; + +namespace TMPro +{ + + public static class TMP_ProjectTextSettings + { + // Open Project Text Settings + [MenuItem("Edit/Project Settings/TextMeshPro Settings", false, 309)] + public static void SelectProjectTextSettings() + { + TMP_Settings textSettings = TMP_Settings.instance; + + if (textSettings) + { + Selection.activeObject = textSettings; + + // TODO: Do we want to ping the Project Text Settings asset in the Project Inspector + EditorUtility.FocusProjectWindow(); + EditorGUIUtility.PingObject(textSettings); + } + else + TMPro_EventManager.RESOURCE_LOAD_EVENT.Add(ON_RESOURCES_LOADED); + } + + + // Event received when TMP resources have been loaded. + static void ON_RESOURCES_LOADED() + { + TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED); + + TMP_Settings textSettings = TMP_Settings.instance; + + Selection.activeObject = textSettings; + + // TODO: Do we want to ping the Project Text Settings asset in the Project Inspector + EditorUtility.FocusProjectWindow(); + EditorGUIUtility.PingObject(textSettings); + } + } +} +#endif \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ProjectTextSettings.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ProjectTextSettings.cs.meta new file mode 100644 index 0000000..6d19454 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ProjectTextSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e751e877ed14d71a6b8e63ac54949cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ResourcesLoader.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ResourcesLoader.cs new file mode 100644 index 0000000..090bd77 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ResourcesLoader.cs @@ -0,0 +1,68 @@ +using UnityEditor; +using UnityEngine; +using System.Collections; + +namespace TMPro.EditorUtilities +{ + + //[InitializeOnLoad] + class TMP_ResourcesLoader + { + + /// + /// Function to pre-load the TMP Resources + /// + public static void LoadTextMeshProResources() + { + //TMP_Settings.LoadDefaultSettings(); + //TMP_StyleSheet.LoadDefaultStyleSheet(); + } + + + static TMP_ResourcesLoader() + { + //Debug.Log("Loading TMP Resources..."); + + // Get current targetted platform + + + //string Settings = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone); + //TMPro.TMP_Settings.LoadDefaultSettings(); + //TMPro.TMP_StyleSheet.LoadDefaultStyleSheet(); + } + + + + //[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + //static void OnBeforeSceneLoaded() + //{ + //Debug.Log("Before scene is loaded."); + + // //TMPro.TMP_Settings.LoadDefaultSettings(); + // //TMPro.TMP_StyleSheet.LoadDefaultStyleSheet(); + + // //ShaderVariantCollection collection = new ShaderVariantCollection(); + // //Shader s0 = Shader.Find("TextMeshPro/Mobile/Distance Field"); + // //ShaderVariantCollection.ShaderVariant tmp_Variant = new ShaderVariantCollection.ShaderVariant(s0, UnityEngine.Rendering.PassType.Normal, string.Empty); + + // //collection.Add(tmp_Variant); + // //collection.WarmUp(); + //} + + } + + //static class TMP_ProjectSettings + //{ + // [InitializeOnLoadMethod] + // static void SetProjectDefineSymbols() + // { + // string currentBuildSettings = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + + // //Check for and inject TMP_INSTALLED + // if (!currentBuildSettings.Contains("TMP_PRESENT")) + // { + // PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, currentBuildSettings + ";TMP_PRESENT"); + // } + // } + //} +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ResourcesLoader.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ResourcesLoader.cs.meta new file mode 100644 index 0000000..8b322e2 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ResourcesLoader.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7241c7dc25374fc1a6ab3ef9da79c363 +timeCreated: 1465441092 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SDFShaderGUI.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SDFShaderGUI.cs new file mode 100644 index 0000000..2728f26 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SDFShaderGUI.cs @@ -0,0 +1,442 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + public class TMP_SDFShaderGUI : TMP_BaseShaderGUI + { + static ShaderFeature s_OutlineFeature, s_UnderlayFeature, s_BevelFeature, s_GlowFeature, s_MaskFeature; + + static bool s_Face = true, s_Outline = true, s_Underlay, s_Lighting, s_Glow, s_Bevel, s_Light, s_Bump, s_Env; + + static string[] + s_FaceUvSpeedNames = { "_FaceUVSpeedX", "_FaceUVSpeedY" }, + s_OutlineUvSpeedNames = { "_OutlineUVSpeedX", "_OutlineUVSpeedY" }; + + static TMP_SDFShaderGUI() + { + s_OutlineFeature = new ShaderFeature() + { + undoLabel = "Outline", + keywords = new[] { "OUTLINE_ON" } + }; + + s_UnderlayFeature = new ShaderFeature() + { + undoLabel = "Underlay", + keywords = new[] { "UNDERLAY_ON", "UNDERLAY_INNER" }, + label = new GUIContent("Underlay Type"), + keywordLabels = new[] + { + new GUIContent("None"), new GUIContent("Normal"), new GUIContent("Inner") + } + }; + + s_BevelFeature = new ShaderFeature() + { + undoLabel = "Bevel", + keywords = new[] { "BEVEL_ON" } + }; + + s_GlowFeature = new ShaderFeature() + { + undoLabel = "Glow", + keywords = new[] { "GLOW_ON" } + }; + + s_MaskFeature = new ShaderFeature() + { + undoLabel = "Mask", + keywords = new[] { "MASK_HARD", "MASK_SOFT" }, + label = new GUIContent("Mask"), + keywordLabels = new[] + { + new GUIContent("Mask Off"), new GUIContent("Mask Hard"), new GUIContent("Mask Soft") + } + }; + } + + protected override void DoGUI() + { + s_Face = BeginPanel("Face", s_Face); + if (s_Face) + { + DoFacePanel(); + } + + EndPanel(); + + s_Outline = m_Material.HasProperty(ShaderUtilities.ID_OutlineTex) ? BeginPanel("Outline", s_Outline) : BeginPanel("Outline", s_OutlineFeature, s_Outline); + if (s_Outline) + { + DoOutlinePanel(); + } + + EndPanel(); + + if (m_Material.HasProperty(ShaderUtilities.ID_UnderlayColor)) + { + s_Underlay = BeginPanel("Underlay", s_UnderlayFeature, s_Underlay); + if (s_Underlay) + { + DoUnderlayPanel(); + } + + EndPanel(); + } + + if (m_Material.HasProperty("_SpecularColor")) + { + s_Lighting = BeginPanel("Lighting", s_BevelFeature, s_Lighting); + if (s_Lighting) + { + s_Bevel = BeginPanel("Bevel", s_Bevel); + if (s_Bevel) + { + DoBevelPanel(); + } + + EndPanel(); + + s_Light = BeginPanel("Local Lighting", s_Light); + if (s_Light) + { + DoLocalLightingPanel(); + } + + EndPanel(); + + s_Bump = BeginPanel("Bump Map", s_Bump); + if (s_Bump) + { + DoBumpMapPanel(); + } + + EndPanel(); + + s_Env = BeginPanel("Environment Map", s_Env); + if (s_Env) + { + DoEnvMapPanel(); + } + + EndPanel(); + } + + EndPanel(); + } + else if (m_Material.HasProperty("_SpecColor")) + { + s_Bevel = BeginPanel("Bevel", s_Bevel); + if (s_Bevel) + { + DoBevelPanel(); + } + + EndPanel(); + + s_Light = BeginPanel("Surface Lighting", s_Light); + if (s_Light) + { + DoSurfaceLightingPanel(); + } + + EndPanel(); + + s_Bump = BeginPanel("Bump Map", s_Bump); + if (s_Bump) + { + DoBumpMapPanel(); + } + + EndPanel(); + + s_Env = BeginPanel("Environment Map", s_Env); + if (s_Env) + { + DoEnvMapPanel(); + } + + EndPanel(); + } + + if (m_Material.HasProperty(ShaderUtilities.ID_GlowColor)) + { + s_Glow = BeginPanel("Glow", s_GlowFeature, s_Glow); + if (s_Glow) + { + DoGlowPanel(); + } + + EndPanel(); + } + + s_DebugExtended = BeginPanel("Debug Settings", s_DebugExtended); + if (s_DebugExtended) + { + DoDebugPanel(); + } + + EndPanel(); + } + + void DoFacePanel() + { + EditorGUI.indentLevel += 1; + DoColor("_FaceColor", "Color"); + if (m_Material.HasProperty(ShaderUtilities.ID_FaceTex)) + { + if (m_Material.HasProperty("_FaceUVSpeedX")) + { + DoTexture2D("_FaceTex", "Texture", true, s_FaceUvSpeedNames); + } + else + { + DoTexture2D("_FaceTex", "Texture", true); + } + } + + DoSlider("_OutlineSoftness", "Softness"); + DoSlider("_FaceDilate", "Dilate"); + if (m_Material.HasProperty(ShaderUtilities.ID_Shininess)) + { + DoSlider("_FaceShininess", "Gloss"); + } + + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoOutlinePanel() + { + EditorGUI.indentLevel += 1; + DoColor("_OutlineColor", "Color"); + if (m_Material.HasProperty(ShaderUtilities.ID_OutlineTex)) + { + if (m_Material.HasProperty("_OutlineUVSpeedX")) + { + DoTexture2D("_OutlineTex", "Texture", true, s_OutlineUvSpeedNames); + } + else + { + DoTexture2D("_OutlineTex", "Texture", true); + } + } + + DoSlider("_OutlineWidth", "Thickness"); + if (m_Material.HasProperty("_OutlineShininess")) + { + DoSlider("_OutlineShininess", "Gloss"); + } + + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoUnderlayPanel() + { + EditorGUI.indentLevel += 1; + s_UnderlayFeature.DoPopup(m_Editor, m_Material); + DoColor("_UnderlayColor", "Color"); + DoSlider("_UnderlayOffsetX", "Offset X"); + DoSlider("_UnderlayOffsetY", "Offset Y"); + DoSlider("_UnderlayDilate", "Dilate"); + DoSlider("_UnderlaySoftness", "Softness"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + static GUIContent[] s_BevelTypeLabels = + { + new GUIContent("Outer Bevel"), + new GUIContent("Inner Bevel") + }; + + void DoBevelPanel() + { + EditorGUI.indentLevel += 1; + DoPopup("_ShaderFlags", "Type", s_BevelTypeLabels); + DoSlider("_Bevel", "Amount"); + DoSlider("_BevelOffset", "Offset"); + DoSlider("_BevelWidth", "Width"); + DoSlider("_BevelRoundness", "Roundness"); + DoSlider("_BevelClamp", "Clamp"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoLocalLightingPanel() + { + EditorGUI.indentLevel += 1; + DoSlider("_LightAngle", "Light Angle"); + DoColor("_SpecularColor", "Specular Color"); + DoSlider("_SpecularPower", "Specular Power"); + DoSlider("_Reflectivity", "Reflectivity Power"); + DoSlider("_Diffuse", "Diffuse Shadow"); + DoSlider("_Ambient", "Ambient Shadow"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoSurfaceLightingPanel() + { + EditorGUI.indentLevel += 1; + DoColor("_SpecColor", "Specular Color"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoBumpMapPanel() + { + EditorGUI.indentLevel += 1; + DoTexture2D("_BumpMap", "Texture"); + DoSlider("_BumpFace", "Face"); + DoSlider("_BumpOutline", "Outline"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoEnvMapPanel() + { + EditorGUI.indentLevel += 1; + DoColor("_ReflectFaceColor", "Face Color"); + DoColor("_ReflectOutlineColor", "Outline Color"); + DoCubeMap("_Cube", "Texture"); + DoVector3("_EnvMatrixRotation", "Rotation"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoGlowPanel() + { + EditorGUI.indentLevel += 1; + DoColor("_GlowColor", "Color"); + DoSlider("_GlowOffset", "Offset"); + DoSlider("_GlowInner", "Inner"); + DoSlider("_GlowOuter", "Outer"); + DoSlider("_GlowPower", "Power"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoDebugPanel() + { + EditorGUI.indentLevel += 1; + DoTexture2D("_MainTex", "Font Atlas"); + DoFloat("_GradientScale", "Gradient Scale"); + DoFloat("_TextureWidth", "Texture Width"); + DoFloat("_TextureHeight", "Texture Height"); + EditorGUILayout.Space(); + DoFloat("_ScaleX", "Scale X"); + DoFloat("_ScaleY", "Scale Y"); + + if (m_Material.HasProperty(ShaderUtilities.ID_Sharpness)) + DoSlider("_Sharpness", "Sharpness"); + + DoSlider("_PerspectiveFilter", "Perspective Filter"); + EditorGUILayout.Space(); + DoFloat("_VertexOffsetX", "Offset X"); + DoFloat("_VertexOffsetY", "Offset Y"); + + if (m_Material.HasProperty(ShaderUtilities.ID_MaskCoord)) + { + EditorGUILayout.Space(); + s_MaskFeature.ReadState(m_Material); + s_MaskFeature.DoPopup(m_Editor, m_Material); + if (s_MaskFeature.Active) + { + DoMaskSubgroup(); + } + + EditorGUILayout.Space(); + DoVector("_ClipRect", "Clip Rect", s_LbrtVectorLabels); + } + else if (m_Material.HasProperty("_MaskTex")) + { + DoMaskTexSubgroup(); + } + else if (m_Material.HasProperty(ShaderUtilities.ID_MaskSoftnessX)) + { + EditorGUILayout.Space(); + DoFloat("_MaskSoftnessX", "Softness X"); + DoFloat("_MaskSoftnessY", "Softness Y"); + DoVector("_ClipRect", "Clip Rect", s_LbrtVectorLabels); + } + + if (m_Material.HasProperty(ShaderUtilities.ID_StencilID)) + { + EditorGUILayout.Space(); + DoFloat("_Stencil", "Stencil ID"); + DoFloat("_StencilComp", "Stencil Comp"); + } + + EditorGUILayout.Space(); + + EditorGUI.BeginChangeCheck(); + bool useRatios = EditorGUILayout.Toggle("Use Ratios", !m_Material.IsKeywordEnabled("RATIOS_OFF")); + if (EditorGUI.EndChangeCheck()) + { + m_Editor.RegisterPropertyChangeUndo("Use Ratios"); + if (useRatios) + { + m_Material.DisableKeyword("RATIOS_OFF"); + } + else + { + m_Material.EnableKeyword("RATIOS_OFF"); + } + } + + EditorGUI.BeginDisabledGroup(true); + DoFloat("_ScaleRatioA", "Scale Ratio A"); + DoFloat("_ScaleRatioB", "Scale Ratio B"); + DoFloat("_ScaleRatioC", "Scale Ratio C"); + EditorGUI.EndDisabledGroup(); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoMaskSubgroup() + { + DoVector("_MaskCoord", "Mask Bounds", s_XywhVectorLabels); + if (Selection.activeGameObject != null) + { + Renderer renderer = Selection.activeGameObject.GetComponent(); + if (renderer != null) + { + Rect rect = EditorGUILayout.GetControlRect(); + rect.x += EditorGUIUtility.labelWidth; + rect.width -= EditorGUIUtility.labelWidth; + if (GUI.Button(rect, "Match Renderer Bounds")) + { + FindProperty("_MaskCoord", m_Properties).vectorValue = new Vector4( + 0, + 0, + Mathf.Round(renderer.bounds.extents.x * 1000) / 1000, + Mathf.Round(renderer.bounds.extents.y * 1000) / 1000 + ); + } + } + } + + if (s_MaskFeature.State == 1) + { + DoFloat("_MaskSoftnessX", "Softness X"); + DoFloat("_MaskSoftnessY", "Softness Y"); + } + } + + void DoMaskTexSubgroup() + { + EditorGUILayout.Space(); + DoTexture2D("_MaskTex", "Mask Texture"); + DoToggle("_MaskInverse", "Inverse Mask"); + DoColor("_MaskEdgeColor", "Edge Color"); + DoSlider("_MaskEdgeSoftness", "Edge Softness"); + DoSlider("_MaskWipeControl", "Wipe Position"); + DoFloat("_MaskSoftnessX", "Softness X"); + DoFloat("_MaskSoftnessY", "Softness Y"); + DoVector("_ClipRect", "Clip Rect", s_LbrtVectorLabels); + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SDFShaderGUI.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SDFShaderGUI.cs.meta new file mode 100644 index 0000000..c643afa --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SDFShaderGUI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8413ca0e506d42a1a4bd9769f204ad16 +timeCreated: 1469844718 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs new file mode 100644 index 0000000..2ba34d6 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs @@ -0,0 +1,14 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro +{ + class TMP_SerializedPropertyHolder : ScriptableObject + { + public TMP_FontAsset fontAsset; + public uint firstCharacter; + public uint secondCharacter; + + public TMP_GlyphPairAdjustmentRecord glyphPairAdjustmentRecord = new TMP_GlyphPairAdjustmentRecord(new TMP_GlyphAdjustmentRecord(), new TMP_GlyphAdjustmentRecord()); + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs.meta new file mode 100644 index 0000000..cde31db --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9c4a050f089abb04ebd4125e419f4548 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SettingsEditor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SettingsEditor.cs new file mode 100644 index 0000000..571c9cd --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SettingsEditor.cs @@ -0,0 +1,341 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; + +#pragma warning disable 0414 // Disabled a few warnings for not yet implemented features. + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TMP_Settings))] + public class TMP_SettingsEditor : Editor + { + internal class Styles + { + public static readonly GUIContent defaultFontAssetLabel = new GUIContent("Default Font Asset", "The Font Asset that will be assigned by default to newly created text objects when no Font Asset is specified."); + public static readonly GUIContent defaultFontAssetPathLabel = new GUIContent("Path: Resources/", "The relative path to a Resources folder where the Font Assets and Material Presets are located.\nExample \"Fonts & Materials/\""); + + public static readonly GUIContent fallbackFontAssetsLabel = new GUIContent("Fallback Font Assets", "The Font Assets that will be searched to locate and replace missing characters from a given Font Asset."); + public static readonly GUIContent fallbackFontAssetsListLabel = new GUIContent("Fallback Font Assets List", "The Font Assets that will be searched to locate and replace missing characters from a given Font Asset."); + + public static readonly GUIContent fallbackMaterialSettingsLabel = new GUIContent("Fallback Material Settings"); + public static readonly GUIContent matchMaterialPresetLabel = new GUIContent("Match Material Presets"); + + public static readonly GUIContent containerDefaultSettingsLabel = new GUIContent("Text Container Default Settings"); + + public static readonly GUIContent textMeshProLabel = new GUIContent("TextMeshPro"); + public static readonly GUIContent textMeshProUiLabel = new GUIContent("TextMeshPro UI"); + public static readonly GUIContent enableRaycastTarget = new GUIContent("Enable Raycast Target"); + public static readonly GUIContent autoSizeContainerLabel = new GUIContent("Auto Size Text Container", "Set the size of the text container to match the text."); + + public static readonly GUIContent textComponentDefaultSettingsLabel = new GUIContent("Text Component Default Settings"); + public static readonly GUIContent defaultFontSize = new GUIContent("Default Font Size"); + public static readonly GUIContent autoSizeRatioLabel = new GUIContent("Text Auto Size Ratios"); + public static readonly GUIContent minLabel = new GUIContent("Min"); + public static readonly GUIContent maxLabel = new GUIContent("Max"); + + public static readonly GUIContent wordWrappingLabel = new GUIContent("Word Wrapping"); + public static readonly GUIContent kerningLabel = new GUIContent("Kerning"); + public static readonly GUIContent extraPaddingLabel = new GUIContent("Extra Padding"); + public static readonly GUIContent tintAllSpritesLabel = new GUIContent("Tint All Sprites"); + public static readonly GUIContent parseEscapeCharactersLabel = new GUIContent("Parse Escape Sequence"); + + public static readonly GUIContent dynamicFontSystemSettingsLabel = new GUIContent("Dynamic Font System Settings"); + public static readonly GUIContent getFontFeaturesAtRuntime = new GUIContent("Get Font Features at Runtime", "Determines if Glyph Adjustment Data will be retrieved from font files at runtime when new characters and glyphs are added to font assets."); + + public static readonly GUIContent missingGlyphLabel = new GUIContent("Replacement Character", "The character to be displayed when the requested character is not found in any font asset or fallbacks."); + public static readonly GUIContent disableWarningsLabel = new GUIContent("Disable warnings", "Disable warning messages in the Console."); + + public static readonly GUIContent defaultSpriteAssetLabel = new GUIContent("Default Sprite Asset", "The Sprite Asset that will be assigned by default when using the tag when no Sprite Asset is specified."); + public static readonly GUIContent enableEmojiSupportLabel = new GUIContent("iOS Emoji Support", "Enables Emoji support for Touch Screen Keyboards on target devices."); + public static readonly GUIContent spriteAssetsPathLabel = new GUIContent("Path: Resources/", "The relative path to a Resources folder where the Sprite Assets are located.\nExample \"Sprite Assets/\""); + + public static readonly GUIContent defaultStyleSheetLabel = new GUIContent("Default Style Sheet", "The Style Sheet that will be used for all text objects in this project."); + + public static readonly GUIContent colorGradientPresetsLabel = new GUIContent("Color Gradient Presets", "The relative path to a Resources folder where the Color Gradient Presets are located.\nExample \"Color Gradient Presets/\""); + public static readonly GUIContent colorGradientsPathLabel = new GUIContent("Path: Resources/", "The relative path to a Resources folder where the Color Gradient Presets are located.\nExample \"Color Gradient Presets/\""); + + public static readonly GUIContent lineBreakingLabel = new GUIContent("Line Breaking for Asian languages", "The text assets that contain the Leading and Following characters which define the rules for line breaking with Asian languages."); + } + + SerializedProperty m_PropFontAsset; + SerializedProperty m_PropDefaultFontAssetPath; + SerializedProperty m_PropDefaultFontSize; + SerializedProperty m_PropDefaultAutoSizeMinRatio; + SerializedProperty m_PropDefaultAutoSizeMaxRatio; + SerializedProperty m_PropDefaultTextMeshProTextContainerSize; + SerializedProperty m_PropDefaultTextMeshProUITextContainerSize; + SerializedProperty m_PropAutoSizeTextContainer; + SerializedProperty m_PropEnableRaycastTarget; + + SerializedProperty m_PropSpriteAsset; + SerializedProperty m_PropSpriteAssetPath; + SerializedProperty m_PropEnableEmojiSupport; + SerializedProperty m_PropStyleSheet; + ReorderableList m_List; + + SerializedProperty m_PropColorGradientPresetsPath; + + SerializedProperty m_PropMatchMaterialPreset; + SerializedProperty m_PropWordWrapping; + SerializedProperty m_PropKerning; + SerializedProperty m_PropExtraPadding; + SerializedProperty m_PropTintAllSprites; + SerializedProperty m_PropParseEscapeCharacters; + SerializedProperty m_PropMissingGlyphCharacter; + + SerializedProperty m_GetFontFeaturesAtRuntime; + + SerializedProperty m_PropWarningsDisabled; + + SerializedProperty m_PropLeadingCharacters; + SerializedProperty m_PropFollowingCharacters; + + public void OnEnable() + { + if (target == null) + return; + + m_PropFontAsset = serializedObject.FindProperty("m_defaultFontAsset"); + m_PropDefaultFontAssetPath = serializedObject.FindProperty("m_defaultFontAssetPath"); + m_PropDefaultFontSize = serializedObject.FindProperty("m_defaultFontSize"); + m_PropDefaultAutoSizeMinRatio = serializedObject.FindProperty("m_defaultAutoSizeMinRatio"); + m_PropDefaultAutoSizeMaxRatio = serializedObject.FindProperty("m_defaultAutoSizeMaxRatio"); + m_PropDefaultTextMeshProTextContainerSize = serializedObject.FindProperty("m_defaultTextMeshProTextContainerSize"); + m_PropDefaultTextMeshProUITextContainerSize = serializedObject.FindProperty("m_defaultTextMeshProUITextContainerSize"); + m_PropAutoSizeTextContainer = serializedObject.FindProperty("m_autoSizeTextContainer"); + m_PropEnableRaycastTarget = serializedObject.FindProperty("m_EnableRaycastTarget"); + + m_PropSpriteAsset = serializedObject.FindProperty("m_defaultSpriteAsset"); + m_PropSpriteAssetPath = serializedObject.FindProperty("m_defaultSpriteAssetPath"); + m_PropEnableEmojiSupport = serializedObject.FindProperty("m_enableEmojiSupport"); + m_PropStyleSheet = serializedObject.FindProperty("m_defaultStyleSheet"); + m_PropColorGradientPresetsPath = serializedObject.FindProperty("m_defaultColorGradientPresetsPath"); + + m_List = new ReorderableList(serializedObject, serializedObject.FindProperty("m_fallbackFontAssets"), true, true, true, true); + + m_List.drawElementCallback = (rect, index, isActive, isFocused) => + { + var element = m_List.serializedProperty.GetArrayElementAtIndex(index); + rect.y += 2; + EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, GUIContent.none); + }; + + m_List.drawHeaderCallback = rect => + { + EditorGUI.LabelField(rect, Styles.fallbackFontAssetsListLabel); + }; + + m_PropMatchMaterialPreset = serializedObject.FindProperty("m_matchMaterialPreset"); + + m_PropWordWrapping = serializedObject.FindProperty("m_enableWordWrapping"); + m_PropKerning = serializedObject.FindProperty("m_enableKerning"); + m_PropExtraPadding = serializedObject.FindProperty("m_enableExtraPadding"); + m_PropTintAllSprites = serializedObject.FindProperty("m_enableTintAllSprites"); + m_PropParseEscapeCharacters = serializedObject.FindProperty("m_enableParseEscapeCharacters"); + m_PropMissingGlyphCharacter = serializedObject.FindProperty("m_missingGlyphCharacter"); + + m_PropWarningsDisabled = serializedObject.FindProperty("m_warningsDisabled"); + + m_GetFontFeaturesAtRuntime = serializedObject.FindProperty("m_GetFontFeaturesAtRuntime"); + + m_PropLeadingCharacters = serializedObject.FindProperty("m_leadingCharacters"); + m_PropFollowingCharacters = serializedObject.FindProperty("m_followingCharacters"); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + float labelWidth = EditorGUIUtility.labelWidth; + float fieldWidth = EditorGUIUtility.fieldWidth; + + // TextMeshPro Font Info Panel + EditorGUI.indentLevel = 0; + + // FONT ASSET + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.defaultFontAssetLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropFontAsset, Styles.defaultFontAssetLabel); + EditorGUILayout.PropertyField(m_PropDefaultFontAssetPath, Styles.defaultFontAssetPathLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // FALLBACK FONT ASSETs + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.fallbackFontAssetsLabel, EditorStyles.boldLabel); + m_List.DoLayoutList(); + + GUILayout.Label(Styles.fallbackMaterialSettingsLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropMatchMaterialPreset, Styles.matchMaterialPresetLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // MISSING GLYPHS + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.dynamicFontSystemSettingsLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_GetFontFeaturesAtRuntime, Styles.getFontFeaturesAtRuntime); + EditorGUILayout.PropertyField(m_PropMissingGlyphCharacter, Styles.missingGlyphLabel); + EditorGUILayout.PropertyField(m_PropWarningsDisabled, Styles.disableWarningsLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // TEXT OBJECT DEFAULT PROPERTIES + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.containerDefaultSettingsLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + + EditorGUILayout.PropertyField(m_PropDefaultTextMeshProTextContainerSize, Styles.textMeshProLabel); + EditorGUILayout.PropertyField(m_PropDefaultTextMeshProUITextContainerSize, Styles.textMeshProUiLabel); + EditorGUILayout.PropertyField(m_PropEnableRaycastTarget, Styles.enableRaycastTarget); + EditorGUILayout.PropertyField(m_PropAutoSizeTextContainer, Styles.autoSizeContainerLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + + GUILayout.Label(Styles.textComponentDefaultSettingsLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropDefaultFontSize, Styles.defaultFontSize); + + EditorGUILayout.BeginHorizontal(); + { + EditorGUILayout.PrefixLabel(Styles.autoSizeRatioLabel); + EditorGUIUtility.labelWidth = 32; + EditorGUIUtility.fieldWidth = 10; + + EditorGUI.indentLevel = 0; + EditorGUILayout.PropertyField(m_PropDefaultAutoSizeMinRatio, Styles.minLabel); + EditorGUILayout.PropertyField(m_PropDefaultAutoSizeMaxRatio, Styles.maxLabel); + EditorGUI.indentLevel = 1; + } + EditorGUILayout.EndHorizontal(); + + EditorGUIUtility.labelWidth = labelWidth; + EditorGUIUtility.fieldWidth = fieldWidth; + + EditorGUILayout.PropertyField(m_PropWordWrapping, Styles.wordWrappingLabel); + EditorGUILayout.PropertyField(m_PropKerning, Styles.kerningLabel); + + EditorGUILayout.PropertyField(m_PropExtraPadding, Styles.extraPaddingLabel); + EditorGUILayout.PropertyField(m_PropTintAllSprites, Styles.tintAllSpritesLabel); + + EditorGUILayout.PropertyField(m_PropParseEscapeCharacters, Styles.parseEscapeCharactersLabel); + + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // SPRITE ASSET + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.defaultSpriteAssetLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropSpriteAsset, Styles.defaultSpriteAssetLabel); + EditorGUILayout.PropertyField(m_PropEnableEmojiSupport, Styles.enableEmojiSupportLabel); + EditorGUILayout.PropertyField(m_PropSpriteAssetPath, Styles.spriteAssetsPathLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // STYLE SHEET + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.defaultStyleSheetLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_PropStyleSheet, Styles.defaultStyleSheetLabel); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + TMP_StyleSheet.UpdateStyleSheet(); + } + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // COLOR GRADIENT PRESETS + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.colorGradientPresetsLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropColorGradientPresetsPath, Styles.colorGradientsPathLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // LINE BREAKING RULE + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.lineBreakingLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropLeadingCharacters); + EditorGUILayout.PropertyField(m_PropFollowingCharacters); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + if (serializedObject.ApplyModifiedProperties()) + { + EditorUtility.SetDirty(target); + TMPro_EventManager.ON_TMP_SETTINGS_CHANGED(); + } + } + } + +#if UNITY_2018_3_OR_NEWER + class TMP_ResourceImporterProvider : SettingsProvider + { + TMP_PackageResourceImporter m_ResourceImporter; + + public TMP_ResourceImporterProvider() + : base("Project/TextMesh Pro", SettingsScope.Project) + { + } + + public override void OnGUI(string searchContext) + { + // Lazy creation that supports domain reload + if (m_ResourceImporter == null) + m_ResourceImporter = new TMP_PackageResourceImporter(); + + m_ResourceImporter.OnGUI(); + } + + public override void OnDeactivate() + { + if (m_ResourceImporter != null) + m_ResourceImporter.OnDestroy(); + } + + static UnityEngine.Object GetTMPSettings() + { + return Resources.Load("TMP Settings"); + } + + [SettingsProviderGroup] + static SettingsProvider[] CreateTMPSettingsProvider() + { + var providers = new List { new TMP_ResourceImporterProvider() }; + + if (GetTMPSettings() != null) + { + var provider = new AssetSettingsProvider("Project/TextMesh Pro/Settings", GetTMPSettings); + provider.PopulateSearchKeywordsFromGUIContentProperties(); + providers.Add(provider); + } + + return providers.ToArray(); + } + } +#endif +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SettingsEditor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SettingsEditor.cs.meta new file mode 100644 index 0000000..a719ae7 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SettingsEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0386b6eb838c47138cd51d1c1b879a35 +timeCreated: 1436658550 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetEditor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetEditor.cs new file mode 100644 index 0000000..4df588e --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetEditor.cs @@ -0,0 +1,896 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using UnityEditorInternal; +using System.Collections.Generic; + + + + +namespace TMPro.EditorUtilities +{ + + [CustomEditor(typeof(TMP_SpriteAsset))] + public class TMP_SpriteAssetEditor : Editor + { + struct UI_PanelState + { + public static bool spriteAssetInfoPanel = true; + public static bool fallbackSpriteAssetPanel = true; + public static bool spriteCharacterTablePanel; + public static bool spriteGlyphTablePanel; + } + + private static string[] s_UiStateLabel = new string[] { "(Click to collapse) ", "(Click to expand) " }; + + int m_moveToIndex; + int m_selectedElement = -1; + int m_CurrentCharacterPage; + int m_CurrentGlyphPage; + + const string k_UndoRedo = "UndoRedoPerformed"; + + string m_CharacterSearchPattern; + List m_CharacterSearchList; + bool m_IsCharacterSearchDirty; + + string m_GlyphSearchPattern; + List m_GlyphSearchList; + bool m_IsGlyphSearchDirty; + + SerializedProperty m_spriteAtlas_prop; + SerializedProperty m_material_prop; + SerializedProperty m_SpriteCharacterTableProperty; + SerializedProperty m_SpriteGlyphTableProperty; + ReorderableList m_fallbackSpriteAssetList; + + TMP_SpriteAsset m_SpriteAsset; + + bool isAssetDirty; + + float m_xOffset; + float m_yOffset; + float m_xAdvance; + float m_scale; + + public void OnEnable() + { + m_SpriteAsset = target as TMP_SpriteAsset; + + m_spriteAtlas_prop = serializedObject.FindProperty("spriteSheet"); + m_material_prop = serializedObject.FindProperty("material"); + m_SpriteCharacterTableProperty = serializedObject.FindProperty("m_SpriteCharacterTable"); + m_SpriteGlyphTableProperty = serializedObject.FindProperty("m_SpriteGlyphTable"); + + // Fallback TMP Sprite Asset list + m_fallbackSpriteAssetList = new ReorderableList(serializedObject, serializedObject.FindProperty("fallbackSpriteAssets"), true, true, true, true); + + m_fallbackSpriteAssetList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + var element = m_fallbackSpriteAssetList.serializedProperty.GetArrayElementAtIndex(index); + rect.y += 2; + EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, GUIContent.none); + }; + + m_fallbackSpriteAssetList.drawHeaderCallback = rect => + { + EditorGUI.LabelField(rect, new GUIContent("Fallback Sprite Asset List", "Select the Sprite Assets that will be searched and used as fallback when a given sprite is missing from this sprite asset.")); + }; + } + + + public override void OnInspectorGUI() + { + + //Debug.Log("OnInspectorGUI Called."); + Event currentEvent = Event.current; + string evt_cmd = currentEvent.commandName; // Get Current Event CommandName to check for Undo Events + + serializedObject.Update(); + + Rect rect; + + // TEXTMESHPRO SPRITE INFO PANEL + GUILayout.Label("Sprite Info", EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_spriteAtlas_prop , new GUIContent("Sprite Atlas")); + if (EditorGUI.EndChangeCheck()) + { + // Assign the new sprite atlas texture to the current material + Texture2D tex = m_spriteAtlas_prop.objectReferenceValue as Texture2D; + if (tex != null) + { + Material mat = m_material_prop.objectReferenceValue as Material; + if (mat != null) + mat.mainTexture = tex; + } + } + + EditorGUILayout.PropertyField(m_material_prop, new GUIContent("Default Material")); + + EditorGUILayout.Space(); + + // FALLBACK SPRITE ASSETS + EditorGUI.indentLevel = 0; + UI_PanelState.fallbackSpriteAssetPanel = EditorGUILayout.Foldout(UI_PanelState.fallbackSpriteAssetPanel, new GUIContent("Fallback Sprite Assets", "Select the Sprite Assets that will be searched and used as fallback when a given sprite is missing from this sprite asset."), true, TMP_UIStyleManager.boldFoldout); + + if (UI_PanelState.fallbackSpriteAssetPanel) + { + m_fallbackSpriteAssetList.DoLayoutList(); + } + + // SPRITE CHARACTER TABLE + #region Display Sprite Character Table + EditorGUI.indentLevel = 0; + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Sprite Character Table", "List of sprite characters contained in this sprite asset."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.spriteCharacterTablePanel = !UI_PanelState.spriteCharacterTablePanel; + + GUI.Label(rect, (UI_PanelState.spriteCharacterTablePanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.spriteCharacterTablePanel) + { + int arraySize = m_SpriteCharacterTableProperty.arraySize; + int itemsPerPage = 10; + + // Display Glyph Management Tools + EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(true)); + { + // Search Bar implementation + #region DISPLAY SEARCH BAR + EditorGUILayout.BeginHorizontal(); + { + EditorGUIUtility.labelWidth = 110f; + EditorGUI.BeginChangeCheck(); + string searchPattern = EditorGUILayout.TextField("Sprite Search", m_CharacterSearchPattern, "SearchTextField"); + if (EditorGUI.EndChangeCheck() || m_IsCharacterSearchDirty) + { + if (string.IsNullOrEmpty(searchPattern) == false) + { + //GUIUtility.keyboardControl = 0; + m_CharacterSearchPattern = searchPattern.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim(); + + // Search Glyph Table for potential matches + SearchCharacterTable(m_CharacterSearchPattern, ref m_CharacterSearchList); + } + else + m_CharacterSearchPattern = null; + + m_IsCharacterSearchDirty = false; + } + + string styleName = string.IsNullOrEmpty(m_CharacterSearchPattern) ? "SearchCancelButtonEmpty" : "SearchCancelButton"; + if (GUILayout.Button(GUIContent.none, styleName)) + { + GUIUtility.keyboardControl = 0; + m_CharacterSearchPattern = string.Empty; + } + } + EditorGUILayout.EndHorizontal(); + #endregion + + // Display Page Navigation + if (!string.IsNullOrEmpty(m_CharacterSearchPattern)) + arraySize = m_CharacterSearchList.Count; + + // Display Page Navigation + DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage); + } + EditorGUILayout.EndVertical(); + + if (arraySize > 0) + { + // Display each SpriteInfo entry using the SpriteInfo property drawer. + for (int i = itemsPerPage * m_CurrentCharacterPage; i < arraySize && i < itemsPerPage * (m_CurrentCharacterPage + 1); i++) + { + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + int elementIndex = i; + if (!string.IsNullOrEmpty(m_CharacterSearchPattern)) + elementIndex = m_CharacterSearchList[i]; + + SerializedProperty spriteCharacterProperty = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(elementIndex); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + EditorGUI.BeginDisabledGroup(i != m_selectedElement); + { + EditorGUILayout.PropertyField(spriteCharacterProperty); + } + EditorGUI.EndDisabledGroup(); + } + EditorGUILayout.EndVertical(); + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_selectedElement == i) + { + m_selectedElement = -1; + } + else + { + m_selectedElement = i; + GUIUtility.keyboardControl = 0; + } + } + + // Draw & Handle Section Area + if (m_selectedElement == i) + { + // Draw selection highlight + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + + // Draw options to MoveUp, MoveDown, Add or Remove Sprites + Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f); + controlRect.width /= 8; + + // Move sprite up. + bool guiEnabled = GUI.enabled; + if (i == 0) { GUI.enabled = false; } + if (GUI.Button(controlRect, "Up")) + { + SwapCharacterElements(i, i - 1); + } + GUI.enabled = guiEnabled; + + // Move sprite down. + controlRect.x += controlRect.width; + if (i == arraySize - 1) { GUI.enabled = false; } + if (GUI.Button(controlRect, "Down")) + { + SwapCharacterElements(i, i + 1); + } + GUI.enabled = guiEnabled; + + // Move sprite to new index + controlRect.x += controlRect.width * 2; + //if (i == arraySize - 1) { GUI.enabled = false; } + m_moveToIndex = EditorGUI.IntField(controlRect, m_moveToIndex); + controlRect.x -= controlRect.width; + if (GUI.Button(controlRect, "Goto")) + { + MoveCharacterToIndex(i, m_moveToIndex); + } + //controlRect.x += controlRect.width; + GUI.enabled = guiEnabled; + + // Add new Sprite + controlRect.x += controlRect.width * 4; + if (GUI.Button(controlRect, "+")) + { + m_SpriteCharacterTableProperty.arraySize += 1; + + int index = m_SpriteCharacterTableProperty.arraySize - 1; + + SerializedProperty spriteInfo_prop = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(index); + + // Copy properties of the selected element + CopyCharacterSerializedProperty(m_SpriteCharacterTableProperty.GetArrayElementAtIndex(elementIndex), ref spriteInfo_prop); + + //spriteInfo_prop.FindPropertyRelative("m_Index").intValue = index; + serializedObject.ApplyModifiedProperties(); + + m_IsCharacterSearchDirty = true; + } + + // Delete selected Sprite + controlRect.x += controlRect.width; + if (m_selectedElement == -1) GUI.enabled = false; + if (GUI.Button(controlRect, "-")) + { + m_SpriteCharacterTableProperty.DeleteArrayElementAtIndex(elementIndex); + + m_selectedElement = -1; + serializedObject.ApplyModifiedProperties(); + + m_IsCharacterSearchDirty = true; + + return; + } + + + } + } + } + + DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage); + + EditorGUIUtility.labelWidth = 40f; + EditorGUIUtility.fieldWidth = 20f; + + GUILayout.Space(5f); + + // GLOBAL TOOLS + #region Global Tools + /* + GUI.enabled = true; + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + rect = EditorGUILayout.GetControlRect(false, 40); + + float width = (rect.width - 75f) / 4; + EditorGUI.LabelField(rect, "Global Offsets & Scale", EditorStyles.boldLabel); + + + rect.x += 70; + bool old_ChangedState = GUI.changed; + + GUI.changed = false; + m_xOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 0, rect.y + 20, width - 5f, 18), new GUIContent("OX:"), m_xOffset); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalBearingX", m_xOffset); + + m_yOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 1, rect.y + 20, width - 5f, 18), new GUIContent("OY:"), m_yOffset); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalBearingY", m_yOffset); + + m_xAdvance = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 2, rect.y + 20, width - 5f, 18), new GUIContent("ADV."), m_xAdvance); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalAdvance", m_xAdvance); + + m_scale = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 3, rect.y + 20, width - 5f, 18), new GUIContent("SF."), m_scale); + if (GUI.changed) UpdateGlobalProperty("m_Scale", m_scale); + + EditorGUILayout.EndVertical(); + + GUI.changed = old_ChangedState; + */ + #endregion + + } + #endregion + + + // SPRITE GLYPH TABLE + #region Display Sprite Glyph Table + EditorGUI.indentLevel = 0; + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Sprite Glyph Table", "A list of the SpriteGlyphs contained in this sprite asset."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.spriteGlyphTablePanel = !UI_PanelState.spriteGlyphTablePanel; + + GUI.Label(rect, (UI_PanelState.spriteGlyphTablePanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.spriteGlyphTablePanel) + { + int arraySize = m_SpriteGlyphTableProperty.arraySize; + int itemsPerPage = 10; + + // Display Glyph Management Tools + EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(true)); + { + // Search Bar implementation + #region DISPLAY SEARCH BAR + EditorGUILayout.BeginHorizontal(); + { + EditorGUIUtility.labelWidth = 110f; + EditorGUI.BeginChangeCheck(); + string searchPattern = EditorGUILayout.TextField("Sprite Search", m_GlyphSearchPattern, "SearchTextField"); + if (EditorGUI.EndChangeCheck() || m_IsGlyphSearchDirty) + { + if (string.IsNullOrEmpty(searchPattern) == false) + { + //GUIUtility.keyboardControl = 0; + m_GlyphSearchPattern = searchPattern.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim(); + + // Search Glyph Table for potential matches + SearchCharacterTable(m_GlyphSearchPattern, ref m_GlyphSearchList); + } + else + m_GlyphSearchPattern = null; + + m_IsGlyphSearchDirty = false; + } + + string styleName = string.IsNullOrEmpty(m_GlyphSearchPattern) ? "SearchCancelButtonEmpty" : "SearchCancelButton"; + if (GUILayout.Button(GUIContent.none, styleName)) + { + GUIUtility.keyboardControl = 0; + m_GlyphSearchPattern = string.Empty; + } + } + EditorGUILayout.EndHorizontal(); + #endregion + + // Display Page Navigation + if (!string.IsNullOrEmpty(m_GlyphSearchPattern)) + arraySize = m_GlyphSearchList.Count; + + // Display Page Navigation + DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage); + } + EditorGUILayout.EndVertical(); + + if (arraySize > 0) + { + // Display each SpriteInfo entry using the SpriteInfo property drawer. + for (int i = itemsPerPage * m_CurrentGlyphPage; i < arraySize && i < itemsPerPage * (m_CurrentGlyphPage + 1); i++) + { + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + int elementIndex = i; + if (!string.IsNullOrEmpty(m_GlyphSearchPattern)) + elementIndex = m_GlyphSearchList[i]; + + SerializedProperty spriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(elementIndex); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + EditorGUI.BeginDisabledGroup(i != m_selectedElement); + { + EditorGUILayout.PropertyField(spriteGlyphProperty); + } + EditorGUI.EndDisabledGroup(); + } + EditorGUILayout.EndVertical(); + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_selectedElement == i) + { + m_selectedElement = -1; + } + else + { + m_selectedElement = i; + GUIUtility.keyboardControl = 0; + } + } + + // Draw & Handle Section Area + if (m_selectedElement == i) + { + // Draw selection highlight + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + + // Draw options to MoveUp, MoveDown, Add or Remove Sprites + Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f); + controlRect.width /= 8; + + // Move sprite up. + bool guiEnabled = GUI.enabled; + if (i == 0) { GUI.enabled = false; } + if (GUI.Button(controlRect, "Up")) + { + SwapGlyphElements(i, i - 1); + } + GUI.enabled = guiEnabled; + + // Move sprite down. + controlRect.x += controlRect.width; + if (i == arraySize - 1) { GUI.enabled = false; } + if (GUI.Button(controlRect, "Down")) + { + SwapGlyphElements(i, i + 1); + } + GUI.enabled = guiEnabled; + + // Move sprite to new index + controlRect.x += controlRect.width * 2; + //if (i == arraySize - 1) { GUI.enabled = false; } + m_moveToIndex = EditorGUI.IntField(controlRect, m_moveToIndex); + controlRect.x -= controlRect.width; + if (GUI.Button(controlRect, "Goto")) + { + MoveGlyphToIndex(i, m_moveToIndex); + } + //controlRect.x += controlRect.width; + GUI.enabled = guiEnabled; + + // Add new Sprite + controlRect.x += controlRect.width * 4; + if (GUI.Button(controlRect, "+")) + { + m_SpriteGlyphTableProperty.arraySize += 1; + + int index = m_SpriteGlyphTableProperty.arraySize - 1; + + SerializedProperty newSpriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(index); + + // Copy properties of the selected element + CopyGlyphSerializedProperty(m_SpriteGlyphTableProperty.GetArrayElementAtIndex(elementIndex), ref newSpriteGlyphProperty); + + newSpriteGlyphProperty.FindPropertyRelative("m_Index").intValue = index; + + serializedObject.ApplyModifiedProperties(); + + m_IsGlyphSearchDirty = true; + + //m_SpriteAsset.UpdateLookupTables(); + } + + // Delete selected Sprite + controlRect.x += controlRect.width; + if (m_selectedElement == -1) GUI.enabled = false; + if (GUI.Button(controlRect, "-")) + { + SerializedProperty selectedSpriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(elementIndex); + + int selectedGlyphIndex = selectedSpriteGlyphProperty.FindPropertyRelative("m_Index").intValue; + + m_SpriteGlyphTableProperty.DeleteArrayElementAtIndex(elementIndex); + + // Remove all Sprite Characters referencing this glyph. + for (int j = 0; j < m_SpriteCharacterTableProperty.arraySize; j++) + { + int glyphIndex = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(j).FindPropertyRelative("m_GlyphIndex").intValue; + + if (glyphIndex == selectedGlyphIndex) + { + // Remove character + m_SpriteCharacterTableProperty.DeleteArrayElementAtIndex(j); + } + } + + m_selectedElement = -1; + serializedObject.ApplyModifiedProperties(); + + m_IsGlyphSearchDirty = true; + + //m_SpriteAsset.UpdateLookupTables(); + + return; + } + + + } + } + } + + DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage); + + EditorGUIUtility.labelWidth = 40f; + EditorGUIUtility.fieldWidth = 20f; + + GUILayout.Space(5f); + + // GLOBAL TOOLS + #region Global Tools + GUI.enabled = true; + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + rect = EditorGUILayout.GetControlRect(false, 40); + + float width = (rect.width - 75f) / 4; + EditorGUI.LabelField(rect, "Global Offsets & Scale", EditorStyles.boldLabel); + + + rect.x += 70; + bool old_ChangedState = GUI.changed; + + GUI.changed = false; + m_xOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 0, rect.y + 20, width - 5f, 18), new GUIContent("OX:"), m_xOffset); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalBearingX", m_xOffset); + + m_yOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 1, rect.y + 20, width - 5f, 18), new GUIContent("OY:"), m_yOffset); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalBearingY", m_yOffset); + + m_xAdvance = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 2, rect.y + 20, width - 5f, 18), new GUIContent("ADV."), m_xAdvance); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalAdvance", m_xAdvance); + + m_scale = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 3, rect.y + 20, width - 5f, 18), new GUIContent("SF."), m_scale); + if (GUI.changed) UpdateGlobalProperty("m_Scale", m_scale); + + EditorGUILayout.EndVertical(); + #endregion + + GUI.changed = old_ChangedState; + + } + #endregion + + + if (serializedObject.ApplyModifiedProperties() || evt_cmd == k_UndoRedo || isAssetDirty) + { + if (m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty || evt_cmd == k_UndoRedo) + m_SpriteAsset.UpdateLookupTables(); + + TMPro_EventManager.ON_SPRITE_ASSET_PROPERTY_CHANGED(true, m_SpriteAsset); + + isAssetDirty = false; + EditorUtility.SetDirty(target); + } + + // Clear selection if mouse event was not consumed. + GUI.enabled = true; + if (currentEvent.type == EventType.MouseDown && currentEvent.button == 0) + m_selectedElement = -1; + + } + + + /// + /// + /// + /// + /// + void DisplayPageNavigation(ref int currentPage, int arraySize, int itemsPerPage) + { + Rect pagePos = EditorGUILayout.GetControlRect(false, 20); + pagePos.width /= 3; + + int shiftMultiplier = Event.current.shift ? 10 : 1; // Page + Shift goes 10 page forward + + // Previous Page + GUI.enabled = currentPage > 0; + + if (GUI.Button(pagePos, "Previous Page")) + { + currentPage -= 1 * shiftMultiplier; + //m_isNewPage = true; + } + + // Page Counter + GUI.enabled = true; + pagePos.x += pagePos.width; + int totalPages = (int)(arraySize / (float)itemsPerPage + 0.999f); + GUI.Label(pagePos, "Page " + (currentPage + 1) + " / " + totalPages, TMP_UIStyleManager.centeredLabel); + + // Next Page + pagePos.x += pagePos.width; + GUI.enabled = itemsPerPage * (currentPage + 1) < arraySize; + + if (GUI.Button(pagePos, "Next Page")) + { + currentPage += 1 * shiftMultiplier; + //m_isNewPage = true; + } + + // Clamp page range + currentPage = Mathf.Clamp(currentPage, 0, arraySize / itemsPerPage); + + GUI.enabled = true; + } + + + /// + /// Method to update the properties of all sprites + /// + /// + /// + void UpdateGlobalProperty(string property, float value) + { + int arraySize = m_SpriteGlyphTableProperty.arraySize; + + for (int i = 0; i < arraySize; i++) + { + // Get a reference to the sprite glyph. + SerializedProperty spriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(i); + + if (property == "m_Scale") + { + spriteGlyphProperty.FindPropertyRelative(property).floatValue = value; + } + else + { + SerializedProperty glyphMetricsProperty = spriteGlyphProperty.FindPropertyRelative("m_Metrics"); + glyphMetricsProperty.FindPropertyRelative(property).floatValue = value; + } + } + + GUI.changed = false; + } + + // Check if any of the Style elements were clicked on. + private bool DoSelectionCheck(Rect selectionArea) + { + Event currentEvent = Event.current; + + switch (currentEvent.type) + { + case EventType.MouseDown: + if (selectionArea.Contains(currentEvent.mousePosition) && currentEvent.button == 0) + { + currentEvent.Use(); + return true; + } + break; + } + + return false; + } + + + /// + /// Swap the sprite item at the currently selected array index to another index. + /// + /// Selected index. + /// New index. + void SwapCharacterElements(int selectedIndex, int newIndex) + { + m_SpriteCharacterTableProperty.MoveArrayElement(selectedIndex, newIndex); + m_selectedElement = newIndex; + m_IsCharacterSearchDirty = true; + m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + } + + /// + /// Move Sprite Element at selected index to another index and reorder sprite list. + /// + /// + /// + void MoveCharacterToIndex(int selectedIndex, int newIndex) + { + int arraySize = m_SpriteCharacterTableProperty.arraySize; + + if (newIndex >= arraySize) + newIndex = arraySize - 1; + + m_SpriteCharacterTableProperty.MoveArrayElement(selectedIndex, newIndex); + + m_selectedElement = newIndex; + m_IsCharacterSearchDirty = true; + m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + + // TODO: Need to handle switching pages if the character or glyph is moved to a different page. + } + + /// + /// + /// + /// + /// + void SwapGlyphElements(int selectedIndex, int newIndex) + { + m_SpriteGlyphTableProperty.MoveArrayElement(selectedIndex, newIndex); + m_selectedElement = newIndex; + m_IsGlyphSearchDirty = true; + m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + } + + /// + /// Move Sprite Element at selected index to another index and reorder sprite list. + /// + /// + /// + void MoveGlyphToIndex(int selectedIndex, int newIndex) + { + int arraySize = m_SpriteGlyphTableProperty.arraySize; + + if (newIndex >= arraySize) + newIndex = arraySize - 1; + + m_SpriteGlyphTableProperty.MoveArrayElement(selectedIndex, newIndex); + + m_selectedElement = newIndex; + m_IsGlyphSearchDirty = true; + m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + + // TODO: Need to handle switching pages if the character or glyph is moved to a different page. + } + + + /// + /// + /// + /// + /// + void CopyCharacterSerializedProperty(SerializedProperty source, ref SerializedProperty target) + { + target.FindPropertyRelative("m_Name").stringValue = source.FindPropertyRelative("m_Name").stringValue; + target.FindPropertyRelative("m_HashCode").intValue = source.FindPropertyRelative("m_HashCode").intValue; + target.FindPropertyRelative("m_Unicode").intValue = source.FindPropertyRelative("m_Unicode").intValue; + target.FindPropertyRelative("m_GlyphIndex").intValue = source.FindPropertyRelative("m_GlyphIndex").intValue; + target.FindPropertyRelative("m_Scale").floatValue = source.FindPropertyRelative("m_Scale").floatValue; + } + + void CopyGlyphSerializedProperty(SerializedProperty srcGlyph, ref SerializedProperty dstGlyph) + { + // TODO : Should make a generic function which copies each of the properties. + + // Index + dstGlyph.FindPropertyRelative("m_Index").intValue = srcGlyph.FindPropertyRelative("m_Index").intValue; + + // GlyphMetrics + SerializedProperty srcGlyphMetrics = srcGlyph.FindPropertyRelative("m_Metrics"); + SerializedProperty dstGlyphMetrics = dstGlyph.FindPropertyRelative("m_Metrics"); + + dstGlyphMetrics.FindPropertyRelative("m_Width").floatValue = srcGlyphMetrics.FindPropertyRelative("m_Width").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_Height").floatValue = srcGlyphMetrics.FindPropertyRelative("m_Height").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalBearingX").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalBearingX").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalBearingY").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalBearingY").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalAdvance").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalAdvance").floatValue; + + // GlyphRect + SerializedProperty srcGlyphRect = srcGlyph.FindPropertyRelative("m_GlyphRect"); + SerializedProperty dstGlyphRect = dstGlyph.FindPropertyRelative("m_GlyphRect"); + + dstGlyphRect.FindPropertyRelative("m_X").intValue = srcGlyphRect.FindPropertyRelative("m_X").intValue; + dstGlyphRect.FindPropertyRelative("m_Y").intValue = srcGlyphRect.FindPropertyRelative("m_Y").intValue; + dstGlyphRect.FindPropertyRelative("m_Width").intValue = srcGlyphRect.FindPropertyRelative("m_Width").intValue; + dstGlyphRect.FindPropertyRelative("m_Height").intValue = srcGlyphRect.FindPropertyRelative("m_Height").intValue; + + dstGlyph.FindPropertyRelative("m_Scale").floatValue = srcGlyph.FindPropertyRelative("m_Scale").floatValue; + dstGlyph.FindPropertyRelative("m_AtlasIndex").intValue = srcGlyph.FindPropertyRelative("m_AtlasIndex").intValue; + } + + + /// + /// + /// + /// + /// + void SearchCharacterTable(string searchPattern, ref List searchResults) + { + if (searchResults == null) searchResults = new List(); + searchResults.Clear(); + + int arraySize = m_SpriteCharacterTableProperty.arraySize; + + for (int i = 0; i < arraySize; i++) + { + SerializedProperty sourceSprite = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(i); + + // Check for potential match against array index + if (i.ToString().Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + + // Check for potential match against decimal id + int id = sourceSprite.FindPropertyRelative("m_GlyphIndex").intValue; + if (id.ToString().Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + + // Check for potential match against name + string name = sourceSprite.FindPropertyRelative("m_Name").stringValue.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim(); + if (name.Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + } + } + + void SearchGlyphTable(string searchPattern, ref List searchResults) + { + if (searchResults == null) searchResults = new List(); + searchResults.Clear(); + + int arraySize = m_SpriteGlyphTableProperty.arraySize; + + for (int i = 0; i < arraySize; i++) + { + SerializedProperty sourceSprite = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(i); + + // Check for potential match against array index + if (i.ToString().Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + + // Check for potential match against decimal id + int id = sourceSprite.FindPropertyRelative("m_GlyphIndex").intValue; + if (id.ToString().Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + + // Check for potential match against name + string name = sourceSprite.FindPropertyRelative("m_Name").stringValue.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim(); + if (name.Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + } + } + + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetEditor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetEditor.cs.meta new file mode 100644 index 0000000..9fcede3 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetEditor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b09be1f217d34247af54863a2f5587e1 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetImporter.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetImporter.cs new file mode 100644 index 0000000..dc4f093 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetImporter.cs @@ -0,0 +1,232 @@ +using UnityEngine; +using UnityEditor; +using System.IO; +using System.Collections.Generic; +using TMPro.EditorUtilities; +using TMPro.SpriteAssetUtilities; + +namespace TMPro +{ + public class TMP_SpriteAssetImporter : EditorWindow + { + // Create Sprite Asset Editor Window + [MenuItem("Window/TextMeshPro/Sprite Importer", false, 2026)] + public static void ShowFontAtlasCreatorWindow() + { + var window = GetWindow(); + window.titleContent = new GUIContent("Sprite Importer"); + window.Focus(); + } + + Texture2D m_SpriteAtlas; + SpriteAssetImportFormats m_SpriteDataFormat = SpriteAssetImportFormats.TexturePacker; + TextAsset m_JsonFile; + + string m_CreationFeedback; + + TMP_SpriteAsset m_SpriteAsset; + List m_SpriteInfoList = new List(); + + + void OnEnable() + { + // Set Editor Window Size + SetEditorWindowSize(); + } + + public void OnGUI() + { + DrawEditorPanel(); + } + + + void DrawEditorPanel() + { + // label + GUILayout.Label("Import Settings", EditorStyles.boldLabel); + + EditorGUI.BeginChangeCheck(); + + // Sprite Texture Selection + m_JsonFile = EditorGUILayout.ObjectField("Sprite Data Source", m_JsonFile, typeof(TextAsset), false) as TextAsset; + + m_SpriteDataFormat = (SpriteAssetImportFormats)EditorGUILayout.EnumPopup("Import Format", m_SpriteDataFormat); + + // Sprite Texture Selection + m_SpriteAtlas = EditorGUILayout.ObjectField("Sprite Texture Atlas", m_SpriteAtlas, typeof(Texture2D), false) as Texture2D; + + if (EditorGUI.EndChangeCheck()) + { + m_CreationFeedback = string.Empty; + } + + GUILayout.Space(10); + + GUI.enabled = m_JsonFile != null && m_SpriteAtlas != null && m_SpriteDataFormat == SpriteAssetImportFormats.TexturePacker; + + // Create Sprite Asset + if (GUILayout.Button("Create Sprite Asset")) + { + m_CreationFeedback = string.Empty; + + // Read json data file + if (m_JsonFile != null && m_SpriteDataFormat == SpriteAssetImportFormats.TexturePacker) + { + TexturePacker.SpriteDataObject sprites = JsonUtility.FromJson(m_JsonFile.text); + + if (sprites != null && sprites.frames != null && sprites.frames.Count > 0) + { + int spriteCount = sprites.frames.Count; + + // Update import results + m_CreationFeedback = "Import Results\n--------------------\n"; + m_CreationFeedback += "" + spriteCount + " Sprites were imported from file."; + + // Create sprite info list + m_SpriteInfoList = CreateSpriteInfoList(sprites); + } + } + + } + + GUI.enabled = true; + + // Creation Feedback + GUILayout.Space(5); + GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.Height(60)); + { + EditorGUILayout.LabelField(m_CreationFeedback, TMP_UIStyleManager.label); + } + GUILayout.EndVertical(); + + GUILayout.Space(5); + GUI.enabled = m_JsonFile != null && m_SpriteAtlas && m_SpriteInfoList != null && m_SpriteInfoList.Count > 0; // Enable Save Button if font_Atlas is not Null. + if (GUILayout.Button("Save Sprite Asset") && m_JsonFile != null) + { + string filePath = EditorUtility.SaveFilePanel("Save Sprite Asset File", new FileInfo(AssetDatabase.GetAssetPath(m_JsonFile)).DirectoryName, m_JsonFile.name, "asset"); + + if (filePath.Length == 0) + return; + + SaveSpriteAsset(filePath); + } + GUI.enabled = true; + } + + + /// + /// + /// + List CreateSpriteInfoList(TexturePacker.SpriteDataObject spriteDataObject) + { + List importedSprites = spriteDataObject.frames; + + List spriteInfoList = new List(); + + for (int i = 0; i < importedSprites.Count; i++) + { + TMP_Sprite sprite = new TMP_Sprite(); + + sprite.id = i; + sprite.name = Path.GetFileNameWithoutExtension(importedSprites[i].filename) ?? ""; + sprite.hashCode = TMP_TextUtilities.GetSimpleHashCode(sprite.name); + + // Attempt to extract Unicode value from name + int unicode; + int indexOfSeperator = sprite.name.IndexOf('-'); + if (indexOfSeperator != -1) + unicode = TMP_TextUtilities.StringHexToInt(sprite.name.Substring(indexOfSeperator + 1)); + else + unicode = TMP_TextUtilities.StringHexToInt(sprite.name); + + sprite.unicode = unicode; + + sprite.x = importedSprites[i].frame.x; + sprite.y = m_SpriteAtlas.height - (importedSprites[i].frame.y + importedSprites[i].frame.h); + sprite.width = importedSprites[i].frame.w; + sprite.height = importedSprites[i].frame.h; + + //Calculate sprite pivot position + sprite.pivot = importedSprites[i].pivot; + + // Properties the can be modified + sprite.xAdvance = sprite.width; + sprite.scale = 1.0f; + sprite.xOffset = 0 - (sprite.width * sprite.pivot.x); + sprite.yOffset = sprite.height - (sprite.height * sprite.pivot.y); + + spriteInfoList.Add(sprite); + } + + return spriteInfoList; + } + + + /// + /// + /// + /// + void SaveSpriteAsset(string filePath) + { + filePath = filePath.Substring(0, filePath.Length - 6); // Trim file extension from filePath. + + string dataPath = Application.dataPath; + + if (filePath.IndexOf(dataPath, System.StringComparison.InvariantCultureIgnoreCase) == -1) + { + Debug.LogError("You're saving the font asset in a directory outside of this project folder. This is not supported. Please select a directory under \"" + dataPath + "\""); + return; + } + + string relativeAssetPath = filePath.Substring(dataPath.Length - 6); + string dirName = Path.GetDirectoryName(relativeAssetPath); + string fileName = Path.GetFileNameWithoutExtension(relativeAssetPath); + string pathNoExt = dirName + "/" + fileName; + + + // Create new Sprite Asset using this texture + m_SpriteAsset = CreateInstance(); + AssetDatabase.CreateAsset(m_SpriteAsset, pathNoExt + ".asset"); + + // Compute the hash code for the sprite asset. + m_SpriteAsset.hashCode = TMP_TextUtilities.GetSimpleHashCode(m_SpriteAsset.name); + + // Assign new Sprite Sheet texture to the Sprite Asset. + m_SpriteAsset.spriteSheet = m_SpriteAtlas; + m_SpriteAsset.spriteInfoList = m_SpriteInfoList; + + // Add new default material for sprite asset. + AddDefaultMaterial(m_SpriteAsset); + } + + + /// + /// Create and add new default material to sprite asset. + /// + /// + static void AddDefaultMaterial(TMP_SpriteAsset spriteAsset) + { + Shader shader = Shader.Find("TextMeshPro/Sprite"); + Material material = new Material(shader); + material.SetTexture(ShaderUtilities.ID_MainTex, spriteAsset.spriteSheet); + + spriteAsset.material = material; + material.hideFlags = HideFlags.HideInHierarchy; + AssetDatabase.AddObjectToAsset(material, spriteAsset); + } + + + /// + /// Limits the minimum size of the editor window. + /// + void SetEditorWindowSize() + { + EditorWindow editorWindow = this; + + Vector2 currentWindowSize = editorWindow.minSize; + + editorWindow.minSize = new Vector2(Mathf.Max(230, currentWindowSize.x), Mathf.Max(300, currentWindowSize.y)); + } + + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetImporter.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetImporter.cs.meta new file mode 100644 index 0000000..d60763a --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetImporter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f1ea944dcf8849ebab391e461b99ccb7 +timeCreated: 1480023525 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetMenu.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetMenu.cs new file mode 100644 index 0000000..5155e1a --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetMenu.cs @@ -0,0 +1,329 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using System.Linq; +using System.IO; +using System.Collections; +using System.Collections.Generic; + + +namespace TMPro.EditorUtilities +{ + + public static class TMP_SpriteAssetMenu + { + // Add a Context Menu to the Sprite Asset Editor Panel to Create and Add a Default Material. + [MenuItem("CONTEXT/TMP_SpriteAsset/Add Default Material", false, 2200)] + static void CopyTexture(MenuCommand command) + { + TMP_SpriteAsset spriteAsset = (TMP_SpriteAsset)command.context; + + // Make sure the sprite asset already contains a default material + if (spriteAsset != null && spriteAsset.material == null) + { + // Add new default material for sprite asset. + AddDefaultMaterial(spriteAsset); + } + } + + // Add a Context Menu to the Sprite Asset Editor Panel to update existing sprite assets. + [MenuItem("CONTEXT/TMP_SpriteAsset/Update Sprite Asset", false, 2100)] + static void UpdateSpriteAsset(MenuCommand command) + { + TMP_SpriteAsset spriteAsset = (TMP_SpriteAsset)command.context; + + if (spriteAsset == null) + return; + + // Get a list of all the sprites contained in the texture referenced by the sprite asset. + // This only works if the texture is set to sprite mode. + string filePath = AssetDatabase.GetAssetPath(spriteAsset.spriteSheet); + + if (string.IsNullOrEmpty(filePath)) + return; + + // Get all the Sprites sorted Left to Right / Top to Bottom + Sprite[] sprites = AssetDatabase.LoadAllAssetsAtPath(filePath).Select(x => x as Sprite).Where(x => x != null).OrderByDescending(x => x.rect.y).ThenBy(x => x.rect.x).ToArray(); + + List spriteGlyphTable = spriteAsset.spriteGlyphTable; + + // Finding available glyph indexes to insert new glyphs into. + var tempGlyphTable = spriteGlyphTable.OrderBy(glyph => glyph.index).ToList(); + List availableGlyphIndexes = new List(); + + int elementIndex = 0; + for (uint i = 0; i < tempGlyphTable[tempGlyphTable.Count - 1].index; i++) + { + uint currentElementIndex = tempGlyphTable[elementIndex].index; + + if (i == currentElementIndex) + elementIndex += 1; + else + availableGlyphIndexes.Add(i); + } + + // Iterate over each of the sprites in the texture to try to match them to existing sprites in the sprite asset. + for (int i = 0; i < sprites.Length; i++) + { + int id = sprites[i].GetInstanceID(); + + int glyphIndex = spriteGlyphTable.FindIndex(item => item.sprite.GetInstanceID() == id); + + if (glyphIndex == -1) + { + // Add new Sprite Glyph to the table + Sprite sprite = sprites[i]; + + TMP_SpriteGlyph spriteGlyph = new TMP_SpriteGlyph(); + + // Get available glyph index + if (availableGlyphIndexes.Count > 0) + { + spriteGlyph.index = availableGlyphIndexes[0]; + availableGlyphIndexes.RemoveAt(0); + } + else + spriteGlyph.index = (uint)spriteGlyphTable.Count; + + spriteGlyph.metrics = new GlyphMetrics(sprite.rect.width, sprite.rect.height, -sprite.pivot.x, sprite.rect.height - sprite.pivot.y, sprite.rect.width); + spriteGlyph.glyphRect = new GlyphRect(sprite.rect); + spriteGlyph.scale = 1.0f; + spriteGlyph.sprite = sprite; + + spriteGlyphTable.Add(spriteGlyph); + + TMP_SpriteCharacter spriteCharacter = new TMP_SpriteCharacter(0, spriteGlyph); + spriteCharacter.name = sprite.name; + spriteCharacter.scale = 1.0f; + + spriteAsset.spriteCharacterTable.Add(spriteCharacter); + } + else + { + // Look for changes in existing Sprite Glyph + Sprite sprite = sprites[i]; + + TMP_SpriteGlyph spriteGlyph = spriteGlyphTable[glyphIndex]; + + // We only update changes to the sprite position / glyph rect. + if (spriteGlyph.glyphRect.x != sprite.rect.x || spriteGlyph.glyphRect.y != sprite.rect.y || spriteGlyph.glyphRect.width != sprite.rect.width || spriteGlyph.glyphRect.height != sprite.rect.height) + spriteGlyph.glyphRect = new GlyphRect(sprite.rect); + } + } + + // Sort glyph table by glyph index + spriteAsset.SortGlyphTable(); + spriteAsset.UpdateLookupTables(); + TMPro_EventManager.ON_SPRITE_ASSET_PROPERTY_CHANGED(true, spriteAsset); + } + + + [MenuItem("Assets/Create/TextMeshPro/Sprite Asset", false, 110)] + public static void CreateSpriteAsset() + { + Object target = Selection.activeObject; + + // Make sure the selection is a texture. + if (target == null || target.GetType() != typeof(Texture2D)) + { + Debug.LogWarning("A texture which contains sprites must first be selected in order to create a TextMesh Pro Sprite Asset."); + return; + } + + Texture2D sourceTex = target as Texture2D; + + // Get the path to the selected texture. + string filePathWithName = AssetDatabase.GetAssetPath(sourceTex); + string fileNameWithExtension = Path.GetFileName(filePathWithName); + string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filePathWithName); + string filePath = filePathWithName.Replace(fileNameWithExtension, ""); + + // Check if Sprite Asset already exists + TMP_SpriteAsset spriteAsset = AssetDatabase.LoadAssetAtPath(filePath + fileNameWithoutExtension + ".asset", typeof(TMP_SpriteAsset)) as TMP_SpriteAsset; + bool isNewAsset = spriteAsset == null ? true : false; + + if (isNewAsset) + { + // Create new Sprite Asset using this texture + spriteAsset = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(spriteAsset, filePath + fileNameWithoutExtension + ".asset"); + + spriteAsset.version = "1.1.0"; + + // Compute the hash code for the sprite asset. + spriteAsset.hashCode = TMP_TextUtilities.GetSimpleHashCode(spriteAsset.name); + + // Assign new Sprite Sheet texture to the Sprite Asset. + spriteAsset.spriteSheet = sourceTex; + + List spriteGlyphTable = new List(); + List spriteCharacterTable = new List(); + + PopulateSpriteTables(sourceTex, ref spriteCharacterTable, ref spriteGlyphTable); + + spriteAsset.spriteCharacterTable = spriteCharacterTable; + spriteAsset.spriteGlyphTable = spriteGlyphTable; + + // Add new default material for sprite asset. + AddDefaultMaterial(spriteAsset); + } + //else + //{ + // spriteAsset.spriteInfoList = UpdateSpriteInfo(spriteAsset); + + // // Make sure the sprite asset already contains a default material + // if (spriteAsset.material == null) + // { + // // Add new default material for sprite asset. + // AddDefaultMaterial(spriteAsset); + // } + + //} + + // Update Lookup tables. + spriteAsset.UpdateLookupTables(); + + // Get the Sprites contained in the Sprite Sheet + EditorUtility.SetDirty(spriteAsset); + + //spriteAsset.sprites = sprites; + + // Set source texture back to Not Readable. + //texImporter.isReadable = false; + + + AssetDatabase.SaveAssets(); + + AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(spriteAsset)); // Re-import font asset to get the new updated version. + + //AssetDatabase.Refresh(); + } + + + private static void PopulateSpriteTables(Texture source, ref List spriteCharacterTable, ref List spriteGlyphTable) + { + //Debug.Log("Creating new Sprite Asset."); + + string filePath = AssetDatabase.GetAssetPath(source); + + // Get all the Sprites sorted by Index + Sprite[] sprites = AssetDatabase.LoadAllAssetsAtPath(filePath).Select(x => x as Sprite).Where(x => x != null).OrderByDescending(x => x.rect.y).ThenBy(x => x.rect.x).ToArray(); + + for (int i = 0; i < sprites.Length; i++) + { + Sprite sprite = sprites[i]; + + TMP_SpriteGlyph spriteGlyph = new TMP_SpriteGlyph(); + spriteGlyph.index = (uint)i; + spriteGlyph.metrics = new GlyphMetrics(sprite.rect.width, sprite.rect.height, -sprite.pivot.x, sprite.rect.height - sprite.pivot.y, sprite.rect.width); + spriteGlyph.glyphRect = new GlyphRect(sprite.rect); + spriteGlyph.scale = 1.0f; + spriteGlyph.sprite = sprite; + + spriteGlyphTable.Add(spriteGlyph); + + TMP_SpriteCharacter spriteCharacter = new TMP_SpriteCharacter(0, spriteGlyph); + spriteCharacter.name = sprite.name; + spriteCharacter.scale = 1.0f; + + spriteCharacterTable.Add(spriteCharacter); + } + } + + + /// + /// Create and add new default material to sprite asset. + /// + /// + private static void AddDefaultMaterial(TMP_SpriteAsset spriteAsset) + { + Shader shader = Shader.Find("TextMeshPro/Sprite"); + Material material = new Material(shader); + material.SetTexture(ShaderUtilities.ID_MainTex, spriteAsset.spriteSheet); + + spriteAsset.material = material; + material.hideFlags = HideFlags.HideInHierarchy; + AssetDatabase.AddObjectToAsset(material, spriteAsset); + } + + + // Update existing SpriteInfo + private static List UpdateSpriteInfo(TMP_SpriteAsset spriteAsset) + { + //Debug.Log("Updating Sprite Asset."); + + string filePath = AssetDatabase.GetAssetPath(spriteAsset.spriteSheet); + + // Get all the Sprites sorted Left to Right / Top to Bottom + Sprite[] sprites = AssetDatabase.LoadAllAssetsAtPath(filePath).Select(x => x as Sprite).Where(x => x != null).OrderByDescending(x => x.rect.y).ThenBy(x => x.rect.x).ToArray(); + + for (int i = 0; i < sprites.Length; i++) + { + Sprite sprite = sprites[i]; + + // Check if the sprite is already contained in the SpriteInfoList + int index = -1; + if (spriteAsset.spriteInfoList.Count > i && spriteAsset.spriteInfoList[i].sprite != null) + index = spriteAsset.spriteInfoList.FindIndex(item => item.sprite.GetInstanceID() == sprite.GetInstanceID()); + + // Use existing SpriteInfo if it already exists + TMP_Sprite spriteInfo = index == -1 ? new TMP_Sprite() : spriteAsset.spriteInfoList[index]; + + Rect spriteRect = sprite.rect; + spriteInfo.x = spriteRect.x; + spriteInfo.y = spriteRect.y; + spriteInfo.width = spriteRect.width; + spriteInfo.height = spriteRect.height; + + // Get Sprite Pivot + Vector2 pivot = new Vector2(0 - (sprite.bounds.min.x) / (sprite.bounds.extents.x * 2), 0 - (sprite.bounds.min.y) / (sprite.bounds.extents.y * 2)); + + // The position of the pivot influences the Offset position. + spriteInfo.pivot = new Vector2(0 - pivot.x * spriteRect.width, spriteRect.height - pivot.y * spriteRect.height); + + if (index == -1) + { + // Find the next available index for this Sprite + int[] ids = spriteAsset.spriteInfoList.Select(item => item.id).ToArray(); + + int id = 0; + for (int j = 0; j < ids.Length; j++ ) + { + if (ids[0] != 0) break; + + if (j > 0 && (ids[j] - ids[j - 1]) > 1) + { + id = ids[j - 1] + 1; + break; + } + + id = j + 1; + } + + spriteInfo.sprite = sprite; + spriteInfo.name = sprite.name; + spriteInfo.hashCode = TMP_TextUtilities.GetSimpleHashCode(spriteInfo.name); + spriteInfo.id = id; + spriteInfo.xAdvance = spriteRect.width; + spriteInfo.scale = 1.0f; + + spriteInfo.xOffset = spriteInfo.pivot.x; + spriteInfo.yOffset = spriteInfo.pivot.y; + + spriteAsset.spriteInfoList.Add(spriteInfo); + + // Sort the Sprites by ID + spriteAsset.spriteInfoList = spriteAsset.spriteInfoList.OrderBy(s => s.id).ToList(); + } + else + { + spriteAsset.spriteInfoList[index] = spriteInfo; + } + } + + return spriteAsset.spriteInfoList; + } + + + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetMenu.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetMenu.cs.meta new file mode 100644 index 0000000..850ab1f --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetMenu.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 1048a87135154606808bf2030da32d18 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs new file mode 100644 index 0000000..abe49a6 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs @@ -0,0 +1,225 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_SpriteCharacter))] + public class TMP_SpriteCharacterPropertyDrawer : PropertyDrawer + { + int m_GlyphSelectedForEditing = -1; + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_SpriteName = property.FindPropertyRelative("m_Name"); + SerializedProperty prop_SpriteNameHashCode = property.FindPropertyRelative("m_HashCode"); + SerializedProperty prop_SpriteUnicode = property.FindPropertyRelative("m_Unicode"); + SerializedProperty prop_SpriteGlyphIndex = property.FindPropertyRelative("m_GlyphIndex"); + SerializedProperty prop_SpriteScale = property.FindPropertyRelative("m_Scale"); + + + GUIStyle style = new GUIStyle(EditorStyles.label); + style.richText = true; + + EditorGUIUtility.labelWidth = 40f; + EditorGUIUtility.fieldWidth = 50; + + Rect rect = new Rect(position.x + 60, position.y, position.width, 49); + + // Display non-editable fields + if (GUI.enabled == false) + { + // Sprite Character Index + int.TryParse(property.displayName.Split(' ')[1], out int spriteCharacterIndex); + EditorGUI.LabelField(new Rect(rect.x, rect.y, 75f, 18), new GUIContent("Index: " + spriteCharacterIndex + ""), style); + + EditorGUI.LabelField(new Rect(rect.x + 75f, rect.y, 120f, 18), new GUIContent("Unicode: 0x" + prop_SpriteUnicode.intValue.ToString("X") + ""), style); + EditorGUI.LabelField(new Rect(rect.x + 195f, rect.y, rect.width - 255, 18), new GUIContent("Name: " + prop_SpriteName.stringValue + ""), style); + + EditorGUI.LabelField(new Rect(rect.x, rect.y + 18, 120, 18), new GUIContent("Glyph ID: " + prop_SpriteGlyphIndex.intValue + ""), style); + + // Draw Sprite Glyph (if exists) + DrawSpriteGlyph(position, property); + + EditorGUI.LabelField(new Rect(rect.x, rect.y + 36, 80, 18), new GUIContent("Scale: " + prop_SpriteScale.floatValue + ""), style); + } + else // Display editable fields + { + // Get a reference to the underlying Sprite Asset + TMP_SpriteAsset spriteAsset = property.serializedObject.targetObject as TMP_SpriteAsset; + + // Sprite Character Index + int.TryParse(property.displayName.Split(' ')[1], out int spriteCharacterIndex); + + EditorGUI.LabelField(new Rect(rect.x, rect.y, 75f, 18), new GUIContent("Index: " + spriteCharacterIndex + ""), style); + + EditorGUIUtility.labelWidth = 55f; + GUI.SetNextControlName("Unicode Input"); + EditorGUI.BeginChangeCheck(); + string unicode = EditorGUI.DelayedTextField(new Rect(rect.x + 75f, rect.y, 120, 18), "Unicode:", prop_SpriteUnicode.intValue.ToString("X")); + + if (GUI.GetNameOfFocusedControl() == "Unicode Input") + { + //Filter out unwanted characters. + char chr = Event.current.character; + if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F')) + { + Event.current.character = '\0'; + } + } + + if (EditorGUI.EndChangeCheck()) + { + // Update Unicode value + prop_SpriteUnicode.intValue = TMP_TextUtilities.StringHexToInt(unicode); + spriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + } + + EditorGUIUtility.labelWidth = 41f; + EditorGUI.BeginChangeCheck(); + EditorGUI.DelayedTextField(new Rect(rect.x + 195f, rect.y, rect.width - 255, 18), prop_SpriteName, new GUIContent("Name:")); + if (EditorGUI.EndChangeCheck()) + { + // Recompute hashCode for new name + prop_SpriteNameHashCode.intValue = TMP_TextUtilities.GetSimpleHashCode(prop_SpriteName.stringValue); + spriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + } + + EditorGUIUtility.labelWidth = 59f; + EditorGUI.BeginChangeCheck(); + EditorGUI.DelayedIntField(new Rect(rect.x, rect.y + 18, 100, 18), prop_SpriteGlyphIndex, new GUIContent("Glyph ID:")); + if (EditorGUI.EndChangeCheck()) + { + spriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + } + + // Draw Sprite Glyph (if exists) + DrawSpriteGlyph(position, property); + + int glyphIndex = prop_SpriteGlyphIndex.intValue; + + // Reset glyph selection if new character has been selected. + if (GUI.enabled && m_GlyphSelectedForEditing != glyphIndex) + m_GlyphSelectedForEditing = -1; + + // Display button to edit the glyph data. + if (GUI.Button(new Rect(rect.x + 120, rect.y + 18, 75, 18), new GUIContent("Edit Glyph"))) + { + if (m_GlyphSelectedForEditing == -1) + m_GlyphSelectedForEditing = glyphIndex; + else + m_GlyphSelectedForEditing = -1; + + // Button clicks should not result in potential change. + GUI.changed = false; + } + + // Show the glyph property drawer if selected + if (glyphIndex == m_GlyphSelectedForEditing && GUI.enabled) + { + if (spriteAsset != null) + { + // Lookup glyph and draw glyph (if available) + int elementIndex = spriteAsset.spriteGlyphTable.FindIndex(item => item.index == glyphIndex); + + if (elementIndex != -1) + { + // Get a reference to the Sprite Glyph Table + SerializedProperty prop_SpriteGlyphTable = property.serializedObject.FindProperty("m_SpriteGlyphTable"); + + SerializedProperty prop_SpriteGlyph = prop_SpriteGlyphTable.GetArrayElementAtIndex(elementIndex); + SerializedProperty prop_GlyphMetrics = prop_SpriteGlyph.FindPropertyRelative("m_Metrics"); + SerializedProperty prop_GlyphRect = prop_SpriteGlyph.FindPropertyRelative("m_GlyphRect"); + + Rect newRect = EditorGUILayout.GetControlRect(false, 115); + EditorGUI.DrawRect(new Rect(newRect.x + 62, newRect.y - 20, newRect.width - 62, newRect.height - 5), new Color(0.1f, 0.1f, 0.1f, 0.45f)); + EditorGUI.DrawRect(new Rect(newRect.x + 63, newRect.y - 19, newRect.width - 64, newRect.height - 7), new Color(0.3f, 0.3f, 0.3f, 0.8f)); + + // Display GlyphRect + newRect.x += 65; + newRect.y -= 18; + newRect.width += 5; + EditorGUI.PropertyField(newRect, prop_GlyphRect); + + // Display GlyphMetrics + newRect.y += 45; + EditorGUI.PropertyField(newRect, prop_GlyphMetrics); + + rect.y += 120; + } + } + } + + EditorGUIUtility.labelWidth = 39f; + EditorGUI.PropertyField(new Rect(rect.x, rect.y + 36, 80, 18), prop_SpriteScale, new GUIContent("Scale:")); + } + } + + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 58; + } + + + void DrawSpriteGlyph(Rect position, SerializedProperty property) + { + // Get a reference to the sprite glyph table + TMP_SpriteAsset spriteAsset = property.serializedObject.targetObject as TMP_SpriteAsset; + + if (spriteAsset == null) + return; + + int glyphIndex = property.FindPropertyRelative("m_GlyphIndex").intValue; + + // Lookup glyph and draw glyph (if available) + int elementIndex = spriteAsset.spriteGlyphTable.FindIndex(item => item.index == glyphIndex); + + if (elementIndex != -1) + { + // Get a reference to the Sprite Glyph Table + SerializedProperty prop_SpriteGlyphTable = property.serializedObject.FindProperty("m_SpriteGlyphTable"); + SerializedProperty prop_SpriteGlyph = prop_SpriteGlyphTable.GetArrayElementAtIndex(elementIndex); + SerializedProperty prop_GlyphRect = prop_SpriteGlyph.FindPropertyRelative("m_GlyphRect"); + + // Get a reference to the sprite texture + Texture tex = spriteAsset.spriteSheet; + + // Return if we don't have a texture assigned to the sprite asset. + if (tex == null) + { + Debug.LogWarning("Please assign a valid Sprite Atlas texture to the [" + spriteAsset.name + "] Sprite Asset.", spriteAsset); + return; + } + + Vector2 spriteTexPosition = new Vector2(position.x, position.y); + Vector2 spriteSize = new Vector2(48, 48); + Vector2 alignmentOffset = new Vector2((58 - spriteSize.x) / 2, (58 - spriteSize.y) / 2); + + float x = prop_GlyphRect.FindPropertyRelative("m_X").intValue; + float y = prop_GlyphRect.FindPropertyRelative("m_Y").intValue; + float spriteWidth = prop_GlyphRect.FindPropertyRelative("m_Width").intValue; + float spriteHeight = prop_GlyphRect.FindPropertyRelative("m_Height").intValue; + + if (spriteWidth >= spriteHeight) + { + spriteSize.y = spriteHeight * spriteSize.x / spriteWidth; + spriteTexPosition.y += (spriteSize.x - spriteSize.y) / 2; + } + else + { + spriteSize.x = spriteWidth * spriteSize.y / spriteHeight; + spriteTexPosition.x += (spriteSize.y - spriteSize.x) / 2; + } + + // Compute the normalized texture coordinates + Rect texCoords = new Rect(x / tex.width, y / tex.height, spriteWidth / tex.width, spriteHeight / tex.height); + GUI.DrawTextureWithTexCoords(new Rect(spriteTexPosition.x + alignmentOffset.x, spriteTexPosition.y + alignmentOffset.y, spriteSize.x, spriteSize.y), tex, texCoords, true); + } + } + + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs.meta new file mode 100644 index 0000000..0733749 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 37cff9f5a86ae494c8cb04423580480d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs new file mode 100644 index 0000000..06f527e --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs @@ -0,0 +1,93 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_SpriteGlyph))] + public class TMP_SpriteGlyphPropertyDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_GlyphIndex = property.FindPropertyRelative("m_Index"); + SerializedProperty prop_GlyphMetrics = property.FindPropertyRelative("m_Metrics"); + SerializedProperty prop_GlyphRect = property.FindPropertyRelative("m_GlyphRect"); + SerializedProperty prop_Scale = property.FindPropertyRelative("m_Scale"); + SerializedProperty prop_AtlasIndex = property.FindPropertyRelative("m_AtlasIndex"); + + GUIStyle style = new GUIStyle(EditorStyles.label); + style.richText = true; + + Rect rect = new Rect(position.x + 70, position.y, position.width, 49); + + // Draw GlyphRect + EditorGUI.PropertyField(rect, prop_GlyphRect); + + // Draw GlyphMetrics + rect.y += 45; + EditorGUI.PropertyField(rect, prop_GlyphMetrics); + + EditorGUIUtility.labelWidth = 40f; + EditorGUI.PropertyField(new Rect(rect.x, rect.y + 65, 75, 18), prop_Scale, new GUIContent("Scale:")); + + EditorGUIUtility.labelWidth = 74f; + EditorGUI.PropertyField(new Rect(rect.x + 85, rect.y + 65, 95, 18), prop_AtlasIndex, new GUIContent("Atlas Index:")); + + DrawGlyph(position, property); + + int.TryParse(property.displayName.Split(' ')[1], out int spriteCharacterIndex); + float labelWidthIndex = GUI.skin.label.CalcSize(new GUIContent("#" + spriteCharacterIndex)).x; + EditorGUI.LabelField(new Rect(position.x, position.y + 5, 64f, 18f), new GUIContent("#" + spriteCharacterIndex), style); + + float labelWidthID = GUI.skin.label.CalcSize(new GUIContent("ID: " + prop_GlyphIndex.intValue)).x; + EditorGUI.LabelField(new Rect(position.x + (64 - labelWidthID) / 2, position.y + 110, 64f, 18f), new GUIContent("ID: " + prop_GlyphIndex.intValue + ""), style); + } + + void DrawGlyph(Rect position, SerializedProperty property) + { + // Get a reference to the sprite texture + Texture tex = (property.serializedObject.targetObject as TMP_SpriteAsset).spriteSheet; + + // Return if we don't have a texture assigned to the sprite asset. + if (tex == null) + { + Debug.LogWarning("Please assign a valid Sprite Atlas texture to the [" + property.serializedObject.targetObject.name + "] Sprite Asset.", property.serializedObject.targetObject); + return; + } + + Vector2 spriteTexPosition = new Vector2(position.x, position.y); + Vector2 spriteSize = new Vector2(65, 65); + + SerializedProperty prop_GlyphRect = property.FindPropertyRelative("m_GlyphRect"); + + int spriteImageX = prop_GlyphRect.FindPropertyRelative("m_X").intValue; + int spriteImageY = prop_GlyphRect.FindPropertyRelative("m_Y").intValue; + int spriteImageWidth = prop_GlyphRect.FindPropertyRelative("m_Width").intValue; + int spriteImageHeight = prop_GlyphRect.FindPropertyRelative("m_Height").intValue; + + if (spriteImageWidth >= spriteImageHeight) + { + spriteSize.y = spriteImageHeight * spriteSize.x / spriteImageWidth; + spriteTexPosition.y += (spriteSize.x - spriteSize.y) / 2; + } + else + { + spriteSize.x = spriteImageWidth * spriteSize.y / spriteImageHeight; + spriteTexPosition.x += (spriteSize.y - spriteSize.x) / 2; + } + + // Compute the normalized texture coordinates + Rect texCoords = new Rect((float)spriteImageX / tex.width, (float)spriteImageY / tex.height, (float)spriteImageWidth / tex.width, (float)spriteImageHeight / tex.height); + GUI.DrawTextureWithTexCoords(new Rect(spriteTexPosition.x + 5, spriteTexPosition.y + 32f, spriteSize.x, spriteSize.y), tex, texCoords, true); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 130f; + } + + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs.meta new file mode 100644 index 0000000..0414562 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 056819c66570ca54cadb72330a354050 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleAssetMenu.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleAssetMenu.cs new file mode 100644 index 0000000..0ae9c38 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleAssetMenu.cs @@ -0,0 +1,49 @@ +using UnityEngine; +using UnityEditor; +using System.IO; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + public static class TMP_StyleAssetMenu + { + + [MenuItem("Assets/Create/TextMeshPro/Style Sheet", false, 120)] + public static void CreateTextMeshProObjectPerform() + { + string filePath; + if (Selection.assetGUIDs.Length == 0) + { + // No asset selected. + filePath = "Assets"; + } + else + { + // Get the path of the selected folder or asset. + filePath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]); + + // Get the file extension of the selected asset as it might need to be removed. + string fileExtension = Path.GetExtension(filePath); + if (fileExtension != "") + { + filePath = Path.GetDirectoryName(filePath); + } + } + + + string filePathWithName = AssetDatabase.GenerateUniqueAssetPath(filePath + "/TMP StyleSheet.asset"); + + //// Create new Style Sheet Asset. + TMP_StyleSheet styleSheet = ScriptableObject.CreateInstance(); + + AssetDatabase.CreateAsset(styleSheet, filePathWithName); + + EditorUtility.SetDirty(styleSheet); + + AssetDatabase.SaveAssets(); + } + } + +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleAssetMenu.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleAssetMenu.cs.meta new file mode 100644 index 0000000..cb44dc2 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleAssetMenu.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 23a562f2cac6401f9f91251c68a1a794 +timeCreated: 1432690168 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleSheetEditor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleSheetEditor.cs new file mode 100644 index 0000000..2e7f6de --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleSheetEditor.cs @@ -0,0 +1,278 @@ +using UnityEngine; +using UnityEditor; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_Style))] + public class StyleDrawer : PropertyDrawer + { + public static readonly float height = 95f; + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return height; + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty nameProperty = property.FindPropertyRelative("m_Name"); + SerializedProperty hashCodeProperty = property.FindPropertyRelative("m_HashCode"); + SerializedProperty openingDefinitionProperty = property.FindPropertyRelative("m_OpeningDefinition"); + SerializedProperty closingDefinitionProperty = property.FindPropertyRelative("m_ClosingDefinition"); + SerializedProperty openingDefinitionArray = property.FindPropertyRelative("m_OpeningTagArray"); + SerializedProperty closingDefinitionArray = property.FindPropertyRelative("m_ClosingTagArray"); + + + EditorGUIUtility.labelWidth = 90; + position.height = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + float labelHeight = position.height + 2f; + + EditorGUI.BeginChangeCheck(); + Rect rect0 = new Rect(position.x, position.y, (position.width) / 2 + 5, position.height); + EditorGUI.PropertyField(rect0, nameProperty); + if (EditorGUI.EndChangeCheck()) + { + // Recompute HashCode if name has changed. + hashCodeProperty.intValue = TMP_TextUtilities.GetSimpleHashCode(nameProperty.stringValue); + + property.serializedObject.ApplyModifiedProperties(); + // Dictionary needs to be updated since HashCode has changed. + TMP_StyleSheet.RefreshStyles(); + } + + // HashCode + Rect rect1 = new Rect(rect0.x + rect0.width + 5, position.y, 65, position.height); + GUI.Label(rect1, "HashCode"); + GUI.enabled = false; + rect1.x += 65; + rect1.width = position.width / 2 - 75; + EditorGUI.PropertyField(rect1, hashCodeProperty, GUIContent.none); + + GUI.enabled = true; + + // Text Tags + EditorGUI.BeginChangeCheck(); + + // Opening Tags + position.y += labelHeight; + GUI.Label(position, "Opening Tags"); + Rect textRect1 = new Rect(108, position.y, position.width - 86, 35); + openingDefinitionProperty.stringValue = EditorGUI.TextArea(textRect1, openingDefinitionProperty.stringValue); + if (EditorGUI.EndChangeCheck()) + { + // If any properties have changed, we need to update the Opening and Closing Arrays. + int size = openingDefinitionProperty.stringValue.Length; + + // Adjust array size to match new string length. + if (openingDefinitionArray.arraySize != size) openingDefinitionArray.arraySize = size; + + for (int i = 0; i < size; i++) + { + SerializedProperty element = openingDefinitionArray.GetArrayElementAtIndex(i); + element.intValue = openingDefinitionProperty.stringValue[i]; + } + } + + EditorGUI.BeginChangeCheck(); + + // Closing Tags + position.y += 38; + GUI.Label(position, "Closing Tags"); + Rect textRect2 = new Rect(108, position.y, position.width - 86, 35); + closingDefinitionProperty.stringValue = EditorGUI.TextArea(textRect2, closingDefinitionProperty.stringValue); + + if (EditorGUI.EndChangeCheck()) + { + // If any properties have changed, we need to update the Opening and Closing Arrays. + int size = closingDefinitionProperty.stringValue.Length; + + // Adjust array size to match new string length. + if (closingDefinitionArray.arraySize != size) closingDefinitionArray.arraySize = size; + + for (int i = 0; i < size; i++) + { + SerializedProperty element = closingDefinitionArray.GetArrayElementAtIndex(i); + element.intValue = closingDefinitionProperty.stringValue[i]; + } + } + + } + } + + + + [CustomEditor(typeof(TMP_StyleSheet)), CanEditMultipleObjects] + public class TMP_StyleEditor : Editor + { + + SerializedProperty m_StyleListProp; + + int m_SelectedElement = -1; + + //private Event m_CurrentEvent; + int m_Page; + + + + void OnEnable() + { + m_StyleListProp = serializedObject.FindProperty("m_StyleList"); + } + + + public override void OnInspectorGUI() + { + Event currentEvent = Event.current; + + serializedObject.Update(); + + int arraySize = m_StyleListProp.arraySize; + int itemsPerPage = (Screen.height - 178) / 111; + + if (arraySize > 0) + { + // Display each Style entry using the StyleDrawer PropertyDrawer. + for (int i = itemsPerPage * m_Page; i < arraySize && i < itemsPerPage * (m_Page + 1); i++) + { + + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + SerializedProperty spriteInfo = m_StyleListProp.GetArrayElementAtIndex(i); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(spriteInfo); + EditorGUILayout.EndVertical(); + if (EditorGUI.EndChangeCheck()) + { + // + } + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_SelectedElement == i) + { + m_SelectedElement = -1; + } + else + { + m_SelectedElement = i; + GUIUtility.keyboardControl = 0; + } + } + + // Handle Selection Highlighting + if (m_SelectedElement == i) + { + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + } + } + } + + int shiftMultiplier = currentEvent.shift ? 10 : 1; // Page + Shift goes 10 page forward + + GUILayout.Space(-3f); + + Rect pagePos = EditorGUILayout.GetControlRect(false, 20); + pagePos.width /= 6; + + // Return if we can't display any items. + if (itemsPerPage == 0) return; + + + // Add new style. + pagePos.x += pagePos.width * 4; + if (GUI.Button(pagePos, "+")) + { + m_StyleListProp.arraySize += 1; + serializedObject.ApplyModifiedProperties(); + TMP_StyleSheet.RefreshStyles(); + } + + + // Delete selected style. + pagePos.x += pagePos.width; + if (m_SelectedElement == -1) GUI.enabled = false; + if (GUI.Button(pagePos, "-")) + { + if (m_SelectedElement != -1) + m_StyleListProp.DeleteArrayElementAtIndex(m_SelectedElement); + + m_SelectedElement = -1; + serializedObject.ApplyModifiedProperties(); + TMP_StyleSheet.RefreshStyles(); + } + + GUILayout.Space(5f); + + pagePos = EditorGUILayout.GetControlRect(false, 20); + pagePos.width /= 3; + + + // Previous Page + if (m_Page > 0) GUI.enabled = true; + else GUI.enabled = false; + + if (GUI.Button(pagePos, "Previous")) + m_Page -= 1 * shiftMultiplier; + + // PAGE COUNTER + GUI.enabled = true; + pagePos.x += pagePos.width; + int totalPages = (int)(arraySize / (float)itemsPerPage + 0.999f); + GUI.Label(pagePos, "Page " + (m_Page + 1) + " / " + totalPages, TMP_UIStyleManager.centeredLabel); + + // Next Page + pagePos.x += pagePos.width; + if (itemsPerPage * (m_Page + 1) < arraySize) GUI.enabled = true; + else GUI.enabled = false; + + if (GUI.Button(pagePos, "Next")) + m_Page += 1 * shiftMultiplier; + + // Clamp page range + m_Page = Mathf.Clamp(m_Page, 0, arraySize / itemsPerPage); + + + if (serializedObject.ApplyModifiedProperties()) + TMPro_EventManager.ON_TEXT_STYLE_PROPERTY_CHANGED(true); + + // Clear selection if mouse event was not consumed. + GUI.enabled = true; + if (currentEvent.type == EventType.MouseDown && currentEvent.button == 0) + m_SelectedElement = -1; + + + } + + + // Check if any of the Style elements were clicked on. + static bool DoSelectionCheck(Rect selectionArea) + { + Event currentEvent = Event.current; + + switch (currentEvent.type) + { + case EventType.MouseDown: + if (selectionArea.Contains(currentEvent.mousePosition) && currentEvent.button == 0) + { + currentEvent.Use(); + return true; + } + break; + } + + return false; + } + + } + +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleSheetEditor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleSheetEditor.cs.meta new file mode 100644 index 0000000..a3bff26 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleSheetEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 34e2c9b9d9e44953933afe37461f44e6 +timeCreated: 1432683777 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs new file mode 100644 index 0000000..1cbea76 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs @@ -0,0 +1,98 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TMP_SubMeshUI)), CanEditMultipleObjects] + public class TMP_SubMeshUI_Editor : Editor + { + private struct m_foldout + { // Track Inspector foldout panel states, globally. + //public static bool textInput = true; + public static bool fontSettings = true; + //public static bool extraSettings = false; + //public static bool shadowSetting = false; + //public static bool materialEditor = true; + } + + private SerializedProperty fontAsset_prop; + private SerializedProperty spriteAsset_prop; + + private TMP_SubMeshUI m_SubMeshComponent; + + private CanvasRenderer m_canvasRenderer; + private Editor m_materialEditor; + private Material m_targetMaterial; + + + public void OnEnable() + { + fontAsset_prop = serializedObject.FindProperty("m_fontAsset"); + spriteAsset_prop = serializedObject.FindProperty("m_spriteAsset"); + + m_SubMeshComponent = target as TMP_SubMeshUI; + //m_rectTransform = m_SubMeshComponent.rectTransform; + m_canvasRenderer = m_SubMeshComponent.canvasRenderer; + + + // Create new Material Editor if one does not exists + if (m_canvasRenderer != null && m_canvasRenderer.GetMaterial() != null) + { + m_materialEditor = Editor.CreateEditor(m_canvasRenderer.GetMaterial()); + m_targetMaterial = m_canvasRenderer.GetMaterial(); + } + } + + + public void OnDisable() + { + // Destroy material editor if one exists + if (m_materialEditor != null) + { + //Debug.Log("Destroying Inline Material Editor."); + DestroyImmediate(m_materialEditor); + } + } + + + + public override void OnInspectorGUI() + { + GUI.enabled = false; + EditorGUILayout.PropertyField(fontAsset_prop); + EditorGUILayout.PropertyField(spriteAsset_prop); + GUI.enabled = true; + + EditorGUILayout.Space(); + + // If a Custom Material Editor exists, we use it. + if (m_canvasRenderer != null && m_canvasRenderer.GetMaterial() != null) + { + Material mat = m_canvasRenderer.GetMaterial(); + + //Debug.Log(mat + " " + m_targetMaterial); + + if (mat != m_targetMaterial) + { + // Destroy previous Material Instance + //Debug.Log("New Material has been assigned."); + m_targetMaterial = mat; + DestroyImmediate(m_materialEditor); + } + + + if (m_materialEditor == null) + { + m_materialEditor = Editor.CreateEditor(mat); + } + + m_materialEditor.DrawHeader(); + + + m_materialEditor.OnInspectorGUI(); + } + } + + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs.meta new file mode 100644 index 0000000..b82410e --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6b01141ed8f74d198965c86f25eb7040 +timeCreated: 1452757501 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMesh_Editor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMesh_Editor.cs new file mode 100644 index 0000000..b5a3cc7 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMesh_Editor.cs @@ -0,0 +1,76 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TMP_SubMesh)), CanEditMultipleObjects] + public class TMP_SubMesh_Editor : Editor + { + private struct m_foldout + { // Track Inspector foldout panel states, globally. + //public static bool textInput = true; + public static bool fontSettings = true; + //public static bool extraSettings = false; + //public static bool shadowSetting = false; + //public static bool materialEditor = true; + } + + private SerializedProperty fontAsset_prop; + private SerializedProperty spriteAsset_prop; + + private TMP_SubMesh m_SubMeshComponent; + private Renderer m_Renderer; + + public void OnEnable() + { + fontAsset_prop = serializedObject.FindProperty("m_fontAsset"); + spriteAsset_prop = serializedObject.FindProperty("m_spriteAsset"); + + m_SubMeshComponent = target as TMP_SubMesh; + + m_Renderer = m_SubMeshComponent.renderer; + } + + + public override void OnInspectorGUI() + { + EditorGUI.indentLevel = 0; + + GUI.enabled = false; + EditorGUILayout.PropertyField(fontAsset_prop); + EditorGUILayout.PropertyField(spriteAsset_prop); + GUI.enabled = true; + + EditorGUI.BeginChangeCheck(); + + // SORTING LAYERS + var sortingLayerNames = SortingLayerHelper.sortingLayerNames; + + // Look up the layer name using the current layer ID + string oldName = SortingLayerHelper.GetSortingLayerNameFromID(m_Renderer.sortingLayerID); + + // Use the name to look up our array index into the names list + int oldLayerIndex = System.Array.IndexOf(sortingLayerNames, oldName); + + // Show the pop-up for the names + int newLayerIndex = EditorGUILayout.Popup("Sorting Layer", oldLayerIndex, sortingLayerNames); + + // If the index changes, look up the ID for the new index to store as the new ID + if (newLayerIndex != oldLayerIndex) + { + //Undo.RecordObject(renderer, "Edit Sorting Layer"); + m_Renderer.sortingLayerID = SortingLayerHelper.GetSortingLayerIDForIndex(newLayerIndex); + //EditorUtility.SetDirty(renderer); + } + + // Expose the manual sorting order + int newSortingLayerOrder = EditorGUILayout.IntField("Order in Layer", m_Renderer.sortingOrder); + if (newSortingLayerOrder != m_Renderer.sortingOrder) + { + //Undo.RecordObject(renderer, "Edit Sorting Order"); + m_Renderer.sortingOrder = newSortingLayerOrder; + } + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMesh_Editor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMesh_Editor.cs.meta new file mode 100644 index 0000000..fd4713b --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMesh_Editor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: dd2fe74169b54bf58fca17288513ef38 +timeCreated: 1456189048 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs new file mode 100644 index 0000000..dbb271c --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs @@ -0,0 +1,119 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TextAlignmentOptions))] + public class TMP_TextAlignmentDrawer : PropertyDrawer + { + const int k_AlignmentButtonWidth = 24; + const int k_AlignmentButtonHeight = 20; + const int k_WideViewWidth = 504; + const int k_ControlsSpacing = 6; + const int k_GroupWidth = k_AlignmentButtonWidth * 6; + static readonly int k_TextAlignmentHash = "DoTextAligmentControl".GetHashCode(); + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return EditorGUIUtility.currentViewWidth > k_WideViewWidth ? k_AlignmentButtonHeight : k_AlignmentButtonHeight * 2 + 3; + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + var id = GUIUtility.GetControlID(k_TextAlignmentHash, FocusType.Keyboard, position); + + EditorGUI.BeginProperty(position, label, property); + { + var controlArea = EditorGUI.PrefixLabel(position, id, label); + + var horizontalAligment = new Rect(controlArea.x, controlArea.y, k_GroupWidth, k_AlignmentButtonHeight); + var verticalAligment = new Rect(!(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.x : horizontalAligment.xMax + k_ControlsSpacing, !(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.y + k_AlignmentButtonHeight + 3 : controlArea.y, k_GroupWidth, k_AlignmentButtonHeight); + + EditorGUI.BeginChangeCheck(); + + var selectedHorizontal = DoHorizontalAligmentControl(horizontalAligment, property); + var selectedVertical = DoVerticalAligmentControl(verticalAligment, property); + + if (EditorGUI.EndChangeCheck()) + { + var value = (0x1 << selectedHorizontal) | (0x100 << selectedVertical); + property.intValue = value; + } + } + EditorGUI.EndProperty(); + } + + static int DoHorizontalAligmentControl(Rect position, SerializedProperty alignment) + { + var selected = TMP_EditorUtility.GetHorizontalAlignmentGridValue(alignment.intValue); + + var values = new bool[6]; + + values[selected] = true; + + if (alignment.hasMultipleDifferentValues) + { + foreach (var obj in alignment.serializedObject.targetObjects) + { + var text = obj as TMP_Text; + if (text != null) + { + values[TMP_EditorUtility.GetHorizontalAlignmentGridValue((int)text.alignment)] = true; + } + } + } + + position.width = k_AlignmentButtonWidth; + + for (var i = 0; i < values.Length; i++) + { + var oldValue = values[i]; + var newValue = TMP_EditorUtility.EditorToggle(position, oldValue, TMP_UIStyleManager.alignContentA[i], i == 0 ? TMP_UIStyleManager.alignmentButtonLeft : (i == 5 ? TMP_UIStyleManager.alignmentButtonRight : TMP_UIStyleManager.alignmentButtonMid)); + if (newValue != oldValue) + { + selected = i; + } + position.x += position.width; + } + + return selected; + } + + static int DoVerticalAligmentControl(Rect position, SerializedProperty alignment) + { + var selected = TMP_EditorUtility.GetVerticalAlignmentGridValue(alignment.intValue); + + var values = new bool[6]; + + values[selected] = true; + + if (alignment.hasMultipleDifferentValues) + { + foreach (var obj in alignment.serializedObject.targetObjects) + { + var text = obj as TMP_Text; + if (text != null) + { + values[TMP_EditorUtility.GetVerticalAlignmentGridValue((int)text.alignment)] = true; + } + } + } + + position.width = k_AlignmentButtonWidth; + + for (var i = 0; i < values.Length; i++) + { + var oldValue = values[i]; + var newValue = TMP_EditorUtility.EditorToggle(position, oldValue, TMP_UIStyleManager.alignContentB[i], i == 0 ? TMP_UIStyleManager.alignmentButtonLeft : (i == 5 ? TMP_UIStyleManager.alignmentButtonRight : TMP_UIStyleManager.alignmentButtonMid)); + if (newValue != oldValue) + { + selected = i; + } + position.x += position.width; + } + + return selected; + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs.meta new file mode 100644 index 0000000..a68a273 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: c55a64c7570474f47a94abe39ebfef04 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UIStyleManager.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UIStyleManager.cs new file mode 100644 index 0000000..0a94a99 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UIStyleManager.cs @@ -0,0 +1,134 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + public static class TMP_UIStyleManager + { + public static GUIStyle label; + public static GUIStyle textAreaBoxWindow; + public static GUIStyle boldFoldout; + public static GUIStyle panelTitle; + public static GUIStyle sectionHeader; + public static GUIStyle centeredLabel; + public static GUIStyle rightLabel; + public static GUIStyle wrappingTextArea; + + public static GUIStyle alignmentButtonLeft; + public static GUIStyle alignmentButtonMid; + public static GUIStyle alignmentButtonRight; + + // Alignment Button Textures + public static Texture2D alignLeft; + public static Texture2D alignCenter; + public static Texture2D alignRight; + public static Texture2D alignJustified; + public static Texture2D alignFlush; + public static Texture2D alignGeoCenter; + public static Texture2D alignTop; + public static Texture2D alignMiddle; + public static Texture2D alignBottom; + public static Texture2D alignBaseline; + public static Texture2D alignMidline; + public static Texture2D alignCapline; + public static Texture2D sectionHeaderTexture; + + public static GUIContent[] alignContentA; + public static GUIContent[] alignContentB; + + static TMP_UIStyleManager() + { + // Find to location of the TextMesh Pro Asset Folder (as users may have moved it) + var tmproAssetFolderPath = TMP_EditorUtility.packageRelativePath; + + if (EditorGUIUtility.isProSkin) + { + alignLeft = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignLeft.psd", typeof(Texture2D)) as Texture2D; + alignCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCenter.psd", typeof(Texture2D)) as Texture2D; + alignRight = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignRight.psd", typeof(Texture2D)) as Texture2D; + alignJustified = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignJustified.psd", typeof(Texture2D)) as Texture2D; + alignFlush = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignFlush.psd", typeof(Texture2D)) as Texture2D; + alignGeoCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCenterGeo.psd", typeof(Texture2D)) as Texture2D; + alignTop = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignTop.psd", typeof(Texture2D)) as Texture2D; + alignMiddle = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignMiddle.psd", typeof(Texture2D)) as Texture2D; + alignBottom = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignBottom.psd", typeof(Texture2D)) as Texture2D; + alignBaseline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignBaseLine.psd", typeof(Texture2D)) as Texture2D; + alignMidline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignMidLine.psd", typeof(Texture2D)) as Texture2D; + alignCapline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCapLine.psd", typeof(Texture2D)) as Texture2D; + sectionHeaderTexture = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/SectionHeader_Dark.psd", typeof(Texture2D)) as Texture2D; + } + else + { + alignLeft = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignLeft_Light.psd", typeof(Texture2D)) as Texture2D; + alignCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCenter_Light.psd", typeof(Texture2D)) as Texture2D; + alignRight = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignRight_Light.psd", typeof(Texture2D)) as Texture2D; + alignJustified = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignJustified_Light.psd", typeof(Texture2D)) as Texture2D; + alignFlush = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignFlush_Light.psd", typeof(Texture2D)) as Texture2D; + alignGeoCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd", typeof(Texture2D)) as Texture2D; + alignTop = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignTop_Light.psd", typeof(Texture2D)) as Texture2D; + alignMiddle = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignMiddle_Light.psd", typeof(Texture2D)) as Texture2D; + alignBottom = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignBottom_Light.psd", typeof(Texture2D)) as Texture2D; + alignBaseline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignBaseLine_Light.psd", typeof(Texture2D)) as Texture2D; + alignMidline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignMidLine_Light.psd", typeof(Texture2D)) as Texture2D; + alignCapline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCapLine_Light.psd", typeof(Texture2D)) as Texture2D; + sectionHeaderTexture = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/SectionHeader_Light.psd", typeof(Texture2D)) as Texture2D; + } + + label = new GUIStyle(EditorStyles.label) { richText = true, wordWrap = true, stretchWidth = true }; + textAreaBoxWindow = new GUIStyle(EditorStyles.textArea) { richText = true }; + boldFoldout = new GUIStyle(EditorStyles.foldout) { fontStyle = FontStyle.Bold }; + panelTitle = new GUIStyle(EditorStyles.label) { fontStyle = FontStyle.Bold }; + + sectionHeader = new GUIStyle(EditorStyles.label) { fixedHeight = 22, richText = true, border = new RectOffset(9, 9, 0, 0), overflow = new RectOffset(9, 0, 0, 0), padding = new RectOffset(0, 0, 4, 0) }; + sectionHeader.normal.background = sectionHeaderTexture; + + centeredLabel = new GUIStyle(EditorStyles.label) { alignment = TextAnchor.MiddleCenter}; + rightLabel = new GUIStyle(EditorStyles.label) { alignment = TextAnchor.MiddleRight, richText = true }; + + + alignmentButtonLeft = new GUIStyle(EditorStyles.miniButtonLeft); + alignmentButtonLeft.padding.left = 4; + alignmentButtonLeft.padding.right = 4; + alignmentButtonLeft.padding.top = 2; + alignmentButtonLeft.padding.bottom = 2; + + alignmentButtonMid = new GUIStyle(EditorStyles.miniButtonMid); + alignmentButtonMid.padding.left = 4; + alignmentButtonMid.padding.right = 4; + alignmentButtonLeft.padding.top = 2; + alignmentButtonLeft.padding.bottom = 2; + + alignmentButtonRight = new GUIStyle(EditorStyles.miniButtonRight); + alignmentButtonRight.padding.left = 4; + alignmentButtonRight.padding.right = 4; + alignmentButtonLeft.padding.top = 2; + alignmentButtonLeft.padding.bottom = 2; + + wrappingTextArea = new GUIStyle(EditorStyles.textArea); + wrappingTextArea.wordWrap = true; + + alignContentA = new [] + { + new GUIContent(alignLeft, "Left"), + new GUIContent(alignCenter, "Center"), + new GUIContent(alignRight, "Right"), + new GUIContent(alignJustified, "Justified"), + new GUIContent(alignFlush, "Flush"), + new GUIContent(alignGeoCenter, "Geometry Center") + }; + + alignContentB = new [] + { + new GUIContent(alignTop, "Top"), + new GUIContent(alignMiddle, "Middle"), + new GUIContent(alignBottom, "Bottom"), + new GUIContent(alignBaseline, "Baseline"), + new GUIContent(alignMidline, "Midline"), + new GUIContent(alignCapline, "Capline") + }; + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UIStyleManager.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UIStyleManager.cs.meta new file mode 100644 index 0000000..9c09bfa --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UIStyleManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 30a939dce2fd4073955f2f20e659d506 +timeCreated: 1426454127 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UiEditorPanel.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UiEditorPanel.cs new file mode 100644 index 0000000..8718165 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UiEditorPanel.cs @@ -0,0 +1,91 @@ +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + + [CustomEditor(typeof(TextMeshProUGUI), true), CanEditMultipleObjects] + public class TMP_UiEditorPanel : TMP_BaseEditorPanel + { + static readonly GUIContent k_RaycastTargetLabel = new GUIContent("Raycast Target", "Whether the text blocks raycasts from the Graphic Raycaster."); + + SerializedProperty m_RaycastTargetProp; + + protected override void OnEnable() + { + base.OnEnable(); + m_RaycastTargetProp = serializedObject.FindProperty("m_RaycastTarget"); + } + + protected override void DrawExtraSettings() + { + Foldout.extraSettings = EditorGUILayout.Foldout(Foldout.extraSettings, k_ExtraSettingsLabel, true, TMP_UIStyleManager.boldFoldout); + if (Foldout.extraSettings) + { + EditorGUI.indentLevel += 1; + + DrawMargins(); + + DrawGeometrySorting(); + + DrawRichText(); + + DrawRaycastTarget(); + + DrawParsing(); + + DrawKerning(); + + DrawPadding(); + + EditorGUI.indentLevel -= 1; + } + } + + protected void DrawRaycastTarget() + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_RaycastTargetProp, k_RaycastTargetLabel); + if (EditorGUI.EndChangeCheck()) + { + // Change needs to propagate to the child sub objects. + Graphic[] graphicComponents = m_TextComponent.GetComponentsInChildren(); + for (int i = 1; i < graphicComponents.Length; i++) + graphicComponents[i].raycastTarget = m_RaycastTargetProp.boolValue; + + m_HavePropertiesChanged = true; + } + } + + // Method to handle multi object selection + protected override bool IsMixSelectionTypes() + { + GameObject[] objects = Selection.gameObjects; + if (objects.Length > 1) + { + for (int i = 0; i < objects.Length; i++) + { + if (objects[i].GetComponent() == null) + return true; + } + } + return false; + } + protected override void OnUndoRedo() + { + int undoEventId = Undo.GetCurrentGroup(); + int lastUndoEventId = s_EventId; + + if (undoEventId != lastUndoEventId) + { + for (int i = 0; i < targets.Length; i++) + { + //Debug.Log("Undo & Redo Performed detected in Editor Panel. Event ID:" + Undo.GetCurrentGroup()); + TMPro_EventManager.ON_TEXTMESHPRO_UGUI_PROPERTY_CHANGED(true, targets[i] as TextMeshProUGUI); + s_EventId = undoEventId; + } + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UiEditorPanel.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UiEditorPanel.cs.meta new file mode 100644 index 0000000..ea3b36b --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UiEditorPanel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 21c0044a7f964773be90d197a78e4703 +timeCreated: 1443571501 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_ContextMenus.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_ContextMenus.cs new file mode 100644 index 0000000..8d65b70 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_ContextMenus.cs @@ -0,0 +1,341 @@ +using UnityEngine; +using UnityEditor; +using System.IO; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + public class TMP_ContextMenus : Editor + { + + private static Texture m_copiedTexture; + + private static Material m_copiedProperties; + private static Material m_copiedAtlasProperties; + + + // Add a Context Menu to the Texture Editor Panel to allow Copy / Paste of Texture. + [MenuItem("CONTEXT/Texture/Copy", false, 2000)] + static void CopyTexture(MenuCommand command) + { + m_copiedTexture = command.context as Texture; + } + + + // Select the currently assigned material or material preset. + [MenuItem("CONTEXT/Material/Select Material", false, 500)] + static void SelectMaterial(MenuCommand command) + { + Material mat = command.context as Material; + + // Select current material + EditorUtility.FocusProjectWindow(); + EditorGUIUtility.PingObject(mat); + } + + + // Add a Context Menu to allow easy duplication of the Material. + [MenuItem("CONTEXT/Material/Create Material Preset", false)] + static void DuplicateMaterial(MenuCommand command) + { + // Get the type of text object + // If material is not a base material, we get material leaks... + + Material source_Mat = (Material)command.context; + if (!EditorUtility.IsPersistent(source_Mat)) + { + Debug.LogWarning("Material is an instance and cannot be converted into a permanent asset."); + return; + } + + + string assetPath = AssetDatabase.GetAssetPath(source_Mat).Split('.')[0]; + + Material duplicate = new Material(source_Mat); + + // Need to manually copy the shader keywords + duplicate.shaderKeywords = source_Mat.shaderKeywords; + + AssetDatabase.CreateAsset(duplicate, AssetDatabase.GenerateUniqueAssetPath(assetPath + ".mat")); + + // Assign duplicate Material to selected object (if one is) + if (Selection.activeGameObject != null) + { + TMP_Text textObject = Selection.activeGameObject.GetComponent(); + if (textObject != null) + { + textObject.fontSharedMaterial = duplicate; + } + else + { + TMP_SubMesh subMeshObject = Selection.activeGameObject.GetComponent(); + + if (subMeshObject != null) + subMeshObject.sharedMaterial = duplicate; + else + { + TMP_SubMeshUI subMeshUIObject = Selection.activeGameObject.GetComponent(); + + if (subMeshUIObject != null) + subMeshUIObject.sharedMaterial = duplicate; + } + } + } + + // Ping newly created Material Preset. + EditorUtility.FocusProjectWindow(); + EditorGUIUtility.PingObject(duplicate); + } + + + //[MenuItem("CONTEXT/MaterialComponent/Copy Material Properties", false)] + [MenuItem("CONTEXT/Material/Copy Material Properties", false)] + static void CopyMaterialProperties(MenuCommand command) + { + Material mat = null; + if (command.context.GetType() == typeof(Material)) + mat = (Material)command.context; + else + { + mat = Selection.activeGameObject.GetComponent().GetMaterial(); + } + + m_copiedProperties = new Material(mat); + + m_copiedProperties.shaderKeywords = mat.shaderKeywords; + + m_copiedProperties.hideFlags = HideFlags.DontSave; + } + + + // PASTE MATERIAL + //[MenuItem("CONTEXT/MaterialComponent/Paste Material Properties", false)] + [MenuItem("CONTEXT/Material/Paste Material Properties", false)] + static void PasteMaterialProperties(MenuCommand command) + { + + if (m_copiedProperties == null) + { + Debug.LogWarning("No Material Properties to Paste. Use Copy Material Properties first."); + return; + } + + Material mat = null; + if (command.context.GetType() == typeof(Material)) + mat = (Material)command.context; + else + { + mat = Selection.activeGameObject.GetComponent().GetMaterial(); + } + + Undo.RecordObject(mat, "Paste Material"); + + ShaderUtilities.GetShaderPropertyIDs(); // Make sure we have valid Property IDs + if (mat.HasProperty(ShaderUtilities.ID_GradientScale)) + { + // Preserve unique SDF properties from destination material. + m_copiedProperties.SetTexture(ShaderUtilities.ID_MainTex, mat.GetTexture(ShaderUtilities.ID_MainTex)); + m_copiedProperties.SetFloat(ShaderUtilities.ID_GradientScale, mat.GetFloat(ShaderUtilities.ID_GradientScale)); + m_copiedProperties.SetFloat(ShaderUtilities.ID_TextureWidth, mat.GetFloat(ShaderUtilities.ID_TextureWidth)); + m_copiedProperties.SetFloat(ShaderUtilities.ID_TextureHeight, mat.GetFloat(ShaderUtilities.ID_TextureHeight)); + } + + EditorShaderUtilities.CopyMaterialProperties(m_copiedProperties, mat); + + // Copy ShaderKeywords from one material to the other. + mat.shaderKeywords = m_copiedProperties.shaderKeywords; + + // Let TextMeshPro Objects that this mat has changed. + TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, mat); + } + + + // Enable Resetting of Material properties without losing unique properties of the font atlas. + [MenuItem("CONTEXT/Material/Reset", false, 2100)] + static void ResetSettings(MenuCommand command) + { + + Material mat = null; + if (command.context.GetType() == typeof(Material)) + mat = (Material)command.context; + else + { + mat = Selection.activeGameObject.GetComponent().GetMaterial(); + } + + Undo.RecordObject(mat, "Reset Material"); + + ShaderUtilities.GetShaderPropertyIDs(); // Make sure we have valid Property IDs + if (mat.HasProperty(ShaderUtilities.ID_GradientScale)) + { + // Copy unique properties of the SDF Material + var texture = mat.GetTexture(ShaderUtilities.ID_MainTex); + var gradientScale = mat.GetFloat(ShaderUtilities.ID_GradientScale); + var texWidth = mat.GetFloat(ShaderUtilities.ID_TextureWidth); + var texHeight = mat.GetFloat(ShaderUtilities.ID_TextureHeight); + + var stencilId = 0.0f; + var stencilComp = 0.0f; + + if (mat.HasProperty(ShaderUtilities.ID_StencilID)) + { + stencilId = mat.GetFloat(ShaderUtilities.ID_StencilID); + stencilComp = mat.GetFloat(ShaderUtilities.ID_StencilComp); + } + + var normalWeight = mat.GetFloat(ShaderUtilities.ID_WeightNormal); + var boldWeight = mat.GetFloat(ShaderUtilities.ID_WeightBold); + + // Reset the material + Unsupported.SmartReset(mat); + + // Reset ShaderKeywords + mat.shaderKeywords = new string[0]; // { "BEVEL_OFF", "GLOW_OFF", "UNDERLAY_OFF" }; + + // Copy unique material properties back to the material. + mat.SetTexture(ShaderUtilities.ID_MainTex, texture); + mat.SetFloat(ShaderUtilities.ID_GradientScale, gradientScale); + mat.SetFloat(ShaderUtilities.ID_TextureWidth, texWidth); + mat.SetFloat(ShaderUtilities.ID_TextureHeight, texHeight); + + if (mat.HasProperty(ShaderUtilities.ID_StencilID)) + { + mat.SetFloat(ShaderUtilities.ID_StencilID, stencilId); + mat.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp); + } + + mat.SetFloat(ShaderUtilities.ID_WeightNormal, normalWeight); + mat.SetFloat(ShaderUtilities.ID_WeightBold, boldWeight); + } + else + { + Unsupported.SmartReset(mat); + } + + TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, mat); + } + + + + //This function is used for debugging and fixing potentially broken font atlas links. + [MenuItem("CONTEXT/Material/Copy Atlas", false, 2000)] + static void CopyAtlas(MenuCommand command) + { + Material mat = command.context as Material; + + m_copiedAtlasProperties = new Material(mat); + m_copiedAtlasProperties.hideFlags = HideFlags.DontSave; + } + + + // This function is used for debugging and fixing potentially broken font atlas links + [MenuItem("CONTEXT/Material/Paste Atlas", false, 2001)] + static void PasteAtlas(MenuCommand command) + { + Material mat = command.context as Material; + + if (m_copiedAtlasProperties != null) + { + Undo.RecordObject(mat, "Paste Texture"); + + ShaderUtilities.GetShaderPropertyIDs(); // Make sure we have valid Property IDs + mat.SetTexture(ShaderUtilities.ID_MainTex, m_copiedAtlasProperties.GetTexture(ShaderUtilities.ID_MainTex)); + mat.SetFloat(ShaderUtilities.ID_GradientScale, m_copiedAtlasProperties.GetFloat(ShaderUtilities.ID_GradientScale)); + mat.SetFloat(ShaderUtilities.ID_TextureWidth, m_copiedAtlasProperties.GetFloat(ShaderUtilities.ID_TextureWidth)); + mat.SetFloat(ShaderUtilities.ID_TextureHeight, m_copiedAtlasProperties.GetFloat(ShaderUtilities.ID_TextureHeight)); + } + else if (m_copiedTexture != null) + { + Undo.RecordObject(mat, "Paste Texture"); + + mat.SetTexture(ShaderUtilities.ID_MainTex, m_copiedTexture); + } + + //DestroyImmediate(m_copiedAtlasProperties); + } + + + // Context Menus for TMPro Font Assets + //This function is used for debugging and fixing potentially broken font atlas links. + [MenuItem("CONTEXT/TMP_FontAsset/Extract Atlas", false, 2100)] + static void ExtractAtlas(MenuCommand command) + { + TMP_FontAsset font = command.context as TMP_FontAsset; + + string fontPath = AssetDatabase.GetAssetPath(font); + string texPath = Path.GetDirectoryName(fontPath) + "/" + Path.GetFileNameWithoutExtension(fontPath) + " Atlas.png"; + + // Create a Serialized Object of the texture to allow us to make it readable. + SerializedObject texprop = new SerializedObject(font.material.GetTexture(ShaderUtilities.ID_MainTex)); + texprop.FindProperty("m_IsReadable").boolValue = true; + texprop.ApplyModifiedProperties(); + + // Create a copy of the texture. + Texture2D tex = Instantiate(font.material.GetTexture(ShaderUtilities.ID_MainTex)) as Texture2D; + + // Set the texture to not readable again. + texprop.FindProperty("m_IsReadable").boolValue = false; + texprop.ApplyModifiedProperties(); + + Debug.Log(texPath); + // Saving File for Debug + var pngData = tex.EncodeToPNG(); + File.WriteAllBytes(texPath, pngData); + + AssetDatabase.Refresh(); + DestroyImmediate(tex); + } + + /// + /// + /// + /// + [MenuItem("CONTEXT/TMP_FontAsset/Update Atlas Texture...", false, 2000)] + static void RegenerateFontAsset(MenuCommand command) + { + TMP_FontAsset fontAsset = command.context as TMP_FontAsset; + + if (fontAsset != null) + { + TMPro_FontAssetCreatorWindow.ShowFontAtlasCreatorWindow(fontAsset); + } + } + + + /// + /// Clear Font Asset Data + /// + /// + [MenuItem("CONTEXT/TMP_FontAsset/Reset", false, 100)] + static void ClearFontAssetData(MenuCommand command) + { + TMP_FontAsset fontAsset = command.context as TMP_FontAsset; + + if (fontAsset != null && Selection.activeObject != fontAsset) + { + Selection.activeObject = fontAsset; + } + + fontAsset.ClearFontAssetData(true); + + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, fontAsset); + } + + + [MenuItem("CONTEXT/TrueTypeFontImporter/Create TMP Font Asset...", false, 200)] + static void CreateFontAsset(MenuCommand command) + { + TrueTypeFontImporter importer = command.context as TrueTypeFontImporter; + + if (importer != null) + { + Font sourceFontFile = AssetDatabase.LoadAssetAtPath(importer.assetPath); + + if (sourceFontFile) + TMPro_FontAssetCreatorWindow.ShowFontAtlasCreatorWindow(sourceFontFile); + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_ContextMenus.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_ContextMenus.cs.meta new file mode 100644 index 0000000..f16753f --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_ContextMenus.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 44e1d646473a40178712cb2150f54cec +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_CreateObjectMenu.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_CreateObjectMenu.cs new file mode 100644 index 0000000..a7c1cc1 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_CreateObjectMenu.cs @@ -0,0 +1,311 @@ +using UnityEngine; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEditor.Experimental.SceneManagement; +using UnityEngine.SceneManagement; +using UnityEngine.UI; +using UnityEngine.EventSystems; + + +namespace TMPro.EditorUtilities +{ + public static class TMPro_CreateObjectMenu + { + + /// + /// Create a TextMeshPro object that works with the Mesh Renderer + /// + /// + [MenuItem("GameObject/3D Object/Text - TextMeshPro", false, 30)] + static void CreateTextMeshProObjectPerform(MenuCommand command) + { + GameObject go = new GameObject("Text (TMP)"); + + // Add support for new prefab mode + StageUtility.PlaceGameObjectInCurrentStage(go); + + TextMeshPro textMeshPro = go.AddComponent(); + textMeshPro.text = "Sample text"; + textMeshPro.alignment = TextAlignmentOptions.TopLeft; + + Undo.RegisterCreatedObjectUndo((Object)go, "Create " + go.name); + + GameObject contextObject = command.context as GameObject; + if (contextObject != null) + { + GameObjectUtility.SetParentAndAlign(go, contextObject); + Undo.SetTransformParent(go.transform, contextObject.transform, "Parent " + go.name); + } + + Selection.activeGameObject = go; + } + + + /// + /// Create a TextMeshPro object that works with the CanvasRenderer + /// + /// + [MenuItem("GameObject/UI/Text - TextMeshPro", false, 2001)] + static void CreateTextMeshProGuiObjectPerform(MenuCommand menuCommand) + { + GameObject go = TMP_DefaultControls.CreateText(GetStandardResources()); + + // Override text color and font size + TMP_Text textComponent = go.GetComponent(); + textComponent.color = Color.white; + if (textComponent.m_isWaitingOnResourceLoad == false) + textComponent.fontSize = TMP_Settings.defaultFontSize; + + PlaceUIElementRoot(go, menuCommand); + } + + [MenuItem("GameObject/UI/Button - TextMeshPro", false, 2031)] + static public void AddButton(MenuCommand menuCommand) + { + GameObject go = TMP_DefaultControls.CreateButton(GetStandardResources()); + + // Override font size + TMP_Text textComponent = go.GetComponentInChildren(); + textComponent.fontSize = 24; + + PlaceUIElementRoot(go, menuCommand); + } + + + + [MenuItem("GameObject/UI/Input Field - TextMeshPro", false, 2037)] + static void AddTextMeshProInputField(MenuCommand menuCommand) + { + GameObject go = TMP_DefaultControls.CreateInputField(GetStandardResources()); + PlaceUIElementRoot(go, menuCommand); + } + + + [MenuItem("GameObject/UI/Dropdown - TextMeshPro", false, 2036)] + static public void AddDropdown(MenuCommand menuCommand) + { + GameObject go = TMP_DefaultControls.CreateDropdown(GetStandardResources()); + PlaceUIElementRoot(go, menuCommand); + } + + + private const string kUILayerName = "UI"; + + private const string kStandardSpritePath = "UI/Skin/UISprite.psd"; + private const string kBackgroundSpritePath = "UI/Skin/Background.psd"; + private const string kInputFieldBackgroundPath = "UI/Skin/InputFieldBackground.psd"; + private const string kKnobPath = "UI/Skin/Knob.psd"; + private const string kCheckmarkPath = "UI/Skin/Checkmark.psd"; + private const string kDropdownArrowPath = "UI/Skin/DropdownArrow.psd"; + private const string kMaskPath = "UI/Skin/UIMask.psd"; + + static private TMP_DefaultControls.Resources s_StandardResources; + + + static private TMP_DefaultControls.Resources GetStandardResources() + { + if (s_StandardResources.standard == null) + { + s_StandardResources.standard = AssetDatabase.GetBuiltinExtraResource(kStandardSpritePath); + s_StandardResources.background = AssetDatabase.GetBuiltinExtraResource(kBackgroundSpritePath); + s_StandardResources.inputField = AssetDatabase.GetBuiltinExtraResource(kInputFieldBackgroundPath); + s_StandardResources.knob = AssetDatabase.GetBuiltinExtraResource(kKnobPath); + s_StandardResources.checkmark = AssetDatabase.GetBuiltinExtraResource(kCheckmarkPath); + s_StandardResources.dropdown = AssetDatabase.GetBuiltinExtraResource(kDropdownArrowPath); + s_StandardResources.mask = AssetDatabase.GetBuiltinExtraResource(kMaskPath); + } + return s_StandardResources; + } + + + private static void SetPositionVisibleinSceneView(RectTransform canvasRTransform, RectTransform itemTransform) + { + // Find the best scene view + SceneView sceneView = SceneView.lastActiveSceneView; + if (sceneView == null && SceneView.sceneViews.Count > 0) + sceneView = SceneView.sceneViews[0] as SceneView; + + // Couldn't find a SceneView. Don't set position. + if (sceneView == null || sceneView.camera == null) + return; + + // Create world space Plane from canvas position. + Camera camera = sceneView.camera; + Vector3 position = Vector3.zero; + if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRTransform, new Vector2(camera.pixelWidth / 2, camera.pixelHeight / 2), camera, out Vector2 localPlanePosition)) + { + // Adjust for canvas pivot + localPlanePosition.x = localPlanePosition.x + canvasRTransform.sizeDelta.x * canvasRTransform.pivot.x; + localPlanePosition.y = localPlanePosition.y + canvasRTransform.sizeDelta.y * canvasRTransform.pivot.y; + + localPlanePosition.x = Mathf.Clamp(localPlanePosition.x, 0, canvasRTransform.sizeDelta.x); + localPlanePosition.y = Mathf.Clamp(localPlanePosition.y, 0, canvasRTransform.sizeDelta.y); + + // Adjust for anchoring + position.x = localPlanePosition.x - canvasRTransform.sizeDelta.x * itemTransform.anchorMin.x; + position.y = localPlanePosition.y - canvasRTransform.sizeDelta.y * itemTransform.anchorMin.y; + + Vector3 minLocalPosition; + minLocalPosition.x = canvasRTransform.sizeDelta.x * (0 - canvasRTransform.pivot.x) + itemTransform.sizeDelta.x * itemTransform.pivot.x; + minLocalPosition.y = canvasRTransform.sizeDelta.y * (0 - canvasRTransform.pivot.y) + itemTransform.sizeDelta.y * itemTransform.pivot.y; + + Vector3 maxLocalPosition; + maxLocalPosition.x = canvasRTransform.sizeDelta.x * (1 - canvasRTransform.pivot.x) - itemTransform.sizeDelta.x * itemTransform.pivot.x; + maxLocalPosition.y = canvasRTransform.sizeDelta.y * (1 - canvasRTransform.pivot.y) - itemTransform.sizeDelta.y * itemTransform.pivot.y; + + position.x = Mathf.Clamp(position.x, minLocalPosition.x, maxLocalPosition.x); + position.y = Mathf.Clamp(position.y, minLocalPosition.y, maxLocalPosition.y); + } + + itemTransform.anchoredPosition = position; + itemTransform.localRotation = Quaternion.identity; + itemTransform.localScale = Vector3.one; + } + + + private static void PlaceUIElementRoot(GameObject element, MenuCommand menuCommand) + { + GameObject parent = menuCommand.context as GameObject; + bool explicitParentChoice = true; + if (parent == null) + { + parent = GetOrCreateCanvasGameObject(); + explicitParentChoice = false; + + // If in Prefab Mode, Canvas has to be part of Prefab contents, + // otherwise use Prefab root instead. + PrefabStage prefabStage = PrefabStageUtility.GetCurrentPrefabStage(); + if (prefabStage != null && !prefabStage.IsPartOfPrefabContents(parent)) + parent = prefabStage.prefabContentsRoot; + } + if (parent.GetComponentInParent() == null) + { + // Create canvas under context GameObject, + // and make that be the parent which UI element is added under. + GameObject canvas = CreateNewUI(); + canvas.transform.SetParent(parent.transform, false); + parent = canvas; + } + + // Setting the element to be a child of an element already in the scene should + // be sufficient to also move the element to that scene. + // However, it seems the element needs to be already in its destination scene when the + // RegisterCreatedObjectUndo is performed; otherwise the scene it was created in is dirtied. + SceneManager.MoveGameObjectToScene(element, parent.scene); + + if (element.transform.parent == null) + { + Undo.SetTransformParent(element.transform, parent.transform, "Parent " + element.name); + } + + GameObjectUtility.EnsureUniqueNameForSibling(element); + + // We have to fix up the undo name since the name of the object was only known after reparenting it. + Undo.SetCurrentGroupName("Create " + element.name); + + GameObjectUtility.SetParentAndAlign(element, parent); + if (!explicitParentChoice) // not a context click, so center in sceneview + SetPositionVisibleinSceneView(parent.GetComponent(), element.GetComponent()); + + Undo.RegisterCreatedObjectUndo(element, "Create " + element.name); + + Selection.activeGameObject = element; + } + + + static public GameObject CreateNewUI() + { + // Root for the UI + var root = new GameObject("Canvas"); + root.layer = LayerMask.NameToLayer(kUILayerName); + Canvas canvas = root.AddComponent(); + canvas.renderMode = RenderMode.ScreenSpaceOverlay; + root.AddComponent(); + root.AddComponent(); + + // Works for all stages. + StageUtility.PlaceGameObjectInCurrentStage(root); + bool customScene = false; + PrefabStage prefabStage = PrefabStageUtility.GetCurrentPrefabStage(); + if (prefabStage != null) + { + root.transform.SetParent(prefabStage.prefabContentsRoot.transform, false); + customScene = true; + } + + Undo.RegisterCreatedObjectUndo(root, "Create " + root.name); + + // If there is no event system add one... + // No need to place event system in custom scene as these are temporary anyway. + // It can be argued for or against placing it in the user scenes, + // but let's not modify scene user is not currently looking at. + if (!customScene) + CreateEventSystem(false); + return root; + } + + + private static void CreateEventSystem(bool select) + { + CreateEventSystem(select, null); + } + + + private static void CreateEventSystem(bool select, GameObject parent) + { + var esys = Object.FindObjectOfType(); + if (esys == null) + { + var eventSystem = new GameObject("EventSystem"); + GameObjectUtility.SetParentAndAlign(eventSystem, parent); + esys = eventSystem.AddComponent(); + eventSystem.AddComponent(); + + Undo.RegisterCreatedObjectUndo(eventSystem, "Create " + eventSystem.name); + } + + if (select && esys != null) + { + Selection.activeGameObject = esys.gameObject; + } + } + + + // Helper function that returns a Canvas GameObject; preferably a parent of the selection, or other existing Canvas. + static public GameObject GetOrCreateCanvasGameObject() + { + GameObject selectedGo = Selection.activeGameObject; + + // Try to find a gameobject that is the selected GO or one if its parents. + Canvas canvas = (selectedGo != null) ? selectedGo.GetComponentInParent() : null; + if (IsValidCanvas(canvas)) + return canvas.gameObject; + + // No canvas in selection or its parents? Then use any valid canvas. + // We have to find all loaded Canvases, not just the ones in main scenes. + Canvas[] canvasArray = StageUtility.GetCurrentStageHandle().FindComponentsOfType(); + for (int i = 0; i < canvasArray.Length; i++) + if (IsValidCanvas(canvasArray[i])) + return canvasArray[i].gameObject; + + // No canvas in the scene at all? Then create a new one. + return CreateNewUI(); + } + + static bool IsValidCanvas(Canvas canvas) + { + if (canvas == null || !canvas.gameObject.activeInHierarchy) + return false; + + // It's important that the non-editable canvas from a prefab scene won't be rejected, + // but canvases not visible in the Hierarchy at all do. Don't check for HideAndDontSave. + if (EditorUtility.IsPersistent(canvas) || (canvas.hideFlags & HideFlags.HideInHierarchy) != 0) + return false; + + if (StageUtility.GetStageHandle(canvas.gameObject) != StageUtility.GetCurrentStageHandle()) + return false; + + return true; + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_CreateObjectMenu.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_CreateObjectMenu.cs.meta new file mode 100644 index 0000000..be9643f --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_CreateObjectMenu.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7065397ff8184621aa3ca4f854491259 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs new file mode 100644 index 0000000..3d63900 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs @@ -0,0 +1,53 @@ +using UnityEngine; +using UnityEditor; +using System.Linq; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + public static class EditorShaderUtilities + { + + /// + /// Copy Shader properties from source to destination material. + /// + /// + /// + public static void CopyMaterialProperties(Material source, Material destination) + { + MaterialProperty[] source_prop = MaterialEditor.GetMaterialProperties(new Material[] { source }); + + for (int i = 0; i < source_prop.Length; i++) + { + int property_ID = Shader.PropertyToID(source_prop[i].name); + if (destination.HasProperty(property_ID)) + { + //Debug.Log(source_prop[i].name + " Type:" + ShaderUtil.GetPropertyType(source.shader, i)); + switch (ShaderUtil.GetPropertyType(source.shader, i)) + { + case ShaderUtil.ShaderPropertyType.Color: + destination.SetColor(property_ID, source.GetColor(property_ID)); + break; + case ShaderUtil.ShaderPropertyType.Float: + destination.SetFloat(property_ID, source.GetFloat(property_ID)); + break; + case ShaderUtil.ShaderPropertyType.Range: + destination.SetFloat(property_ID, source.GetFloat(property_ID)); + break; + case ShaderUtil.ShaderPropertyType.TexEnv: + destination.SetTexture(property_ID, source.GetTexture(property_ID)); + break; + case ShaderUtil.ShaderPropertyType.Vector: + destination.SetVector(property_ID, source.GetVector(property_ID)); + break; + } + } + } + + } + + } + +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs.meta new file mode 100644 index 0000000..89d2594 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: aa76955fe5bb44f7915d91db8c7043c4 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs new file mode 100644 index 0000000..95be939 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs @@ -0,0 +1,1736 @@ +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Globalization; +using System.Threading; +using System.IO; +using System.Text.RegularExpressions; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; +using Object = UnityEngine.Object; + +namespace TMPro.EditorUtilities +{ + public class TMPro_FontAssetCreatorWindow : EditorWindow + { + [MenuItem("Window/TextMeshPro/Font Asset Creator", false, 2025)] + public static void ShowFontAtlasCreatorWindow() + { + var window = GetWindow(); + window.titleContent = new GUIContent("Font Asset Creator"); + window.Focus(); + + // Make sure TMP Essential Resources have been imported. + window.CheckEssentialResources(); + } + + + public static void ShowFontAtlasCreatorWindow(Font sourceFontFile) + { + var window = GetWindow(); + + window.titleContent = new GUIContent("Font Asset Creator"); + window.Focus(); + + window.ClearGeneratedData(); + window.m_LegacyFontAsset = null; + window.m_SelectedFontAsset = null; + + // Override selected font asset + window.m_SourceFontFile = sourceFontFile; + + // Make sure TMP Essential Resources have been imported. + window.CheckEssentialResources(); + } + + + public static void ShowFontAtlasCreatorWindow(TMP_FontAsset fontAsset) + { + var window = GetWindow(); + + window.titleContent = new GUIContent("Font Asset Creator"); + window.Focus(); + + // Clear any previously generated data + window.ClearGeneratedData(); + window.m_LegacyFontAsset = null; + + // Load font asset creation settings if we have valid settings + if (string.IsNullOrEmpty(fontAsset.creationSettings.sourceFontFileGUID) == false) + { + window.LoadFontCreationSettings(fontAsset.creationSettings); + + // Override settings to inject character list from font asset + window.m_CharacterSetSelectionMode = 6; + window.m_CharacterSequence = TMP_EditorUtility.GetUnicodeCharacterSequence(TMP_FontAsset.GetCharactersArray(fontAsset)); + + + window.m_ReferencedFontAsset = fontAsset; + window.m_SavedFontAtlas = fontAsset.atlasTexture; + } + else + { + window.m_WarningMessage = "Font Asset [" + fontAsset.name + "] does not contain any previous \"Font Asset Creation Settings\". This usually means [" + fontAsset.name + "] was created before this new functionality was added."; + window.m_SourceFontFile = null; + window.m_LegacyFontAsset = fontAsset; + } + + // Even if we don't have any saved generation settings, we still want to pre-select the source font file. + window.m_SelectedFontAsset = fontAsset; + + // Make sure TMP Essential Resources have been imported. + window.CheckEssentialResources(); + } + + [System.Serializable] + class FontAssetCreationSettingsContainer + { + public List fontAssetCreationSettings; + } + + FontAssetCreationSettingsContainer m_FontAssetCreationSettingsContainer; + + //static readonly string[] m_FontCreationPresets = new string[] { "Recent 1", "Recent 2", "Recent 3", "Recent 4" }; + int m_FontAssetCreationSettingsCurrentIndex = 0; + + const string k_FontAssetCreationSettingsContainerKey = "TextMeshPro.FontAssetCreator.RecentFontAssetCreationSettings.Container"; + const string k_FontAssetCreationSettingsCurrentIndexKey = "TextMeshPro.FontAssetCreator.RecentFontAssetCreationSettings.CurrentIndex"; + const float k_TwoColumnControlsWidth = 335f; + + // Diagnostics + System.Diagnostics.Stopwatch m_StopWatch; + double m_GlyphPackingGenerationTime; + double m_GlyphRenderingGenerationTime; + + string[] m_FontSizingOptions = { "Auto Sizing", "Custom Size" }; + int m_PointSizeSamplingMode; + string[] m_FontResolutionLabels = { "8", "16","32", "64", "128", "256", "512", "1024", "2048", "4096", "8192" }; + int[] m_FontAtlasResolutions = { 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 }; + string[] m_FontCharacterSets = { "ASCII", "Extended ASCII", "ASCII Lowercase", "ASCII Uppercase", "Numbers + Symbols", "Custom Range", "Unicode Range (Hex)", "Custom Characters", "Characters from File" }; + enum FontPackingModes { Fast = 0, Optimum = 4 }; + FontPackingModes m_PackingMode = FontPackingModes.Fast; + + int m_CharacterSetSelectionMode; + + string m_CharacterSequence = ""; + string m_OutputFeedback = ""; + string m_WarningMessage; + int m_CharacterCount; + Vector2 m_ScrollPosition; + Vector2 m_OutputScrollPosition; + + bool m_IsRepaintNeeded; + + float m_AtlasGenerationProgress; + string m_AtlasGenerationProgressLabel = string.Empty; + float m_RenderingProgress; + bool m_IsRenderingDone; + bool m_IsProcessing; + bool m_IsGenerationDisabled; + bool m_IsGenerationCancelled; + + bool m_IsFontAtlasInvalid; + Object m_SourceFontFile; + TMP_FontAsset m_SelectedFontAsset; + TMP_FontAsset m_LegacyFontAsset; + TMP_FontAsset m_ReferencedFontAsset; + + TextAsset m_CharactersFromFile; + int m_PointSize; + int m_Padding = 5; + //FaceStyles m_FontStyle = FaceStyles.Normal; + //float m_FontStyleValue = 2; + + GlyphRenderMode m_GlyphRenderMode = GlyphRenderMode.SDFAA; + int m_AtlasWidth = 512; + int m_AtlasHeight = 512; + byte[] m_AtlasTextureBuffer; + Texture2D m_FontAtlasTexture; + Texture2D m_SavedFontAtlas; + + // + List m_FontGlyphTable = new List(); + List m_FontCharacterTable = new List(); + + Dictionary m_CharacterLookupMap = new Dictionary(); + Dictionary> m_GlyphLookupMap = new Dictionary>(); + + List m_GlyphsToPack = new List(); + List m_GlyphsPacked = new List(); + List m_FreeGlyphRects = new List(); + List m_UsedGlyphRects = new List(); + List m_GlyphsToRender = new List(); + List m_AvailableGlyphsToAdd = new List(); + List m_MissingCharacters = new List(); + List m_ExcludedCharacters = new List(); + + private FaceInfo m_FaceInfo; + + bool m_IncludeFontFeatures; + + + public void OnEnable() + { + // Used for Diagnostics + m_StopWatch = new System.Diagnostics.Stopwatch(); + + // Set Editor window size. + minSize = new Vector2(315, minSize.y); + + // Initialize & Get shader property IDs. + ShaderUtilities.GetShaderPropertyIDs(); + + // Load last selected preset if we are not already in the process of regenerating an existing font asset (via the Context menu) + if (EditorPrefs.HasKey(k_FontAssetCreationSettingsContainerKey)) + { + if (m_FontAssetCreationSettingsContainer == null) + m_FontAssetCreationSettingsContainer = JsonUtility.FromJson(EditorPrefs.GetString(k_FontAssetCreationSettingsContainerKey)); + + if (m_FontAssetCreationSettingsContainer.fontAssetCreationSettings != null && m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Count > 0) + { + // Load Font Asset Creation Settings preset. + if (EditorPrefs.HasKey(k_FontAssetCreationSettingsCurrentIndexKey)) + m_FontAssetCreationSettingsCurrentIndex = EditorPrefs.GetInt(k_FontAssetCreationSettingsCurrentIndexKey); + + LoadFontCreationSettings(m_FontAssetCreationSettingsContainer.fontAssetCreationSettings[m_FontAssetCreationSettingsCurrentIndex]); + } + } + + ClearGeneratedData(); + } + + + public void OnDisable() + { + //Debug.Log("TextMeshPro Editor Window has been disabled."); + + // Destroy Engine only if it has been initialized already + FontEngine.DestroyFontEngine(); + + ClearGeneratedData(); + + // Remove Glyph Report if one was created. + if (File.Exists("Assets/TextMesh Pro/Glyph Report.txt")) + { + File.Delete("Assets/TextMesh Pro/Glyph Report.txt"); + File.Delete("Assets/TextMesh Pro/Glyph Report.txt.meta"); + + AssetDatabase.Refresh(); + } + + // Save Font Asset Creation Settings Index + SaveCreationSettingsToEditorPrefs(SaveFontCreationSettings()); + EditorPrefs.SetInt(k_FontAssetCreationSettingsCurrentIndexKey, m_FontAssetCreationSettingsCurrentIndex); + + // Unregister to event + TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED); + + Resources.UnloadUnusedAssets(); + } + + + // Event received when TMP resources have been loaded. + void ON_RESOURCES_LOADED() + { + TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED); + + m_IsGenerationDisabled = false; + } + + // Make sure TMP Essential Resources have been imported. + void CheckEssentialResources() + { + if (TMP_Settings.instance == null) + { + if (m_IsGenerationDisabled == false) + TMPro_EventManager.RESOURCE_LOAD_EVENT.Add(ON_RESOURCES_LOADED); + + m_IsGenerationDisabled = true; + } + } + + + public void OnGUI() + { + GUILayout.BeginHorizontal(); + DrawControls(); + if (position.width > position.height && position.width > k_TwoColumnControlsWidth) + { + DrawPreview(); + } + GUILayout.EndHorizontal(); + } + + + public void Update() + { + if (m_IsRepaintNeeded) + { + //Debug.Log("Repainting..."); + m_IsRepaintNeeded = false; + Repaint(); + } + + // Update Progress bar is we are Rendering a Font. + if (m_IsProcessing) + { + m_AtlasGenerationProgress = FontEngine.generationProgress; + + m_IsRepaintNeeded = true; + } + + // Update Feedback Window & Create Font Texture once Rendering is done. + if (m_IsRenderingDone) + { + m_IsProcessing = false; + m_IsRenderingDone = false; + + if (m_IsGenerationCancelled == false) + { + m_AtlasGenerationProgressLabel = "Generation completed in: " + (m_GlyphPackingGenerationTime + m_GlyphRenderingGenerationTime).ToString("0.00 ms."); + + UpdateRenderFeedbackWindow(); + CreateFontAtlasTexture(); + + // If dynamic make readable ... + m_FontAtlasTexture.Apply(false, false); + } + Repaint(); + } + } + + + /// + /// Method which returns the character corresponding to a decimal value. + /// + /// + /// + static uint[] ParseNumberSequence(string sequence) + { + List unicodeList = new List(); + string[] sequences = sequence.Split(','); + + foreach (string seq in sequences) + { + string[] s1 = seq.Split('-'); + + if (s1.Length == 1) + try + { + unicodeList.Add(uint.Parse(s1[0])); + } + catch + { + Debug.Log("No characters selected or invalid format."); + } + else + { + for (uint j = uint.Parse(s1[0]); j < uint.Parse(s1[1]) + 1; j++) + { + unicodeList.Add(j); + } + } + } + + return unicodeList.ToArray(); + } + + + /// + /// Method which returns the character (decimal value) from a hex sequence. + /// + /// + /// + static uint[] ParseHexNumberSequence(string sequence) + { + List unicodeList = new List(); + string[] sequences = sequence.Split(','); + + foreach (string seq in sequences) + { + string[] s1 = seq.Split('-'); + + if (s1.Length == 1) + try + { + unicodeList.Add(uint.Parse(s1[0], NumberStyles.AllowHexSpecifier)); + } + catch + { + Debug.Log("No characters selected or invalid format."); + } + else + { + for (uint j = uint.Parse(s1[0], NumberStyles.AllowHexSpecifier); j < uint.Parse(s1[1], NumberStyles.AllowHexSpecifier) + 1; j++) + { + unicodeList.Add(j); + } + } + } + + return unicodeList.ToArray(); + } + + + void DrawControls() + { + GUILayout.Space(5f); + + if (position.width > position.height && position.width > k_TwoColumnControlsWidth) + { + m_ScrollPosition = EditorGUILayout.BeginScrollView(m_ScrollPosition, GUILayout.Width(315)); + } + else + { + m_ScrollPosition = EditorGUILayout.BeginScrollView(m_ScrollPosition); + } + + GUILayout.Space(5f); + + GUILayout.Label(m_SelectedFontAsset != null ? string.Format("Font Settings [{0}]", m_SelectedFontAsset.name) : "Font Settings", EditorStyles.boldLabel); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + EditorGUIUtility.labelWidth = 125f; + EditorGUIUtility.fieldWidth = 5f; + + // Disable Options if already generating a font atlas texture. + EditorGUI.BeginDisabledGroup(m_IsProcessing); + { + // FONT TTF SELECTION + EditorGUI.BeginChangeCheck(); + m_SourceFontFile = EditorGUILayout.ObjectField("Source Font File", m_SourceFontFile, typeof(Font), false) as Font; + if (EditorGUI.EndChangeCheck()) + { + m_SelectedFontAsset = null; + m_IsFontAtlasInvalid = true; + } + + // FONT SIZING + EditorGUI.BeginChangeCheck(); + if (m_PointSizeSamplingMode == 0) + { + m_PointSizeSamplingMode = EditorGUILayout.Popup("Sampling Point Size", m_PointSizeSamplingMode, m_FontSizingOptions); + } + else + { + GUILayout.BeginHorizontal(); + m_PointSizeSamplingMode = EditorGUILayout.Popup("Sampling Point Size", m_PointSizeSamplingMode, m_FontSizingOptions, GUILayout.Width(225)); + m_PointSize = EditorGUILayout.IntField(m_PointSize); + GUILayout.EndHorizontal(); + } + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + // FONT PADDING + EditorGUI.BeginChangeCheck(); + m_Padding = EditorGUILayout.IntField("Padding", m_Padding); + m_Padding = (int)Mathf.Clamp(m_Padding, 0f, 64f); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + // FONT PACKING METHOD SELECTION + EditorGUI.BeginChangeCheck(); + m_PackingMode = (FontPackingModes)EditorGUILayout.EnumPopup("Packing Method", m_PackingMode); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + // FONT ATLAS RESOLUTION SELECTION + GUILayout.BeginHorizontal(); + GUI.changed = false; + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PrefixLabel("Atlas Resolution"); + m_AtlasWidth = EditorGUILayout.IntPopup(m_AtlasWidth, m_FontResolutionLabels, m_FontAtlasResolutions); + m_AtlasHeight = EditorGUILayout.IntPopup(m_AtlasHeight, m_FontResolutionLabels, m_FontAtlasResolutions); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + GUILayout.EndHorizontal(); + + + // FONT CHARACTER SET SELECTION + EditorGUI.BeginChangeCheck(); + bool hasSelectionChanged = false; + m_CharacterSetSelectionMode = EditorGUILayout.Popup("Character Set", m_CharacterSetSelectionMode, m_FontCharacterSets); + if (EditorGUI.EndChangeCheck()) + { + m_CharacterSequence = ""; + hasSelectionChanged = true; + m_IsFontAtlasInvalid = true; + } + + switch (m_CharacterSetSelectionMode) + { + case 0: // ASCII + //characterSequence = "32 - 126, 130, 132 - 135, 139, 145 - 151, 153, 155, 161, 166 - 167, 169 - 174, 176, 181 - 183, 186 - 187, 191, 8210 - 8226, 8230, 8240, 8242 - 8244, 8249 - 8250, 8252 - 8254, 8260, 8286"; + m_CharacterSequence = "32 - 126, 160, 8203, 8230, 9633"; + break; + + case 1: // EXTENDED ASCII + m_CharacterSequence = "32 - 126, 160 - 255, 8192 - 8303, 8364, 8482, 9633"; + // Could add 9632 for missing glyph + break; + + case 2: // Lowercase + m_CharacterSequence = "32 - 64, 91 - 126, 160"; + break; + + case 3: // Uppercase + m_CharacterSequence = "32 - 96, 123 - 126, 160"; + break; + + case 4: // Numbers & Symbols + m_CharacterSequence = "32 - 64, 91 - 96, 123 - 126, 160"; + break; + + case 5: // Custom Range + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label("Enter a sequence of decimal values to define the characters to be included in the font asset or retrieve one from another font asset.", TMP_UIStyleManager.label); + GUILayout.Space(10f); + + EditorGUI.BeginChangeCheck(); + m_ReferencedFontAsset = EditorGUILayout.ObjectField("Select Font Asset", m_ReferencedFontAsset, typeof(TMP_FontAsset), false) as TMP_FontAsset; + if (EditorGUI.EndChangeCheck() || hasSelectionChanged) + { + if (m_ReferencedFontAsset != null) + m_CharacterSequence = TMP_EditorUtility.GetDecimalCharacterSequence(TMP_FontAsset.GetCharactersArray(m_ReferencedFontAsset)); + + m_IsFontAtlasInvalid = true; + } + + // Filter out unwanted characters. + char chr = Event.current.character; + if ((chr < '0' || chr > '9') && (chr < ',' || chr > '-')) + { + Event.current.character = '\0'; + } + GUILayout.Label("Character Sequence (Decimal)", EditorStyles.boldLabel); + EditorGUI.BeginChangeCheck(); + m_CharacterSequence = EditorGUILayout.TextArea(m_CharacterSequence, TMP_UIStyleManager.textAreaBoxWindow, GUILayout.Height(120), GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + EditorGUILayout.EndVertical(); + break; + + case 6: // Unicode HEX Range + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label("Enter a sequence of Unicode (hex) values to define the characters to be included in the font asset or retrieve one from another font asset.", TMP_UIStyleManager.label); + GUILayout.Space(10f); + + EditorGUI.BeginChangeCheck(); + m_ReferencedFontAsset = EditorGUILayout.ObjectField("Select Font Asset", m_ReferencedFontAsset, typeof(TMP_FontAsset), false) as TMP_FontAsset; + if (EditorGUI.EndChangeCheck() || hasSelectionChanged) + { + if (m_ReferencedFontAsset != null) + m_CharacterSequence = TMP_EditorUtility.GetUnicodeCharacterSequence(TMP_FontAsset.GetCharactersArray(m_ReferencedFontAsset)); + + m_IsFontAtlasInvalid = true; + } + + // Filter out unwanted characters. + chr = Event.current.character; + if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F') && (chr < ',' || chr > '-')) + { + Event.current.character = '\0'; + } + GUILayout.Label("Character Sequence (Hex)", EditorStyles.boldLabel); + EditorGUI.BeginChangeCheck(); + m_CharacterSequence = EditorGUILayout.TextArea(m_CharacterSequence, TMP_UIStyleManager.textAreaBoxWindow, GUILayout.Height(120), GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + EditorGUILayout.EndVertical(); + break; + + case 7: // Characters from Font Asset + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label("Type the characters to be included in the font asset or retrieve them from another font asset.", TMP_UIStyleManager.label); + GUILayout.Space(10f); + + EditorGUI.BeginChangeCheck(); + m_ReferencedFontAsset = EditorGUILayout.ObjectField("Select Font Asset", m_ReferencedFontAsset, typeof(TMP_FontAsset), false) as TMP_FontAsset; + if (EditorGUI.EndChangeCheck() || hasSelectionChanged) + { + if (m_ReferencedFontAsset != null) + m_CharacterSequence = TMP_FontAsset.GetCharacters(m_ReferencedFontAsset); + + m_IsFontAtlasInvalid = true; + } + + EditorGUI.indentLevel = 0; + + GUILayout.Label("Custom Character List", EditorStyles.boldLabel); + EditorGUI.BeginChangeCheck(); + m_CharacterSequence = EditorGUILayout.TextArea(m_CharacterSequence, TMP_UIStyleManager.textAreaBoxWindow, GUILayout.Height(120), GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + EditorGUILayout.EndVertical(); + break; + + case 8: // Character List from File + EditorGUI.BeginChangeCheck(); + m_CharactersFromFile = EditorGUILayout.ObjectField("Character File", m_CharactersFromFile, typeof(TextAsset), false) as TextAsset; + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + if (m_CharactersFromFile != null) + { + Regex rx = new Regex(@"(? + { + if (match.Value.StartsWith("\\U")) + return char.ConvertFromUtf32(int.Parse(match.Value.Replace("\\U", ""), NumberStyles.HexNumber)); + + return char.ConvertFromUtf32(int.Parse(match.Value.Replace("\\u", ""), NumberStyles.HexNumber)); + }); + } + break; + } + + // FONT STYLE SELECTION + //GUILayout.BeginHorizontal(); + //EditorGUI.BeginChangeCheck(); + ////m_FontStyle = (FaceStyles)EditorGUILayout.EnumPopup("Font Style", m_FontStyle, GUILayout.Width(225)); + ////m_FontStyleValue = EditorGUILayout.IntField((int)m_FontStyleValue); + //if (EditorGUI.EndChangeCheck()) + //{ + // m_IsFontAtlasInvalid = true; + //} + //GUILayout.EndHorizontal(); + + // Render Mode Selection + CheckForLegacyGlyphRenderMode(); + + EditorGUI.BeginChangeCheck(); + m_GlyphRenderMode = (GlyphRenderMode)EditorGUILayout.EnumPopup("Render Mode", m_GlyphRenderMode); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + m_IncludeFontFeatures = EditorGUILayout.Toggle("Get Kerning Pairs", m_IncludeFontFeatures); + + EditorGUILayout.Space(); + } + + EditorGUI.EndDisabledGroup(); + + if (!string.IsNullOrEmpty(m_WarningMessage)) + { + EditorGUILayout.HelpBox(m_WarningMessage, MessageType.Warning); + } + + GUI.enabled = m_SourceFontFile != null && !m_IsProcessing && !m_IsGenerationDisabled; // Enable Preview if we are not already rendering a font. + if (GUILayout.Button("Generate Font Atlas") && GUI.enabled) + { + if (!m_IsProcessing && m_SourceFontFile != null) + { + DestroyImmediate(m_FontAtlasTexture); + m_FontAtlasTexture = null; + m_SavedFontAtlas = null; + + // Initialize font engine + FontEngineError errorCode = FontEngine.InitializeFontEngine(); + if (errorCode != FontEngineError.Success) + { + Debug.Log("Font Asset Creator - Error [" + errorCode + "] has occurred while Initializing the FreeType Library."); + } + + // Get file path of the source font file. + string fontPath = AssetDatabase.GetAssetPath(m_SourceFontFile); + + if (errorCode == FontEngineError.Success) + { + errorCode = FontEngine.LoadFontFace(fontPath); + + if (errorCode != FontEngineError.Success) + { + Debug.Log("Font Asset Creator - Error Code [" + errorCode + "] has occurred trying to load the [" + m_SourceFontFile.name + "] font file. This typically results from the use of an incompatible or corrupted font file."); + } + } + + + // Define an array containing the characters we will render. + if (errorCode == FontEngineError.Success) + { + uint[] characterSet = null; + + // Get list of characters that need to be packed and rendered to the atlas texture. + if (m_CharacterSetSelectionMode == 7 || m_CharacterSetSelectionMode == 8) + { + List char_List = new List(); + + for (int i = 0; i < m_CharacterSequence.Length; i++) + { + uint unicode = m_CharacterSequence[i]; + + // Handle surrogate pairs + if (i < m_CharacterSequence.Length - 1 && char.IsHighSurrogate((char)unicode) && char.IsLowSurrogate(m_CharacterSequence[i + 1])) + { + unicode = (uint)char.ConvertToUtf32(m_CharacterSequence[i], m_CharacterSequence[i + 1]); + i += 1; + } + + // Check to make sure we don't include duplicates + if (char_List.FindIndex(item => item == unicode) == -1) + char_List.Add(unicode); + } + + characterSet = char_List.ToArray(); + } + else if (m_CharacterSetSelectionMode == 6) + { + characterSet = ParseHexNumberSequence(m_CharacterSequence); + } + else + { + characterSet = ParseNumberSequence(m_CharacterSequence); + } + + m_CharacterCount = characterSet.Length; + + m_AtlasGenerationProgress = 0; + m_IsProcessing = true; + m_IsGenerationCancelled = false; + + GlyphLoadFlags glyphLoadFlags = ((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_HINTED) == GlyphRasterModes.RASTER_MODE_HINTED ? GlyphLoadFlags.LOAD_RENDER : GlyphLoadFlags.LOAD_RENDER | GlyphLoadFlags.LOAD_NO_HINTING; + + // + AutoResetEvent autoEvent = new AutoResetEvent(false); + + // Worker thread to pack glyphs in the given texture space. + ThreadPool.QueueUserWorkItem(PackGlyphs => + { + // Start Stop Watch + m_StopWatch = System.Diagnostics.Stopwatch.StartNew(); + + // Clear the various lists used in the generation process. + m_AvailableGlyphsToAdd.Clear(); + m_MissingCharacters.Clear(); + m_ExcludedCharacters.Clear(); + m_CharacterLookupMap.Clear(); + m_GlyphLookupMap.Clear(); + m_GlyphsToPack.Clear(); + m_GlyphsPacked.Clear(); + + // Check if requested characters are available in the source font file. + for (int i = 0; i < characterSet.Length; i++) + { + uint unicode = characterSet[i]; + + if (FontEngine.TryGetGlyphIndex(unicode, out uint glyphIndex)) + { + // Skip over potential duplicate characters. + if (m_CharacterLookupMap.ContainsKey(unicode)) + continue; + + // Add character to character lookup map. + m_CharacterLookupMap.Add(unicode, glyphIndex); + + // Skip over potential duplicate glyph references. + if (m_GlyphLookupMap.ContainsKey(glyphIndex)) + { + // Add additional glyph reference for this character. + m_GlyphLookupMap[glyphIndex].Add(unicode); + continue; + } + + // Add glyph reference to glyph lookup map. + m_GlyphLookupMap.Add(glyphIndex, new List() { unicode }); + + // Add glyph index to list of glyphs to add to texture. + m_AvailableGlyphsToAdd.Add(glyphIndex); + } + else + { + // Add Unicode to list of missing characters. + m_MissingCharacters.Add(unicode); + } + } + + // Pack available glyphs in the provided texture space. + if (m_AvailableGlyphsToAdd.Count > 0) + { + int packingModifier = ((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1; + + if (m_PointSizeSamplingMode == 0) // Auto-Sizing Point Size Mode + { + // Estimate min / max range for auto sizing of point size. + int minPointSize = 0; + int maxPointSize = (int)Mathf.Sqrt((m_AtlasWidth * m_AtlasHeight) / m_AvailableGlyphsToAdd.Count) * 3; + + m_PointSize = (maxPointSize + minPointSize) / 2; + + bool optimumPointSizeFound = false; + for (int iteration = 0; iteration < 15 && optimumPointSizeFound == false; iteration++) + { + m_AtlasGenerationProgressLabel = "Packing glyphs - Pass (" + iteration + ")"; + + FontEngine.SetFaceSize(m_PointSize); + + m_GlyphsToPack.Clear(); + m_GlyphsPacked.Clear(); + + m_FreeGlyphRects.Clear(); + m_FreeGlyphRects.Add(new GlyphRect(0, 0, m_AtlasWidth - packingModifier, m_AtlasHeight - packingModifier)); + m_UsedGlyphRects.Clear(); + + for (int i = 0; i < m_AvailableGlyphsToAdd.Count; i++) + { + uint glyphIndex = m_AvailableGlyphsToAdd[i]; + + if (FontEngine.TryGetGlyphWithIndexValue(glyphIndex, glyphLoadFlags, out Glyph glyph)) + { + if (glyph.glyphRect.width > 0 && glyph.glyphRect.height > 0) + { + m_GlyphsToPack.Add(glyph); + } + else + { + m_GlyphsPacked.Add(glyph); + } + } + } + + FontEngine.TryPackGlyphsInAtlas(m_GlyphsToPack, m_GlyphsPacked, m_Padding, (GlyphPackingMode)m_PackingMode, m_GlyphRenderMode, m_AtlasWidth, m_AtlasHeight, m_FreeGlyphRects, m_UsedGlyphRects); + + if (m_IsGenerationCancelled) + { + DestroyImmediate(m_FontAtlasTexture); + m_FontAtlasTexture = null; + return; + } + + //Debug.Log("Glyphs remaining to add [" + m_GlyphsToAdd.Count + "]. Glyphs added [" + m_GlyphsAdded.Count + "]."); + + if (m_GlyphsToPack.Count > 0) + { + if (m_PointSize > minPointSize) + { + maxPointSize = m_PointSize; + m_PointSize = (m_PointSize + minPointSize) / 2; + + //Debug.Log("Decreasing point size from [" + maxPointSize + "] to [" + m_PointSize + "]."); + } + } + else + { + if (maxPointSize - minPointSize > 1 && m_PointSize < maxPointSize) + { + minPointSize = m_PointSize; + m_PointSize = (m_PointSize + maxPointSize) / 2; + + //Debug.Log("Increasing point size from [" + minPointSize + "] to [" + m_PointSize + "]."); + } + else + { + //Debug.Log("[" + iteration + "] iterations to find the optimum point size of : [" + m_PointSize + "]."); + optimumPointSizeFound = true; + } + } + } + } + else // Custom Point Size Mode + { + m_AtlasGenerationProgressLabel = "Packing glyphs..."; + + // Set point size + FontEngine.SetFaceSize(m_PointSize); + + m_GlyphsToPack.Clear(); + m_GlyphsPacked.Clear(); + + m_FreeGlyphRects.Clear(); + m_FreeGlyphRects.Add(new GlyphRect(0, 0, m_AtlasWidth - packingModifier, m_AtlasHeight - packingModifier)); + m_UsedGlyphRects.Clear(); + + for (int i = 0; i < m_AvailableGlyphsToAdd.Count; i++) + { + uint glyphIndex = m_AvailableGlyphsToAdd[i]; + + if (FontEngine.TryGetGlyphWithIndexValue(glyphIndex, glyphLoadFlags, out Glyph glyph)) + { + if (glyph.glyphRect.width > 0 && glyph.glyphRect.height > 0) + { + m_GlyphsToPack.Add(glyph); + } + else + { + m_GlyphsPacked.Add(glyph); + } + } + } + + FontEngine.TryPackGlyphsInAtlas(m_GlyphsToPack, m_GlyphsPacked, m_Padding, (GlyphPackingMode)m_PackingMode, m_GlyphRenderMode, m_AtlasWidth, m_AtlasHeight, m_FreeGlyphRects, m_UsedGlyphRects); + + if (m_IsGenerationCancelled) + { + DestroyImmediate(m_FontAtlasTexture); + m_FontAtlasTexture = null; + return; + } + //Debug.Log("Glyphs remaining to add [" + m_GlyphsToAdd.Count + "]. Glyphs added [" + m_GlyphsAdded.Count + "]."); + } + + } + else + { + int packingModifier = ((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1; + + FontEngine.SetFaceSize(m_PointSize); + + m_GlyphsToPack.Clear(); + m_GlyphsPacked.Clear(); + + m_FreeGlyphRects.Clear(); + m_FreeGlyphRects.Add(new GlyphRect(0, 0, m_AtlasWidth - packingModifier, m_AtlasHeight - packingModifier)); + m_UsedGlyphRects.Clear(); + } + + //Stop StopWatch + m_StopWatch.Stop(); + m_GlyphPackingGenerationTime = m_StopWatch.Elapsed.TotalMilliseconds; + Debug.Log("Glyph packing completed in: " + m_GlyphPackingGenerationTime.ToString("0.000 ms.")); + m_StopWatch.Reset(); + + m_FontCharacterTable.Clear(); + m_FontGlyphTable.Clear(); + m_GlyphsToRender.Clear(); + + // Add glyphs and characters successfully added to texture to their respective font tables. + foreach (Glyph glyph in m_GlyphsPacked) + { + uint glyphIndex = glyph.index; + + m_FontGlyphTable.Add(glyph); + + // Add glyphs to list of glyphs that need to be rendered. + if (glyph.glyphRect.width > 0 && glyph.glyphRect.height > 0) + m_GlyphsToRender.Add(glyph); + + foreach (uint unicode in m_GlyphLookupMap[glyphIndex]) + { + // Create new Character + m_FontCharacterTable.Add(new TMP_Character(unicode, glyph)); + } + } + + // + foreach (Glyph glyph in m_GlyphsToPack) + { + foreach (uint unicode in m_GlyphLookupMap[glyph.index]) + { + m_ExcludedCharacters.Add(unicode); + } + } + + // Get the face info for the current sampling point size. + m_FaceInfo = FontEngine.GetFaceInfo(); + + autoEvent.Set(); + }); + + // Worker thread to render glyphs in texture buffer. + ThreadPool.QueueUserWorkItem(RenderGlyphs => + { + autoEvent.WaitOne(); + + // Start Stop Watch + m_StopWatch = System.Diagnostics.Stopwatch.StartNew(); + + m_IsRenderingDone = false; + + // Allocate texture data + m_AtlasTextureBuffer = new byte[m_AtlasWidth * m_AtlasHeight]; + + m_AtlasGenerationProgressLabel = "Rendering glyphs..."; + + // Render and add glyphs to the given atlas texture. + if (m_GlyphsToRender.Count > 0) + { + FontEngine.RenderGlyphsToTexture(m_GlyphsToRender, m_Padding, m_GlyphRenderMode, m_AtlasTextureBuffer, m_AtlasWidth, m_AtlasHeight); + } + + m_IsRenderingDone = true; + + // Stop StopWatch + m_StopWatch.Stop(); + m_GlyphRenderingGenerationTime = m_StopWatch.Elapsed.TotalMilliseconds; + Debug.Log("Font Atlas generation completed in: " + m_GlyphRenderingGenerationTime.ToString("0.000 ms.")); + m_StopWatch.Reset(); + }); + } + + SaveCreationSettingsToEditorPrefs(SaveFontCreationSettings()); + } + } + + // FONT RENDERING PROGRESS BAR + GUILayout.Space(1); + Rect progressRect = EditorGUILayout.GetControlRect(false, 20); + + GUI.enabled = true; + progressRect.width -= 22; + EditorGUI.ProgressBar(progressRect, Mathf.Max(0.01f, m_AtlasGenerationProgress), m_AtlasGenerationProgressLabel); + progressRect.x = progressRect.x + progressRect.width + 2; + progressRect.y -= 1; + progressRect.width = 20; + progressRect.height = 20; + + GUI.enabled = m_IsProcessing; + if (GUI.Button(progressRect, "X")) + { + FontEngine.SendCancellationRequest(); + m_AtlasGenerationProgress = 0; + m_IsProcessing = false; + m_IsGenerationCancelled = true; + } + GUILayout.Space(5); + + // FONT STATUS & INFORMATION + GUI.enabled = true; + + GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.Height(200)); + m_OutputScrollPosition = EditorGUILayout.BeginScrollView(m_OutputScrollPosition); + EditorGUILayout.LabelField(m_OutputFeedback, TMP_UIStyleManager.label); + EditorGUILayout.EndScrollView(); + GUILayout.EndVertical(); + + // SAVE TEXTURE & CREATE and SAVE FONT XML FILE + GUI.enabled = m_FontAtlasTexture != null && !m_IsProcessing; // Enable Save Button if font_Atlas is not Null. + + EditorGUILayout.BeginHorizontal(); + + if (GUILayout.Button("Save") && GUI.enabled) + { + if (m_SelectedFontAsset == null) + { + if (m_LegacyFontAsset != null) + SaveNewFontAssetWithSameName(m_LegacyFontAsset); + else + SaveNewFontAsset(m_SourceFontFile); + } + else + { + // Save over exiting Font Asset + string filePath = Path.GetFullPath(AssetDatabase.GetAssetPath(m_SelectedFontAsset)).Replace('\\', '/'); + + if (((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + Save_Bitmap_FontAsset(filePath); + else + Save_SDF_FontAsset(filePath); + } + } + if (GUILayout.Button("Save as...") && GUI.enabled) + { + if (m_SelectedFontAsset == null) + { + SaveNewFontAsset(m_SourceFontFile); + } + else + { + SaveNewFontAssetWithSameName(m_SelectedFontAsset); + } + } + + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(); + + EditorGUILayout.EndVertical(); + + GUI.enabled = true; // Re-enable GUI + + if (position.height > position.width || position.width < k_TwoColumnControlsWidth) + { + DrawPreview(); + GUILayout.Space(5); + } + + EditorGUILayout.EndScrollView(); + + if (m_IsFontAtlasInvalid) + ClearGeneratedData(); + } + + + /// + /// Clear the previously generated data. + /// + void ClearGeneratedData() + { + m_IsFontAtlasInvalid = false; + + if (m_FontAtlasTexture != null && !EditorUtility.IsPersistent(m_FontAtlasTexture)) + { + DestroyImmediate(m_FontAtlasTexture); + m_FontAtlasTexture = null; + } + + m_AtlasGenerationProgressLabel = string.Empty; + m_AtlasGenerationProgress = 0; + m_SavedFontAtlas = null; + + m_OutputFeedback = string.Empty; + m_WarningMessage = string.Empty; + } + + + /// + /// Function to update the feedback window showing the results of the latest generation. + /// + void UpdateRenderFeedbackWindow() + { + m_PointSize = m_FaceInfo.pointSize; + + string missingGlyphReport = string.Empty; + + //string colorTag = m_FontCharacterTable.Count == m_CharacterCount ? "" : ""; + string colorTag2 = ""; + + missingGlyphReport = "Font: " + colorTag2 + m_FaceInfo.familyName + " Style: " + colorTag2 + m_FaceInfo.styleName + ""; + + missingGlyphReport += "\nPoint Size: " + colorTag2 + m_FaceInfo.pointSize + " SP/PD Ratio: " + colorTag2 + ((float)m_Padding / m_FaceInfo.pointSize).ToString("0.0%" + ""); + + missingGlyphReport += "\n\nCharacters included: " + m_FontCharacterTable.Count + "/" + m_CharacterCount + ""; + missingGlyphReport += "\nMissing characters: " + m_MissingCharacters.Count + ""; + missingGlyphReport += "\nExcluded characters: " + m_ExcludedCharacters.Count + ""; + + // Report characters missing from font file + missingGlyphReport += "\n\nCharacters missing from font file:"; + missingGlyphReport += "\n----------------------------------------"; + + m_OutputFeedback = missingGlyphReport; + + for (int i = 0; i < m_MissingCharacters.Count; i++) + { + missingGlyphReport += "\nID: " + m_MissingCharacters[i] + "\tHex: " + m_MissingCharacters[i].ToString("X") + "\tChar [" + (char)m_MissingCharacters[i] + "]"; + + if (missingGlyphReport.Length < 16300) + m_OutputFeedback = missingGlyphReport; + } + + // Report characters that did not fit in the atlas texture + missingGlyphReport += "\n\nCharacters excluded from packing:"; + missingGlyphReport += "\n----------------------------------------"; + + for (int i = 0; i < m_ExcludedCharacters.Count; i++) + { + missingGlyphReport += "\nID: " + m_ExcludedCharacters[i] + "\tHex: " + m_ExcludedCharacters[i].ToString("X") + "\tChar [" + (char)m_ExcludedCharacters[i] + "]"; + + if (missingGlyphReport.Length < 16300) + m_OutputFeedback = missingGlyphReport; + } + + if (missingGlyphReport.Length > 16300) + m_OutputFeedback += "\n\nReport truncated.\nSee \"TextMesh Pro\\Glyph Report.txt\""; + + // Save Missing Glyph Report file + if (Directory.Exists("Assets/TextMesh Pro")) + { + missingGlyphReport = System.Text.RegularExpressions.Regex.Replace(missingGlyphReport, @"<[^>]*>", string.Empty); + File.WriteAllText("Assets/TextMesh Pro/Glyph Report.txt", missingGlyphReport); + AssetDatabase.Refresh(); + } + } + + + void CreateFontAtlasTexture() + { + if (m_FontAtlasTexture != null) + DestroyImmediate(m_FontAtlasTexture); + + m_FontAtlasTexture = new Texture2D(m_AtlasWidth, m_AtlasHeight, TextureFormat.Alpha8, false, true); + + Color32[] colors = new Color32[m_AtlasWidth * m_AtlasHeight]; + + for (int i = 0; i < colors.Length; i++) + { + byte c = m_AtlasTextureBuffer[i]; + colors[i] = new Color32(c, c, c, c); + } + + // Clear allocation of + m_AtlasTextureBuffer = null; + + if ((m_GlyphRenderMode & GlyphRenderMode.RASTER) == GlyphRenderMode.RASTER || (m_GlyphRenderMode & GlyphRenderMode.RASTER_HINTED) == GlyphRenderMode.RASTER_HINTED) + m_FontAtlasTexture.filterMode = FilterMode.Point; + + m_FontAtlasTexture.SetPixels32(colors, 0); + m_FontAtlasTexture.Apply(false, false); + + // Saving File for Debug + //var pngData = m_FontAtlasTexture.EncodeToPNG(); + //File.WriteAllBytes("Assets/Textures/Debug Font Texture.png", pngData); + } + + + /// + /// Open Save Dialog to provide the option save the font asset using the name of the source font file. This also appends SDF to the name if using any of the SDF Font Asset creation modes. + /// + /// + void SaveNewFontAsset(Object sourceObject) + { + string filePath; + + // Save new Font Asset and open save file requester at Source Font File location. + string saveDirectory = new FileInfo(AssetDatabase.GetAssetPath(sourceObject)).DirectoryName; + + if (((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + { + filePath = EditorUtility.SaveFilePanel("Save TextMesh Pro! Font Asset File", saveDirectory, sourceObject.name, "asset"); + + if (filePath.Length == 0) + return; + + Save_Bitmap_FontAsset(filePath); + } + else + { + filePath = EditorUtility.SaveFilePanel("Save TextMesh Pro! Font Asset File", saveDirectory, sourceObject.name + " SDF", "asset"); + + if (filePath.Length == 0) + return; + + Save_SDF_FontAsset(filePath); + } + } + + + /// + /// Open Save Dialog to provide the option to save the font asset under the same name. + /// + /// + void SaveNewFontAssetWithSameName(Object sourceObject) + { + string filePath; + + // Save new Font Asset and open save file requester at Source Font File location. + string saveDirectory = new FileInfo(AssetDatabase.GetAssetPath(sourceObject)).DirectoryName; + + filePath = EditorUtility.SaveFilePanel("Save TextMesh Pro! Font Asset File", saveDirectory, sourceObject.name, "asset"); + + if (filePath.Length == 0) + return; + + if (((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + { + Save_Bitmap_FontAsset(filePath); + } + else + { + Save_SDF_FontAsset(filePath); + } + } + + + void Save_Bitmap_FontAsset(string filePath) + { + filePath = filePath.Substring(0, filePath.Length - 6); // Trim file extension from filePath. + + string dataPath = Application.dataPath; + + if (filePath.IndexOf(dataPath, System.StringComparison.InvariantCultureIgnoreCase) == -1) + { + Debug.LogError("You're saving the font asset in a directory outside of this project folder. This is not supported. Please select a directory under \"" + dataPath + "\""); + return; + } + + string relativeAssetPath = filePath.Substring(dataPath.Length - 6); + string tex_DirName = Path.GetDirectoryName(relativeAssetPath); + string tex_FileName = Path.GetFileNameWithoutExtension(relativeAssetPath); + string tex_Path_NoExt = tex_DirName + "/" + tex_FileName; + + // Check if TextMeshPro font asset already exists. If not, create a new one. Otherwise update the existing one. + TMP_FontAsset fontAsset = AssetDatabase.LoadAssetAtPath(tex_Path_NoExt + ".asset", typeof(TMP_FontAsset)) as TMP_FontAsset; + if (fontAsset == null) + { + //Debug.Log("Creating TextMeshPro font asset!"); + fontAsset = ScriptableObject.CreateInstance(); // Create new TextMeshPro Font Asset. + AssetDatabase.CreateAsset(fontAsset, tex_Path_NoExt + ".asset"); + + // Set version number of font asset + fontAsset.version = "1.1.0"; + + //Set Font Asset Type + fontAsset.atlasRenderMode = m_GlyphRenderMode; + + // Reference to the source font file GUID. + fontAsset.m_SourceFontFileGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_SourceFontFile)); + + // Add FaceInfo to Font Asset + fontAsset.faceInfo = m_FaceInfo; + + // Add GlyphInfo[] to Font Asset + fontAsset.glyphTable = m_FontGlyphTable; + + // Add CharacterTable[] to font asset. + fontAsset.characterTable = m_FontCharacterTable; + + // Sort glyph and character tables. + fontAsset.SortGlyphAndCharacterTables(); + + // Get and Add Kerning Pairs to Font Asset + if (m_IncludeFontFeatures) + fontAsset.fontFeatureTable = GetKerningTable(); + + + // Add Font Atlas as Sub-Asset + fontAsset.atlasTextures = new Texture2D[] { m_FontAtlasTexture }; + m_FontAtlasTexture.name = tex_FileName + " Atlas"; + fontAsset.atlasWidth = m_AtlasWidth; + fontAsset.atlasHeight = m_AtlasHeight; + fontAsset.atlasPadding = m_Padding; + + AssetDatabase.AddObjectToAsset(m_FontAtlasTexture, fontAsset); + + // Create new Material and Add it as Sub-Asset + Shader default_Shader = Shader.Find("TextMeshPro/Bitmap"); // m_shaderSelection; + Material tmp_material = new Material(default_Shader); + tmp_material.name = tex_FileName + " Material"; + tmp_material.SetTexture(ShaderUtilities.ID_MainTex, m_FontAtlasTexture); + fontAsset.material = tmp_material; + + AssetDatabase.AddObjectToAsset(tmp_material, fontAsset); + + } + else + { + // Find all Materials referencing this font atlas. + Material[] material_references = TMP_EditorUtility.FindMaterialReferences(fontAsset); + + // Set version number of font asset + fontAsset.version = "1.1.0"; + + // Special handling to remove legacy font asset data + if (fontAsset.m_glyphInfoList != null && fontAsset.m_glyphInfoList.Count > 0) + fontAsset.m_glyphInfoList = null; + + // Destroy Assets that will be replaced. + if (fontAsset.atlasTextures != null && fontAsset.atlasTextures.Length > 0) + DestroyImmediate(fontAsset.atlasTextures[0], true); + + //Set Font Asset Type + fontAsset.atlasRenderMode = m_GlyphRenderMode; + + // Add FaceInfo to Font Asset + fontAsset.faceInfo = m_FaceInfo; + + // Add GlyphInfo[] to Font Asset + fontAsset.glyphTable = m_FontGlyphTable; + + // Add CharacterTable[] to font asset. + fontAsset.characterTable = m_FontCharacterTable; + + // Sort glyph and character tables. + fontAsset.SortGlyphAndCharacterTables(); + + // Get and Add Kerning Pairs to Font Asset + if (m_IncludeFontFeatures) + fontAsset.fontFeatureTable = GetKerningTable(); + + // Add Font Atlas as Sub-Asset + fontAsset.atlasTextures = new Texture2D[] { m_FontAtlasTexture }; + m_FontAtlasTexture.name = tex_FileName + " Atlas"; + fontAsset.atlasWidth = m_AtlasWidth; + fontAsset.atlasHeight = m_AtlasHeight; + fontAsset.atlasPadding = m_Padding; + + // Special handling due to a bug in earlier versions of Unity. + m_FontAtlasTexture.hideFlags = HideFlags.None; + fontAsset.material.hideFlags = HideFlags.None; + + AssetDatabase.AddObjectToAsset(m_FontAtlasTexture, fontAsset); + + // Assign new font atlas texture to the existing material. + fontAsset.material.SetTexture(ShaderUtilities.ID_MainTex, fontAsset.atlasTextures[0]); + + // Update the Texture reference on the Material + for (int i = 0; i < material_references.Length; i++) + { + material_references[i].SetTexture(ShaderUtilities.ID_MainTex, m_FontAtlasTexture); + } + } + + // Add list of GlyphRects to font asset. + fontAsset.freeGlyphRects = m_FreeGlyphRects; + fontAsset.usedGlyphRects = m_UsedGlyphRects; + + // Save Font Asset creation settings + m_SelectedFontAsset = fontAsset; + m_LegacyFontAsset = null; + fontAsset.creationSettings = SaveFontCreationSettings(); + + AssetDatabase.SaveAssets(); + + AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(fontAsset)); // Re-import font asset to get the new updated version. + + //EditorUtility.SetDirty(font_asset); + fontAsset.ReadFontAssetDefinition(); + + AssetDatabase.Refresh(); + + m_FontAtlasTexture = null; + + // NEED TO GENERATE AN EVENT TO FORCE A REDRAW OF ANY TEXTMESHPRO INSTANCES THAT MIGHT BE USING THIS FONT ASSET + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, fontAsset); + } + + + void Save_SDF_FontAsset(string filePath) + { + filePath = filePath.Substring(0, filePath.Length - 6); // Trim file extension from filePath. + + string dataPath = Application.dataPath; + + if (filePath.IndexOf(dataPath, System.StringComparison.InvariantCultureIgnoreCase) == -1) + { + Debug.LogError("You're saving the font asset in a directory outside of this project folder. This is not supported. Please select a directory under \"" + dataPath + "\""); + return; + } + + string relativeAssetPath = filePath.Substring(dataPath.Length - 6); + string tex_DirName = Path.GetDirectoryName(relativeAssetPath); + string tex_FileName = Path.GetFileNameWithoutExtension(relativeAssetPath); + string tex_Path_NoExt = tex_DirName + "/" + tex_FileName; + + + // Check if TextMeshPro font asset already exists. If not, create a new one. Otherwise update the existing one. + TMP_FontAsset fontAsset = AssetDatabase.LoadAssetAtPath(tex_Path_NoExt + ".asset"); + if (fontAsset == null) + { + //Debug.Log("Creating TextMeshPro font asset!"); + fontAsset = ScriptableObject.CreateInstance(); // Create new TextMeshPro Font Asset. + AssetDatabase.CreateAsset(fontAsset, tex_Path_NoExt + ".asset"); + + // Set version number of font asset + fontAsset.version = "1.1.0"; + + // Reference to source font file GUID. + fontAsset.m_SourceFontFileGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_SourceFontFile)); + + //Set Font Asset Type + fontAsset.atlasRenderMode = m_GlyphRenderMode; + + // Add FaceInfo to Font Asset + fontAsset.faceInfo = m_FaceInfo; + + // Add GlyphInfo[] to Font Asset + fontAsset.glyphTable = m_FontGlyphTable; + + // Add CharacterTable[] to font asset. + fontAsset.characterTable = m_FontCharacterTable; + + // Sort glyph and character tables. + fontAsset.SortGlyphAndCharacterTables(); + + // Get and Add Kerning Pairs to Font Asset + if (m_IncludeFontFeatures) + fontAsset.fontFeatureTable = GetKerningTable(); + + // Add Font Atlas as Sub-Asset + fontAsset.atlasTextures = new Texture2D[] { m_FontAtlasTexture }; + m_FontAtlasTexture.name = tex_FileName + " Atlas"; + fontAsset.atlasWidth = m_AtlasWidth; + fontAsset.atlasHeight = m_AtlasHeight; + fontAsset.atlasPadding = m_Padding; + + AssetDatabase.AddObjectToAsset(m_FontAtlasTexture, fontAsset); + + // Create new Material and Add it as Sub-Asset + Shader default_Shader = Shader.Find("TextMeshPro/Distance Field"); + Material tmp_material = new Material(default_Shader); + + tmp_material.name = tex_FileName + " Material"; + tmp_material.SetTexture(ShaderUtilities.ID_MainTex, m_FontAtlasTexture); + tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, m_FontAtlasTexture.width); + tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, m_FontAtlasTexture.height); + + int spread = m_Padding + 1; + tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, spread); // Spread = Padding for Brute Force SDF. + + tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle); + tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle); + + fontAsset.material = tmp_material; + + AssetDatabase.AddObjectToAsset(tmp_material, fontAsset); + + } + else + { + // Find all Materials referencing this font atlas. + Material[] material_references = TMP_EditorUtility.FindMaterialReferences(fontAsset); + + // Destroy Assets that will be replaced. + if (fontAsset.atlasTextures != null && fontAsset.atlasTextures.Length > 0) + DestroyImmediate(fontAsset.atlasTextures[0], true); + + // Set version number of font asset + fontAsset.version = "1.1.0"; + + // Special handling to remove legacy font asset data + if (fontAsset.m_glyphInfoList != null && fontAsset.m_glyphInfoList.Count > 0) + fontAsset.m_glyphInfoList = null; + + //Set Font Asset Type + fontAsset.atlasRenderMode = m_GlyphRenderMode; + + // Add FaceInfo to Font Asset + fontAsset.faceInfo = m_FaceInfo; + + // Add GlyphInfo[] to Font Asset + fontAsset.glyphTable = m_FontGlyphTable; + + // Add CharacterTable[] to font asset. + fontAsset.characterTable = m_FontCharacterTable; + + // Sort glyph and character tables. + fontAsset.SortGlyphAndCharacterTables(); + + // Get and Add Kerning Pairs to Font Asset + // TODO: Check and preserve existing adjustment pairs. + if (m_IncludeFontFeatures) + fontAsset.fontFeatureTable = GetKerningTable(); + + // Add Font Atlas as Sub-Asset + fontAsset.atlasTextures = new Texture2D[] { m_FontAtlasTexture }; + m_FontAtlasTexture.name = tex_FileName + " Atlas"; + fontAsset.atlasWidth = m_AtlasWidth; + fontAsset.atlasHeight = m_AtlasHeight; + fontAsset.atlasPadding = m_Padding; + + // Special handling due to a bug in earlier versions of Unity. + m_FontAtlasTexture.hideFlags = HideFlags.None; + fontAsset.material.hideFlags = HideFlags.None; + + AssetDatabase.AddObjectToAsset(m_FontAtlasTexture, fontAsset); + + // Assign new font atlas texture to the existing material. + fontAsset.material.SetTexture(ShaderUtilities.ID_MainTex, fontAsset.atlasTextures[0]); + + // Update the Texture reference on the Material + for (int i = 0; i < material_references.Length; i++) + { + material_references[i].SetTexture(ShaderUtilities.ID_MainTex, m_FontAtlasTexture); + material_references[i].SetFloat(ShaderUtilities.ID_TextureWidth, m_FontAtlasTexture.width); + material_references[i].SetFloat(ShaderUtilities.ID_TextureHeight, m_FontAtlasTexture.height); + + int spread = m_Padding + 1; + material_references[i].SetFloat(ShaderUtilities.ID_GradientScale, spread); // Spread = Padding for Brute Force SDF. + + material_references[i].SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle); + material_references[i].SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle); + } + } + + // Saving File for Debug + //var pngData = destination_Atlas.EncodeToPNG(); + //File.WriteAllBytes("Assets/Textures/Debug Distance Field.png", pngData); + + // Add list of GlyphRects to font asset. + fontAsset.freeGlyphRects = m_FreeGlyphRects; + fontAsset.usedGlyphRects = m_UsedGlyphRects; + + // Save Font Asset creation settings + m_SelectedFontAsset = fontAsset; + m_LegacyFontAsset = null; + fontAsset.creationSettings = SaveFontCreationSettings(); + + AssetDatabase.SaveAssets(); + + AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(fontAsset)); // Re-import font asset to get the new updated version. + + fontAsset.ReadFontAssetDefinition(); + + AssetDatabase.Refresh(); + + m_FontAtlasTexture = null; + + // NEED TO GENERATE AN EVENT TO FORCE A REDRAW OF ANY TEXTMESHPRO INSTANCES THAT MIGHT BE USING THIS FONT ASSET + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, fontAsset); + } + + + /// + /// Internal method to save the Font Asset Creation Settings + /// + /// + FontAssetCreationSettings SaveFontCreationSettings() + { + FontAssetCreationSettings settings = new FontAssetCreationSettings(); + + //settings.sourceFontFileName = m_SourceFontFile.name; + settings.sourceFontFileGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_SourceFontFile)); + settings.pointSizeSamplingMode = m_PointSizeSamplingMode; + settings.pointSize = m_PointSize; + settings.padding = m_Padding; + settings.packingMode = (int)m_PackingMode; + settings.atlasWidth = m_AtlasWidth; + settings.atlasHeight = m_AtlasHeight; + settings.characterSetSelectionMode = m_CharacterSetSelectionMode; + settings.characterSequence = m_CharacterSequence; + settings.referencedFontAssetGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_ReferencedFontAsset)); + settings.referencedTextAssetGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_CharactersFromFile)); + //settings.fontStyle = (int)m_FontStyle; + //settings.fontStyleModifier = m_FontStyleValue; + settings.renderMode = (int)m_GlyphRenderMode; + settings.includeFontFeatures = m_IncludeFontFeatures; + + return settings; + } + + + /// + /// Internal method to load the Font Asset Creation Settings + /// + /// + void LoadFontCreationSettings(FontAssetCreationSettings settings) + { + m_SourceFontFile = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(settings.sourceFontFileGUID)); + m_PointSizeSamplingMode = settings.pointSizeSamplingMode; + m_PointSize = settings.pointSize; + m_Padding = settings.padding; + m_PackingMode = (FontPackingModes)settings.packingMode; + m_AtlasWidth = settings.atlasWidth; + m_AtlasHeight = settings.atlasHeight; + m_CharacterSetSelectionMode = settings.characterSetSelectionMode; + m_CharacterSequence = settings.characterSequence; + m_ReferencedFontAsset = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(settings.referencedFontAssetGUID)); + m_CharactersFromFile = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(settings.referencedTextAssetGUID)); + //m_FontStyle = (FaceStyles)settings.fontStyle; + //m_FontStyleValue = settings.fontStyleModifier; + m_GlyphRenderMode = (GlyphRenderMode)settings.renderMode; + m_IncludeFontFeatures = settings.includeFontFeatures; + } + + + /// + /// Save the latest font asset creation settings to EditorPrefs. + /// + /// + void SaveCreationSettingsToEditorPrefs(FontAssetCreationSettings settings) + { + // Create new list if one does not already exist + if (m_FontAssetCreationSettingsContainer == null) + { + m_FontAssetCreationSettingsContainer = new FontAssetCreationSettingsContainer(); + m_FontAssetCreationSettingsContainer.fontAssetCreationSettings = new List(); + } + + // Add new creation settings to the list + m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Add(settings); + + // Since list should only contain the most 4 recent settings, we remove the first element if list exceeds 4 elements. + if (m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Count > 4) + m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.RemoveAt(0); + + m_FontAssetCreationSettingsCurrentIndex = m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Count - 1; + + // Serialize list to JSON + string serializedSettings = JsonUtility.ToJson(m_FontAssetCreationSettingsContainer, true); + + EditorPrefs.SetString(k_FontAssetCreationSettingsContainerKey, serializedSettings); + } + + void DrawPreview() + { + Rect pixelRect; + if (position.width > position.height && position.width > k_TwoColumnControlsWidth) + { + float minSide = Mathf.Min(position.height - 15f, position.width - k_TwoColumnControlsWidth); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.MaxWidth(minSide)); + + pixelRect = GUILayoutUtility.GetRect(minSide, minSide, GUILayout.ExpandHeight(false), GUILayout.ExpandWidth(false)); + } + else + { + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + pixelRect = GUILayoutUtility.GetAspectRect(1f); + } + + if (m_FontAtlasTexture != null) + { + EditorGUI.DrawTextureAlpha(pixelRect, m_FontAtlasTexture, ScaleMode.StretchToFill); + } + else if (m_SavedFontAtlas != null) + { + EditorGUI.DrawTextureAlpha(pixelRect, m_SavedFontAtlas, ScaleMode.StretchToFill); + } + + EditorGUILayout.EndVertical(); + } + + + void CheckForLegacyGlyphRenderMode() + { + // Special handling for legacy glyph render mode + if ((int)m_GlyphRenderMode < 0x100) + { + switch ((int)m_GlyphRenderMode) + { + case 0: + m_GlyphRenderMode = GlyphRenderMode.SMOOTH_HINTED; + break; + case 1: + m_GlyphRenderMode = GlyphRenderMode.SMOOTH; + break; + case 2: + m_GlyphRenderMode = GlyphRenderMode.RASTER_HINTED; + break; + case 3: + m_GlyphRenderMode = GlyphRenderMode.RASTER; + break; + case 6: + case 7: + m_GlyphRenderMode = GlyphRenderMode.SDFAA; + break; + } + } + } + + + // Get Kerning Pairs + public TMP_FontFeatureTable GetKerningTable() + { + GlyphPairAdjustmentRecord[] adjustmentRecords = FontEngine.GetGlyphPairAdjustmentTable(m_AvailableGlyphsToAdd.ToArray()); + + if (adjustmentRecords == null) + return null; + + TMP_FontFeatureTable fontFeatureTable = new TMP_FontFeatureTable(); + + for (int i = 0; i < adjustmentRecords.Length; i++) + { + fontFeatureTable.glyphPairAdjustmentRecords.Add(new TMP_GlyphPairAdjustmentRecord(adjustmentRecords[i])); + } + + fontFeatureTable.SortGlyphPairAdjustmentRecords(); + + return fontFeatureTable; + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs.meta new file mode 100644 index 0000000..4648857 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 383966e89d344865a36addd5d378ffd3 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontPlugin.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontPlugin.cs new file mode 100644 index 0000000..3b098ff --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontPlugin.cs @@ -0,0 +1,115 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; +using System; +using System.Runtime.InteropServices; + + +namespace TMPro.EditorUtilities +{ + /* + public class TMPro_FontPlugin + { + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + private delegate void DebugLog(string log); + private static readonly DebugLog debugLog = DebugWrapper; + private static readonly IntPtr functionPointer = Marshal.GetFunctionPointerForDelegate(debugLog); + + private static void DebugWrapper(string log) + { + Debug.Log(log); + } + + public static void LinkDebugLog() + { + LinkDebug(functionPointer); + } + + [DllImport("TMPro_Plugin")] + private static extern void LinkDebug([MarshalAs(UnmanagedType.FunctionPtr)]IntPtr debugCall); + + [DllImport("TMPro_Plugin")] + public static extern + int Initialize_FontEngine(); + + [DllImport("TMPro_Plugin")] + public static extern + int Destroy_FontEngine(); + + [DllImport("TMPro_Plugin")] + public static extern + int Load_TrueType_Font(string fontPath); + + [DllImport("TMPro_Plugin")] + public static extern + int FT_Size_Font(int fontSize); + + [DllImport("TMPro_Plugin")] + public static extern + int Render_Character(byte[] buffer_fill, byte[] buffer_edge, int buffer_width, int buffer_height, int offset, int asc, FaceStyles style, float thickness, RenderModes rasterMode, ref FT_GlyphInfo glyphInfo); + + [DllImport("TMPro_Plugin")] + public static extern + int Render_Characters(byte[] buffer, int buffer_width, int buffer_height, int character_padding, int[] asc_set, int char_count, FaceStyles style, float style_mod, bool autoSize, RenderModes renderMode, int method, ref FT_FaceInfo fontData, FT_GlyphInfo[] Output); + + [DllImport("TMPro_Plugin")] + public static extern + int FT_GetKerningPairs(string fontPath, int[] characterSet, int setCount, FT_KerningPair[] kerningPairs); + + [DllImport("TMPro_Plugin")] + public static extern + float Check_RenderProgress(); + + [DllImport("TMPro_Plugin")] + internal static extern + void SendCancellationRequest(CancellationRequestType request); + } + + public enum FaceStyles { Normal, Bold, Italic, Bold_Italic, Outline, Bold_Sim }; + public enum RenderModes { HintedSmooth = 0, Smooth = 1, RasterHinted = 2, Raster = 3, DistanceField16 = 6, DistanceField32 = 7 }; // SignedDistanceField64 = 8 + + internal enum CancellationRequestType : byte { None = 0x0, CancelInProgess = 0x1, WindowClosed = 0x2 }; + + [StructLayout(LayoutKind.Sequential)] + public struct FT_KerningPair + { + public int ascII_Left; + public int ascII_Right; + public float xAdvanceOffset; + } + + + [StructLayout(LayoutKind.Sequential)] + public struct FT_GlyphInfo + { + public int id; + public float x; + public float y; + public float width; + public float height; + public float xOffset; + public float yOffset; + public float xAdvance; + } + + + [StructLayout(LayoutKind.Sequential)] + public struct FT_FaceInfo + { + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] + public string name; + public int pointSize; + public int padding; + public float lineHeight; + public float baseline; + public float ascender; + public float descender; + public float centerLine; + public float underline; + public float underlineThickness; + public int characterCount; + public int atlasWidth; + public int atlasHeight; + } + */ +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontPlugin.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontPlugin.cs.meta new file mode 100644 index 0000000..66f3a87 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontPlugin.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 9edc9283e7d6409fab242fe8fb6a822c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_SortingLayerHelper.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_SortingLayerHelper.cs new file mode 100644 index 0000000..4f44c53 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_SortingLayerHelper.cs @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2014, Nick Gravelyn. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + */ + +using UnityEngine; +using UnityEditor; +using System; +using System.Reflection; + +namespace TMPro +{ + // Helpers used by the different sorting layer classes. + public static class SortingLayerHelper + { + private static Type _utilityType; + private static PropertyInfo _sortingLayerNamesProperty; + private static MethodInfo _getSortingLayerUserIdMethod; + + static SortingLayerHelper() + { + _utilityType = Type.GetType("UnityEditorInternal.InternalEditorUtility, UnityEditor"); + _sortingLayerNamesProperty = _utilityType.GetProperty("sortingLayerNames", BindingFlags.Static | BindingFlags.NonPublic); + _getSortingLayerUserIdMethod = _utilityType.GetMethod("GetSortingLayerUniqueID", BindingFlags.Static | BindingFlags.NonPublic); + } + + // Gets an array of sorting layer names. + // Since this uses reflection, callers should check for 'null' which will be returned if the reflection fails. + public static string[] sortingLayerNames + { + get + { + if (_sortingLayerNamesProperty == null) + { + return null; + } + + return _sortingLayerNamesProperty.GetValue(null, null) as string[]; + } + } + + // Given the ID of a sorting layer, returns the sorting layer's name + public static string GetSortingLayerNameFromID(int id) + { + string[] names = sortingLayerNames; + if (names == null) + { + return null; + } + + for (int i = 0; i < names.Length; i++) + { + if (GetSortingLayerIDForIndex(i) == id) + { + return names[i]; + } + } + + return null; + } + + // Given the name of a sorting layer, returns the ID. + public static int GetSortingLayerIDForName(string name) + { + string[] names = sortingLayerNames; + if (names == null) + { + return 0; + } + + return GetSortingLayerIDForIndex(Array.IndexOf(names, name)); + } + + // Helper to convert from a sorting layer INDEX to a sorting layer ID. These are not the same thing. + // IDs are based on the order in which layers were created and do not change when reordering the layers. + // Thankfully there is a private helper we can call to get the ID for a layer given its index. + public static int GetSortingLayerIDForIndex(int index) + { + if (_getSortingLayerUserIdMethod == null) + { + return 0; + } + + return (int)_getSortingLayerUserIdMethod.Invoke(null, new object[] { index }); + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_SortingLayerHelper.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_SortingLayerHelper.cs.meta new file mode 100644 index 0000000..9d902b9 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_SortingLayerHelper.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 88ed537c17c34f339121fe9a7d6d7a0e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TextContainerEditor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TextContainerEditor.cs new file mode 100644 index 0000000..09fc617 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TextContainerEditor.cs @@ -0,0 +1,235 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TextContainer)), CanEditMultipleObjects] + public class TMPro_TextContainerEditor : Editor + { + + // Serialized Properties + private SerializedProperty anchorPosition_prop; + private SerializedProperty pivot_prop; + private SerializedProperty rectangle_prop; + private SerializedProperty margins_prop; + + + private TextContainer m_textContainer; + //private Transform m_transform; + //private Vector3[] m_Rect_handlePoints = new Vector3[4]; + //private Vector3[] m_Margin_handlePoints = new Vector3[4]; + + //private Vector2 m_anchorPosition; + + //private Vector3 m_mousePreviousPOS; + //private Vector2 m_previousStartPOS; + //private int m_mouseDragFlag = 0; + + //private static Transform m_visualHelper; + + + void OnEnable() + { + + // Serialized Properties + anchorPosition_prop = serializedObject.FindProperty("m_anchorPosition"); + pivot_prop = serializedObject.FindProperty("m_pivot"); + rectangle_prop = serializedObject.FindProperty("m_rect"); + margins_prop = serializedObject.FindProperty("m_margins"); + + m_textContainer = (TextContainer)target; + //m_transform = m_textContainer.transform; + + + /* + if (m_visualHelper == null) + { + m_visualHelper = GameObject.CreatePrimitive(PrimitiveType.Sphere).transform; + m_visualHelper.localScale = new Vector3(0.25f, 0.25f, 0.25f); + } + */ + } + + void OnDisable() + { + /* + if (m_visualHelper != null) + DestroyImmediate (m_visualHelper.gameObject); + */ + } + + + + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(anchorPosition_prop); + if (anchorPosition_prop.enumValueIndex == 9) + { + EditorGUI.indentLevel += 1; + EditorGUILayout.PropertyField(pivot_prop, new GUIContent("Pivot Position")); + EditorGUI.indentLevel -= 1; + } + + + DrawDimensionProperty(rectangle_prop, "Dimensions"); + DrawMaginProperty(margins_prop, "Margins"); + if (EditorGUI.EndChangeCheck()) + { + // Re-compute pivot position when changes are made. + if (anchorPosition_prop.enumValueIndex != 9) + pivot_prop.vector2Value = GetAnchorPosition(anchorPosition_prop.enumValueIndex); + + m_textContainer.hasChanged = true; + } + + serializedObject.ApplyModifiedProperties(); + + EditorGUILayout.Space(); + } + + + private void DrawDimensionProperty(SerializedProperty property, string label) + { + float old_LabelWidth = EditorGUIUtility.labelWidth; + float old_FieldWidth = EditorGUIUtility.fieldWidth; + + Rect rect = EditorGUILayout.GetControlRect(false, 18); + Rect pos0 = new Rect(rect.x, rect.y + 2, rect.width, 18); + + float width = rect.width + 3; + pos0.width = old_LabelWidth; + GUI.Label(pos0, label); + + Rect rectangle = property.rectValue; + + float width_B = width - old_LabelWidth; + float fieldWidth = width_B / 4; + pos0.width = fieldWidth - 5; + + pos0.x = old_LabelWidth + 15; + GUI.Label(pos0, "Width"); + + pos0.x += fieldWidth; + rectangle.width = EditorGUI.FloatField(pos0, GUIContent.none, rectangle.width); + + pos0.x += fieldWidth; + GUI.Label(pos0, "Height"); + + pos0.x += fieldWidth; + rectangle.height = EditorGUI.FloatField(pos0, GUIContent.none, rectangle.height); + + property.rectValue = rectangle; + EditorGUIUtility.labelWidth = old_LabelWidth; + EditorGUIUtility.fieldWidth = old_FieldWidth; + } + + + private void DrawMaginProperty(SerializedProperty property, string label) + { + float old_LabelWidth = EditorGUIUtility.labelWidth; + float old_FieldWidth = EditorGUIUtility.fieldWidth; + + Rect rect = EditorGUILayout.GetControlRect(false, 2 * 18); + Rect pos0 = new Rect(rect.x, rect.y + 2, rect.width, 18); + + float width = rect.width + 3; + pos0.width = old_LabelWidth; + GUI.Label(pos0, label); + + //Vector4 vec = property.vector4Value; + Vector4 vec = Vector4.zero; + vec.x = property.FindPropertyRelative("x").floatValue; + vec.y = property.FindPropertyRelative("y").floatValue; + vec.z = property.FindPropertyRelative("z").floatValue; + vec.w = property.FindPropertyRelative("w").floatValue; + + + float widthB = width - old_LabelWidth; + float fieldWidth = widthB / 4; + pos0.width = fieldWidth - 5; + + // Labels + pos0.x = old_LabelWidth + 15; + GUI.Label(pos0, "Left"); + + pos0.x += fieldWidth; + GUI.Label(pos0, "Top"); + + pos0.x += fieldWidth; + GUI.Label(pos0, "Right"); + + pos0.x += fieldWidth; + GUI.Label(pos0, "Bottom"); + + pos0.y += 18; + + pos0.x = old_LabelWidth + 15; + vec.x = EditorGUI.FloatField(pos0, GUIContent.none, vec.x); + + pos0.x += fieldWidth; + vec.y = EditorGUI.FloatField(pos0, GUIContent.none, vec.y); + + pos0.x += fieldWidth; + vec.z = EditorGUI.FloatField(pos0, GUIContent.none, vec.z); + + pos0.x += fieldWidth; + vec.w = EditorGUI.FloatField(pos0, GUIContent.none, vec.w); + + //property.vector4Value = vec; + property.FindPropertyRelative("x").floatValue = vec.x; + property.FindPropertyRelative("y").floatValue = vec.y; + property.FindPropertyRelative("z").floatValue = vec.z; + property.FindPropertyRelative("w").floatValue = vec.w; + + EditorGUIUtility.labelWidth = old_LabelWidth; + EditorGUIUtility.fieldWidth = old_FieldWidth; + } + + + Vector2 GetAnchorPosition(int index) + { + Vector2 anchorPosition = Vector2.zero; + + switch (index) + { + case 0: // TOP LEFT + anchorPosition = new Vector2(0, 1); + break; + case 1: // TOP + anchorPosition = new Vector2(0.5f, 1); + break; + case 2: // TOP RIGHT + anchorPosition = new Vector2(1, 1); + break; + case 3: // LEFT + anchorPosition = new Vector2(0, 0.5f); + break; + case 4: // MIDDLE + anchorPosition = new Vector2(0.5f, 0.5f); + break; + case 5: // RIGHT + anchorPosition = new Vector2(1, 0.5f); + break; + case 6: // BOTTOM LEFT + anchorPosition = new Vector2(0, 0); + break; + case 7: // BOTTOM + anchorPosition = new Vector2(0.5f, 0); + break; + case 8: // BOTTOM RIGHT + anchorPosition = new Vector2(1, 0); + break; + } + + return anchorPosition; + } + + + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TextContainerEditor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TextContainerEditor.cs.meta new file mode 100644 index 0000000..bad7881 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TextContainerEditor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 02893ffb522b490a9fa28eedd2584309 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TexturePostProcessor.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TexturePostProcessor.cs new file mode 100644 index 0000000..b163409 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TexturePostProcessor.cs @@ -0,0 +1,75 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + public class TMPro_TexturePostProcessor : AssetPostprocessor + { + + void OnPostprocessTexture(Texture2D texture) + { + //var importer = assetImporter as TextureImporter; + + Texture2D tex = AssetDatabase.LoadAssetAtPath(assetPath, typeof(Texture2D)) as Texture2D; + + // Send Event Sub Objects + if (tex != null) + TMPro_EventManager.ON_SPRITE_ASSET_PROPERTY_CHANGED(true, tex); + } + + } + + + //public class TMPro_PackageImportPostProcessor : AssetPostprocessor + //{ + // static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) + // { + // for (int i = 0; i < importedAssets.Length; i++) + // { + // if (importedAssets[i].Contains("TextMesh Pro/Resources/TMP Settings.asset")) + // { + // Debug.Log("New TMP Settings file was just imported."); + + // // TMP Settings file was just re-imported. + // // Check if project already contains + // } + + + // if (importedAssets[i].Contains("com.unity.TextMeshPro/Examples")) + // { + // //Debug.Log("New TMP Examples folder was just imported."); + // } + + // //Debug.Log("[" + importedAssets[i] + "] was just imported."); + // } + + + + // //for (int i = 0; i < deletedAssets.Length; i++) + // //{ + // // if (deletedAssets[i] == "Assets/TextMesh Pro") + // // { + // // //Debug.Log("Asset [" + deletedAssets[i] + "] has been deleted."); + // // string currentBuildSettings = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + + // // //Check for and inject TMP_PRESENT + // // if (currentBuildSettings.Contains("TMP_PRESENT;")) + // // { + // // currentBuildSettings = currentBuildSettings.Replace("TMP_PRESENT;", ""); + + // // PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, currentBuildSettings); + // // } + // // else if (currentBuildSettings.Contains("TMP_PRESENT")) + // // { + // // currentBuildSettings = currentBuildSettings.Replace("TMP_PRESENT", ""); + + // // PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, currentBuildSettings); + // // } + // // } + // //} + // } + //} +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TexturePostProcessor.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TexturePostProcessor.cs.meta new file mode 100644 index 0000000..fb00b80 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TexturePostProcessor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f4935fb862d54980b1bcbca942962642 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef new file mode 100644 index 0000000..d5df154 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef @@ -0,0 +1,13 @@ +{ + "name": "Unity.TextMeshPro.Editor", + "references": [ + "Unity.TextMeshPro", + "Unity.ugui", + "Unity.ugui.Editor" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [] +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef.meta new file mode 100644 index 0000000..6ed76ad --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6546d7765b4165b40850b3667f981c26 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime.meta new file mode 100644 index 0000000..4b24415 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5fc988a1d5b04aee9a5222502b201a45 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/AssemblyInfo.cs.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/AssemblyInfo.cs.cs new file mode 100644 index 0000000..5278493 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/AssemblyInfo.cs.cs @@ -0,0 +1,11 @@ +using System.Runtime.CompilerServices; + +// Allow internal visibility for testing purposes. +[assembly: InternalsVisibleTo("Unity.TextCore")] + +[assembly: InternalsVisibleTo("Unity.FontEngine.Tests")] + +#if UNITY_EDITOR +[assembly: InternalsVisibleTo("Unity.TextCore.Editor")] +[assembly: InternalsVisibleTo("Unity.TextMeshPro.Editor")] +#endif diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/AssemblyInfo.cs.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/AssemblyInfo.cs.cs.meta new file mode 100644 index 0000000..cd52706 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/AssemblyInfo.cs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1c147d10db452eb4b854a35f84472017 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/FastAction.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/FastAction.cs new file mode 100644 index 0000000..0a6485a --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/FastAction.cs @@ -0,0 +1,146 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + + +namespace TMPro +{ + public class FastAction + { + + LinkedList delegates = new LinkedList(); + + Dictionary> lookup = new Dictionary>(); + + public void Add(System.Action rhs) + { + if (lookup.ContainsKey(rhs)) return; + + lookup[rhs] = delegates.AddLast(rhs); + } + + public void Remove(System.Action rhs) + { + if (lookup.TryGetValue(rhs, out LinkedListNode node)) + { + lookup.Remove(rhs); + delegates.Remove(node); + } + } + + public void Call() + { + var node = delegates.First; + while (node != null) + { + node.Value(); + node = node.Next; + } + } + } + + + public class FastAction + { + + LinkedList> delegates = new LinkedList>(); + + Dictionary, LinkedListNode>> lookup = new Dictionary, LinkedListNode>>(); + + public void Add(System.Action rhs) + { + if (lookup.ContainsKey(rhs)) return; + + lookup[rhs] = delegates.AddLast(rhs); + } + + public void Remove(System.Action rhs) + { + if (lookup.TryGetValue(rhs, out LinkedListNode> node)) + { + lookup.Remove(rhs); + delegates.Remove(node); + } + } + + public void Call(A a) + { + var node = delegates.First; + while (node != null) + { + node.Value(a); + node = node.Next; + } + } + } + + + public class FastAction + { + + LinkedList> delegates = new LinkedList>(); + + Dictionary, LinkedListNode>> lookup = new Dictionary, LinkedListNode>>(); + + public void Add(System.Action rhs) + { + if (lookup.ContainsKey(rhs)) return; + + lookup[rhs] = delegates.AddLast(rhs); + } + + public void Remove(System.Action rhs) + { + if (lookup.TryGetValue(rhs, out LinkedListNode> node)) + { + lookup.Remove(rhs); + delegates.Remove(node); + } + } + + public void Call(A a, B b) + { + var node = delegates.First; + while (node != null) + { + node.Value(a, b); + node = node.Next; + } + } + } + + + public class FastAction + { + + LinkedList> delegates = new LinkedList>(); + + Dictionary, LinkedListNode>> lookup = new Dictionary, LinkedListNode>>(); + + public void Add(System.Action rhs) + { + if (lookup.ContainsKey(rhs)) return; + + lookup[rhs] = delegates.AddLast(rhs); + } + + public void Remove(System.Action rhs) + { + if (lookup.TryGetValue(rhs, out LinkedListNode> node)) + { + lookup.Remove(rhs); + delegates.Remove(node); + } + } + + public void Call(A a, B b, C c) + { + var node = delegates.First; + while (node != null) + { + node.Value(a, b, c); + node = node.Next; + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/FastAction.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/FastAction.cs.meta new file mode 100644 index 0000000..fcd991e --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/FastAction.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 871f8edd56e84b8fb295b10cc3c78f36 +timeCreated: 1435956061 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/MaterialReferenceManager.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/MaterialReferenceManager.cs new file mode 100644 index 0000000..3370963 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/MaterialReferenceManager.cs @@ -0,0 +1,644 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + + +namespace TMPro +{ + + public class MaterialReferenceManager + { + private static MaterialReferenceManager s_Instance; + + // Dictionaries used to track Asset references. + private Dictionary m_FontMaterialReferenceLookup = new Dictionary(); + private Dictionary m_FontAssetReferenceLookup = new Dictionary(); + private Dictionary m_SpriteAssetReferenceLookup = new Dictionary(); + private Dictionary m_ColorGradientReferenceLookup = new Dictionary(); + + + /// + /// Get a singleton instance of the registry + /// + public static MaterialReferenceManager instance + { + get + { + if (MaterialReferenceManager.s_Instance == null) + MaterialReferenceManager.s_Instance = new MaterialReferenceManager(); + return MaterialReferenceManager.s_Instance; + } + } + + + + /// + /// Add new font asset reference to dictionary. + /// + /// + public static void AddFontAsset(TMP_FontAsset fontAsset) + { + MaterialReferenceManager.instance.AddFontAssetInternal(fontAsset); + } + + /// + /// Add new Font Asset reference to dictionary. + /// + /// + private void AddFontAssetInternal(TMP_FontAsset fontAsset) + { + if (m_FontAssetReferenceLookup.ContainsKey(fontAsset.hashCode)) return; + + // Add reference to the font asset. + m_FontAssetReferenceLookup.Add(fontAsset.hashCode, fontAsset); + + // Add reference to the font material. + m_FontMaterialReferenceLookup.Add(fontAsset.materialHashCode, fontAsset.material); + } + + + + /// + /// Add new Sprite Asset to dictionary. + /// + /// + /// + public static void AddSpriteAsset(TMP_SpriteAsset spriteAsset) + { + MaterialReferenceManager.instance.AddSpriteAssetInternal(spriteAsset); + } + + /// + /// Internal method to add a new sprite asset to the dictionary. + /// + /// + /// + private void AddSpriteAssetInternal(TMP_SpriteAsset spriteAsset) + { + if (m_SpriteAssetReferenceLookup.ContainsKey(spriteAsset.hashCode)) return; + + // Add reference to sprite asset. + m_SpriteAssetReferenceLookup.Add(spriteAsset.hashCode, spriteAsset); + + // Adding reference to the sprite asset material as well + m_FontMaterialReferenceLookup.Add(spriteAsset.hashCode, spriteAsset.material); + } + + /// + /// Add new Sprite Asset to dictionary. + /// + /// + /// + public static void AddSpriteAsset(int hashCode, TMP_SpriteAsset spriteAsset) + { + MaterialReferenceManager.instance.AddSpriteAssetInternal(hashCode, spriteAsset); + } + + /// + /// Internal method to add a new sprite asset to the dictionary. + /// + /// + /// + private void AddSpriteAssetInternal(int hashCode, TMP_SpriteAsset spriteAsset) + { + if (m_SpriteAssetReferenceLookup.ContainsKey(hashCode)) return; + + // Add reference to Sprite Asset. + m_SpriteAssetReferenceLookup.Add(hashCode, spriteAsset); + + // Add reference to Sprite Asset using the asset hashcode. + m_FontMaterialReferenceLookup.Add(hashCode, spriteAsset.material); + + // Compatibility check + if (spriteAsset.hashCode == 0) spriteAsset.hashCode = hashCode; + } + + + /// + /// Add new Material reference to dictionary. + /// + /// + /// + public static void AddFontMaterial(int hashCode, Material material) + { + MaterialReferenceManager.instance.AddFontMaterialInternal(hashCode, material); + } + + /// + /// Add new material reference to dictionary. + /// + /// + /// + private void AddFontMaterialInternal(int hashCode, Material material) + { + // Since this function is called after checking if the material is + // contained in the dictionary, there is no need to check again. + m_FontMaterialReferenceLookup.Add(hashCode, material); + } + + + /// + /// Add new Color Gradient Preset to dictionary. + /// + /// + /// + public static void AddColorGradientPreset(int hashCode, TMP_ColorGradient spriteAsset) + { + MaterialReferenceManager.instance.AddColorGradientPreset_Internal(hashCode, spriteAsset); + } + + /// + /// Internal method to add a new Color Gradient Preset to the dictionary. + /// + /// + /// + private void AddColorGradientPreset_Internal(int hashCode, TMP_ColorGradient spriteAsset) + { + if (m_ColorGradientReferenceLookup.ContainsKey(hashCode)) return; + + // Add reference to Color Gradient Preset Asset. + m_ColorGradientReferenceLookup.Add(hashCode, spriteAsset); + } + + + + /// + /// Add new material reference and return the index of this new reference in the materialReferences array. + /// + /// + /// + /// + //public int AddMaterial(Material material, int materialHashCode, TMP_FontAsset fontAsset) + //{ + // if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode)) + // { + // int index = m_MaterialReferenceLookup.Count; + + // materialReferences[index].fontAsset = fontAsset; + // materialReferences[index].material = material; + // materialReferences[index].isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false; + // materialReferences[index].index = index; + // materialReferences[index].referenceCount = 0; + + // m_MaterialReferenceLookup[materialHashCode] = index; + + // // Compute Padding value and store it + // // TODO + + // int fontAssetHashCode = fontAsset.hashCode; + + // if (!m_FontAssetReferenceLookup.ContainsKey(fontAssetHashCode)) + // m_FontAssetReferenceLookup.Add(fontAssetHashCode, fontAsset); + + // m_countInternal += 1; + + // return index; + // } + // else + // { + // return m_MaterialReferenceLookup[materialHashCode]; + // } + //} + + + /// + /// Add new material reference and return the index of this new reference in the materialReferences array. + /// + /// + /// + /// + /// + //public int AddMaterial(Material material, int materialHashCode, TMP_SpriteAsset spriteAsset) + //{ + // if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode)) + // { + // int index = m_MaterialReferenceLookup.Count; + + // materialReferences[index].fontAsset = materialReferences[0].fontAsset; + // materialReferences[index].spriteAsset = spriteAsset; + // materialReferences[index].material = material; + // materialReferences[index].isDefaultMaterial = true; + // materialReferences[index].index = index; + // materialReferences[index].referenceCount = 0; + + // m_MaterialReferenceLookup[materialHashCode] = index; + + // int spriteAssetHashCode = spriteAsset.hashCode; + + // if (!m_SpriteAssetReferenceLookup.ContainsKey(spriteAssetHashCode)) + // m_SpriteAssetReferenceLookup.Add(spriteAssetHashCode, spriteAsset); + + // m_countInternal += 1; + + // return index; + // } + // else + // { + // return m_MaterialReferenceLookup[materialHashCode]; + // } + //} + + + /// + /// Function to check if the font asset is already referenced. + /// + /// + /// + public bool Contains(TMP_FontAsset font) + { + if (m_FontAssetReferenceLookup.ContainsKey(font.hashCode)) + return true; + + return false; + } + + + /// + /// Function to check if the sprite asset is already referenced. + /// + /// + /// + public bool Contains(TMP_SpriteAsset sprite) + { + if (m_FontAssetReferenceLookup.ContainsKey(sprite.hashCode)) + return true; + + return false; + } + + + + /// + /// Function returning the Font Asset corresponding to the provided hash code. + /// + /// + /// + /// + public static bool TryGetFontAsset(int hashCode, out TMP_FontAsset fontAsset) + { + return MaterialReferenceManager.instance.TryGetFontAssetInternal(hashCode, out fontAsset); + } + + /// + /// Internal Function returning the Font Asset corresponding to the provided hash code. + /// + /// + /// + /// + private bool TryGetFontAssetInternal(int hashCode, out TMP_FontAsset fontAsset) + { + fontAsset = null; + + if (m_FontAssetReferenceLookup.TryGetValue(hashCode, out fontAsset)) + { + return true; + } + + return false; + } + + + + /// + /// Function returning the Sprite Asset corresponding to the provided hash code. + /// + /// + /// + /// + public static bool TryGetSpriteAsset(int hashCode, out TMP_SpriteAsset spriteAsset) + { + return MaterialReferenceManager.instance.TryGetSpriteAssetInternal(hashCode, out spriteAsset); + } + + /// + /// Internal function returning the Sprite Asset corresponding to the provided hash code. + /// + /// + /// + /// + private bool TryGetSpriteAssetInternal(int hashCode, out TMP_SpriteAsset spriteAsset) + { + spriteAsset = null; + + if (m_SpriteAssetReferenceLookup.TryGetValue(hashCode, out spriteAsset)) + { + return true; + } + + return false; + } + + + /// + /// Function returning the Color Gradient Preset corresponding to the provided hash code. + /// + /// + /// + /// + public static bool TryGetColorGradientPreset(int hashCode, out TMP_ColorGradient gradientPreset) + { + return MaterialReferenceManager.instance.TryGetColorGradientPresetInternal(hashCode, out gradientPreset); + } + + /// + /// Internal function returning the Color Gradient Preset corresponding to the provided hash code. + /// + /// + /// + /// + private bool TryGetColorGradientPresetInternal(int hashCode, out TMP_ColorGradient gradientPreset) + { + gradientPreset = null; + + if (m_ColorGradientReferenceLookup.TryGetValue(hashCode, out gradientPreset)) + { + return true; + } + + return false; + } + + + /// + /// Function returning the Font Material corresponding to the provided hash code. + /// + /// + /// + /// + public static bool TryGetMaterial(int hashCode, out Material material) + { + return MaterialReferenceManager.instance.TryGetMaterialInternal(hashCode, out material); + } + + /// + /// Internal function returning the Font Material corresponding to the provided hash code. + /// + /// + /// + /// + private bool TryGetMaterialInternal(int hashCode, out Material material) + { + material = null; + + if (m_FontMaterialReferenceLookup.TryGetValue(hashCode, out material)) + { + return true; + } + + return false; + } + + + /// + /// Function to lookup a material based on hash code and returning the MaterialReference containing this material. + /// + /// + /// + /// + //public bool TryGetMaterial(int hashCode, out MaterialReference materialReference) + //{ + // int materialIndex = -1; + + // if (m_MaterialReferenceLookup.TryGetValue(hashCode, out materialIndex)) + // { + // materialReference = materialReferences[materialIndex]; + + // return true; + // } + + // materialReference = new MaterialReference(); + + // return false; + //} + + + + /// + /// + /// + /// + /// + //public int GetMaterialIndex(TMP_FontAsset fontAsset) + //{ + // if (m_MaterialReferenceLookup.ContainsKey(fontAsset.materialHashCode)) + // return m_MaterialReferenceLookup[fontAsset.materialHashCode]; + + // return -1; + //} + + + /// + /// + /// + /// + /// + //public TMP_FontAsset GetFontAsset(int index) + //{ + // if (index >= 0 && index < materialReferences.Length) + // return materialReferences[index].fontAsset; + + // return null; + //} + + + /// + /// + /// + /// + /// + /// + //public void SetDefaultMaterial(Material material, int materialHashCode, TMP_FontAsset fontAsset) + //{ + // if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode)) + // { + // materialReferences[0].fontAsset = fontAsset; + // materialReferences[0].material = material; + // materialReferences[0].index = 0; + // materialReferences[0].isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false; + // materialReferences[0].referenceCount = 0; + // m_MaterialReferenceLookup[materialHashCode] = 0; + + // // Compute Padding value and store it + // // TODO + + // int fontHashCode = fontAsset.hashCode; + + // if (!m_FontAssetReferenceLookup.ContainsKey(fontHashCode)) + // m_FontAssetReferenceLookup.Add(fontHashCode, fontAsset); + // } + // else + // { + // materialReferences[0].fontAsset = fontAsset; + // materialReferences[0].material = material; + // materialReferences[0].index = 0; + // materialReferences[0].referenceCount = 0; + // m_MaterialReferenceLookup[materialHashCode] = 0; + // } + // // Compute padding + // // TODO + + // m_countInternal = 1; + //} + + + + /// + /// + /// + //public void Clear() + //{ + // //m_currentIndex = 0; + // m_MaterialReferenceLookup.Clear(); + // m_SpriteAssetReferenceLookup.Clear(); + // m_FontAssetReferenceLookup.Clear(); + //} + + + /// + /// Function to clear the reference count for each of the material references. + /// + //public void ClearReferenceCount() + //{ + // m_countInternal = 0; + + // for (int i = 0; i < materialReferences.Length; i++) + // { + // if (materialReferences[i].fontAsset == null) + // return; + + // materialReferences[i].referenceCount = 0; + // } + //} + + } + + + + public struct MaterialReference + { + + public int index; + public TMP_FontAsset fontAsset; + public TMP_SpriteAsset spriteAsset; + public Material material; + public bool isDefaultMaterial; + public bool isFallbackMaterial; + public Material fallbackMaterial; + public float padding; + public int referenceCount; + + + /// + /// Constructor for new Material Reference. + /// + /// + /// + /// + /// + /// + public MaterialReference(int index, TMP_FontAsset fontAsset, TMP_SpriteAsset spriteAsset, Material material, float padding) + { + this.index = index; + this.fontAsset = fontAsset; + this.spriteAsset = spriteAsset; + this.material = material; + this.isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false; + this.isFallbackMaterial = false; + this.fallbackMaterial = null; + this.padding = padding; + this.referenceCount = 0; + } + + + /// + /// Function to check if a certain font asset is contained in the material reference array. + /// + /// + /// + /// + public static bool Contains(MaterialReference[] materialReferences, TMP_FontAsset fontAsset) + { + int id = fontAsset.GetInstanceID(); + + for (int i = 0; i < materialReferences.Length && materialReferences[i].fontAsset != null; i++) + { + if (materialReferences[i].fontAsset.GetInstanceID() == id) + return true; + } + + return false; + } + + + /// + /// Function to add a new material reference and returning its index in the material reference array. + /// + /// + /// + /// + /// + /// + public static int AddMaterialReference(Material material, TMP_FontAsset fontAsset, MaterialReference[] materialReferences, Dictionary materialReferenceIndexLookup) + { + int materialID = material.GetInstanceID(); + + if (materialReferenceIndexLookup.TryGetValue(materialID, out int index)) + { + return index; + } + else + { + index = materialReferenceIndexLookup.Count; + + // Add new reference index + materialReferenceIndexLookup[materialID] = index; + + materialReferences[index].index = index; + materialReferences[index].fontAsset = fontAsset; + materialReferences[index].spriteAsset = null; + materialReferences[index].material = material; + materialReferences[index].isDefaultMaterial = materialID == fontAsset.material.GetInstanceID() ? true : false; + //materialReferences[index].padding = 0; + materialReferences[index].referenceCount = 0; + + return index; + } + } + + + /// + /// + /// + /// + /// + /// + /// + /// + public static int AddMaterialReference(Material material, TMP_SpriteAsset spriteAsset, MaterialReference[] materialReferences, Dictionary materialReferenceIndexLookup) + { + int materialID = material.GetInstanceID(); + + if (materialReferenceIndexLookup.TryGetValue(materialID, out int index)) + { + return index; + } + else + { + index = materialReferenceIndexLookup.Count; + + // Add new reference index + materialReferenceIndexLookup[materialID] = index; + + materialReferences[index].index = index; + materialReferences[index].fontAsset = materialReferences[0].fontAsset; + materialReferences[index].spriteAsset = spriteAsset; + materialReferences[index].material = material; + materialReferences[index].isDefaultMaterial = true; + //materialReferences[index].padding = 0; + materialReferences[index].referenceCount = 0; + + return index; + } + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/MaterialReferenceManager.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/MaterialReferenceManager.cs.meta new file mode 100644 index 0000000..17ad566 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/MaterialReferenceManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 11a6a034ab84493cbed6af5ae7aae78b +timeCreated: 1449743129 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Asset.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Asset.cs new file mode 100644 index 0000000..a0ff497 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Asset.cs @@ -0,0 +1,26 @@ +using UnityEngine; + +namespace TMPro +{ + + // Base class inherited by the various TextMeshPro Assets. + [System.Serializable] + public class TMP_Asset : ScriptableObject + { + /// + /// HashCode based on the name of the asset. + /// + public int hashCode; + + /// + /// The material used by this asset. + /// + public Material material; + + /// + /// HashCode based on the name of the material assigned to this asset. + /// + public int materialHashCode; + + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Asset.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Asset.cs.meta new file mode 100644 index 0000000..62e9ee7 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Asset.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3bda1886f58f4e0ab1139400b160c3ee +timeCreated: 1459318952 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Character.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Character.cs new file mode 100644 index 0000000..8fc161e --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Character.cs @@ -0,0 +1,51 @@ +using System; +using UnityEngine.TextCore; + +namespace TMPro +{ + /// + /// A basic element of text. + /// + [Serializable] + public class TMP_Character : TMP_TextElement + { + /// + /// Default constructor. + /// + public TMP_Character() + { + m_ElementType = TextElementType.Character; + this.scale = 1.0f; + } + + /// + /// Constructor for new character + /// + /// Unicode value. + /// Glyph + public TMP_Character(uint unicode, Glyph glyph) + { + m_ElementType = TextElementType.Character; + + this.unicode = unicode; + this.glyph = glyph; + this.glyphIndex = glyph.index; + this.scale = 1.0f; + } + + /// + /// Constructor for new character + /// + /// Unicode value. + /// Glyph index. + internal TMP_Character(uint unicode, uint glyphIndex) + { + m_ElementType = TextElementType.Character; + + this.unicode = unicode; + this.glyph = null; + this.glyphIndex = glyphIndex; + this.scale = 1.0f; + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Character.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Character.cs.meta new file mode 100644 index 0000000..55aea1b --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Character.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4ac5b6a65aaeb59478e3b78660e9f134 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CharacterInfo.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CharacterInfo.cs new file mode 100644 index 0000000..e15c46a --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CharacterInfo.cs @@ -0,0 +1,73 @@ +using UnityEngine; +using UnityEngine.TextCore; + +namespace TMPro +{ + public struct TMP_Vertex + { + public Vector3 position; + public Vector2 uv; + public Vector2 uv2; + public Vector2 uv4; + public Color32 color; + + //public Vector3 normal; + //public Vector4 tangent; + } + + /// + /// Structure containing information about individual text elements (character or sprites). + /// + public struct TMP_CharacterInfo + { + public char character; // Should be changed to an int to handle UTF 32 + /// + /// Index of the character in the raw string. + /// + public int index; // Index of the character in the input string. + public int stringLength; + public TMP_TextElementType elementType; + + public TMP_TextElement textElement; + public TMP_FontAsset fontAsset; + public TMP_SpriteAsset spriteAsset; + public int spriteIndex; + public Material material; + public int materialReferenceIndex; + public bool isUsingAlternateTypeface; + + public float pointSize; + + //public short wordNumber; + public int lineNumber; + //public short charNumber; + public int pageNumber; + + + public int vertexIndex; + public TMP_Vertex vertex_BL; + public TMP_Vertex vertex_TL; + public TMP_Vertex vertex_TR; + public TMP_Vertex vertex_BR; + + public Vector3 topLeft; + public Vector3 bottomLeft; + public Vector3 topRight; + public Vector3 bottomRight; + public float origin; + public float ascender; + public float baseLine; + public float descender; + + public float xAdvance; + public float aspectRatio; + public float scale; + public Color32 color; + public Color32 underlineColor; + public Color32 strikethroughColor; + public Color32 highlightColor; + public FontStyles style; + public bool isVisible; + //public bool isIgnoringAlignment; + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CharacterInfo.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CharacterInfo.cs.meta new file mode 100644 index 0000000..9367a16 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CharacterInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 90fe1c65e6bb3bc4e90862df7297719e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ColorGradient.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ColorGradient.cs new file mode 100644 index 0000000..0730ada --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ColorGradient.cs @@ -0,0 +1,68 @@ +using UnityEngine; +using System.Collections; + +namespace TMPro +{ + public enum ColorMode + { + Single, + HorizontalGradient, + VerticalGradient, + FourCornersGradient + } + + [System.Serializable] + public class TMP_ColorGradient : ScriptableObject + { + public ColorMode colorMode = ColorMode.FourCornersGradient; + + public Color topLeft; + public Color topRight; + public Color bottomLeft; + public Color bottomRight; + + const ColorMode k_DefaultColorMode = ColorMode.FourCornersGradient; + static readonly Color k_DefaultColor = Color.white; + + /// + /// Default Constructor which sets each of the colors as white. + /// + public TMP_ColorGradient() + { + colorMode = k_DefaultColorMode; + topLeft = k_DefaultColor; + topRight = k_DefaultColor; + bottomLeft = k_DefaultColor; + bottomRight = k_DefaultColor; + } + + /// + /// Constructor allowing to set the default color of the Color Gradient. + /// + /// + public TMP_ColorGradient(Color color) + { + colorMode = k_DefaultColorMode; + topLeft = color; + topRight = color; + bottomLeft = color; + bottomRight = color; + } + + /// + /// The vertex colors at the corners of the characters. + /// + /// Top left color. + /// Top right color. + /// Bottom left color. + /// Bottom right color. + public TMP_ColorGradient(Color color0, Color color1, Color color2, Color color3) + { + colorMode = k_DefaultColorMode; + this.topLeft = color0; + this.topRight = color1; + this.bottomLeft = color2; + this.bottomRight = color3; + } + } +} diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ColorGradient.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ColorGradient.cs.meta new file mode 100644 index 0000000..1d79d01 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ColorGradient.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 54d21f6ece3b46479f0c328f8c6007e0 +timeCreated: 1468187202 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CoroutineTween.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CoroutineTween.cs new file mode 100644 index 0000000..bec1f54 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CoroutineTween.cs @@ -0,0 +1,246 @@ +using UnityEngine; +using UnityEngine.Events; +using System.Collections; + + +namespace TMPro +{ + // Base interface for tweeners, + // using an interface instead of + // an abstract class as we want the + // tweens to be structs. + internal interface ITweenValue + { + void TweenValue(float floatPercentage); + bool ignoreTimeScale { get; } + float duration { get; } + bool ValidTarget(); + } + + // Color tween class, receives the + // TweenValue callback and then sets + // the value on the target. + internal struct ColorTween : ITweenValue + { + public enum ColorTweenMode + { + All, + RGB, + Alpha + } + + public class ColorTweenCallback : UnityEvent { } + + private ColorTweenCallback m_Target; + private Color m_StartColor; + private Color m_TargetColor; + private ColorTweenMode m_TweenMode; + + private float m_Duration; + private bool m_IgnoreTimeScale; + + public Color startColor + { + get { return m_StartColor; } + set { m_StartColor = value; } + } + + public Color targetColor + { + get { return m_TargetColor; } + set { m_TargetColor = value; } + } + + public ColorTweenMode tweenMode + { + get { return m_TweenMode; } + set { m_TweenMode = value; } + } + + public float duration + { + get { return m_Duration; } + set { m_Duration = value; } + } + + public bool ignoreTimeScale + { + get { return m_IgnoreTimeScale; } + set { m_IgnoreTimeScale = value; } + } + + public void TweenValue(float floatPercentage) + { + if (!ValidTarget()) + return; + + var newColor = Color.Lerp(m_StartColor, m_TargetColor, floatPercentage); + + if (m_TweenMode == ColorTweenMode.Alpha) + { + newColor.r = m_StartColor.r; + newColor.g = m_StartColor.g; + newColor.b = m_StartColor.b; + } + else if (m_TweenMode == ColorTweenMode.RGB) + { + newColor.a = m_StartColor.a; + } + m_Target.Invoke(newColor); + } + + public void AddOnChangedCallback(UnityAction callback) + { + if (m_Target == null) + m_Target = new ColorTweenCallback(); + + m_Target.AddListener(callback); + } + + public bool GetIgnoreTimescale() + { + return m_IgnoreTimeScale; + } + + public float GetDuration() + { + return m_Duration; + } + + public bool ValidTarget() + { + return m_Target != null; + } + } + + // Float tween class, receives the + // TweenValue callback and then sets + // the value on the target. + internal struct FloatTween : ITweenValue + { + public class FloatTweenCallback : UnityEvent { } + + private FloatTweenCallback m_Target; + private float m_StartValue; + private float m_TargetValue; + + private float m_Duration; + private bool m_IgnoreTimeScale; + + public float startValue + { + get { return m_StartValue; } + set { m_StartValue = value; } + } + + public float targetValue + { + get { return m_TargetValue; } + set { m_TargetValue = value; } + } + + public float duration + { + get { return m_Duration; } + set { m_Duration = value; } + } + + public bool ignoreTimeScale + { + get { return m_IgnoreTimeScale; } + set { m_IgnoreTimeScale = value; } + } + + public void TweenValue(float floatPercentage) + { + if (!ValidTarget()) + return; + + var newValue = Mathf.Lerp(m_StartValue, m_TargetValue, floatPercentage); + m_Target.Invoke(newValue); + } + + public void AddOnChangedCallback(UnityAction callback) + { + if (m_Target == null) + m_Target = new FloatTweenCallback(); + + m_Target.AddListener(callback); + } + + public bool GetIgnoreTimescale() + { + return m_IgnoreTimeScale; + } + + public float GetDuration() + { + return m_Duration; + } + + public bool ValidTarget() + { + return m_Target != null; + } + } + + // Tween runner, executes the given tween. + // The coroutine will live within the given + // behaviour container. + internal class TweenRunner where T : struct, ITweenValue + { + protected MonoBehaviour m_CoroutineContainer; + protected IEnumerator m_Tween; + + // utility function for starting the tween + private static IEnumerator Start(T tweenInfo) + { + if (!tweenInfo.ValidTarget()) + yield break; + + var elapsedTime = 0.0f; + while (elapsedTime < tweenInfo.duration) + { + elapsedTime += tweenInfo.ignoreTimeScale ? Time.unscaledDeltaTime : Time.deltaTime; + var percentage = Mathf.Clamp01(elapsedTime / tweenInfo.duration); + tweenInfo.TweenValue(percentage); + yield return null; + } + tweenInfo.TweenValue(1.0f); + } + + public void Init(MonoBehaviour coroutineContainer) + { + m_CoroutineContainer = coroutineContainer; + } + + public void StartTween(T info) + { + if (m_CoroutineContainer == null) + { + Debug.LogWarning("Coroutine container not configured... did you forget to call Init?"); + return; + } + + StopTween(); + + if (!m_CoroutineContainer.gameObject.activeInHierarchy) + { + info.TweenValue(1.0f); + return; + } + + m_Tween = Start(info); + m_CoroutineContainer.StartCoroutine(m_Tween); + } + + public void StopTween() + { + if (m_Tween != null) + { + m_CoroutineContainer.StopCoroutine(m_Tween); + m_Tween = null; + } + } + } +} \ No newline at end of file diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CoroutineTween.cs.meta b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CoroutineTween.cs.meta new file mode 100644 index 0000000..01cf5eb --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CoroutineTween.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 658c1fb149e7498aa072b0c0f3bf13f0 +timeCreated: 1464850953 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_DefaultControls.cs b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_DefaultControls.cs new file mode 100644 index 0000000..7bc6f97 --- /dev/null +++ b/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_DefaultControls.cs @@ -0,0 +1,385 @@ +using UnityEngine; +using System.Collections; +using UnityEngine.UI; + + +namespace TMPro +{ + + public static class TMP_DefaultControls + { + public struct Resources + { + public Sprite standard; + public Sprite background; + public Sprite inputField; + public Sprite knob; + public Sprite checkmark; + public Sprite dropdown; + public Sprite mask; + } + + private const float kWidth = 160f; + private const float kThickHeight = 30f; + private const float kThinHeight = 20f; + private static Vector2 s_ThickElementSize = new Vector2(kWidth, kThickHeight); + private static Vector2 s_ThinElementSize = new Vector2(kWidth, kThinHeight); + //private static Vector2 s_ImageElementSize = new Vector2(100f, 100f); + private static Color s_DefaultSelectableColor = new Color(1f, 1f, 1f, 1f); + //private static Color s_PanelColor = new Color(1f, 1f, 1f, 0.392f); + private static Color s_TextColor = new Color(50f / 255f, 50f / 255f, 50f / 255f, 1f); + + + private static GameObject CreateUIElementRoot(string name, Vector2 size) + { + GameObject child = new GameObject(name); + RectTransform rectTransform = child.AddComponent(); + rectTransform.sizeDelta = size; + return child; + } + + static GameObject CreateUIObject(string name, GameObject parent) + { + GameObject go = new GameObject(name); + go.AddComponent(); + SetParentAndAlign(go, parent); + return go; + } + + private static void SetDefaultTextValues(TMP_Text lbl) + { + // Set text values we want across UI elements in default controls. + // Don't set values which are the same as the default values for the Text component, + // since there's no point in that, and it's good to keep them as consistent as possible. + lbl.color = s_TextColor; + lbl.fontSize = 14; + } + + private static void SetDefaultColorTransitionValues(Selectable slider) + { + ColorBlock colors = slider.colors; + colors.highlightedColor = new Color(0.882f, 0.882f, 0.882f); + colors.pressedColor = new Color(0.698f, 0.698f, 0.698f); + colors.disabledColor = new Color(0.521f, 0.521f, 0.521f); + } + + private static void SetParentAndAlign(GameObject child, GameObject parent) + { + if (parent == null) + return; + + child.transform.SetParent(parent.transform, false); + SetLayerRecursively(child, parent.layer); + } + + private static void SetLayerRecursively(GameObject go, int layer) + { + go.layer = layer; + Transform t = go.transform; + for (int i = 0; i < t.childCount; i++) + SetLayerRecursively(t.GetChild(i).gameObject, layer); + } + + // Actual controls + + public static GameObject CreateScrollbar(Resources resources) + { + // Create GOs Hierarchy + GameObject scrollbarRoot = CreateUIElementRoot("Scrollbar", s_ThinElementSize); + + GameObject sliderArea = CreateUIObject("Sliding Area", scrollbarRoot); + GameObject handle = CreateUIObject("Handle", sliderArea); + + Image bgImage = scrollbarRoot.AddComponent(); + bgImage.sprite = resources.background; + bgImage.type = Image.Type.Sliced; + bgImage.color = s_DefaultSelectableColor; + + Image handleImage = handle.AddComponent(); + handleImage.sprite = resources.standard; + handleImage.type = Image.Type.Sliced; + handleImage.color = s_DefaultSelectableColor; + + RectTransform sliderAreaRect = sliderArea.GetComponent(); + sliderAreaRect.sizeDelta = new Vector2(-20, -20); + sliderAreaRect.anchorMin = Vector2.zero; + sliderAreaRect.anchorMax = Vector2.one; + + RectTransform handleRect = handle.GetComponent(); + handleRect.sizeDelta = new Vector2(20, 20); + + Scrollbar scrollbar = scrollbarRoot.AddComponent(); + scrollbar.handleRect = handleRect; + scrollbar.targetGraphic = handleImage; + SetDefaultColorTransitionValues(scrollbar); + + return scrollbarRoot; + } + + public static GameObject CreateButton(Resources resources) + { + GameObject buttonRoot = CreateUIElementRoot("Button", s_ThickElementSize); + + GameObject childText = new GameObject("Text (TMP)"); + childText.AddComponent(); + SetParentAndAlign(childText, buttonRoot); + + Image image = buttonRoot.AddComponent(); + image.sprite = resources.standard; + image.type = Image.Type.Sliced; + image.color = s_DefaultSelectableColor; + + Button bt = buttonRoot.AddComponent